X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Ftelelco-v3.0%2Fao_telelco.c;h=faba96b0e0f5c28b930af0ad4a5d492b2d8af188;hb=5cea1324ac4a34a21324c4bb50885ffacb6d29da;hp=91798b562cb82e1660caeff3a9f711b88d7ae6b1;hpb=31756e065828ca5c1779f1349c38d29196f4798d;p=fw%2Faltos diff --git a/src/telelco-v3.0/ao_telelco.c b/src/telelco-v3.0/ao_telelco.c index 91798b56..faba96b0 100644 --- a/src/telelco-v3.0/ao_telelco.c +++ b/src/telelco-v3.0/ao_telelco.c @@ -27,34 +27,233 @@ #include #include #include -//#include +#include #include +#include -uint8_t -ao_eeprom_read(ao_pos_t pos, void *v, uint16_t len) +#define WIDTH AO_ST7565_WIDTH +#define HEIGHT AO_ST7565_HEIGHT +#define STRIDE AO_BITMAP_STRIDE(WIDTH) + +static uint32_t image[STRIDE * HEIGHT]; + +static struct ao_bitmap fb = { + .base = image, + .stride = STRIDE, + .width = WIDTH, + .height = HEIGHT, + .damage = AO_BOX_INIT, +}; + +static void +ao_st7565_test(void) { - (void) pos; - (void) v; - (void) len; - return 0; + ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY); + ao_st7565_update(&fb); + ao_text(&fb, &BitstreamVeraSans_Roman_24_font, + 0, 20, "hello world", AO_BLACK, AO_COPY); + ao_st7565_update(&fb); } -uint8_t -ao_eeprom_write(ao_pos_t pos32, void *v, uint16_t len) +static int16_t x1 = 32, _y1 = 10, x2 = 32, y2 = 40; +static int16_t dx1 = 2, dy1 = 2, dx2 = -2, dy2 = -1; + +#define bounds(v,m,M,d) \ + if (v < m) { \ + v = m + m - v; \ + d = -d; \ + } else if (v > M) { \ + v = M - (v - M); \ + d = -d; \ + } + +static void +ao_st7565_line(void) { - (void) pos32; - (void) v; - (void) len; - return 0; + int i; + + for (i = 0; i < 100; i++) { + ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY); + ao_line(&fb, x1, _y1, x2, y2, AO_BLACK, AO_COPY); + ao_st7565_update(&fb); + x1 += dx1; + _y1 += dy1; + x2 += dx2; + y2 += dy2; + printf("%d,%d - %d,%d\n", x1, _y1, x2, y2); + fflush(stdout); + bounds(x1, 0, WIDTH, dx1); + bounds(x2, 0, WIDTH, dx2); + bounds(_y1, 0, HEIGHT, dy1); + bounds(y2, 0, HEIGHT, dy2); + ao_delay(AO_MS_TO_TICKS(200)); + } +} + +static const float pad_volts = 12.3f; +static const float lco_volts = 4.1f; +static const int rssi = -30; + +static int boxes[] = { 1, 2, 3, 5, 8, 11, 13, 17, 19, 23, 29, 31, 37, 62, 97 }; + +//static int max_box = 97; + +#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) + +static bool +valid_box(int box) +{ + size_t i; + if (box == 0) + return true; + for (i = 0; i < ARRAYSIZE(boxes); i++) + if (boxes[i] == box) + return true; + return false; +} + +#if 0 +static void +next_box(void) +{ + for (int n = box_number + 1; n <= max_box; n++) + if (valid_box(n)) { + box_number = n; + return; + } + box_number = 0; +} + +static void +prev_box(void) +{ + for (int n = box_number - 1; n >= 0; n--) + if (valid_box(n)) { + box_number = n; + return; + } + box_number = max_box; +} +#endif + +static const struct ao_transform logo_transform = { + .x_scale = 48, .x_off = 2, + .y_scale = 48, .y_off = 0, +}; + +#define BIG_FONT BitstreamVeraSans_Roman_58_font +#define VOLT_FONT BitstreamVeraSans_Roman_58_font +#define SMALL_FONT BitstreamVeraSans_Roman_12_font +#define TINY_FONT BitstreamVeraSans_Roman_10_font +#define LOGO_FONT BenguiatGothicStd_Bold_26_font + +#define LABEL_Y (int16_t) (SMALL_FONT.ascent) +#define VALUE_Y (int16_t) (LABEL_Y + BIG_FONT.ascent + 5) +#define BOX_X 2 +#define PAD_X 90 +#define BOX_LABEL_X 30 +#define VOLT_LABEL_X 25 +#define RSSI_LABEL_X 15 +#define PAD_LABEL_X 95 +#define SEP_X (PAD_X - 8) +#define SCAN_X (WIDTH - 100) / 2 +#define SCAN_Y 50 +#define SCAN_HEIGHT 3 +#define FOUND_Y 63 +#define FOUND_X 6 +#define FOUND_WIDTH 17 +#define MAX_VALID (WIDTH / FOUND_WIDTH) + +static int16_t box_number = 88; +static int16_t pad_number = 8; + +static void +ao_st7565_poly(void) +{ + int16_t scan_number; + char str[8]; + int i; + int v; + int last_box; + int16_t b; + + for (scan_number = 0; scan_number < 100; scan_number++) { + ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY); + ao_logo(&fb, &logo_transform, &LOGO_FONT, AO_BLACK, AO_COPY); + if (scan_number) { + ao_rect(&fb, SCAN_X, SCAN_Y, (int16_t) scan_number, SCAN_HEIGHT, AO_BLACK, AO_COPY); + b = 0; + v = 0; + last_box = 0; + for (i = scan_number; i > 1; i--) { + if (valid_box(i)) { + if (!last_box) + last_box = i; + v++; + if (v == MAX_VALID) + break; + } + } + for (; i <= scan_number; i++) { + if (valid_box(i)) { + sprintf(str, "%02d%s", i, i == last_box ? "" : ","); + ao_text(&fb, &TINY_FONT, (int16_t) (FOUND_X + FOUND_WIDTH * b), + FOUND_Y, str, AO_BLACK, AO_COPY); + b++; + } + } + } + ao_st7565_update(&fb); + ao_delay(AO_MS_TO_TICKS(50)); + } + ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY); + switch (box_number) { + case 0: + sprintf(str, "%4.1f", lco_volts); + ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY); + ao_text(&fb, &SMALL_FONT, VOLT_LABEL_X, LABEL_Y, "LCO Battery", AO_BLACK, AO_COPY); + break; + default: + switch (pad_number) { + case -1: + sprintf(str, "%4.1f", pad_volts); + ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY); + ao_text(&fb, &SMALL_FONT, VOLT_LABEL_X, LABEL_Y, "Pad Battery", AO_BLACK, AO_COPY); + break; + case 0: + sprintf(str, "%4d", rssi); + ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY); + ao_text(&fb, &SMALL_FONT, RSSI_LABEL_X, LABEL_Y, "Signal Strength", AO_BLACK, AO_COPY); + break; + default: + sprintf(str, "%02d", box_number); + ao_text(&fb, &BIG_FONT, BOX_X, VALUE_Y, str, AO_BLACK, AO_COPY); + ao_text(&fb, &SMALL_FONT, BOX_LABEL_X, LABEL_Y, "Box", AO_BLACK, AO_COPY); + + sprintf(str, "%d", pad_number); + ao_text(&fb, &BIG_FONT, PAD_X, VALUE_Y, str, AO_BLACK, AO_COPY); + ao_text(&fb, &SMALL_FONT, PAD_LABEL_X, LABEL_Y, "Pad", AO_BLACK, AO_COPY); + + ao_rect(&fb, SEP_X, 0, 2, HEIGHT, AO_BLACK, AO_COPY); + } + break; + } + ao_st7565_update(&fb); } +const struct ao_cmds ao_st7565_cmds[] = { + { ao_st7565_test, "g\0Test ST7565 display" }, + { ao_st7565_line, "l\0Draw lines" }, + { ao_st7565_poly, "p\0Draw polygon" }, + { 0, NULL }, +}; + int main(void) { ao_clock_init(); ao_led_init(); - ao_led_on(LEDS_AVAILABLE); ao_task_init(); ao_timer_init(); @@ -62,8 +261,10 @@ main(void) ao_spi_init(); ao_dma_init(); ao_exti_init(); + ao_adc_single_init(); ao_beep_init(); + ao_pwm_init(); ao_cmd_init(); ao_quadrature_init(); @@ -80,7 +281,7 @@ main(void) ao_lco_init(); ao_lco_cmd_init(); - ao_led_off(LEDS_AVAILABLE); +// ao_cmd_register(ao_st7565_cmds); ao_start_scheduler(); return 0;