2 * Copyright © 2011 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
21 #include <ao_packet.h>
22 #include <ao_companion.h>
24 #include <ao_quadrature.h>
25 #include <ao_button.h>
27 #include <ao_lco_cmd.h>
28 #include <ao_radio_cmac_cmd.h>
29 #include <ao_eeprom.h>
30 #include <ao_adc_single.h>
31 #include <ao_st7565.h>
33 #define WIDTH AO_ST7565_WIDTH
34 #define HEIGHT AO_ST7565_HEIGHT
35 #define STRIDE AO_BITMAP_STRIDE(WIDTH)
37 static uint32_t image[STRIDE * HEIGHT];
39 static struct ao_bitmap fb = {
44 .damage = AO_BOX_INIT,
50 ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY);
51 ao_st7565_update(&fb);
52 ao_text(&fb, &BitstreamVeraSans_Roman_24_font,
53 0, 20, "hello world", AO_BLACK, AO_COPY);
54 ao_st7565_update(&fb);
57 static int16_t x1 = 32, _y1 = 10, x2 = 32, y2 = 40;
58 static int16_t dx1 = 2, dy1 = 2, dx2 = -2, dy2 = -1;
60 #define bounds(v,m,M,d) \
74 for (i = 0; i < 100; i++) {
75 ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY);
76 ao_line(&fb, x1, _y1, x2, y2, AO_BLACK, AO_COPY);
77 ao_st7565_update(&fb);
82 printf("%d,%d - %d,%d\n", x1, _y1, x2, y2);
84 bounds(x1, 0, WIDTH, dx1);
85 bounds(x2, 0, WIDTH, dx2);
86 bounds(_y1, 0, HEIGHT, dy1);
87 bounds(y2, 0, HEIGHT, dy2);
88 ao_delay(AO_MS_TO_TICKS(200));
92 static const float pad_volts = 12.3f;
93 static const float lco_volts = 4.1f;
94 static const int rssi = -30;
96 static int boxes[] = { 1, 2, 3, 5, 8, 11, 13, 17, 19, 23, 29, 31, 37, 62, 97 };
98 //static int max_box = 97;
100 #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
108 for (i = 0; i < ARRAYSIZE(boxes); i++)
118 for (int n = box_number + 1; n <= max_box; n++)
129 for (int n = box_number - 1; n >= 0; n--)
134 box_number = max_box;
138 static const struct ao_transform logo_transform = {
139 .x_scale = 48, .x_off = 2,
140 .y_scale = 48, .y_off = 0,
143 #define BIG_FONT BitstreamVeraSans_Roman_58_font
144 #define VOLT_FONT BitstreamVeraSans_Roman_58_font
145 #define SMALL_FONT BitstreamVeraSans_Roman_12_font
146 #define TINY_FONT BitstreamVeraSans_Roman_10_font
147 #define LOGO_FONT BenguiatGothicStd_Bold_26_font
149 #define LABEL_Y (int16_t) (SMALL_FONT.ascent)
150 #define VALUE_Y (int16_t) (LABEL_Y + BIG_FONT.ascent + 5)
153 #define BOX_LABEL_X 30
154 #define VOLT_LABEL_X 25
155 #define RSSI_LABEL_X 15
156 #define PAD_LABEL_X 95
157 #define SEP_X (PAD_X - 8)
158 #define SCAN_X (WIDTH - 100) / 2
160 #define SCAN_HEIGHT 3
163 #define FOUND_WIDTH 17
164 #define MAX_VALID (WIDTH / FOUND_WIDTH)
166 static int16_t box_number = 88;
167 static int16_t pad_number = 8;
179 for (scan_number = 0; scan_number < 100; scan_number++) {
180 ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY);
181 ao_logo(&fb, &logo_transform, &LOGO_FONT, AO_BLACK, AO_COPY);
183 ao_rect(&fb, SCAN_X, SCAN_Y, (int16_t) scan_number, SCAN_HEIGHT, AO_BLACK, AO_COPY);
187 for (i = scan_number; i > 1; i--) {
196 for (; i <= scan_number; i++) {
198 sprintf(str, "%02d%s", i, i == last_box ? "" : ",");
199 ao_text(&fb, &TINY_FONT, (int16_t) (FOUND_X + FOUND_WIDTH * b),
200 FOUND_Y, str, AO_BLACK, AO_COPY);
205 ao_st7565_update(&fb);
206 ao_delay(AO_MS_TO_TICKS(50));
208 ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY);
209 switch (box_number) {
211 sprintf(str, "%4.1f", lco_volts);
212 ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY);
213 ao_text(&fb, &SMALL_FONT, VOLT_LABEL_X, LABEL_Y, "LCO Battery", AO_BLACK, AO_COPY);
216 switch (pad_number) {
218 sprintf(str, "%4.1f", pad_volts);
219 ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY);
220 ao_text(&fb, &SMALL_FONT, VOLT_LABEL_X, LABEL_Y, "Pad Battery", AO_BLACK, AO_COPY);
223 sprintf(str, "%4d", rssi);
224 ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY);
225 ao_text(&fb, &SMALL_FONT, RSSI_LABEL_X, LABEL_Y, "Signal Strength", AO_BLACK, AO_COPY);
228 sprintf(str, "%02d", box_number);
229 ao_text(&fb, &BIG_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY);
230 ao_text(&fb, &SMALL_FONT, BOX_LABEL_X, LABEL_Y, "Box", AO_BLACK, AO_COPY);
232 sprintf(str, "%d", pad_number);
233 ao_text(&fb, &BIG_FONT, PAD_X, VALUE_Y, str, AO_BLACK, AO_COPY);
234 ao_text(&fb, &SMALL_FONT, PAD_LABEL_X, LABEL_Y, "Pad", AO_BLACK, AO_COPY);
236 ao_rect(&fb, SEP_X, 0, 2, HEIGHT, AO_BLACK, AO_COPY);
240 ao_st7565_update(&fb);
243 const struct ao_cmds ao_st7565_cmds[] = {
244 { ao_st7565_test, "g\0Test ST7565 display" },
245 { ao_st7565_line, "l\0Draw lines" },
246 { ao_st7565_poly, "p\0Draw polygon" },
256 ao_led_on(LEDS_AVAILABLE);
264 ao_adc_single_init();
269 ao_quadrature_init();
283 // ao_cmd_register(ao_st7565_cmds);
285 ao_led_off(LEDS_AVAILABLE);
287 ao_start_scheduler();