X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Ftelelco-v3.0%2Fao_lco_v3.c;h=dbee0bc2ed269223195ca8bad6a236c797c6a0d1;hb=323a6a44083f865c90c12e93775ac2dbf9352de3;hp=7c81a2e5babd3ddaf4c1f5c69c00c88469e0ed1b;hpb=f9e319f5a97df8c0950ec7531d0889cf60e53783;p=fw%2Faltos diff --git a/src/telelco-v3.0/ao_lco_v3.c b/src/telelco-v3.0/ao_lco_v3.c index 7c81a2e5..dbee0bc2 100644 --- a/src/telelco-v3.0/ao_lco_v3.c +++ b/src/telelco-v3.0/ao_lco_v3.c @@ -23,6 +23,7 @@ #include #include #include +#include #define WIDTH AO_ST7565_WIDTH #define HEIGHT AO_ST7565_HEIGHT @@ -43,9 +44,13 @@ static const struct ao_transform logo_transform = { .y_scale = 48, .y_off = 0, }; +static const struct ao_transform show_transform = { + .x_scale = 36, .x_off = 100, + .y_scale = 36, .y_off = 0, +}; + #define BIG_FONT BitstreamVeraSans_Roman_58_font #define VOLT_FONT BitstreamVeraSans_Roman_58_font -#define CONTRAST_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 @@ -70,6 +75,17 @@ static const struct ao_transform logo_transform = { #define CONTRAST_X (WIDTH - CONTRAST_WIDTH) / 2 #define CONTRAST_Y 20 #define CONTRAST_HEIGHT 20 +#define CONTRAST_VALUE_X 64 +#define CONTRAST_VALUE_Y (CONTRAST_Y + CONTRAST_HEIGHT + SMALL_FONT.ascent + 3) +#define BACKLIGHT_LABEL_X 37 +#define BACKLIGHT_WIDTH 100 +#define BACKLIGHT_X (WIDTH - BACKLIGHT_WIDTH) / 2 +#define BACKLIGHT_Y 20 +#define BACKLIGHT_HEIGHT 20 +#define BACKLIGHT_VALUE_X 64 +#define BACKLIGHT_VALUE_Y (BACKLIGHT_Y + BACKLIGHT_HEIGHT + SMALL_FONT.ascent + 3) +#define INFO_START_Y ((int16_t) (SMALL_FONT.ascent + 2)) +#define INFO_STEP_Y ((int16_t) (SMALL_FONT.ascent + 3)) #define AO_LCO_DRAG_RACE_START_TIME AO_SEC_TO_TICKS(5) #define AO_LCO_DRAG_RACE_STOP_TIME AO_SEC_TO_TICKS(2) @@ -130,11 +146,61 @@ _ao_lco_batt_voltage(void) static void _ao_lco_show_contrast(void) { + char buf[8]; uint8_t brightness = ao_st7565_get_brightness(); int16_t contrast = (int16_t) (brightness * CONTRAST_WIDTH / AO_LCO_MAX_CONTRAST); + int16_t width; ao_text(&fb, &SMALL_FONT, CONTRAST_LABEL_X, LABEL_Y, "Contrast", AO_BLACK, AO_COPY); ao_rect(&fb, CONTRAST_X, CONTRAST_Y, contrast, CONTRAST_HEIGHT, AO_BLACK, AO_COPY); + /* this "knows" that CONTRAST_WIDTH == 100 */ + snprintf(buf, sizeof(buf), "%d %%", contrast); + width = ao_text_width(&SMALL_FONT, buf); + ao_text(&fb, &SMALL_FONT, BACKLIGHT_VALUE_X - width / 2, BACKLIGHT_VALUE_Y, buf, AO_BLACK, AO_COPY); +} + +static void +_ao_lco_show_backlight(void) +{ + char buf[8]; + int32_t backlight = ao_lco_get_backlight(); + int16_t value = (int16_t) (backlight * BACKLIGHT_WIDTH / AO_LCO_MAX_BACKLIGHT); + int16_t width; + + ao_text(&fb, &SMALL_FONT, BACKLIGHT_LABEL_X, LABEL_Y, "Backlight", AO_BLACK, AO_COPY); + ao_rect(&fb, BACKLIGHT_X, BACKLIGHT_Y, value, BACKLIGHT_HEIGHT, AO_BLACK, AO_COPY); + /* this "knows" that BACKLIGHT_WIDTH == 100 */ + snprintf(buf, sizeof(buf), "%d %%", value); + width = ao_text_width(&SMALL_FONT, buf); + ao_text(&fb, &SMALL_FONT, BACKLIGHT_VALUE_X - width / 2, BACKLIGHT_VALUE_Y, buf, AO_BLACK, AO_COPY); +} + +static int16_t info_y; + +static void +_ao_lco_info(const char *format, ...) +{ + va_list a; + char buf[20]; + va_start(a, format); + vsnprintf(buf, sizeof(buf), format, a); + va_end(a); + ao_text(&fb, &SMALL_FONT, 0, info_y, buf, AO_BLACK, AO_COPY); + info_y += INFO_STEP_Y; +} + +static void +_ao_lco_show_info(void) +{ + info_y = INFO_START_Y; + ao_logo_poly(&fb, &show_transform, AO_BLACK, AO_COPY); + _ao_lco_info("%s", ao_product); + _ao_lco_info("Version: %s", ao_version); + _ao_lco_info("Serial: %d", ao_serial_number); + _ao_lco_info("Callsign: %s", ao_config.callsign); + _ao_lco_info("Frequency: %ld.%03d", + ao_config.frequency / 1000, + (int) (ao_config.frequency % 1000)); } void @@ -142,16 +208,28 @@ ao_lco_show(void) { ao_mutex_get(&ao_lco_display_mutex); ao_rect(&fb, 0, 0, WIDTH, HEIGHT, AO_WHITE, AO_COPY); - if (ao_lco_box == AO_LCO_LCO_VOLTAGE) { + switch (ao_lco_box) { + case AO_LCO_LCO_VOLTAGE: _ao_lco_batt_voltage(); - } else if (ao_lco_box == AO_LCO_CONTRAST) { + break; + case AO_LCO_CONTRAST: _ao_lco_show_contrast(); - } else if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) { - _ao_lco_show_voltage(ao_pad_query.battery, "Pad battery"); - } else { - _ao_lco_show_pad(ao_lco_pad); - _ao_lco_show_box(ao_lco_box); - ao_rect(&fb, SEP_X, 0, 2, HEIGHT, AO_BLACK, AO_COPY); + break; + case AO_LCO_BACKLIGHT: + _ao_lco_show_backlight(); + break; + case AO_LCO_INFO: + _ao_lco_show_info(); + break; + default: + if (ao_lco_pad == AO_LCO_PAD_VOLTAGE) { + _ao_lco_show_voltage(ao_pad_query.battery, "Pad battery"); + } else { + _ao_lco_show_pad(ao_lco_pad); + _ao_lco_show_box(ao_lco_box); + ao_rect(&fb, SEP_X, 0, 2, HEIGHT, AO_BLACK, AO_COPY); + } + break; } ao_st7565_update(&fb); ao_mutex_put(&ao_lco_display_mutex); @@ -181,15 +259,30 @@ ao_lco_set_select(void) void -ao_lco_set_contrast(int16_t contrast) +ao_lco_set_contrast(int32_t contrast) { ao_st7565_set_brightness((uint8_t) contrast); } -int16_t +int32_t ao_lco_get_contrast(void) { - return (int16_t) ao_st7565_get_brightness(); + return (int32_t) ao_st7565_get_brightness(); +} + +static uint16_t ao_backlight; + +void +ao_lco_set_backlight(int32_t backlight) +{ + ao_backlight = (uint16_t) backlight; + ao_pwm_set(AO_LCD_BL_PWM_CHAN, ao_backlight); +} + +int32_t +ao_lco_get_backlight(void) +{ + return (int32_t) ao_backlight; } static struct ao_task ao_lco_drag_task;