From fc4687428b114dfcbc30f0091ad227fc6c66a4a6 Mon Sep 17 00:00:00 2001 From: bartool Date: Sun, 26 Mar 2023 19:41:38 +0200 Subject: [PATCH] [wip] display layout --- firmware/.vscode/settings.json | 8 +- .../shared_libs/bitmaps/bitmap_disp_buttons.c | 2 +- .../shared_libs/bitmaps/bitmap_disp_buttons.h | 2 +- .../shared_libs/disp_layout/disp_layout.c | 214 ++++++++++++++++++ .../shared_libs/disp_layout/disp_layout.h | 44 ++++ 5 files changed, 267 insertions(+), 3 deletions(-) create mode 100644 firmware/shared_libs/disp_layout/disp_layout.c create mode 100644 firmware/shared_libs/disp_layout/disp_layout.h diff --git a/firmware/.vscode/settings.json b/firmware/.vscode/settings.json index 4b91b29..e1eb127 100644 --- a/firmware/.vscode/settings.json +++ b/firmware/.vscode/settings.json @@ -1,6 +1,12 @@ { "files.associations": { "ad9833_def.h": "c", - "ad9833.h": "c" + "ad9833.h": "c", + "disp_layout.h": "c", + "bitmap_disp_buttons.h": "c", + "bitmap_fonts.h": "c", + "font_gfx.h": "c", + "display_gfx.h": "c", + "main.h": "c" } } \ No newline at end of file diff --git a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c index 65cd622..7b7d7a4 100644 --- a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c +++ b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c @@ -201,7 +201,7 @@ const uint8_t btn_x10_inverse[] = { // clang-format on -GFX_bitmap_t btn_bottom[DISP_BTN_MAX] = { +GFX_bitmap_t bitmap_btnBottom[DISP_BTN_MAX] = { {25, 11, btn_fre}, {25, 11, btn_fre_inverse}, {25, 11, btn_amp}, diff --git a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h index 1cefd7e..b549390 100644 --- a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h +++ b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h @@ -30,4 +30,4 @@ typedef enum DISP_BTN_MAX, } BITMAP_buttonName_t; -extern GFX_bitmap_t btn_bottom[DISP_BTN_MAX]; +extern GFX_bitmap_t bitmap_btnBottom[DISP_BTN_MAX]; diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c new file mode 100644 index 0000000..e72133a --- /dev/null +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -0,0 +1,214 @@ +#include "main.h" +#include "display_gfx.h" +#include "font_gfx.h" +#include "bitmap_fonts.h" +#include "bitmap_disp_buttons.h" + +// #include "wave_gfx.h" + +#include "printf.h" +#include "disp_layout.h" + +static uint8_t isChannelChange = 1; +static uint8_t isGraphChange = 1; +static uint8_t isValuesChange = 1; +static uint8_t isButtonsChange = 1; +static int8_t isButtonsBlink = 1; + +static uint8_t timer_blink[LAY_BTN_MAX]; + +void LAY_blinkButton(LAY_dispBtnName_t disp_btn) +{ + timer_blink[disp_btn] = 2; + isButtonsBlink = 1; +} + +void LAY_updateChannels(void) +{ + isChannelChange = 1; +} + +void LAY_updateGraph(void) +{ + isGraphChange = 1; +} + +void LAY_updateValues(void) +{ + isValuesChange = 1; +} + +void LAY_updateButtons(void) +{ + isButtonsChange = 1; +} + +static void _drawFreqValue(GFX_display_t *disp) +{ + uint32_t value = getFreqValue(); + uint8_t input[8]; + snprintf((char *)input, 8, "%07u", value); + DISP_writeString(disp, &font5x7Info, input, 76, 13, BM_NORMAL); +} + +static void _drawAmplValue(GFX_display_t *disp) +{ + float value = getAmplValue(); + uint8_t input[8]; + snprintf((char *)input, 8, "%05.2f V", value); + DISP_writeString(disp, &font5x7Info, input, 76, 23, BM_NORMAL); +} + +static void _drawOffsValue(GFX_display_t *disp) +{ + float value = getOffsetValue(); + uint8_t input[8]; + snprintf((char *)input, 8, "%+4.2f V", value); + DISP_writeString(disp, &font5x7Info, input, 76, 33, BM_NORMAL); +} + +static void _drawPhasValue(GFX_display_t *disp) +{ + uint32_t value = getPhaseValue(); + uint8_t input[8]; + snprintf((char *)input, 8, "%03u'", value); + DISP_writeString(disp, &font5x7Info, input, 76, 43, BM_NORMAL); +} + +static void _drawDutyValue(GFX_display_t *disp) +{ + uint32_t value = getDutyValue(); + uint8_t input[8]; + snprintf((char *)input, 8, "%03u%%", value); + DISP_writeString(disp, &font5x7Info, input, 76, 43, BM_NORMAL); // zmien pozycje!!!!!!!! +} + +static void _blinkButtons(GFX_display_t *disp) +{ + // input: display buttons, invert + uint8_t done = 0; + for (LAY_dispBtnName_t disp_btn = LAY_BTN_1; disp_btn < LAY_BTN_MAX; disp_btn++) + { + if (timer_blink[disp_btn] > 0) + { + DISP_drawBitmap(disp, &btn_bottom[disp_btns[curr_layout][disp_btn] + 1], btn_pos_x[disp_btn], 53, BM_NORMAL); + timer_blink[disp_btn]--; + } + else if (timer_blink[disp_btn] == 0) + { + DISP_drawBitmap(disp, &btn_bottom[disp_btns[curr_layout][disp_btn]], btn_pos_x[disp_btn], 53, BM_NORMAL); + done++; + timer_blink[disp_btn]--; + } + } + + if (done == LAY_BTN_MAX) + { + isButtonsBlink = 0; + } +} + +static void _drawButtons(GFX_display_t *disp) +{ + // input: display buttons, invert + DISP_clearRegion(disp, 0, 53, disp->width, 11); + uint8_t pos_x = 0; + + for (LAY_dispBtnName_t disp_btn = LAY_BTN_1; disp_btn < LAY_BTN_MAX; disp_btn++) + { + BITMAP_buttonName_t btn_name = getBitmapName(disp_btn); + + DISP_drawBitmap(disp, &bitmap_btnBottom[btn_name], pos_x, 53, BM_NORMAL); + pos_x += bitmap_btnBottom[btn_name].width + 1; + } + + isButtonsChange = 0; +} + +static void _drawFuncGenValues(GFX_display_t *disp) +{ + DISP_writeString(disp, &font5x7Info, (uint8_t *)"F:", 64, 13, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"A:", 64, 23, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 33, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 43, BM_NORMAL); + + _drawFreqValue(disp); + _drawAmplValue(disp); + _drawOffsValue(disp); + _drawPhasValue(disp); +} + +static void _drawPwmGenValues(GFX_display_t *disp) +{ + DISP_writeString(disp, &font5x7Info, (uint8_t *)"F:", 64, 13, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"A:", 64, 23, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 33, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 43, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"D:", 64, 43, BM_NORMAL); + + _drawFreqValue(disp); + _drawAmplValue(disp); + _drawOffsValue(disp); + _drawPhasValue(disp); + _drawDutyValue(disp); +} + +static void _drawValues(GFX_display_t *disp) +{ + // input: frequency(value), amplitiude(value), offset(value), phase(value), duty(value), invert(info), position(value) + switch (getLayoutType()) + { + case LT_TYPE_FG: + _drawFuncGenValues(disp); + break; + case LT_TYPE_PWM: + _drawPwmGenValues(disp); + break; + + default: + break; + } + + isValuesChange = 0; +} + +static void _drawGraph(GFX_display_t *disp) +{ + // input: graph type(sin, triangle, squere, pwm), frequency(info), amplitiude(value), offset(value), phase(value), invert(pwm), + DISP_drawSin(disp, 4, 32, 16, 0, 0); + DISP_drawHorizontalLine(disp, 2, 32, 56, GFX_WHITE); + + isGraphChange = 0; +} + +static void _drawChannels(GFX_display_t *disp) +{ + // input: active channel + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH1", 2, 2, BM_INVERSE); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH2", 23, 2, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH3", 44, 2, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH4", 65, 2, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH5", 86, 2, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH6", 107, 2, BM_NORMAL); + DISP_drawHorizontalLine(disp, 0, 10, 127, GFX_WHITE); + + isChannelChange = 0; +} + +void LAY_drawDisplayLayout(GFX_display_t *disp) +{ + if (isChannelChange) + _drawChannels(disp); + + if (isGraphChange) + _drawGraph(disp); + + if (isValuesChange) + _drawValues(disp); + + if (isButtonsChange) + _drawButtons(disp); + + if (isButtonsBlink) + _blinkButtons(disp); +} diff --git a/firmware/shared_libs/disp_layout/disp_layout.h b/firmware/shared_libs/disp_layout/disp_layout.h new file mode 100644 index 0000000..ca1c80c --- /dev/null +++ b/firmware/shared_libs/disp_layout/disp_layout.h @@ -0,0 +1,44 @@ +#pragma once + +typedef enum +{ + LAY_BTN_1, + LAY_BTN_2, + LAY_BTN_3, + LAY_BTN_4, + LAY_BTN_5, + LAY_BTN_MAX, +} LAY_dispBtnName_t; + +typedef enum +{ + LAY_CH_1, + LAY_CH_2, + LAY_CH_3, + LAY_CH_4, + LAY_CH_5, + LAY_CH_6, + LAY_CH_MAX, +} LAY_chanName_t; + +typedef enum +{ + LAY_FG_MAIN, + LAY_FG_FREQ, + LAY_FG_AMPL, + LAY_FG_OFFS, + LAY_FG_PHAS, + LAY_FG_WAVE, + LAY_STATE_MAX, +} LAY_state_t; + +typedef enum +{ + LT_TYPE_FG, + LT_TYPE_PWM +} LAY_type_t; + +void LAY_drawDisplayLayout(GFX_display_t *disp); +void LAY_setDisplayLayout(LAY_state_t layout); +void LAY_blinkButton(LAY_dispBtnName_t disp_btn); +void LAY_setFreqValue(uint32_t value);