From fc4687428b114dfcbc30f0091ad227fc6c66a4a6 Mon Sep 17 00:00:00 2001 From: bartool Date: Sun, 26 Mar 2023 19:41:38 +0200 Subject: [PATCH 01/10] [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); From 32daa4bce912cb47936291c0684d2295b28d32c2 Mon Sep 17 00:00:00 2001 From: bartool Date: Thu, 30 Mar 2023 18:32:32 +0200 Subject: [PATCH 02/10] [wip] controllers and display --- firmware/.vscode/c_cpp_properties.json | 14 +- firmware/.vscode/settings.json | 6 +- firmware/func_gen_stm32f303re_nucleo/Makefile | 16 +- .../shared_libs/bitmaps/bitmap_disp_buttons.c | 2 +- .../shared_libs/bitmaps/bitmap_disp_buttons.h | 2 + .../shared_libs/bitmaps/bitmap_font_5x7.c | 2 +- firmware/shared_libs/bitmaps/bitmap_fonts.h | 2 + firmware/shared_libs/config.h | 13 + firmware/shared_libs/controllers/ctrl_app.c | 19 ++ firmware/shared_libs/controllers/ctrl_app.h | 70 ++++++ .../controllers/ctrl_bottom_button.c | 56 +++++ .../controllers/ctrl_bottom_button.h | 14 ++ .../controllers/ctrl_channel_button.c | 62 +++++ .../controllers/ctrl_channel_button.h | 15 ++ .../shared_libs/disp_layout/disp_layout.c | 237 ++++++++---------- .../shared_libs/disp_layout/disp_layout.h | 44 +--- .../disp_layout/disp_layout_defs.c | 13 + .../disp_layout/disp_layout_defs.h | 7 + .../disp_layout/disp_layout_types.h | 22 ++ 19 files changed, 438 insertions(+), 178 deletions(-) create mode 100644 firmware/shared_libs/config.h create mode 100644 firmware/shared_libs/controllers/ctrl_app.c create mode 100644 firmware/shared_libs/controllers/ctrl_app.h create mode 100644 firmware/shared_libs/controllers/ctrl_bottom_button.c create mode 100644 firmware/shared_libs/controllers/ctrl_bottom_button.h create mode 100644 firmware/shared_libs/controllers/ctrl_channel_button.c create mode 100644 firmware/shared_libs/controllers/ctrl_channel_button.h create mode 100644 firmware/shared_libs/disp_layout/disp_layout_defs.c create mode 100644 firmware/shared_libs/disp_layout/disp_layout_defs.h create mode 100644 firmware/shared_libs/disp_layout/disp_layout_types.h diff --git a/firmware/.vscode/c_cpp_properties.json b/firmware/.vscode/c_cpp_properties.json index a2d1f65..b0931cd 100644 --- a/firmware/.vscode/c_cpp_properties.json +++ b/firmware/.vscode/c_cpp_properties.json @@ -3,9 +3,17 @@ { "name": "Win32", "includePath": [ - "${workspaceFolder}/func_gen_stm32f303re_nucleo/Core/**", - "${workspaceFolder}/func_gen_stm32f303re_nucleo/Drivers/**", - "${workspaceFolder}/shared_libs/**" + "${workspaceFolder}/func_gen_stm32f303re_nucleo/Core/Inc", + "${workspaceFolder}/func_gen_stm32f303re_nucleo/Drivers/CMSIS/Core/Include", + "${workspaceFolder}/func_gen_stm32f303re_nucleo/Drivers/CMSIS/Device/ST/STM32F3xx/Include", + "${workspaceFolder}/func_gen_stm32f303re_nucleo/Drivers/STM32F3xx_HAL_Driver/Inc", + "${workspaceFolder}/shared_libs", + "${workspaceFolder}/shared_libs/bitmaps", + "${workspaceFolder}/shared_libs/controllers", + "${workspaceFolder}/shared_libs/disp_layout", + "${workspaceFolder}/shared_libs/display", + "${workspaceFolder}/shared_libs/drivers/**", + "${workspaceFolder}/shared_libs/utils/**" ], "defines": [ "_DEBUG", diff --git a/firmware/.vscode/settings.json b/firmware/.vscode/settings.json index e1eb127..97f9e87 100644 --- a/firmware/.vscode/settings.json +++ b/firmware/.vscode/settings.json @@ -7,6 +7,10 @@ "bitmap_fonts.h": "c", "font_gfx.h": "c", "display_gfx.h": "c", - "main.h": "c" + "main.h": "c", + "ctrl_button.h": "c", + "ctrl_bottom_button.h": "c", + "printf.h": "c", + "disp_layout_template.h": "c" } } \ No newline at end of file diff --git a/firmware/func_gen_stm32f303re_nucleo/Makefile b/firmware/func_gen_stm32f303re_nucleo/Makefile index f762892..9789a43 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Makefile +++ b/firmware/func_gen_stm32f303re_nucleo/Makefile @@ -83,6 +83,13 @@ C_SOURCES += ../shared_libs/display/font_gfx.c # bitmaps C_SOURCES += ../shared_libs/bitmaps/bitmap_disp_buttons.c C_SOURCES += ../shared_libs/bitmaps/bitmap_font_5x7.c +# display_layout +C_SOURCES += ../shared_libs/disp_layout/disp_layout.c +C_SOURCES += ../shared_libs/disp_layout/disp_layout_defs.c +# controllers +C_SOURCES += ../shared_libs/controllers/ctrl_bottom_button.c +C_SOURCES += ../shared_libs/controllers/ctrl_channel_button.c +C_SOURCES += ../shared_libs/controllers/ctrl_app.c # utils/printf C_SOURCES += ../shared_libs/utils/printf/printf.c @@ -165,11 +172,18 @@ C_INCLUDES += -I../shared_libs/drivers/hw_button C_INCLUDES += -I../shared_libs/display # bitmaps includes C_INCLUDES += -I../shared_libs/bitmaps +# display layout includes +C_INCLUDES += -I../shared_libs/disp_layout +# controllers includes +C_INCLUDES += -I../shared_libs/controllers -# utils/print includes +# utils includes C_INCLUDES += -I../shared_libs/utils/printf C_INCLUDES += -I../shared_libs/utils/rtt +# config +C_INCLUDES += -I../shared_libs + # compile gcc flags ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections diff --git a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c index 7b7d7a4..4f9c065 100644 --- a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c +++ b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c @@ -1,5 +1,5 @@ #include "main.h" -#include "display_gfx.h" + #include "bitmap_disp_buttons.h" // clang-format off diff --git a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h index b549390..8c24d04 100644 --- a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h +++ b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h @@ -1,5 +1,7 @@ #pragma once +#include "display_gfx.h" + typedef enum { DISP_BTN_FREQ, diff --git a/firmware/shared_libs/bitmaps/bitmap_font_5x7.c b/firmware/shared_libs/bitmaps/bitmap_font_5x7.c index e1a0d83..f86fa00 100644 --- a/firmware/shared_libs/bitmaps/bitmap_font_5x7.c +++ b/firmware/shared_libs/bitmaps/bitmap_font_5x7.c @@ -1,5 +1,5 @@ #include "main.h" -#include "font_gfx.h" + #include "bitmap_fonts.h" // clang-format off diff --git a/firmware/shared_libs/bitmaps/bitmap_fonts.h b/firmware/shared_libs/bitmaps/bitmap_fonts.h index 8db9ac8..fe85ca0 100644 --- a/firmware/shared_libs/bitmaps/bitmap_fonts.h +++ b/firmware/shared_libs/bitmaps/bitmap_fonts.h @@ -1,5 +1,7 @@ #pragma once +#include "font_gfx.h" + /* Font data for standard 5x7t */ extern const uint8_t font5x7[]; extern const GFX_font_t font5x7Info; diff --git a/firmware/shared_libs/config.h b/firmware/shared_libs/config.h new file mode 100644 index 0000000..75c5c91 --- /dev/null +++ b/firmware/shared_libs/config.h @@ -0,0 +1,13 @@ +#pragma once + +#define BTN1_GPIO_Port GPIOA +#define BTN2_GPIO_Port GPIOA +#define BTN3_GPIO_Port GPIOA +#define BTN4_GPIO_Port GPIOA +#define BTN5_GPIO_Port GPIOA + +#define BTN1_Pin 0 +#define BTN2_Pin 0 +#define BTN3_Pin 0 +#define BTN4_Pin 0 +#define BTN5_Pin 0 \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c new file mode 100644 index 0000000..9a5c76d --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -0,0 +1,19 @@ +#include "main.h" + +#include "ctrl_app.h" + +static GEN_fg_t func_gen[3]; +static GEN_pwm_t pwm_gen[3]; + +const static GENERATOR_t generators[CHANNEL_MAX] = { + {.gen_type = GEN_FG_TYPE, .gen = &func_gen[0]}, + {.gen_type = GEN_FG_TYPE, .gen = &func_gen[1]}, + {.gen_type = GEN_FG_TYPE, .gen = &func_gen[2]}, + {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[0]}, + {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[1]}, + {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[2]}, +}; + +void APP_init(APP_data_t *app_data) +{ +} \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_app.h b/firmware/shared_libs/controllers/ctrl_app.h new file mode 100644 index 0000000..2045f4a --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_app.h @@ -0,0 +1,70 @@ +#pragma once + +#include "disp_layout_types.h" + +typedef struct +{ + uint32_t frequency; + uint16_t amplitude; + uint16_t offset; + uint16_t phase; + uint8_t duty; + uint8_t enabled; +} GEN_pwm_t; + +typedef struct +{ + uint32_t frequency; + uint16_t amplitude; + uint16_t offset; + uint16_t phase; + uint8_t wave; + uint8_t enabled; + uint8_t connected; +} GEN_fg_t; + +typedef enum +{ + GEN_FG_TYPE, + GEN_PWM_TYPE, + GEN_TYPE_MAX +} GEN_type_t; + +typedef struct +{ + GEN_type_t gen_type; + void *gen; +} GENERATOR_t; + +typedef enum +{ + CHANNEL1, + CHANNEL2, + CHANNEL3, + CHANNEL4, + CHANNEL5, + CHANNEL6, + CHANNEL_MAX +} GEN_channel_t; + +typedef struct +{ + uint8_t freq_focus_digit; + uint8_t ampl_focus_digit; + uint8_t offs_focus_digit; + uint8_t phas_focus_digit; + uint8_t duty_focus_digit; + + GEN_type_t gen_type; + void *generator; + + GEN_channel_t curr_channel; + LAY_state_t curr_layout; + uint8_t isChannelChange; + uint8_t isGraphChange; + uint8_t isValueChange; + uint8_t isButtonChange; + uint8_t isButtonBlink; + uint8_t timer_blink[LAY_BTN_MAX]; + +} APP_data_t; diff --git a/firmware/shared_libs/controllers/ctrl_bottom_button.c b/firmware/shared_libs/controllers/ctrl_bottom_button.c new file mode 100644 index 0000000..552d1d9 --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_bottom_button.c @@ -0,0 +1,56 @@ +#include "main.h" +#include "config.h" +#include "hw_button.h" +#include "ctrl_button.h" +#include "ctrl_bottom_button.h" + +static ButtonKey_t bottom_buttons[BTN_BOT_MAX]; + +void CTRL_bottomButtonInit(void) +{ + bottom_buttons[BTN_BOT_1].instance = BTN_BOT_1; + bottom_buttons[BTN_BOT_1].buttonPressed = CTRL_pushedDispBtnEvent; + bottom_buttons[BTN_BOT_1].gpio_port = BTN1_GPIO_Port; + bottom_buttons[BTN_BOT_1].gpio_pin = BTN1_Pin; + bottom_buttons[BTN_BOT_1].pushed_state = GPIO_PIN_SET; + + bottom_buttons[BTN_BOT_2].instance = BTN_BOT_2; + bottom_buttons[BTN_BOT_2].buttonPressed = CTRL_pushedDispBtnEvent; + bottom_buttons[BTN_BOT_2].gpio_port = BTN2_GPIO_Port; + bottom_buttons[BTN_BOT_2].gpio_pin = BTN2_Pin; + bottom_buttons[BTN_BOT_2].pushed_state = GPIO_PIN_SET; + + bottom_buttons[BTN_BOT_3].instance = BTN_BOT_3; + bottom_buttons[BTN_BOT_3].buttonPressed = CTRL_pushedDispBtnEvent; + bottom_buttons[BTN_BOT_3].gpio_port = BTN3_GPIO_Port; + bottom_buttons[BTN_BOT_3].gpio_pin = BTN3_Pin; + bottom_buttons[BTN_BOT_3].pushed_state = GPIO_PIN_SET; + + bottom_buttons[BTN_BOT_4].instance = BTN_BOT_4; + bottom_buttons[BTN_BOT_4].buttonPressed = CTRL_pushedDispBtnEvent; + bottom_buttons[BTN_BOT_4].gpio_port = BTN4_GPIO_Port; + bottom_buttons[BTN_BOT_4].gpio_pin = BTN4_Pin; + bottom_buttons[BTN_BOT_4].pushed_state = GPIO_PIN_SET; + + bottom_buttons[BTN_BOT_5].instance = BTN_BOT_5; + bottom_buttons[BTN_BOT_5].buttonPressed = CTRL_pushedDispBtnEvent; + bottom_buttons[BTN_BOT_5].gpio_port = BTN5_GPIO_Port; + bottom_buttons[BTN_BOT_5].gpio_pin = BTN5_Pin; + bottom_buttons[BTN_BOT_5].pushed_state = GPIO_PIN_SET; + + for (HW_BotBtnName_t btn_key = BTN_BOT_1; btn_key < BTN_BOT_MAX; btn_key++) + { + bottom_buttons[btn_key].state = IDLE; + bottom_buttons[btn_key].timer_debounce = BTN_DEFAULT_DEBOUNCE_MS; + bottom_buttons[btn_key].timer_long_pressed = BTN_DEFAULT_LONGPRESSED_MS; + bottom_buttons[btn_key].timer_repeat_delay = BTN_DEFAULT_REPEAT_MS; + } +} + +void CTRL_bottomButtonsHandler(void) +{ + for (HW_BotBtnName_t btn_key = BTN_BOT_1; btn_key < BTN_BOT_MAX; btn_key++) + { + buttonHandler(&bottom_buttons[btn_key]); + } +} \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_bottom_button.h b/firmware/shared_libs/controllers/ctrl_bottom_button.h new file mode 100644 index 0000000..efc02da --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_bottom_button.h @@ -0,0 +1,14 @@ +#pragma once + +typedef enum +{ + BTN_BOT_1, + BTN_BOT_2, + BTN_BOT_3, + BTN_BOT_4, + BTN_BOT_5, + BTN_BOT_MAX, +} HW_BotBtnName_t; + +void CTRL_bottomButtonInit(void); +void CTRL_bottomButtonsHandler(void); \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_channel_button.c b/firmware/shared_libs/controllers/ctrl_channel_button.c new file mode 100644 index 0000000..be87333 --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_channel_button.c @@ -0,0 +1,62 @@ +#include "main.h" +#include "config.h" +#include "hw_button.h" +#include "ctrl_button.h" +#include "ctrl_channel_button.h" + +static ButtonKey_t channel_buttons[BTN_CH_MAX]; + +void CTRL_channelButtonInit(void) +{ + channel_buttons[BTN_CH_1].instance = BTN_CH_1; + channel_buttons[BTN_CH_1].buttonPressed = CTRL_pushedChanBtnEvent; + channel_buttons[BTN_CH_1].gpio_port = BTN1_GPIO_Port; + channel_buttons[BTN_CH_1].gpio_pin = BTN1_Pin; + channel_buttons[BTN_CH_1].pushed_state = GPIO_PIN_SET; + + channel_buttons[BTN_CH_2].instance = BTN_CH_2; + channel_buttons[BTN_CH_2].buttonPressed = CTRL_pushedChanBtnEvent; + channel_buttons[BTN_CH_2].gpio_port = BTN2_GPIO_Port; + channel_buttons[BTN_CH_2].gpio_pin = BTN2_Pin; + channel_buttons[BTN_CH_2].pushed_state = GPIO_PIN_SET; + + channel_buttons[BTN_CH_3].instance = BTN_CH_3; + channel_buttons[BTN_CH_3].buttonPressed = CTRL_pushedChanBtnEvent; + channel_buttons[BTN_CH_3].gpio_port = BTN3_GPIO_Port; + channel_buttons[BTN_CH_3].gpio_pin = BTN3_Pin; + channel_buttons[BTN_CH_3].pushed_state = GPIO_PIN_SET; + + channel_buttons[BTN_CH_4].instance = BTN_CH_4; + channel_buttons[BTN_CH_4].buttonPressed = CTRL_pushedChanBtnEvent; + channel_buttons[BTN_CH_4].gpio_port = BTN4_GPIO_Port; + channel_buttons[BTN_CH_4].gpio_pin = BTN4_Pin; + channel_buttons[BTN_CH_4].pushed_state = GPIO_PIN_SET; + + channel_buttons[BTN_CH_5].instance = BTN_CH_5; + channel_buttons[BTN_CH_5].buttonPressed = CTRL_pushedChanBtnEvent; + channel_buttons[BTN_CH_5].gpio_port = BTN5_GPIO_Port; + channel_buttons[BTN_CH_5].gpio_pin = BTN5_Pin; + channel_buttons[BTN_CH_5].pushed_state = GPIO_PIN_SET; + + channel_buttons[BTN_CH_6].instance = BTN_CH_6; + channel_buttons[BTN_CH_6].buttonPressed = CTRL_pushedChanBtnEvent; + channel_buttons[BTN_CH_6].gpio_port = BTN5_GPIO_Port; + channel_buttons[BTN_CH_6].gpio_pin = BTN5_Pin; + channel_buttons[BTN_CH_6].pushed_state = GPIO_PIN_SET; + + for (HW_chanBtnName_t btn_key = BTN_CH_1; btn_key < BTN_CH_MAX; btn_key++) + { + channel_buttons[btn_key].state = IDLE; + channel_buttons[btn_key].timer_debounce = BTN_DEFAULT_DEBOUNCE_MS; + channel_buttons[btn_key].timer_long_pressed = BTN_DEFAULT_LONGPRESSED_MS; + channel_buttons[btn_key].timer_repeat_delay = BTN_DEFAULT_REPEAT_MS; + } +} + +void CTRL_channelButtonsHandler(void) +{ + for (HW_chanBtnName_t btn_key = BTN_CH_1; btn_key < BTN_CH_MAX; btn_key++) + { + buttonHandler(&channel_buttons[btn_key]); + } +} \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_channel_button.h b/firmware/shared_libs/controllers/ctrl_channel_button.h new file mode 100644 index 0000000..a0f5a0b --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_channel_button.h @@ -0,0 +1,15 @@ +#pragma once + +typedef enum +{ + BTN_CH_1, + BTN_CH_2, + BTN_CH_3, + BTN_CH_4, + BTN_CH_5, + BTN_CH_6, + BTN_CH_MAX, +} HW_chanBtnName_t; + +void CTRL_channelButtonInit(void); +void CTRL_channelButtonsHandler(void); \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index e72133a..c92ca2e 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -1,214 +1,191 @@ #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 "bitmap_fonts.h" +#include "disp_layout_defs.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) +static void _drawFreqValue(GFX_display_t *disp, uint32_t freq) { - timer_blink[disp_btn] = 2; - isButtonsBlink = 1; + // uint32_t freq = 9999999; + uint8_t data[8]; + snprintf((char *)data, 8, "%07u", freq); + DISP_writeString(disp, &font5x7Info, data, 76, 13, BM_NORMAL); } -void LAY_updateChannels(void) +static void _drawAmplValue(GFX_display_t *disp, uint16_t ampl) { - isChannelChange = 1; + // float ampl = getAmplValue(); + uint8_t data[8]; + // snprintf((char *)data, 8, "%05.2f V", ampl); + snprintf((char *)data, 8, "%02d.%02d V", ampl / 100, ampl % 100); + DISP_writeString(disp, &font5x7Info, data, 76, 23, BM_NORMAL); } -void LAY_updateGraph(void) +static void _drawOffsValue(GFX_display_t *disp, uint16_t offs) { - isGraphChange = 1; + // float offs = getOffsetValue(); + uint8_t data[8]; + // snprintf((char *)data, 8, "%+4.2f V", offs); + snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, offs % 100); + DISP_writeString(disp, &font5x7Info, data, 76, 33, BM_NORMAL); } -void LAY_updateValues(void) +static void _drawPhasValue(GFX_display_t *disp, uint16_t phase) { - isValuesChange = 1; + // uint32_t phase = getPhaseValue(); + uint8_t data[8]; + snprintf((char *)data, 8, "%03u'", phase); + DISP_writeString(disp, &font5x7Info, data, 76, 43, BM_NORMAL); } -void LAY_updateButtons(void) +static void _drawDutyValue(GFX_display_t *disp, uint8_t duty) { - isButtonsChange = 1; + // uint32_t duty = getDutyValue(); + uint8_t data[8]; + snprintf((char *)data, 8, "%03u%%", duty); + DISP_writeString(disp, &font5x7Info, data, 76, 43, BM_NORMAL); // zmien pozycje!!!!!!!! } -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) +static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data) { // input: display buttons, invert - uint8_t done = 0; - for (LAY_dispBtnName_t disp_btn = LAY_BTN_1; disp_btn < LAY_BTN_MAX; disp_btn++) + BITMAP_buttonName_t bitmap_idx; + for (LAY_dispBtnIdx_t btn_idx = LAY_BTN_1; btn_idx < LAY_BTN_MAX; btn_idx++) { - if (timer_blink[disp_btn] > 0) + if (!(app_data->isButtonBlink & (1 << btn_idx))) { - DISP_drawBitmap(disp, &btn_bottom[disp_btns[curr_layout][disp_btn] + 1], btn_pos_x[disp_btn], 53, BM_NORMAL); - timer_blink[disp_btn]--; + continue; } - 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; + bitmap_idx = btn_names[app_data->curr_layout][btn_idx]; + if (app_data->timer_blink[btn_idx] > 0) + { + DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx + 1], btn_pos_x[btn_idx], 53, BM_NORMAL); + app_data->timer_blink[btn_idx]--; + } + else + { + DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx], btn_pos_x[btn_idx], 53, BM_NORMAL); + app_data->isButtonBlink &= ~(1 << btn_idx); + } } } -static void _drawButtons(GFX_display_t *disp) +static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) { // input: display buttons, invert + BITMAP_buttonName_t bitmap_idx; 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++) + for (LAY_dispBtnIdx_t btn_idx = LAY_BTN_1; btn_idx < LAY_BTN_MAX; btn_idx++) { - 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; + bitmap_idx = btn_names[app_data->curr_layout][btn_idx]; + DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx], btn_pos_x[btn_idx], 53, BM_NORMAL); } - isButtonsChange = 0; + app_data->isButtonChange = 0; } -static void _drawFuncGenValues(GFX_display_t *disp) +static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) { 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); + GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->generator; + switch (app_data->curr_layout) + { + case LAY_FG_FREQ: + _drawFreqValue(disp, fun_gen->frequency); + break; + case LAY_FG_AMPL: + _drawAmplValue(disp, fun_gen->amplitude); + break; + case LAY_FG_OFFS: + _drawOffsValue(disp, fun_gen->offset); + break; + case LAY_FG_PHAS: + _drawPhasValue(disp, fun_gen->phase); + break; + default: + break; + } } -static void _drawPwmGenValues(GFX_display_t *disp) +static void _drawPwmGenValues(GFX_display_t *disp, APP_data_t *app_data) { + GEN_pwm_t *pwm_gen = app_data->generator; 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); + _drawFreqValue(disp, pwm_gen->frequency); + _drawAmplValue(disp, pwm_gen->amplitude / 100); + _drawOffsValue(disp, pwm_gen->offset / 100); + _drawPhasValue(disp, pwm_gen->phase); + _drawDutyValue(disp, pwm_gen->duty); } -static void _drawValues(GFX_display_t *disp) +static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) { // input: frequency(value), amplitiude(value), offset(value), phase(value), duty(value), invert(info), position(value) - switch (getLayoutType()) + switch (app_data->gen_type) { - case LT_TYPE_FG: - _drawFuncGenValues(disp); + case GEN_FG_TYPE: + _drawFuncGenValues(disp, app_data); break; - case LT_TYPE_PWM: - _drawPwmGenValues(disp); + case GEN_PWM_TYPE: + _drawPwmGenValues(disp, app_data); break; default: break; } - isValuesChange = 0; + app_data->isValueChange = 0; } -static void _drawGraph(GFX_display_t *disp) +static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data) { // 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_drawSin(disp, 4, 32, 16, 0, 0); DISP_drawHorizontalLine(disp, 2, 32, 56, GFX_WHITE); - isGraphChange = 0; + app_data->isGraphChange = 0; } -static void _drawChannels(GFX_display_t *disp) +static void _drawChannels(GFX_display_t *disp, APP_data_t *app_data) { // 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_writeString(disp, &font5x7Info, (uint8_t *)"CH1", 2, 2, CHANNEL1 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH2", 23, 2, CHANNEL2 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH3", 44, 2, CHANNEL3 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH4", 65, 2, CHANNEL4 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH5", 86, 2, CHANNEL5 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH6", 107, 2, CHANNEL6 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); DISP_drawHorizontalLine(disp, 0, 10, 127, GFX_WHITE); - isChannelChange = 0; + app_data->isChannelChange = 0; } -void LAY_drawDisplayLayout(GFX_display_t *disp) +void LAY_drawDisplayLayout(GFX_display_t *disp, APP_data_t *app_data) { - if (isChannelChange) - _drawChannels(disp); + if (app_data->isChannelChange) + _drawChannels(disp, app_data); - if (isGraphChange) - _drawGraph(disp); + if (app_data->isGraphChange) + _drawGraph(disp, app_data); - if (isValuesChange) - _drawValues(disp); + if (app_data->isValueChange) + _drawValues(disp, app_data); - if (isButtonsChange) - _drawButtons(disp); + if (app_data->isButtonChange) + _drawButtons(disp, app_data); - if (isButtonsBlink) - _blinkButtons(disp); + if (app_data->isButtonBlink) + _blinkButtons(disp, app_data); } diff --git a/firmware/shared_libs/disp_layout/disp_layout.h b/firmware/shared_libs/disp_layout/disp_layout.h index ca1c80c..f06825c 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.h +++ b/firmware/shared_libs/disp_layout/disp_layout.h @@ -1,44 +1,6 @@ #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; +#include "display_gfx.h" +#include "ctrl_app.h" -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); +void LAY_drawDisplayLayout(GFX_display_t *disp, APP_data_t *app_data); diff --git a/firmware/shared_libs/disp_layout/disp_layout_defs.c b/firmware/shared_libs/disp_layout/disp_layout_defs.c new file mode 100644 index 0000000..8fb3395 --- /dev/null +++ b/firmware/shared_libs/disp_layout/disp_layout_defs.c @@ -0,0 +1,13 @@ +#include "main.h" +#include "disp_layout_defs.h" + +const BITMAP_buttonName_t btn_names[LAY_STATE_MAX][LAY_BTN_MAX] = { + {DISP_BTN_FREQ, DISP_BTN_AMPL, DISP_BTN_OFFS, DISP_BTN_PHAS, DISP_BTN_WAVE}, // Func Gen Main + {DISP_BTN_LEFT, DISP_BTN_RIGHT, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Freq + {DISP_BTN_X1, DISP_BTN_X0_1, DISP_BTN_X0_01, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Ampl + {DISP_BTN_X1, DISP_BTN_X0_1, DISP_BTN_X0_01, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Offs + {DISP_BTN_X10, DISP_BTN_X1, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Phas + {DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Wave +}; + +const uint8_t btn_pos_x[LAY_BTN_MAX] = {0, 26, 52, 78, 104}; \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout_defs.h b/firmware/shared_libs/disp_layout/disp_layout_defs.h new file mode 100644 index 0000000..dcfdd83 --- /dev/null +++ b/firmware/shared_libs/disp_layout/disp_layout_defs.h @@ -0,0 +1,7 @@ +#pragma once + +#include "bitmap_disp_buttons.h" +#include "disp_layout_types.h" + +extern const BITMAP_buttonName_t btn_names[LAY_STATE_MAX][LAY_BTN_MAX]; +extern const uint8_t btn_pos_x[LAY_BTN_MAX]; \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout_types.h b/firmware/shared_libs/disp_layout/disp_layout_types.h new file mode 100644 index 0000000..56630c5 --- /dev/null +++ b/firmware/shared_libs/disp_layout/disp_layout_types.h @@ -0,0 +1,22 @@ +#pragma once + +typedef enum +{ + LAY_BTN_1, + LAY_BTN_2, + LAY_BTN_3, + LAY_BTN_4, + LAY_BTN_5, + LAY_BTN_MAX, +} LAY_dispBtnIdx_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; \ No newline at end of file From 07dd185e7cb246f31a9ce98ba24075823a4112d3 Mon Sep 17 00:00:00 2001 From: bartool Date: Sat, 1 Apr 2023 22:43:36 +0200 Subject: [PATCH 03/10] [wip] working on display layout --- firmware/.vscode/launch.json | 1 + firmware/.vscode/settings.json | 4 +- .../Core/Inc/main.h | 20 + .../Core/Inc/spi.h | 3 + .../Core/Src/gpio.c | 41 +- .../Core/Src/main.c | 188 +++++---- .../Core/Src/spi.c | 77 ++++ firmware/func_gen_stm32f303re_nucleo/Makefile | 5 +- .../func_gen_stm32f303re_nucleo.ioc | 87 +++- .../shared_libs/bitmaps/bitmap_disp_buttons.c | 10 +- .../shared_libs/bitmaps/bitmap_disp_buttons.h | 55 +-- firmware/shared_libs/config.h | 13 - firmware/shared_libs/controllers/ctrl_app.c | 382 +++++++++++++++++- firmware/shared_libs/controllers/ctrl_app.h | 40 +- .../shared_libs/controllers/ctrl_app_types.h | 56 +++ .../controllers/ctrl_bottom_button.c | 8 +- .../controllers/ctrl_bottom_button.h | 3 +- .../controllers/ctrl_channel_button.c | 28 +- .../shared_libs/disp_layout/disp_layout.c | 88 ++-- .../disp_layout/disp_layout_defs.c | 13 - .../disp_layout/disp_layout_defs.h | 7 - .../disp_layout/disp_layout_types.h | 22 - firmware/shared_libs/display/display_gfx.c | 2 +- firmware/shared_libs/display/display_gfx.h | 2 +- 24 files changed, 901 insertions(+), 254 deletions(-) delete mode 100644 firmware/shared_libs/config.h create mode 100644 firmware/shared_libs/controllers/ctrl_app_types.h delete mode 100644 firmware/shared_libs/disp_layout/disp_layout_defs.c delete mode 100644 firmware/shared_libs/disp_layout/disp_layout_defs.h delete mode 100644 firmware/shared_libs/disp_layout/disp_layout_types.h diff --git a/firmware/.vscode/launch.json b/firmware/.vscode/launch.json index 3b2ccb2..3189b99 100644 --- a/firmware/.vscode/launch.json +++ b/firmware/.vscode/launch.json @@ -16,6 +16,7 @@ "interface": "swd", "runToMain": true, "svdFile": "STM32F303xE.svd", + "preLaunchTask": "${defaultBuildTask}", "rttConfig": { "enabled": true, "address": "auto", diff --git a/firmware/.vscode/settings.json b/firmware/.vscode/settings.json index 97f9e87..c4e9d03 100644 --- a/firmware/.vscode/settings.json +++ b/firmware/.vscode/settings.json @@ -11,6 +11,8 @@ "ctrl_button.h": "c", "ctrl_bottom_button.h": "c", "printf.h": "c", - "disp_layout_template.h": "c" + "disp_layout_template.h": "c", + "disp_layout_types.h": "c", + "ctrl_app_types.h": "c" } } \ No newline at end of file diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h index d9a4a9b..cb9931c 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h @@ -65,10 +65,30 @@ void Error_Handler(void); #define USART_RX_GPIO_Port GPIOA #define LD2_Pin GPIO_PIN_5 #define LD2_GPIO_Port GPIOA +#define BTN1_Pin GPIO_PIN_1 +#define BTN1_GPIO_Port GPIOB +#define BTN2_Pin GPIO_PIN_2 +#define BTN2_GPIO_Port GPIOB +#define BTN3_Pin GPIO_PIN_11 +#define BTN3_GPIO_Port GPIOB +#define BTN4_Pin GPIO_PIN_12 +#define BTN4_GPIO_Port GPIOB +#define BTN5_Pin GPIO_PIN_11 +#define BTN5_GPIO_Port GPIOA #define TMS_Pin GPIO_PIN_13 #define TMS_GPIO_Port GPIOA #define TCK_Pin GPIO_PIN_14 #define TCK_GPIO_Port GPIOA +#define ST7565_CS_Pin GPIO_PIN_15 +#define ST7565_CS_GPIO_Port GPIOA +#define ST7565_SCK_Pin GPIO_PIN_10 +#define ST7565_SCK_GPIO_Port GPIOC +#define ST7565_RST_Pin GPIO_PIN_11 +#define ST7565_RST_GPIO_Port GPIOC +#define ST7565_MOSI_Pin GPIO_PIN_12 +#define ST7565_MOSI_GPIO_Port GPIOC +#define ST7565_A0_Pin GPIO_PIN_2 +#define ST7565_A0_GPIO_Port GPIOD #define SWO_Pin GPIO_PIN_3 #define SWO_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/spi.h b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/spi.h index 522da13..dd277bf 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/spi.h +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/spi.h @@ -34,11 +34,14 @@ extern "C" { extern SPI_HandleTypeDef hspi2; +extern SPI_HandleTypeDef hspi3; + /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_SPI2_Init(void); +void MX_SPI3_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/gpio.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/gpio.c index 9cc520a..899d233 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/gpio.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/gpio.c @@ -49,9 +49,16 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, LD2_Pin|ST7565_CS_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ST7565_RST_GPIO_Port, ST7565_RST_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ST7565_A0_GPIO_Port, ST7565_A0_Pin, GPIO_PIN_RESET); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = B1_Pin; @@ -59,12 +66,38 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pin : PtPin */ - GPIO_InitStruct.Pin = LD2_Pin; + /*Configure GPIO pins : PAPin PAPin */ + GPIO_InitStruct.Pin = LD2_Pin|ST7565_CS_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : PBPin PBPin PBPin PBPin */ + GPIO_InitStruct.Pin = BTN1_Pin|BTN2_Pin|BTN3_Pin|BTN4_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = BTN5_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(BTN5_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = ST7565_RST_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ST7565_RST_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = ST7565_A0_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ST7565_A0_GPIO_Port, &GPIO_InitStruct); } diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c index 0767dff..b95a4ca 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c @@ -25,7 +25,10 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include "ctrl_app.h" +#include "display_gfx.h" +#include "disp_layout.h" +#include "st7565.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -45,7 +48,9 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ - +st7565_handle_t hst7565; +GFX_display_t disp; +APP_data_t app_data; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -60,96 +65,117 @@ void SystemClock_Config(void); /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ + * @brief The application entry point. + * @retval int + */ int main(void) { - /* USER CODE BEGIN 1 */ + /* USER CODE BEGIN 1 */ - /* USER CODE END 1 */ + /* USER CODE END 1 */ - /* MCU Configuration--------------------------------------------------------*/ + /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN Init */ - /* USER CODE END Init */ + /* USER CODE END Init */ - /* Configure the system clock */ - SystemClock_Config(); + /* Configure the system clock */ + SystemClock_Config(); - /* USER CODE BEGIN SysInit */ + /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ + /* USER CODE END SysInit */ - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_USART2_UART_Init(); - MX_SPI2_Init(); - MX_I2C1_Init(); - /* USER CODE BEGIN 2 */ + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + MX_SPI2_Init(); + MX_I2C1_Init(); + MX_SPI3_Init(); + /* USER CODE BEGIN 2 */ + APP_init(&app_data); - /* USER CODE END 2 */ + hst7565.hspi = &hspi3; + hst7565.cs_port = ST7565_CS_GPIO_Port; + hst7565.cs_pin = ST7565_CS_Pin; + hst7565.a0_port = ST7565_A0_GPIO_Port; + hst7565.a0_pin = ST7565_A0_Pin; + hst7565.rst_port = ST7565_RST_GPIO_Port; + hst7565.rst_pin = ST7565_RST_Pin; + ST7565_Init(&hst7565, &disp); - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + DISP_clearScreen(&disp); + ST7565_DisplayAll(&hst7565); + + uint32_t last_tick = HAL_GetTick(); while (1) { - /* USER CODE END WHILE */ + CTRL_buttonsHandler(); + if (HAL_GetTick() - last_tick > 100) + { + last_tick = HAL_GetTick(); + ST7565_DisplayAll(&hst7565); + LAY_drawDisplayLayout(&disp, &app_data); + } + /* USER CODE END WHILE */ - /* USER CODE BEGIN 3 */ + /* USER CODE BEGIN 3 */ } - /* USER CODE END 3 */ + /* USER CODE END 3 */ } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; - RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) - { - Error_Handler(); - } - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1; - PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; - PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) - { - Error_Handler(); - } + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_I2C1; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } } /* USER CODE BEGIN 4 */ @@ -157,33 +183,33 @@ void SystemClock_Config(void) /* USER CODE END 4 */ /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ void Error_Handler(void) { - /* USER CODE BEGIN Error_Handler_Debug */ + /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } - /* USER CODE END Error_Handler_Debug */ + /* USER CODE END Error_Handler_Debug */ } -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ void assert_failed(uint8_t *file, uint32_t line) { - /* USER CODE BEGIN 6 */ + /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ + /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/spi.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/spi.c index 8dc448c..36dc0fa 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/spi.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/spi.c @@ -25,6 +25,7 @@ /* USER CODE END 0 */ SPI_HandleTypeDef hspi2; +SPI_HandleTypeDef hspi3; /* SPI2 init function */ void MX_SPI2_Init(void) @@ -59,6 +60,40 @@ void MX_SPI2_Init(void) /* USER CODE END SPI2_Init 2 */ +} +/* SPI3 init function */ +void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_1LINE; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 7; + hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ + } void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) @@ -90,6 +125,30 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) /* USER CODE END SPI2_MspInit 1 */ } + else if(spiHandle->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* SPI3 clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC12 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = ST7565_SCK_Pin|ST7565_MOSI_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } } void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) @@ -114,6 +173,24 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) /* USER CODE END SPI2_MspDeInit 1 */ } + else if(spiHandle->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC12 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOC, ST7565_SCK_Pin|ST7565_MOSI_Pin); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Makefile b/firmware/func_gen_stm32f303re_nucleo/Makefile index 9789a43..527d94f 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Makefile +++ b/firmware/func_gen_stm32f303re_nucleo/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Sat Mar 25 21:51:05 CET 2023] +# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Sat Apr 01 12:37:38 CEST 2023] ########################################################################################################################## # ------------------------------------------------ @@ -85,7 +85,6 @@ C_SOURCES += ../shared_libs/bitmaps/bitmap_disp_buttons.c C_SOURCES += ../shared_libs/bitmaps/bitmap_font_5x7.c # display_layout C_SOURCES += ../shared_libs/disp_layout/disp_layout.c -C_SOURCES += ../shared_libs/disp_layout/disp_layout_defs.c # controllers C_SOURCES += ../shared_libs/controllers/ctrl_bottom_button.c C_SOURCES += ../shared_libs/controllers/ctrl_channel_button.c @@ -181,8 +180,6 @@ C_INCLUDES += -I../shared_libs/controllers C_INCLUDES += -I../shared_libs/utils/printf C_INCLUDES += -I../shared_libs/utils/rtt -# config -C_INCLUDES += -I../shared_libs # compile gcc flags ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections diff --git a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc index 4e7a605..116e0e7 100644 --- a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc +++ b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc @@ -11,29 +11,40 @@ Mcu.IP0=I2C1 Mcu.IP1=NVIC Mcu.IP2=RCC Mcu.IP3=SPI2 -Mcu.IP4=SYS -Mcu.IP5=USART2 -Mcu.IPNb=6 +Mcu.IP4=SPI3 +Mcu.IP5=SYS +Mcu.IP6=USART2 +Mcu.IPNb=7 Mcu.Name=STM32F303R(D-E)Tx Mcu.Package=LQFP64 Mcu.Pin0=PC13 Mcu.Pin1=PC14-OSC32_IN -Mcu.Pin10=PB15 -Mcu.Pin11=PA13 -Mcu.Pin12=PA14 -Mcu.Pin13=PB3 -Mcu.Pin14=PB6 -Mcu.Pin15=PB7 -Mcu.Pin16=VP_SYS_VS_Systick +Mcu.Pin10=PB11 +Mcu.Pin11=PB12 +Mcu.Pin12=PB13 +Mcu.Pin13=PB14 +Mcu.Pin14=PB15 +Mcu.Pin15=PA11 +Mcu.Pin16=PA13 +Mcu.Pin17=PA14 +Mcu.Pin18=PA15 +Mcu.Pin19=PC10 Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin20=PC11 +Mcu.Pin21=PC12 +Mcu.Pin22=PD2 +Mcu.Pin23=PB3 +Mcu.Pin24=PB6 +Mcu.Pin25=PB7 +Mcu.Pin26=VP_SYS_VS_Systick Mcu.Pin3=PF0-OSC_IN Mcu.Pin4=PF1-OSC_OUT Mcu.Pin5=PA2 Mcu.Pin6=PA3 Mcu.Pin7=PA5 -Mcu.Pin8=PB13 -Mcu.Pin9=PB14 -Mcu.PinsNb=17 +Mcu.Pin8=PB1 +Mcu.Pin9=PB2 +Mcu.PinsNb=27 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F303RETx @@ -50,6 +61,10 @@ NVIC.PriorityGroup=NVIC_PRIORITYGROUP_0 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true\:true\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false\:false +PA11.GPIOParameters=GPIO_Label +PA11.GPIO_Label=BTN5 +PA11.Locked=true +PA11.Signal=GPIO_Input PA13.GPIOParameters=GPIO_Label PA13.GPIO_Label=TMS PA13.Locked=true @@ -60,6 +75,10 @@ PA14.GPIO_Label=TCK PA14.Locked=true PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK +PA15.GPIOParameters=GPIO_Label +PA15.GPIO_Label=ST7565_CS +PA15.Locked=true +PA15.Signal=GPIO_Output PA2.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode PA2.GPIO_Label=USART_TX PA2.GPIO_Mode=GPIO_MODE_AF_PP @@ -83,12 +102,28 @@ PA5.GPIO_PuPd=GPIO_NOPULL PA5.GPIO_Speed=GPIO_SPEED_FREQ_LOW PA5.Locked=true PA5.Signal=GPIO_Output +PB1.GPIOParameters=GPIO_Label +PB1.GPIO_Label=BTN1 +PB1.Locked=true +PB1.Signal=GPIO_Input +PB11.GPIOParameters=GPIO_Label +PB11.GPIO_Label=BTN3 +PB11.Locked=true +PB11.Signal=GPIO_Input +PB12.GPIOParameters=GPIO_Label +PB12.GPIO_Label=BTN4 +PB12.Locked=true +PB12.Signal=GPIO_Input PB13.Mode=Full_Duplex_Master PB13.Signal=SPI2_SCK PB14.Mode=Full_Duplex_Master PB14.Signal=SPI2_MISO PB15.Mode=Full_Duplex_Master PB15.Signal=SPI2_MOSI +PB2.GPIOParameters=GPIO_Label +PB2.GPIO_Label=BTN2 +PB2.Locked=true +PB2.Signal=GPIO_Input PB3.GPIOParameters=GPIO_Label PB3.GPIO_Label=SWO PB3.Locked=true @@ -98,6 +133,19 @@ PB6.Mode=I2C PB6.Signal=I2C1_SCL PB7.Mode=I2C PB7.Signal=I2C1_SDA +PC10.GPIOParameters=GPIO_Label +PC10.GPIO_Label=ST7565_SCK +PC10.Locked=true +PC10.Mode=Simplex_Bidirectional_Master +PC10.Signal=SPI3_SCK +PC11.GPIOParameters=GPIO_Label +PC11.GPIO_Label=ST7565_RST +PC11.Locked=true +PC11.Signal=GPIO_Output +PC12.GPIOParameters=GPIO_Label +PC12.GPIO_Label=ST7565_MOSI +PC12.Mode=Simplex_Bidirectional_Master +PC12.Signal=SPI3_MOSI PC13.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI PC13.GPIO_Label=B1 [Blue PushButton] PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING @@ -109,6 +157,10 @@ PC14-OSC32_IN.Signal=RCC_OSC32_IN PC15-OSC32_OUT.Locked=true PC15-OSC32_OUT.Mode=LSE-External-Oscillator PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PD2.GPIOParameters=GPIO_Label +PD2.GPIO_Label=ST7565_A0 +PD2.Locked=true +PD2.Signal=GPIO_Output PF0-OSC_IN.Locked=true PF0-OSC_IN.Mode=HSE-External-Clock-Source PF0-OSC_IN.Signal=RCC_OSC_IN @@ -142,7 +194,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=Makefile ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_SPI3_Init-SPI3-false-HAL-true RCC.ADC12outputFreq_Value=72000000 RCC.ADC34outputFreq_Value=72000000 RCC.AHBFreq_Value=72000000 @@ -201,6 +253,13 @@ SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,NSSPMode SPI2.Mode=SPI_MODE_MASTER SPI2.NSSPMode=SPI_NSS_PULSE_ENABLE SPI2.VirtualType=VM_MASTER +SPI3.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_64 +SPI3.CalculateBaudRate=562.5 KBits/s +SPI3.DataSize=SPI_DATASIZE_8BIT +SPI3.Direction=SPI_DIRECTION_1LINE +SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize +SPI3.Mode=SPI_MODE_MASTER +SPI3.VirtualType=VM_MASTER USART2.IPParameters=VirtualMode-Asynchronous USART2.VirtualMode-Asynchronous=VM_ASYNC VP_SYS_VS_Systick.Mode=SysTick diff --git a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c index 4f9c065..4e1e778 100644 --- a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c +++ b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.c @@ -198,10 +198,17 @@ const uint8_t btn_x10_inverse[] = { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF, 0xFB,0xF9, }; +const uint8_t btn_empty[] = { + // res: 25x11 - 50 bytes + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00, +}; // clang-format on -GFX_bitmap_t bitmap_btnBottom[DISP_BTN_MAX] = { +const GFX_bitmap_t bitmap_btnBottom[BITMAP_BTN_MAX] = { {25, 11, btn_fre}, {25, 11, btn_fre_inverse}, {25, 11, btn_amp}, @@ -226,6 +233,7 @@ GFX_bitmap_t bitmap_btnBottom[DISP_BTN_MAX] = { {25, 11, btn_x1_inverse}, {25, 11, btn_x10}, {25, 11, btn_x10_inverse}, + {25, 11, btn_empty}, {0, 0, NULL}, }; diff --git a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h index 8c24d04..885b276 100644 --- a/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h +++ b/firmware/shared_libs/bitmaps/bitmap_disp_buttons.h @@ -4,32 +4,33 @@ typedef enum { - DISP_BTN_FREQ, - DISP_BTN_FREQ_INVERSE, - DISP_BTN_AMPL, - DISP_BTN_AMPL_INVERSE, - DISP_BTN_OFFS, - DISP_BTN_OFFS_INVERSE, - DISP_BTN_PHAS, - DISP_BTN_PHAS_INVERSE, - DISP_BTN_WAVE, - DISP_BTN_WAVE_INVERSE, - DISP_BTN_BACK, - DISP_BTN_BACK_INVERSE, - DISP_BTN_LEFT, - DISP_BTN_LEFT_INVERSE, - DISP_BTN_RIGHT, - DISP_BTN_RIGHT_INVERSE, - DISP_BTN_X0_01, - DISP_BTN_X0_01_INVERSE, - DISP_BTN_X0_1, - DISP_BTN_X0_1_INVERSE, - DISP_BTN_X1, - DISP_BTN_X1_INVERSE, - DISP_BTN_X10, - DISP_BTN_X10_INVERSE, - DISP_BTN_NONE, - DISP_BTN_MAX, + BITMAP_BTN_FREQ, + BITMAP_BTN_FREQ_INVERSE, + BITMAP_BTN_AMPL, + BITMAP_BTN_AMPL_INVERSE, + BITMAP_BTN_OFFS, + BITMAP_BTN_OFFS_INVERSE, + BITMAP_BTN_PHAS, + BITMAP_BTN_PHAS_INVERSE, + BITMAP_BTN_WAVE, + BITMAP_BTN_WAVE_INVERSE, + BITMAP_BTN_BACK, + BITMAP_BTN_BACK_INVERSE, + BITMAP_BTN_LEFT, + BITMAP_BTN_LEFT_INVERSE, + BITMAP_BTN_RIGHT, + BITMAP_BTN_RIGHT_INVERSE, + BITMAP_BTN_X0_01, + BITMAP_BTN_X0_01_INVERSE, + BITMAP_BTN_X0_1, + BITMAP_BTN_X0_1_INVERSE, + BITMAP_BTN_X1, + BITMAP_BTN_X1_INVERSE, + BITMAP_BTN_X10, + BITMAP_BTN_X10_INVERSE, + BITMAP_BTN_EMPTY, + BITMAP_BTN_NONE, + BITMAP_BTN_MAX, } BITMAP_buttonName_t; -extern GFX_bitmap_t bitmap_btnBottom[DISP_BTN_MAX]; +extern const GFX_bitmap_t bitmap_btnBottom[BITMAP_BTN_MAX]; diff --git a/firmware/shared_libs/config.h b/firmware/shared_libs/config.h deleted file mode 100644 index 75c5c91..0000000 --- a/firmware/shared_libs/config.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#define BTN1_GPIO_Port GPIOA -#define BTN2_GPIO_Port GPIOA -#define BTN3_GPIO_Port GPIOA -#define BTN4_GPIO_Port GPIOA -#define BTN5_GPIO_Port GPIOA - -#define BTN1_Pin 0 -#define BTN2_Pin 0 -#define BTN3_Pin 0 -#define BTN4_Pin 0 -#define BTN5_Pin 0 \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c index 9a5c76d..d748aec 100644 --- a/firmware/shared_libs/controllers/ctrl_app.c +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -1,11 +1,31 @@ #include "main.h" +#include "hw_button.h" +#include "ctrl_bottom_button.h" +#include "ctrl_channel_button.h" #include "ctrl_app.h" +#define FUN_GEN_FOCUS_MAX 6U +#define PWM_GEN_FOCUS_MAX 4U + +typedef void (*btn_action_t)(void); + +typedef struct +{ + btn_action_t command; + BITMAP_buttonName_t bitmap_name; +} CMD_button_t; + static GEN_fg_t func_gen[3]; static GEN_pwm_t pwm_gen[3]; -const static GENERATOR_t generators[CHANNEL_MAX] = { +static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX]; +static const LAY_dispBtn_t btn_hw_to_disp[BTN_BOT_MAX] = {DISP_BTN_1, DISP_BTN_2, DISP_BTN_3, DISP_BTN_4, DISP_BTN_5}; + +static HW_BotBtnName_t last_key; +static APP_data_t *_app_data; + +static const GENERATOR_t generators[CHANNEL_MAX] = { {.gen_type = GEN_FG_TYPE, .gen = &func_gen[0]}, {.gen_type = GEN_FG_TYPE, .gen = &func_gen[1]}, {.gen_type = GEN_FG_TYPE, .gen = &func_gen[2]}, @@ -16,4 +36,362 @@ const static GENERATOR_t generators[CHANNEL_MAX] = { void APP_init(APP_data_t *app_data) { -} \ No newline at end of file + _app_data = app_data; + _app_data->freq_focus_digit = 0; + _app_data->ampl_focus_digit = 0; + _app_data->offs_focus_digit = 0; + _app_data->phas_focus_digit = 0; + _app_data->duty_focus_digit = 0; + + _app_data->curr_gen_type = GEN_FG_TYPE; + _app_data->generator = generators[CHANNEL1].gen; + + _app_data->curr_state_lay = LAY_MAIN; + _app_data->curr_state_btn = BTN_MAIN_FG; + + _app_data->isChannelChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isButtonBlink = 1; + + CTRL_buttonsInit(); +} + +void CTRL_buttonsInit(void) +{ + + CTRL_bottomButtonInit(); + // CTRL_channelButtonInit(); +} + +void CTRL_buttonsHandler(void) +{ + CTRL_bottomButtonsHandler(); + CTRL_channelButtonsHandler(); +} + +void CTRL_pushedDispBtnEvent(ButtonKey_t *key) +{ + last_key = btn_hw_to_disp[key->instance]; + btn_command[_app_data->curr_state_btn][last_key].command(); +} + +void CTRL_pushedChanBtnEvent(ButtonKey_t *key) +{ + UNUSED(key); +} + +inline BITMAP_buttonName_t CTRL_getBitmapName(LAY_dispBtn_t disp_btn) +{ + return btn_command[_app_data->curr_state_btn][disp_btn].bitmap_name; +} + +static void _doNoting(void) +{ + return; +} + +static void _backToMain(void) +{ + _app_data->curr_state_lay = LAY_MAIN; + + switch (_app_data->curr_gen_type) + { + case GEN_FG_TYPE: + _app_data->curr_state_btn = BTN_MAIN_FG; + break; + + case GEN_PWM_TYPE: + _app_data->curr_state_btn = BTN_MAIN_PWM; + break; + + default: + break; + } + + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; +} + +static void _blockFocusAtMaxAndMin(void) +{ + switch (_app_data->curr_state_btn) + { + case BTN_FREQ_MIN: + if (_app_data->freq_focus_digit > 0) + { + _app_data->curr_state_btn = BTN_FREQ; + _app_data->isButtonChange = 1; + } + break; + case BTN_FREQ_MAX: + if (_app_data->freq_focus_digit < FUN_GEN_FOCUS_MAX) + { + _app_data->curr_state_btn = BTN_FREQ; + _app_data->isButtonChange = 1; + } + break; + case BTN_FREQ: + if (_app_data->freq_focus_digit == 0) + { + _app_data->curr_state_btn = BTN_FREQ_MIN; + _app_data->isButtonChange = 1; + } + else if (_app_data->freq_focus_digit == FUN_GEN_FOCUS_MAX) + { + _app_data->curr_state_btn = BTN_FREQ_MAX; + _app_data->isButtonChange = 1; + } + break; + default: + break; + } +} + +static void _enterToFreqLayout(void) +{ + _app_data->curr_state_lay = LAY_FREQ; + _app_data->curr_state_btn = BTN_FREQ; + _blockFocusAtMaxAndMin(); + + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; +} + +static void _enterToAmplLayout(void) +{ + _app_data->curr_state_lay = LAY_AMPL; + _app_data->curr_state_btn = BTN_AMPL; + + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; +} + +static void _enterToOffslLayout(void) +{ + _app_data->curr_state_lay = LAY_OFFS; + _app_data->curr_state_btn = BTN_OFFS; + + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; +} + +static void _enterToPhasLayout(void) +{ + _app_data->curr_state_lay = LAY_PHAS; + _app_data->curr_state_btn = BTN_PHAS; + + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; +} + +static void _enterToDutyLayout(void) +{ + _app_data->curr_state_lay = LAY_DUTY; + _app_data->curr_state_btn = BTN_DUTY; + + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; +} + +static void _enterToWavelLayout(void) +{ + _app_data->curr_state_lay = LAY_WAVE; + _app_data->curr_state_btn = BTN_WAVE; + + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; +} + +static void _moveToLeftFocusFreqNumber(void) +{ + _app_data->freq_focus_digit += 1; + _app_data->isValueChange = 1; + + _blockFocusAtMaxAndMin(); + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); +} + +static void _moveToRighttFocusFreqNumber(void) +{ + _app_data->freq_focus_digit -= 1; + _app_data->isValueChange = 1; + + _blockFocusAtMaxAndMin(); + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); +} + +static void _setTo0_01xFocusNumber(void) +{ + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 1; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 1; + break; + default: + break; + } + + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); +} +static void _setTo0_1xFocusNumber(void) +{ + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 10; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 10; + break; + default: + break; + } + + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); +} +static void _setTo1xFocusNumber(void) +{ + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 10; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 10; + break; + case LAY_PHAS: + _app_data->offs_focus_digit = 1; + break; + case LAY_DUTY: + _app_data->offs_focus_digit = 1; + break; + default: + break; + } + + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); +} +static void _setTo10xFocusNumber(void) +{ + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 100; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 100; + break; + case LAY_PHAS: + _app_data->offs_focus_digit = 10; + break; + case LAY_DUTY: + _app_data->offs_focus_digit = 10; + break; + default: + break; + } + + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); +} + +static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX] = { + { + // BTN_MAIN_FG + {_enterToFreqLayout, BITMAP_BTN_FREQ}, + {_enterToAmplLayout, BITMAP_BTN_AMPL}, + {_enterToOffslLayout, BITMAP_BTN_OFFS}, + {_enterToPhasLayout, BITMAP_BTN_PHAS}, + {_enterToWavelLayout, BITMAP_BTN_WAVE}, + }, + { + // BTN_MAIN_PWM + {_enterToFreqLayout, BITMAP_BTN_FREQ}, + {_enterToAmplLayout, BITMAP_BTN_AMPL}, + {_enterToOffslLayout, BITMAP_BTN_OFFS}, + {_enterToPhasLayout, BITMAP_BTN_PHAS}, + {_enterToDutyLayout, BITMAP_BTN_NONE}, + }, + { + // BTN_FREQ + {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, + {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_FREQ_MIN + {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, + {_doNoting, BITMAP_BTN_EMPTY}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_FREQ_MAX + {_doNoting, BITMAP_BTN_EMPTY}, + {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_AMPL + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, + {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_OFFS + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, + {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_PHAS + {_setTo10xFocusNumber, BITMAP_BTN_X10}, + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_DUTY + {_setTo10xFocusNumber, BITMAP_BTN_X10}, + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_WAVE + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + +}; diff --git a/firmware/shared_libs/controllers/ctrl_app.h b/firmware/shared_libs/controllers/ctrl_app.h index 2045f4a..2338b89 100644 --- a/firmware/shared_libs/controllers/ctrl_app.h +++ b/firmware/shared_libs/controllers/ctrl_app.h @@ -1,6 +1,7 @@ #pragma once - -#include "disp_layout_types.h" +#include "hw_button.h" +#include "bitmap_disp_buttons.h" +#include "ctrl_app_types.h" typedef struct { @@ -23,30 +24,12 @@ typedef struct uint8_t connected; } GEN_fg_t; -typedef enum -{ - GEN_FG_TYPE, - GEN_PWM_TYPE, - GEN_TYPE_MAX -} GEN_type_t; - typedef struct { GEN_type_t gen_type; - void *gen; + void *const gen; } GENERATOR_t; -typedef enum -{ - CHANNEL1, - CHANNEL2, - CHANNEL3, - CHANNEL4, - CHANNEL5, - CHANNEL6, - CHANNEL_MAX -} GEN_channel_t; - typedef struct { uint8_t freq_focus_digit; @@ -55,16 +38,25 @@ typedef struct uint8_t phas_focus_digit; uint8_t duty_focus_digit; - GEN_type_t gen_type; + GEN_type_t curr_gen_type; void *generator; GEN_channel_t curr_channel; - LAY_state_t curr_layout; + STATE_layout_t curr_state_lay; + STATE_button_t curr_state_btn; + uint8_t isChannelChange; uint8_t isGraphChange; uint8_t isValueChange; uint8_t isButtonChange; uint8_t isButtonBlink; - uint8_t timer_blink[LAY_BTN_MAX]; + uint8_t timer_blink[DISP_BTN_MAX]; } APP_data_t; + +void APP_init(APP_data_t *app_data); +void CTRL_buttonsInit(void); +void CTRL_buttonsHandler(void); +void CTRL_pushedDispBtnEvent(ButtonKey_t *key); +void CTRL_pushedChanBtnEvent(ButtonKey_t *key); +BITMAP_buttonName_t CTRL_getBitmapName(LAY_dispBtn_t disp_btn); diff --git a/firmware/shared_libs/controllers/ctrl_app_types.h b/firmware/shared_libs/controllers/ctrl_app_types.h new file mode 100644 index 0000000..7423fda --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_app_types.h @@ -0,0 +1,56 @@ +#pragma once + +typedef enum +{ + GEN_FG_TYPE, + GEN_PWM_TYPE, + GEN_TYPE_MAX +} GEN_type_t; + +typedef enum +{ + CHANNEL1, + CHANNEL2, + CHANNEL3, + CHANNEL4, + CHANNEL5, + CHANNEL6, + CHANNEL_MAX +} GEN_channel_t; + +typedef enum +{ + LAY_MAIN, + LAY_FREQ, + LAY_AMPL, + LAY_OFFS, + LAY_PHAS, + LAY_DUTY, + LAY_WAVE, + LAY_STATE_MAX +} STATE_layout_t; + +typedef enum +{ + BTN_MAIN_FG, + BTN_MAIN_PWM, + BTN_FREQ, + BTN_FREQ_MIN, + BTN_FREQ_MAX, + BTN_AMPL, + BTN_OFFS, + BTN_PHAS, + BTN_DUTY, + BTN_WAVE, + BTN_STATE_MAX +} STATE_button_t; + +typedef enum +{ + DISP_BTN_1, + DISP_BTN_2, + DISP_BTN_3, + DISP_BTN_4, + DISP_BTN_5, + DISP_BTN_MAX, +} LAY_dispBtn_t; \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_bottom_button.c b/firmware/shared_libs/controllers/ctrl_bottom_button.c index 552d1d9..51eff34 100644 --- a/firmware/shared_libs/controllers/ctrl_bottom_button.c +++ b/firmware/shared_libs/controllers/ctrl_bottom_button.c @@ -1,7 +1,6 @@ #include "main.h" -#include "config.h" #include "hw_button.h" -#include "ctrl_button.h" +// #include "ctrl_app.h" #include "ctrl_bottom_button.h" static ButtonKey_t bottom_buttons[BTN_BOT_MAX]; @@ -53,4 +52,9 @@ void CTRL_bottomButtonsHandler(void) { buttonHandler(&bottom_buttons[btn_key]); } +} + +__weak void CTRL_pushedDispBtnEvent(ButtonKey_t *key) +{ + UNUSED(key); } \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_bottom_button.h b/firmware/shared_libs/controllers/ctrl_bottom_button.h index efc02da..c987bee 100644 --- a/firmware/shared_libs/controllers/ctrl_bottom_button.h +++ b/firmware/shared_libs/controllers/ctrl_bottom_button.h @@ -11,4 +11,5 @@ typedef enum } HW_BotBtnName_t; void CTRL_bottomButtonInit(void); -void CTRL_bottomButtonsHandler(void); \ No newline at end of file +void CTRL_bottomButtonsHandler(void); +void CTRL_pushedDispBtnEvent(ButtonKey_t *key); diff --git a/firmware/shared_libs/controllers/ctrl_channel_button.c b/firmware/shared_libs/controllers/ctrl_channel_button.c index be87333..6281bec 100644 --- a/firmware/shared_libs/controllers/ctrl_channel_button.c +++ b/firmware/shared_libs/controllers/ctrl_channel_button.c @@ -1,47 +1,49 @@ #include "main.h" -#include "config.h" #include "hw_button.h" #include "ctrl_button.h" #include "ctrl_channel_button.h" +#define DUMMY_GPIO_Port GPIOA +#define DUMMY_GPIO_Pin GPIO_PIN_0 + static ButtonKey_t channel_buttons[BTN_CH_MAX]; void CTRL_channelButtonInit(void) { channel_buttons[BTN_CH_1].instance = BTN_CH_1; channel_buttons[BTN_CH_1].buttonPressed = CTRL_pushedChanBtnEvent; - channel_buttons[BTN_CH_1].gpio_port = BTN1_GPIO_Port; - channel_buttons[BTN_CH_1].gpio_pin = BTN1_Pin; + channel_buttons[BTN_CH_1].gpio_port = DUMMY_GPIO_Port; + channel_buttons[BTN_CH_1].gpio_pin = DUMMY_GPIO_Pin; channel_buttons[BTN_CH_1].pushed_state = GPIO_PIN_SET; channel_buttons[BTN_CH_2].instance = BTN_CH_2; channel_buttons[BTN_CH_2].buttonPressed = CTRL_pushedChanBtnEvent; - channel_buttons[BTN_CH_2].gpio_port = BTN2_GPIO_Port; - channel_buttons[BTN_CH_2].gpio_pin = BTN2_Pin; + channel_buttons[BTN_CH_2].gpio_port = DUMMY_GPIO_Port; + channel_buttons[BTN_CH_2].gpio_pin = DUMMY_GPIO_Pin; channel_buttons[BTN_CH_2].pushed_state = GPIO_PIN_SET; channel_buttons[BTN_CH_3].instance = BTN_CH_3; channel_buttons[BTN_CH_3].buttonPressed = CTRL_pushedChanBtnEvent; - channel_buttons[BTN_CH_3].gpio_port = BTN3_GPIO_Port; - channel_buttons[BTN_CH_3].gpio_pin = BTN3_Pin; + channel_buttons[BTN_CH_3].gpio_port = DUMMY_GPIO_Port; + channel_buttons[BTN_CH_3].gpio_pin = DUMMY_GPIO_Pin; channel_buttons[BTN_CH_3].pushed_state = GPIO_PIN_SET; channel_buttons[BTN_CH_4].instance = BTN_CH_4; channel_buttons[BTN_CH_4].buttonPressed = CTRL_pushedChanBtnEvent; - channel_buttons[BTN_CH_4].gpio_port = BTN4_GPIO_Port; - channel_buttons[BTN_CH_4].gpio_pin = BTN4_Pin; + channel_buttons[BTN_CH_4].gpio_port = DUMMY_GPIO_Port; + channel_buttons[BTN_CH_4].gpio_pin = DUMMY_GPIO_Pin; channel_buttons[BTN_CH_4].pushed_state = GPIO_PIN_SET; channel_buttons[BTN_CH_5].instance = BTN_CH_5; channel_buttons[BTN_CH_5].buttonPressed = CTRL_pushedChanBtnEvent; - channel_buttons[BTN_CH_5].gpio_port = BTN5_GPIO_Port; - channel_buttons[BTN_CH_5].gpio_pin = BTN5_Pin; + channel_buttons[BTN_CH_5].gpio_port = DUMMY_GPIO_Port; + channel_buttons[BTN_CH_5].gpio_pin = DUMMY_GPIO_Pin; channel_buttons[BTN_CH_5].pushed_state = GPIO_PIN_SET; channel_buttons[BTN_CH_6].instance = BTN_CH_6; channel_buttons[BTN_CH_6].buttonPressed = CTRL_pushedChanBtnEvent; - channel_buttons[BTN_CH_6].gpio_port = BTN5_GPIO_Port; - channel_buttons[BTN_CH_6].gpio_pin = BTN5_Pin; + channel_buttons[BTN_CH_6].gpio_port = DUMMY_GPIO_Port; + channel_buttons[BTN_CH_6].gpio_pin = DUMMY_GPIO_Pin; channel_buttons[BTN_CH_6].pushed_state = GPIO_PIN_SET; for (HW_chanBtnName_t btn_key = BTN_CH_1; btn_key < BTN_CH_MAX; btn_key++) diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index c92ca2e..8a4d13d 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -1,23 +1,31 @@ #include "main.h" #include "printf.h" #include "bitmap_fonts.h" -#include "disp_layout_defs.h" +#include "bitmap_disp_buttons.h" #include "disp_layout.h" -static void _drawFreqValue(GFX_display_t *disp, uint32_t freq) +const uint8_t btn_pos_x[DISP_BTN_MAX] = {0, 26, 52, 78, 104}; +const uint8_t marker_freq_pos_X[7] = {76, 84, 90, 96, 105, 111, 118}; + +// clang-format off +const GFX_bitmap_t marker = {05, 03, (uint8_t[]){0xF9,0xFB,0xFF,0xFB,0xF9,}}; + +// clang-format on + +static void _drawFreqValue(GFX_display_t *disp, uint32_t freq, uint8_t pos_y) { - // uint32_t freq = 9999999; uint8_t data[8]; snprintf((char *)data, 8, "%07u", freq); - DISP_writeString(disp, &font5x7Info, data, 76, 13, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[0], 0}, 76, pos_y, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[0], 0}, 76, pos_y, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[1], data[2], data[3], 0}, 84, pos_y, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[4], data[5], data[6], 0}, 105, pos_y, BM_NORMAL); } static void _drawAmplValue(GFX_display_t *disp, uint16_t ampl) { - // float ampl = getAmplValue(); uint8_t data[8]; - // snprintf((char *)data, 8, "%05.2f V", ampl); snprintf((char *)data, 8, "%02d.%02d V", ampl / 100, ampl % 100); DISP_writeString(disp, &font5x7Info, data, 76, 23, BM_NORMAL); } @@ -51,14 +59,14 @@ static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data) { // input: display buttons, invert BITMAP_buttonName_t bitmap_idx; - for (LAY_dispBtnIdx_t btn_idx = LAY_BTN_1; btn_idx < LAY_BTN_MAX; btn_idx++) + for (LAY_dispBtn_t btn_idx = DISP_BTN_1; btn_idx < DISP_BTN_MAX; btn_idx++) { if (!(app_data->isButtonBlink & (1 << btn_idx))) { continue; } - bitmap_idx = btn_names[app_data->curr_layout][btn_idx]; + bitmap_idx = CTRL_getBitmapName(btn_idx); if (app_data->timer_blink[btn_idx] > 0) { DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx + 1], btn_pos_x[btn_idx], 53, BM_NORMAL); @@ -78,38 +86,72 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) BITMAP_buttonName_t bitmap_idx; DISP_clearRegion(disp, 0, 53, disp->width, 11); - for (LAY_dispBtnIdx_t btn_idx = LAY_BTN_1; btn_idx < LAY_BTN_MAX; btn_idx++) + for (LAY_dispBtn_t btn_idx = DISP_BTN_1; btn_idx < DISP_BTN_MAX; btn_idx++) { - bitmap_idx = btn_names[app_data->curr_layout][btn_idx]; + bitmap_idx = CTRL_getBitmapName(btn_idx); DISP_drawBitmap(disp, &bitmap_btnBottom[bitmap_idx], btn_pos_x[btn_idx], 53, BM_NORMAL); } app_data->isButtonChange = 0; } +static void _drawMeterHelper(GFX_display_t *disp, char *min, char *max, uint8_t pos) +{ + DISP_drawPixel(disp, 64, 40, GFX_WHITE); + DISP_drawPixel(disp, 125, 40, GFX_WHITE); + DISP_drawHorizontalLine(disp, 64, 41, 62, GFX_WHITE); + DISP_writeString(disp, &font5x7Info, (uint8_t *)min, 62, 43, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)max, 117, 43, BM_NORMAL); + // marker 0% - 62, 100% - 123 + DISP_drawBitmap(disp, &marker, 62 + pos, 35, BM_NORMAL); +} + +static void _drawFreqValueHelper(GFX_display_t *disp, uint32_t freq, uint8_t focus_digit) +{ + DISP_clearRegion(disp, 64, 13, 66, 40); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"F:", 64, 20, BM_NORMAL); + _drawFreqValue(disp, freq, 20); + DISP_drawBitmap(disp, &marker, marker_freq_pos_X[6 - focus_digit], 15, BM_NORMAL); +} + +static uint8_t _calcMarkePos(uint32_t value, uint32_t max) +{ + return ((62 * value) + (max / 2)) / max; +} + static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) { - 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); - GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->generator; - switch (app_data->curr_layout) + switch (app_data->curr_state_lay) { - case LAY_FG_FREQ: - _drawFreqValue(disp, fun_gen->frequency); + case LAY_FREQ: + _drawFreqValueHelper(disp, fun_gen->frequency, app_data->freq_focus_digit); + _drawMeterHelper(disp, "1", "1M", _calcMarkePos(900000, 1000000)); break; - case LAY_FG_AMPL: + case LAY_AMPL: _drawAmplValue(disp, fun_gen->amplitude); break; - case LAY_FG_OFFS: + case LAY_OFFS: _drawOffsValue(disp, fun_gen->offset); break; - case LAY_FG_PHAS: + case LAY_PHAS: _drawPhasValue(disp, fun_gen->phase); break; + case LAY_MAIN: + DISP_clearRegion(disp, 62, 13, 66, 40); + 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, fun_gen->frequency, 13); + _drawAmplValue(disp, fun_gen->amplitude); + _drawOffsValue(disp, fun_gen->offset); + _drawPhasValue(disp, fun_gen->phase); + break; + default: + // focus break; } } @@ -123,7 +165,7 @@ static void _drawPwmGenValues(GFX_display_t *disp, APP_data_t *app_data) DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 43, BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t *)"D:", 64, 43, BM_NORMAL); - _drawFreqValue(disp, pwm_gen->frequency); + _drawFreqValue(disp, pwm_gen->frequency, 13); _drawAmplValue(disp, pwm_gen->amplitude / 100); _drawOffsValue(disp, pwm_gen->offset / 100); _drawPhasValue(disp, pwm_gen->phase); @@ -133,7 +175,7 @@ static void _drawPwmGenValues(GFX_display_t *disp, APP_data_t *app_data) static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) { // input: frequency(value), amplitiude(value), offset(value), phase(value), duty(value), invert(info), position(value) - switch (app_data->gen_type) + switch (app_data->curr_gen_type) { case GEN_FG_TYPE: _drawFuncGenValues(disp, app_data); diff --git a/firmware/shared_libs/disp_layout/disp_layout_defs.c b/firmware/shared_libs/disp_layout/disp_layout_defs.c deleted file mode 100644 index 8fb3395..0000000 --- a/firmware/shared_libs/disp_layout/disp_layout_defs.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "main.h" -#include "disp_layout_defs.h" - -const BITMAP_buttonName_t btn_names[LAY_STATE_MAX][LAY_BTN_MAX] = { - {DISP_BTN_FREQ, DISP_BTN_AMPL, DISP_BTN_OFFS, DISP_BTN_PHAS, DISP_BTN_WAVE}, // Func Gen Main - {DISP_BTN_LEFT, DISP_BTN_RIGHT, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Freq - {DISP_BTN_X1, DISP_BTN_X0_1, DISP_BTN_X0_01, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Ampl - {DISP_BTN_X1, DISP_BTN_X0_1, DISP_BTN_X0_01, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Offs - {DISP_BTN_X10, DISP_BTN_X1, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Phas - {DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_NONE, DISP_BTN_BACK}, // Func Gen Wave -}; - -const uint8_t btn_pos_x[LAY_BTN_MAX] = {0, 26, 52, 78, 104}; \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout_defs.h b/firmware/shared_libs/disp_layout/disp_layout_defs.h deleted file mode 100644 index dcfdd83..0000000 --- a/firmware/shared_libs/disp_layout/disp_layout_defs.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "bitmap_disp_buttons.h" -#include "disp_layout_types.h" - -extern const BITMAP_buttonName_t btn_names[LAY_STATE_MAX][LAY_BTN_MAX]; -extern const uint8_t btn_pos_x[LAY_BTN_MAX]; \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout_types.h b/firmware/shared_libs/disp_layout/disp_layout_types.h deleted file mode 100644 index 56630c5..0000000 --- a/firmware/shared_libs/disp_layout/disp_layout_types.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -typedef enum -{ - LAY_BTN_1, - LAY_BTN_2, - LAY_BTN_3, - LAY_BTN_4, - LAY_BTN_5, - LAY_BTN_MAX, -} LAY_dispBtnIdx_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; \ No newline at end of file diff --git a/firmware/shared_libs/display/display_gfx.c b/firmware/shared_libs/display/display_gfx.c index ab482cf..f5b5e93 100644 --- a/firmware/shared_libs/display/display_gfx.c +++ b/firmware/shared_libs/display/display_gfx.c @@ -347,7 +347,7 @@ static inline uint8_t _getBitmapByte(const uint8_t *bitmap, uint16_t index, GFX_ * @param pos_y Top left corner y coordinate * @param color Color of pixel BM_NORMAL or BM_INVERSE for bitmap. BM_WHITE or BM_BLACK for fill region. */ -void DISP_drawBitmap(GFX_display_t *disp, GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, GFX_BitmapColor_t color) +void DISP_drawBitmap(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, GFX_BitmapColor_t color) { if (bitmap->width + pos_x < 0 || bitmap->height + pos_y < 0) return; diff --git a/firmware/shared_libs/display/display_gfx.h b/firmware/shared_libs/display/display_gfx.h index 9e35d91..6d6afe4 100644 --- a/firmware/shared_libs/display/display_gfx.h +++ b/firmware/shared_libs/display/display_gfx.h @@ -58,6 +58,6 @@ void DISP_drawFillRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, void DISP_drawCircle(GFX_display_t *disp, int16_t x0, int16_t y0, uint8_t radius, GFX_Color_t color); void DISP_drawQuarterCircle(GFX_display_t *disp, int16_t x0, int16_t y0, uint8_t radius, GFX_CircCorners_t corner, GFX_Color_t color); void DISP_drawRoundRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height, int16_t radius, GFX_Color_t color); -void DISP_drawBitmap(GFX_display_t *disp, GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, GFX_BitmapColor_t color); +void DISP_drawBitmap(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, GFX_BitmapColor_t color); void DISP_clearRegion(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height); void DISP_clearScreen(GFX_display_t *disp); From 45ef68b74d3f7075ab354e82e3b279dba55eda0e Mon Sep 17 00:00:00 2001 From: bartool Date: Sat, 1 Apr 2023 23:23:14 +0200 Subject: [PATCH 04/10] [wip] added amplitude helper --- firmware/shared_libs/controllers/ctrl_app.c | 54 ++++++++-------- .../controllers/ctrl_channel_button.c | 6 +- .../controllers/ctrl_channel_button.h | 3 +- .../shared_libs/disp_layout/disp_layout.c | 64 +++++++++---------- 4 files changed, 66 insertions(+), 61 deletions(-) diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c index d748aec..49a8fbc 100644 --- a/firmware/shared_libs/controllers/ctrl_app.c +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -232,6 +232,24 @@ static void _moveToRighttFocusFreqNumber(void) } static void _setTo0_01xFocusNumber(void) +{ + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 0; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 0; + break; + default: + break; + } + + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; +} +static void _setTo0_1xFocusNumber(void) { switch (_app_data->curr_state_lay) { @@ -247,39 +265,23 @@ static void _setTo0_01xFocusNumber(void) _app_data->timer_blink[last_key] = 2; _app_data->isButtonBlink |= (1 << last_key); -} -static void _setTo0_1xFocusNumber(void) -{ - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 10; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 10; - break; - default: - break; - } - - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; } static void _setTo1xFocusNumber(void) { switch (_app_data->curr_state_lay) { case LAY_AMPL: - _app_data->ampl_focus_digit = 10; + _app_data->ampl_focus_digit = 2; break; case LAY_OFFS: - _app_data->offs_focus_digit = 10; + _app_data->offs_focus_digit = 2; break; case LAY_PHAS: - _app_data->offs_focus_digit = 1; + _app_data->offs_focus_digit = 0; break; case LAY_DUTY: - _app_data->offs_focus_digit = 1; + _app_data->offs_focus_digit = 0; break; default: break; @@ -287,22 +289,23 @@ static void _setTo1xFocusNumber(void) _app_data->timer_blink[last_key] = 2; _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; } static void _setTo10xFocusNumber(void) { switch (_app_data->curr_state_lay) { case LAY_AMPL: - _app_data->ampl_focus_digit = 100; + _app_data->ampl_focus_digit = 3; break; case LAY_OFFS: - _app_data->offs_focus_digit = 100; + _app_data->offs_focus_digit = 3; break; case LAY_PHAS: - _app_data->offs_focus_digit = 10; + _app_data->offs_focus_digit = 1; break; case LAY_DUTY: - _app_data->offs_focus_digit = 10; + _app_data->offs_focus_digit = 1; break; default: break; @@ -310,6 +313,7 @@ static void _setTo10xFocusNumber(void) _app_data->timer_blink[last_key] = 2; _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; } static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX] = { diff --git a/firmware/shared_libs/controllers/ctrl_channel_button.c b/firmware/shared_libs/controllers/ctrl_channel_button.c index 6281bec..37a5912 100644 --- a/firmware/shared_libs/controllers/ctrl_channel_button.c +++ b/firmware/shared_libs/controllers/ctrl_channel_button.c @@ -1,6 +1,5 @@ #include "main.h" #include "hw_button.h" -#include "ctrl_button.h" #include "ctrl_channel_button.h" #define DUMMY_GPIO_Port GPIOA @@ -61,4 +60,9 @@ void CTRL_channelButtonsHandler(void) { buttonHandler(&channel_buttons[btn_key]); } +} + +__weak void CTRL_pushedChanBtnEvent(ButtonKey_t *key) +{ + UNUSED(key); } \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_channel_button.h b/firmware/shared_libs/controllers/ctrl_channel_button.h index a0f5a0b..3cad522 100644 --- a/firmware/shared_libs/controllers/ctrl_channel_button.h +++ b/firmware/shared_libs/controllers/ctrl_channel_button.h @@ -12,4 +12,5 @@ typedef enum } HW_chanBtnName_t; void CTRL_channelButtonInit(void); -void CTRL_channelButtonsHandler(void); \ No newline at end of file +void CTRL_channelButtonsHandler(void); +void CTRL_pushedChanBtnEvent(ButtonKey_t *key); \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index 8a4d13d..e68d0eb 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -5,8 +5,12 @@ #include "disp_layout.h" +#define FREQ_MAX_DIGIT 7 +#define AMPL_MAX_DIGIT 3 + const uint8_t btn_pos_x[DISP_BTN_MAX] = {0, 26, 52, 78, 104}; -const uint8_t marker_freq_pos_X[7] = {76, 84, 90, 96, 105, 111, 118}; +const uint8_t marker_freq_pos_x[FREQ_MAX_DIGIT] = {76, 84, 90, 96, 105, 111, 118}; +const uint8_t marker_ampl_pos_x[AMPL_MAX_DIGIT] = {82, 94, 100}; // clang-format off const GFX_bitmap_t marker = {05, 03, (uint8_t[]){0xF9,0xFB,0xFF,0xFB,0xF9,}}; @@ -23,36 +27,32 @@ static void _drawFreqValue(GFX_display_t *disp, uint32_t freq, uint8_t pos_y) DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[4], data[5], data[6], 0}, 105, pos_y, BM_NORMAL); } -static void _drawAmplValue(GFX_display_t *disp, uint16_t ampl) +static void _drawAmplValue(GFX_display_t *disp, uint16_t ampl, uint8_t pos_y) { uint8_t data[8]; snprintf((char *)data, 8, "%02d.%02d V", ampl / 100, ampl % 100); - DISP_writeString(disp, &font5x7Info, data, 76, 23, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } -static void _drawOffsValue(GFX_display_t *disp, uint16_t offs) +static void _drawOffsValue(GFX_display_t *disp, uint16_t offs, uint8_t pos_y) { - // float offs = getOffsetValue(); uint8_t data[8]; - // snprintf((char *)data, 8, "%+4.2f V", offs); snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, offs % 100); - DISP_writeString(disp, &font5x7Info, data, 76, 33, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } -static void _drawPhasValue(GFX_display_t *disp, uint16_t phase) +static void _drawPhasValue(GFX_display_t *disp, uint16_t phase, uint8_t pos_y) { - // uint32_t phase = getPhaseValue(); uint8_t data[8]; snprintf((char *)data, 8, "%03u'", phase); - DISP_writeString(disp, &font5x7Info, data, 76, 43, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } -static void _drawDutyValue(GFX_display_t *disp, uint8_t duty) +static void _drawDutyValue(GFX_display_t *disp, uint8_t duty, uint8_t pos_y) { - // uint32_t duty = getDutyValue(); uint8_t data[8]; snprintf((char *)data, 8, "%03u%%", duty); - DISP_writeString(disp, &font5x7Info, data, 76, 43, BM_NORMAL); // zmien pozycje!!!!!!!! + DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data) @@ -95,6 +95,11 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) app_data->isButtonChange = 0; } +static uint8_t _calcMarkePos(uint32_t value, uint32_t max) +{ + return ((62 * value) + (max / 2)) / max; +} + static void _drawMeterHelper(GFX_display_t *disp, char *min, char *max, uint8_t pos) { DISP_drawPixel(disp, 64, 40, GFX_WHITE); @@ -111,12 +116,15 @@ static void _drawFreqValueHelper(GFX_display_t *disp, uint32_t freq, uint8_t foc DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"F:", 64, 20, BM_NORMAL); _drawFreqValue(disp, freq, 20); - DISP_drawBitmap(disp, &marker, marker_freq_pos_X[6 - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker, marker_freq_pos_x[(FREQ_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } -static uint8_t _calcMarkePos(uint32_t value, uint32_t max) +static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t focus_digit) { - return ((62 * value) + (max / 2)) / max; + DISP_clearRegion(disp, 64, 13, 66, 40); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"A:", 64, 20, BM_NORMAL); + _drawAmplValue(disp, ampl, 20); + DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) @@ -126,16 +134,15 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) { case LAY_FREQ: _drawFreqValueHelper(disp, fun_gen->frequency, app_data->freq_focus_digit); - _drawMeterHelper(disp, "1", "1M", _calcMarkePos(900000, 1000000)); + _drawMeterHelper(disp, "1", "1M", _calcMarkePos(990000, 1000000)); break; case LAY_AMPL: - _drawAmplValue(disp, fun_gen->amplitude); + _drawAmplValueHelper(disp, fun_gen->amplitude, app_data->ampl_focus_digit); + _drawMeterHelper(disp, "0V", "5V", _calcMarkePos(100, 500)); break; case LAY_OFFS: - _drawOffsValue(disp, fun_gen->offset); break; case LAY_PHAS: - _drawPhasValue(disp, fun_gen->phase); break; case LAY_MAIN: DISP_clearRegion(disp, 62, 13, 66, 40); @@ -145,9 +152,9 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 43, BM_NORMAL); _drawFreqValue(disp, fun_gen->frequency, 13); - _drawAmplValue(disp, fun_gen->amplitude); - _drawOffsValue(disp, fun_gen->offset); - _drawPhasValue(disp, fun_gen->phase); + _drawAmplValue(disp, fun_gen->amplitude, 23); + _drawOffsValue(disp, fun_gen->offset, 33); + _drawPhasValue(disp, fun_gen->phase, 43); break; default: @@ -159,17 +166,6 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) static void _drawPwmGenValues(GFX_display_t *disp, APP_data_t *app_data) { GEN_pwm_t *pwm_gen = app_data->generator; - 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, pwm_gen->frequency, 13); - _drawAmplValue(disp, pwm_gen->amplitude / 100); - _drawOffsValue(disp, pwm_gen->offset / 100); - _drawPhasValue(disp, pwm_gen->phase); - _drawDutyValue(disp, pwm_gen->duty); } static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) From ec33dab70613755a6ca57819eddd830e62aa5e77 Mon Sep 17 00:00:00 2001 From: bartool Date: Sun, 2 Apr 2023 11:55:03 +0200 Subject: [PATCH 05/10] [wip] func gen layout finished --- .../shared_libs/disp_layout/disp_layout.c | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index e68d0eb..418cd5b 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -100,13 +100,24 @@ static uint8_t _calcMarkePos(uint32_t value, uint32_t max) return ((62 * value) + (max / 2)) / max; } +static uint8_t _sizeOfCharArray(char *array) +{ + uint8_t size = 0; + while (*array++) + { + size++; + } + return size; +} + static void _drawMeterHelper(GFX_display_t *disp, char *min, char *max, uint8_t pos) { + uint8_t max_size = _sizeOfCharArray(max); DISP_drawPixel(disp, 64, 40, GFX_WHITE); DISP_drawPixel(disp, 125, 40, GFX_WHITE); DISP_drawHorizontalLine(disp, 64, 41, 62, GFX_WHITE); DISP_writeString(disp, &font5x7Info, (uint8_t *)min, 62, 43, BM_NORMAL); - DISP_writeString(disp, &font5x7Info, (uint8_t *)max, 117, 43, BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)max, 127 - (6 * max_size), 43, BM_NORMAL); // marker 0% - 62, 100% - 123 DISP_drawBitmap(disp, &marker, 62 + pos, 35, BM_NORMAL); } @@ -127,6 +138,22 @@ static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t foc DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } +static void _drawOffsValueHelper(GFX_display_t *disp, uint32_t offs, uint8_t focus_digit) +{ + DISP_clearRegion(disp, 64, 13, 66, 40); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 20, BM_NORMAL); + _drawAmplValue(disp, offs, 20); + DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); +} + +static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t focus_digit) +{ + DISP_clearRegion(disp, 64, 13, 66, 40); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 20, BM_NORMAL); + _drawAmplValue(disp, phase, 20); + DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); +} + static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) { GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->generator; @@ -141,8 +168,12 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) _drawMeterHelper(disp, "0V", "5V", _calcMarkePos(100, 500)); break; case LAY_OFFS: + _drawOffsValueHelper(disp, fun_gen->offset, app_data->offs_focus_digit); + _drawMeterHelper(disp, "-5V", "+5V", _calcMarkePos(100, 500)); break; case LAY_PHAS: + _drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit); + _drawMeterHelper(disp, "0", "360", _calcMarkePos(100, 500)); break; case LAY_MAIN: DISP_clearRegion(disp, 62, 13, 66, 40); From 0f8a5ca047c2502f62c47fe1c4f9549dc0633ca4 Mon Sep 17 00:00:00 2001 From: bartool Date: Sun, 2 Apr 2023 12:27:45 +0200 Subject: [PATCH 06/10] [fix] negative offset --- firmware/shared_libs/controllers/ctrl_app.h | 4 ++-- firmware/shared_libs/disp_layout/disp_layout.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/firmware/shared_libs/controllers/ctrl_app.h b/firmware/shared_libs/controllers/ctrl_app.h index 2338b89..9dc33bf 100644 --- a/firmware/shared_libs/controllers/ctrl_app.h +++ b/firmware/shared_libs/controllers/ctrl_app.h @@ -7,7 +7,7 @@ typedef struct { uint32_t frequency; uint16_t amplitude; - uint16_t offset; + int16_t offset; uint16_t phase; uint8_t duty; uint8_t enabled; @@ -17,7 +17,7 @@ typedef struct { uint32_t frequency; uint16_t amplitude; - uint16_t offset; + int16_t offset; uint16_t phase; uint8_t wave; uint8_t enabled; diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index 418cd5b..575f3d3 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -5,6 +5,8 @@ #include "disp_layout.h" +#define abs(x) ((x) < 0 ? -(x) : (x)) + #define FREQ_MAX_DIGIT 7 #define AMPL_MAX_DIGIT 3 @@ -34,10 +36,10 @@ static void _drawAmplValue(GFX_display_t *disp, uint16_t ampl, uint8_t pos_y) DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } -static void _drawOffsValue(GFX_display_t *disp, uint16_t offs, uint8_t pos_y) +static void _drawOffsValue(GFX_display_t *disp, int16_t offs, uint8_t pos_y) { uint8_t data[8]; - snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, offs % 100); + snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, abs(offs) % 100); DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } @@ -98,6 +100,7 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) static uint8_t _calcMarkePos(uint32_t value, uint32_t max) { return ((62 * value) + (max / 2)) / max; + // return (value < 0) ? ((62 * value) - (max / 2)) / max : ((62 * value) + (max / 2)) / max; } static uint8_t _sizeOfCharArray(char *array) @@ -138,11 +141,11 @@ static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t foc DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } -static void _drawOffsValueHelper(GFX_display_t *disp, uint32_t offs, uint8_t focus_digit) +static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focus_digit) { DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 20, BM_NORMAL); - _drawAmplValue(disp, offs, 20); + _drawOffsValue(disp, offs, 20); DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } @@ -150,7 +153,7 @@ static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t f { DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 20, BM_NORMAL); - _drawAmplValue(disp, phase, 20); + _drawPhasValue(disp, phase, 20); DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } @@ -168,8 +171,9 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) _drawMeterHelper(disp, "0V", "5V", _calcMarkePos(100, 500)); break; case LAY_OFFS: + fun_gen->offset = -123; _drawOffsValueHelper(disp, fun_gen->offset, app_data->offs_focus_digit); - _drawMeterHelper(disp, "-5V", "+5V", _calcMarkePos(100, 500)); + _drawMeterHelper(disp, "-5V", "+5V", _calcMarkePos(100 + 250, 500 + 250)); break; case LAY_PHAS: _drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit); From b4dd5c789ca0e1d9f05ccf626b6e2a72b0ce2839 Mon Sep 17 00:00:00 2001 From: bartool Date: Sun, 30 Apr 2023 07:27:59 +0200 Subject: [PATCH 07/10] [wip] working on display graph --- firmware/.vscode/settings.json | 3 +- .../func_gen_stm32f303re_nucleo/.mxproject | 26 +-- .../Core/Inc/stm32f3xx_hal_conf.h | 2 +- .../Core/Inc/tim.h | 55 +++++ .../Core/Src/main.c | 165 +++++++------- .../Core/Src/tim.c | 202 ++++++++++++++++++ firmware/func_gen_stm32f303re_nucleo/Makefile | 6 +- .../func_gen_stm32f303re_nucleo.ioc | 66 ++++-- firmware/shared_libs/bitmaps/bitmap_wave.c | 57 +++++ firmware/shared_libs/bitmaps/bitmap_wave.h | 13 ++ firmware/shared_libs/controllers/ctrl_app.c | 1 + .../shared_libs/controllers/ctrl_app_types.h | 10 +- .../shared_libs/disp_layout/disp_layout.c | 112 ++++++++-- firmware/shared_libs/display/display_gfx.c | 81 ++++++- firmware/shared_libs/display/display_gfx.h | 5 +- 15 files changed, 663 insertions(+), 141 deletions(-) create mode 100644 firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h create mode 100644 firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c create mode 100644 firmware/shared_libs/bitmaps/bitmap_wave.c create mode 100644 firmware/shared_libs/bitmaps/bitmap_wave.h diff --git a/firmware/.vscode/settings.json b/firmware/.vscode/settings.json index c4e9d03..c36b291 100644 --- a/firmware/.vscode/settings.json +++ b/firmware/.vscode/settings.json @@ -13,6 +13,7 @@ "printf.h": "c", "disp_layout_template.h": "c", "disp_layout_types.h": "c", - "ctrl_app_types.h": "c" + "ctrl_app_types.h": "c", + "tim.h": "c" } } \ No newline at end of file diff --git a/firmware/func_gen_stm32f303re_nucleo/.mxproject b/firmware/func_gen_stm32f303re_nucleo/.mxproject index a6536c9..0debea6 100644 --- a/firmware/func_gen_stm32f303re_nucleo/.mxproject +++ b/firmware/func_gen_stm32f303re_nucleo/.mxproject @@ -1,32 +1,34 @@ [PreviousLibFiles] -LibFiles=Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_usart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart_ex.h;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_usart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart_ex.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f303xe.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\system_stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; +LibFiles=Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_usart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart_ex.h;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_usart.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_uart_ex.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f303xe.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\system_stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; [PreviousUsedMakefileFiles] -SourceFiles=Core\Src\main.c;Core\Src\gpio.c;Core\Src\i2c.c;Core\Src\spi.c;Core\Src\usart.c;Core\Src\stm32f3xx_it.c;Core\Src\stm32f3xx_hal_msp.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;;; +SourceFiles=Core\Src\main.c;Core\Src\gpio.c;Core\Src\i2c.c;Core\Src\spi.c;Core\Src\tim.c;Core\Src\usart.c;Core\Src\stm32f3xx_it.c;Core\Src\stm32f3xx_hal_msp.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_uart_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;;; HeaderPath=Drivers\STM32F3xx_HAL_Driver\Inc;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy;Drivers\CMSIS\Device\ST\STM32F3xx\Include;Drivers\CMSIS\Include;Core\Inc; CDefines=USE_HAL_DRIVER;STM32F303xE;USE_HAL_DRIVER;USE_HAL_DRIVER; [PreviousGenFiles] AdvancedFolderStructure=true -HeaderFileListSize=7 +HeaderFileListSize=8 HeaderFiles#0=..\Core\Inc\gpio.h HeaderFiles#1=..\Core\Inc\i2c.h HeaderFiles#2=..\Core\Inc\spi.h -HeaderFiles#3=..\Core\Inc\usart.h -HeaderFiles#4=..\Core\Inc\stm32f3xx_it.h -HeaderFiles#5=..\Core\Inc\stm32f3xx_hal_conf.h -HeaderFiles#6=..\Core\Inc\main.h +HeaderFiles#3=..\Core\Inc\tim.h +HeaderFiles#4=..\Core\Inc\usart.h +HeaderFiles#5=..\Core\Inc\stm32f3xx_it.h +HeaderFiles#6=..\Core\Inc\stm32f3xx_hal_conf.h +HeaderFiles#7=..\Core\Inc\main.h HeaderFolderListSize=1 HeaderPath#0=..\Core\Inc HeaderFiles=; -SourceFileListSize=7 +SourceFileListSize=8 SourceFiles#0=..\Core\Src\gpio.c SourceFiles#1=..\Core\Src\i2c.c SourceFiles#2=..\Core\Src\spi.c -SourceFiles#3=..\Core\Src\usart.c -SourceFiles#4=..\Core\Src\stm32f3xx_it.c -SourceFiles#5=..\Core\Src\stm32f3xx_hal_msp.c -SourceFiles#6=..\Core\Src\main.c +SourceFiles#3=..\Core\Src\tim.c +SourceFiles#4=..\Core\Src\usart.c +SourceFiles#5=..\Core\Src\stm32f3xx_it.c +SourceFiles#6=..\Core\Src\stm32f3xx_hal_msp.c +SourceFiles#7=..\Core\Src\main.c SourceFolderListSize=1 SourcePath#0=..\Core\Src SourceFiles=; diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/stm32f3xx_hal_conf.h b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/stm32f3xx_hal_conf.h index 157f7a7..54801f0 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/stm32f3xx_hal_conf.h +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/stm32f3xx_hal_conf.h @@ -57,7 +57,7 @@ /*#define HAL_RNG_MODULE_ENABLED */ /*#define HAL_RTC_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED -/*#define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /*#define HAL_USART_MODULE_ENABLED */ /*#define HAL_IRDA_MODULE_ENABLED */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h new file mode 100644 index 0000000..1cfd24e --- /dev/null +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/tim.h @@ -0,0 +1,55 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.h + * @brief This file contains all the function prototypes for + * the tim.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __TIM_H__ +#define __TIM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern TIM_HandleTypeDef htim2; + +extern TIM_HandleTypeDef htim3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_TIM2_Init(void); +void MX_TIM3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIM_H__ */ + diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c index b95a4ca..b48f5e0 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c @@ -20,6 +20,7 @@ #include "main.h" #include "i2c.h" #include "spi.h" +#include "tim.h" #include "usart.h" #include "gpio.h" @@ -65,38 +66,40 @@ void SystemClock_Config(void); /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ + * @brief The application entry point. + * @retval int + */ int main(void) { - /* USER CODE BEGIN 1 */ + /* USER CODE BEGIN 1 */ - /* USER CODE END 1 */ + /* USER CODE END 1 */ - /* MCU Configuration--------------------------------------------------------*/ + /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN Init */ - /* USER CODE END Init */ + /* USER CODE END Init */ - /* Configure the system clock */ - SystemClock_Config(); + /* Configure the system clock */ + SystemClock_Config(); - /* USER CODE BEGIN SysInit */ + /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ + /* USER CODE END SysInit */ - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_USART2_UART_Init(); - MX_SPI2_Init(); - MX_I2C1_Init(); - MX_SPI3_Init(); - /* USER CODE BEGIN 2 */ + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + MX_SPI2_Init(); + MX_I2C1_Init(); + MX_SPI3_Init(); + MX_TIM2_Init(); + MX_TIM3_Init(); + /* USER CODE BEGIN 2 */ APP_init(&app_data); hst7565.hspi = &hspi3; @@ -108,10 +111,10 @@ int main(void) hst7565.rst_pin = ST7565_RST_Pin; ST7565_Init(&hst7565, &disp); - /* USER CODE END 2 */ + /* USER CODE END 2 */ - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ DISP_clearScreen(&disp); ST7565_DisplayAll(&hst7565); @@ -125,57 +128,61 @@ int main(void) ST7565_DisplayAll(&hst7565); LAY_drawDisplayLayout(&disp, &app_data); } - /* USER CODE END WHILE */ + /* USER CODE END WHILE */ - /* USER CODE BEGIN 3 */ + /* USER CODE BEGIN 3 */ } - /* USER CODE END 3 */ + /* USER CODE END 3 */ } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; - RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) - { - Error_Handler(); - } - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_I2C1; - PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; - PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) - { - Error_Handler(); - } + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1 + |RCC_PERIPHCLK_TIM2|RCC_PERIPHCLK_TIM34; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + PeriphClkInit.Tim2ClockSelection = RCC_TIM2CLK_HCLK; + PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } } /* USER CODE BEGIN 4 */ @@ -183,33 +190,33 @@ void SystemClock_Config(void) /* USER CODE END 4 */ /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ void Error_Handler(void) { - /* USER CODE BEGIN Error_Handler_Debug */ + /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } - /* USER CODE END Error_Handler_Debug */ + /* USER CODE END Error_Handler_Debug */ } -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ void assert_failed(uint8_t *file, uint32_t line) { - /* USER CODE BEGIN 6 */ + /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ + /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c new file mode 100644 index 0000000..91b3645 --- /dev/null +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/tim.c @@ -0,0 +1,202 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.c + * @brief This file provides code for the configuration + * of the TIM instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "tim.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; + +/* TIM2 init function */ +void MX_TIM2_Init(void) +{ + + /* USER CODE BEGIN TIM2_Init 0 */ + + /* USER CODE END TIM2_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM2_Init 1 */ + + /* USER CODE END TIM2_Init 1 */ + htim2.Instance = TIM2; + htim2.Init.Prescaler = 0; + htim2.Init.CounterMode = TIM_COUNTERMODE_UP; + htim2.Init.Period = 4294967295; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM2_Init 2 */ + + /* USER CODE END TIM2_Init 2 */ + +} +/* TIM3 init function */ +void MX_TIM3_Init(void) +{ + + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_Encoder_InitTypeDef sConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 0; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 255; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + sConfig.EncoderMode = TIM_ENCODERMODE_TI1; + sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; + sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC1Prescaler = TIM_ICPSC_DIV1; + sConfig.IC1Filter = 15; + sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; + sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC2Prescaler = TIM_ICPSC_DIV1; + sConfig.IC2Filter = 15; + if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + +} + +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspInit 0 */ + + /* USER CODE END TIM2_MspInit 0 */ + /* TIM2 clock enable */ + __HAL_RCC_TIM2_CLK_ENABLE(); + /* USER CODE BEGIN TIM2_MspInit 1 */ + + /* USER CODE END TIM2_MspInit 1 */ + } +} + +void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(tim_encoderHandle->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* TIM3 clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PA6 ------> TIM3_CH1 + PA7 ------> TIM3_CH2 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } +} + +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspDeInit 0 */ + + /* USER CODE END TIM2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM2_CLK_DISABLE(); + /* USER CODE BEGIN TIM2_MspDeInit 1 */ + + /* USER CODE END TIM2_MspDeInit 1 */ + } +} + +void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) +{ + + if(tim_encoderHandle->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + + /**TIM3 GPIO Configuration + PA6 ------> TIM3_CH1 + PA7 ------> TIM3_CH2 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Makefile b/firmware/func_gen_stm32f303re_nucleo/Makefile index 527d94f..1718e2f 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Makefile +++ b/firmware/func_gen_stm32f303re_nucleo/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Sat Apr 01 12:37:38 CEST 2023] +# File automatically-generated by tool: [projectgenerator] version: [3.17.1] date: [Fri Apr 21 19:03:25 CEST 2023] ########################################################################################################################## # ------------------------------------------------ @@ -62,7 +62,8 @@ Core/Src/system_stm32f3xx.c \ Core/Src/spi.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c \ -Core/Src/i2c.c +Core/Src/i2c.c \ +Core/Src/tim.c ###################################### # shared libs source @@ -83,6 +84,7 @@ C_SOURCES += ../shared_libs/display/font_gfx.c # bitmaps C_SOURCES += ../shared_libs/bitmaps/bitmap_disp_buttons.c C_SOURCES += ../shared_libs/bitmaps/bitmap_font_5x7.c +C_SOURCES += ../shared_libs/bitmaps/bitmap_wave.c # display_layout C_SOURCES += ../shared_libs/disp_layout/disp_layout.c # controllers diff --git a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc index 116e0e7..f61b5ca 100644 --- a/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc +++ b/firmware/func_gen_stm32f303re_nucleo/func_gen_stm32f303re_nucleo.ioc @@ -13,38 +13,43 @@ Mcu.IP2=RCC Mcu.IP3=SPI2 Mcu.IP4=SPI3 Mcu.IP5=SYS -Mcu.IP6=USART2 -Mcu.IPNb=7 +Mcu.IP6=TIM2 +Mcu.IP7=TIM3 +Mcu.IP8=USART2 +Mcu.IPNb=9 Mcu.Name=STM32F303R(D-E)Tx Mcu.Package=LQFP64 Mcu.Pin0=PC13 Mcu.Pin1=PC14-OSC32_IN -Mcu.Pin10=PB11 -Mcu.Pin11=PB12 -Mcu.Pin12=PB13 -Mcu.Pin13=PB14 -Mcu.Pin14=PB15 -Mcu.Pin15=PA11 -Mcu.Pin16=PA13 -Mcu.Pin17=PA14 -Mcu.Pin18=PA15 -Mcu.Pin19=PC10 +Mcu.Pin10=PB1 +Mcu.Pin11=PB2 +Mcu.Pin12=PB11 +Mcu.Pin13=PB12 +Mcu.Pin14=PB13 +Mcu.Pin15=PB14 +Mcu.Pin16=PB15 +Mcu.Pin17=PA11 +Mcu.Pin18=PA13 +Mcu.Pin19=PA14 Mcu.Pin2=PC15-OSC32_OUT -Mcu.Pin20=PC11 -Mcu.Pin21=PC12 -Mcu.Pin22=PD2 -Mcu.Pin23=PB3 -Mcu.Pin24=PB6 -Mcu.Pin25=PB7 -Mcu.Pin26=VP_SYS_VS_Systick +Mcu.Pin20=PA15 +Mcu.Pin21=PC10 +Mcu.Pin22=PC11 +Mcu.Pin23=PC12 +Mcu.Pin24=PD2 +Mcu.Pin25=PB3 +Mcu.Pin26=PB6 +Mcu.Pin27=PB7 +Mcu.Pin28=VP_SYS_VS_Systick +Mcu.Pin29=VP_TIM2_VS_ClockSourceINT Mcu.Pin3=PF0-OSC_IN Mcu.Pin4=PF1-OSC_OUT Mcu.Pin5=PA2 Mcu.Pin6=PA3 Mcu.Pin7=PA5 -Mcu.Pin8=PB1 -Mcu.Pin9=PB2 -Mcu.PinsNb=27 +Mcu.Pin8=PA6 +Mcu.Pin9=PA7 +Mcu.PinsNb=30 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F303RETx @@ -102,6 +107,9 @@ PA5.GPIO_PuPd=GPIO_NOPULL PA5.GPIO_Speed=GPIO_SPEED_FREQ_LOW PA5.Locked=true PA5.Signal=GPIO_Output +PA6.Signal=S_TIM3_CH1 +PA7.Locked=true +PA7.Signal=S_TIM3_CH2 PB1.GPIOParameters=GPIO_Label PB1.GPIO_Label=BTN1 PB1.Locked=true @@ -194,7 +202,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=Makefile ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_SPI3_Init-SPI3-false-HAL-true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_I2C1_Init-I2C1-false-HAL-true,6-MX_SPI3_Init-SPI3-false-HAL-true,7-MX_TIM2_Init-TIM2-false-HAL-true RCC.ADC12outputFreq_Value=72000000 RCC.ADC34outputFreq_Value=72000000 RCC.AHBFreq_Value=72000000 @@ -245,6 +253,10 @@ RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 SH.GPXTI13.0=GPIO_EXTI13 SH.GPXTI13.ConfNb=1 +SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface +SH.S_TIM3_CH1.ConfNb=1 +SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface +SH.S_TIM3_CH2.ConfNb=1 SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32 SPI2.CalculateBaudRate=1.125 MBits/s SPI2.DataSize=SPI_DATASIZE_8BIT @@ -260,9 +272,17 @@ SPI3.Direction=SPI_DIRECTION_1LINE SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize SPI3.Mode=SPI_MODE_MASTER SPI3.VirtualType=VM_MASTER +TIM2.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE +TIM2.IPParameters=AutoReloadPreload +TIM3.IC1Filter=15 +TIM3.IC2Filter=15 +TIM3.IPParameters=Period,IC1Filter,IC2Filter +TIM3.Period=255 USART2.IPParameters=VirtualMode-Asynchronous USART2.VirtualMode-Asynchronous=VM_ASYNC VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM2_VS_ClockSourceINT.Mode=Internal +VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT board=NUCLEO-F303RE boardIOC=true diff --git a/firmware/shared_libs/bitmaps/bitmap_wave.c b/firmware/shared_libs/bitmaps/bitmap_wave.c new file mode 100644 index 0000000..dd7c4c6 --- /dev/null +++ b/firmware/shared_libs/bitmaps/bitmap_wave.c @@ -0,0 +1,57 @@ +#include "main.h" + +#include "bitmap_wave.h" + +// clang-format off +const uint8_t wave_sin[] = { + // res: 48x25(32) - 192 bytes + 0x00,0x00,0x80,0x60,0x10,0x08,0x04,0x04,0x02,0x02,0x01,0x01,0x01,0x01,0x02,0x02, + 0x04,0x04,0x08,0x10,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x18,0x06,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x18,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x40, + 0x80,0x80,0x00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x0C,0x03,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; + +const uint8_t wave_tri[] = { + // res: 48x25(32) - 192 bytes + 0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08, + 0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08, + 0x10,0x20,0x40,0x80,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +const uint8_t wave_sqr[] = { + // res: 48x25(32) - 192 bytes + 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +}; + +const GFX_bitmap_t wave[WAVE_MAX] = { + {48, 25, wave_sin}, + {48, 25, wave_tri}, + {48, 25, wave_sqr}, +}; diff --git a/firmware/shared_libs/bitmaps/bitmap_wave.h b/firmware/shared_libs/bitmaps/bitmap_wave.h new file mode 100644 index 0000000..929210c --- /dev/null +++ b/firmware/shared_libs/bitmaps/bitmap_wave.h @@ -0,0 +1,13 @@ +#pragma once + +#include "display_gfx.h" + +typedef enum +{ + WAVE_SIN, + WAVE_TRI, + WAVE_SQR, + WAVE_MAX +} BITMAP_wave_t; + +extern const GFX_bitmap_t wave[WAVE_MAX]; \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c index 49a8fbc..3d5cb34 100644 --- a/firmware/shared_libs/controllers/ctrl_app.c +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -113,6 +113,7 @@ static void _backToMain(void) _app_data->isButtonChange = 1; _app_data->isGraphChange = 1; _app_data->isValueChange = 1; + _app_data->isGraphChange = 1; } static void _blockFocusAtMaxAndMin(void) diff --git a/firmware/shared_libs/controllers/ctrl_app_types.h b/firmware/shared_libs/controllers/ctrl_app_types.h index 7423fda..91a6de9 100644 --- a/firmware/shared_libs/controllers/ctrl_app_types.h +++ b/firmware/shared_libs/controllers/ctrl_app_types.h @@ -18,6 +18,14 @@ typedef enum CHANNEL_MAX } GEN_channel_t; +typedef enum +{ + GEN_SIN, + GEN_TRI, + GEN_SQR, + GEN_WAVE_MAX, +} GEN_wave_t; + typedef enum { LAY_MAIN, @@ -53,4 +61,4 @@ typedef enum DISP_BTN_4, DISP_BTN_5, DISP_BTN_MAX, -} LAY_dispBtn_t; \ No newline at end of file +} LAY_dispBtn_t; diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index 575f3d3..1a3bc06 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -2,6 +2,9 @@ #include "printf.h" #include "bitmap_fonts.h" #include "bitmap_disp_buttons.h" +#include "bitmap_wave.h" +#include "tim.h" +#include "SEGGER_RTT.h" #include "disp_layout.h" @@ -15,7 +18,8 @@ const uint8_t marker_freq_pos_x[FREQ_MAX_DIGIT] = {76, 84, 90, 96, 105, 111, 118 const uint8_t marker_ampl_pos_x[AMPL_MAX_DIGIT] = {82, 94, 100}; // clang-format off -const GFX_bitmap_t marker = {05, 03, (uint8_t[]){0xF9,0xFB,0xFF,0xFB,0xF9,}}; +const GFX_bitmap_t marker_down = {05, 03, (uint8_t[]){0x01,0x03,0x07,0x03,0x01}};// res: 5x3(8) - 5 bytes +const GFX_bitmap_t marker_up = {05, 03, (uint8_t[]){0x04,0x06,0x07,0x06,0x04}}; // res: 5x3(8) - 5 bytes // clang-format on @@ -97,12 +101,22 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) app_data->isButtonChange = 0; } -static uint8_t _calcMarkePos(uint32_t value, uint32_t max) +static uint8_t _calcMarkerPos(uint32_t value, uint32_t max) { return ((62 * value) + (max / 2)) / max; // return (value < 0) ? ((62 * value) - (max / 2)) / max : ((62 * value) + (max / 2)) / max; } +static uint8_t _calcPhaseShiftInPxl(uint32_t value, uint32_t max) +{ + return ((48 * value) + (max / 2)) / max; +} + +static int32_t _calcVerticalShiftInPxl(int16_t value, int16_t max) +{ + return (value < 0) ? ((12 * value) - (max / 2)) / max : ((12 * value) + (max / 2)) / max; +} + static uint8_t _sizeOfCharArray(char *array) { uint8_t size = 0; @@ -122,7 +136,7 @@ static void _drawMeterHelper(GFX_display_t *disp, char *min, char *max, uint8_t DISP_writeString(disp, &font5x7Info, (uint8_t *)min, 62, 43, BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t *)max, 127 - (6 * max_size), 43, BM_NORMAL); // marker 0% - 62, 100% - 123 - DISP_drawBitmap(disp, &marker, 62 + pos, 35, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, 62 + pos, 35, BM_NORMAL); } static void _drawFreqValueHelper(GFX_display_t *disp, uint32_t freq, uint8_t focus_digit) @@ -130,7 +144,7 @@ static void _drawFreqValueHelper(GFX_display_t *disp, uint32_t freq, uint8_t foc DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"F:", 64, 20, BM_NORMAL); _drawFreqValue(disp, freq, 20); - DISP_drawBitmap(disp, &marker, marker_freq_pos_x[(FREQ_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_freq_pos_x[(FREQ_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t focus_digit) @@ -138,7 +152,7 @@ static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t foc DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"A:", 64, 20, BM_NORMAL); _drawAmplValue(disp, ampl, 20); - DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focus_digit) @@ -146,7 +160,7 @@ static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focu DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 20, BM_NORMAL); _drawOffsValue(disp, offs, 20); - DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t focus_digit) @@ -154,7 +168,7 @@ static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t f DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 20, BM_NORMAL); _drawPhasValue(disp, phase, 20); - DISP_drawBitmap(disp, &marker, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) @@ -164,20 +178,19 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) { case LAY_FREQ: _drawFreqValueHelper(disp, fun_gen->frequency, app_data->freq_focus_digit); - _drawMeterHelper(disp, "1", "1M", _calcMarkePos(990000, 1000000)); + _drawMeterHelper(disp, "1", "1M", _calcMarkerPos(990000, 1000000)); break; case LAY_AMPL: _drawAmplValueHelper(disp, fun_gen->amplitude, app_data->ampl_focus_digit); - _drawMeterHelper(disp, "0V", "5V", _calcMarkePos(100, 500)); + _drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(100, 500)); break; case LAY_OFFS: - fun_gen->offset = -123; _drawOffsValueHelper(disp, fun_gen->offset, app_data->offs_focus_digit); - _drawMeterHelper(disp, "-5V", "+5V", _calcMarkePos(100 + 250, 500 + 250)); + _drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(100 + 250, 500 + 250)); break; case LAY_PHAS: _drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit); - _drawMeterHelper(disp, "0", "360", _calcMarkePos(100, 500)); + _drawMeterHelper(disp, "0", "360", _calcMarkerPos(100, 500)); break; case LAY_MAIN: DISP_clearRegion(disp, 62, 13, 66, 40); @@ -222,11 +235,74 @@ static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) app_data->isValueChange = 0; } +static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) +{ + int8_t offs_shift = _calcVerticalShiftInPxl(offs, ampl); + + if (offs_shift > 20) + { + offs_shift = 20; + } + if (offs_shift < -19) + { + offs_shift = -19; + } + + DISP_drawHorizontalLine(disp, 2, 31 + offs_shift, 57, GFX_WHITE); +} + +static void _drawMaxAmpLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) +{ + DISP_drawHorizontalLine(disp, 2, 12, 57, GFX_WHITE); + DISP_drawBitmap(disp, &marker_up, 0, 13, BM_NORMAL); + + DISP_drawHorizontalLine(disp, 2, 51, 57, GFX_WHITE); + DISP_drawBitmap(disp, &marker_down, 0, 48, BM_NORMAL); +} + +static void _drawFunGenGraph(GFX_display_t *disp, APP_data_t *app_data) +{ + GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->generator; + + switch (fun_gen->wave) + { + case GEN_SIN: + DISP_drawBitmapShift(disp, &wave[WAVE_SIN], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL); + break; + case GEN_TRI: + DISP_drawBitmapShift(disp, &wave[WAVE_TRI], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL); + break; + case GEN_SQR: + DISP_drawBitmapShift(disp, &wave[WAVE_SQR], 6, 19, _calcPhaseShiftInPxl(fun_gen->phase, 360), BM_NORMAL); + break; + default: + break; + } + + _drawOffsetLine(disp, fun_gen->offset, fun_gen->amplitude); + // _drawMaxAmpLine(disp, fun_gen->offset, fun_gen->amplitude); +} +static void _drawPwmGenGraph(GFX_display_t *disp, APP_data_t *app_data) +{ +} + static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data) { // 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); + DISP_drawVerticalLine(disp, 2, 12, 40, GFX_WHITE); + + switch (app_data->curr_gen_type) + { + case GEN_FG_TYPE: + _drawFunGenGraph(disp, app_data); + break; + case GEN_PWM_TYPE: + _drawPwmGenGraph(disp, app_data); + break; + + default: + break; + } app_data->isGraphChange = 0; } @@ -234,7 +310,7 @@ static void _drawGraph(GFX_display_t *disp, APP_data_t *app_data) static void _drawChannels(GFX_display_t *disp, APP_data_t *app_data) { // input: active channel - DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH1", 2, 2, CHANNEL1 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); + DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH1", 2, 1, CHANNEL1 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH2", 23, 2, CHANNEL2 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH3", 44, 2, CHANNEL3 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t *)"CH4", 65, 2, CHANNEL4 == app_data->curr_channel ? BM_INVERSE : BM_NORMAL); @@ -250,12 +326,12 @@ void LAY_drawDisplayLayout(GFX_display_t *disp, APP_data_t *app_data) if (app_data->isChannelChange) _drawChannels(disp, app_data); - if (app_data->isGraphChange) - _drawGraph(disp, app_data); - if (app_data->isValueChange) _drawValues(disp, app_data); + if (app_data->isGraphChange) + _drawGraph(disp, app_data); + if (app_data->isButtonChange) _drawButtons(disp, app_data); diff --git a/firmware/shared_libs/display/display_gfx.c b/firmware/shared_libs/display/display_gfx.c index f5b5e93..e697478 100644 --- a/firmware/shared_libs/display/display_gfx.c +++ b/firmware/shared_libs/display/display_gfx.c @@ -44,6 +44,31 @@ void DISP_drawPixel(GFX_display_t *disp, uint8_t x, uint8_t y, GFX_Color_t color break; } } +void DISP_drawBitmapSlow(GFX_display_t *disp, const GFX_bitmap_t *bitmap, uint8_t x, uint8_t y) +{ + uint8_t row_div_by_8 = 0; + uint8_t mask = 0; + uint8_t bitmap_byte = 0; + + for (uint8_t row = 0; row < bitmap->height; row++) + { + row_div_by_8 = row / 8; + mask = (row % 8); + for (uint8_t col = 0; col < bitmap->width; col++) + { + + bitmap_byte = bitmap->bitmap[row_div_by_8 * bitmap->width + col]; + if (bitmap_byte & (1 << mask)) + { + DISP_drawPixel(disp, col + x, row + y, GFX_WHITE); + } + else + { + DISP_drawPixel(disp, col + x, row + y, GFX_BLACK); + } + } + } +} /** * @brief Draw a vertical line. @@ -97,7 +122,7 @@ void DISP_drawSlashLine(GFX_display_t *disp, int16_t x0, int16_t y0, int16_t x1, /** * @brief Write a perfectly vertical line * @param disp A pointer to display struct - * @param x Top-most x coordinate + * @param x Left-most x coordinate * @param y Top-most y coordinate * @param height Height in pixels * @param color Color of pixel WHITE(0), BLACK(1) or INVERSE(2) @@ -114,11 +139,11 @@ void DISP_drawVerticalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t he @brief Write a perfectly horizontal line @param disp A pointer to display struct @param x Left-most x coordinate - @param y Left-most y coordinate + @param y Top-most y coordinate @param width Width in pixels @param color Color of pixel WHITE(0), BLACK(1) or INVERSE(2) */ -void DISP_drawHorizontalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, GFX_Color_t color) +void DISP_drawHorizontalLine(GFX_display_t *disp, uint8_t x, uint8_t y, uint8_t width, GFX_Color_t color) { for (int16_t i = x; i < x + width; i++) { @@ -396,6 +421,56 @@ void DISP_drawBitmap(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos } } +void DISP_drawBitmapShift(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, uint8_t shift_left, GFX_BitmapColor_t color) +{ + if (bitmap->width + pos_x < 0 || bitmap->height + pos_y < 0) + return; + + uint16_t tmp_buf16, bitmap_idx, buf_idx; + uint8_t tmp_bitmap, bitmap_row; + + buf_bitmap_boundry_t b; + _getBoundry(disp, &b, bitmap->width, bitmap->height, pos_x, pos_y); + + b.bitmap_col = (b.bitmap_col + shift_left) % bitmap->width; + for (uint8_t col = b.buf_col_first; col < b.buf_col_last; col++, b.bitmap_col = (b.bitmap_col + 1) % bitmap->width) + { + tmp_buf16 = 0; + bitmap_row = b.bitmap_row_first; + + if (b.bitmap_row_first > 0) + { + tmp_buf16 = _getBitmapByte(bitmap->bitmap, bitmap->width * (b.bitmap_row_first - 1) + b.bitmap_col, color) >> (8 - b.bitmap_shift); + } + else + { + tmp_buf16 = disp->buffor[b.buf_row_first * disp->width + col] & b.buf_mask_top; + } + + for (uint8_t buf_row = b.buf_row_first; buf_row < b.buf_row_last; buf_row++, bitmap_row++) + { + bitmap_idx = bitmap->width * bitmap_row + b.bitmap_col; + buf_idx = buf_row * disp->width + col; + + if (bitmap_idx < b.bitmap_max_idx) + { + tmp_bitmap = _getBitmapByte(bitmap->bitmap, bitmap_idx, color); + tmp_buf16 |= tmp_bitmap << b.bitmap_shift; + } + + if (b.bitmap_row_last == buf_row) + { + disp->buffor[buf_idx] = (disp->buffor[buf_idx] & b.buf_mask_bottom) | (tmp_buf16 & ~(b.buf_mask_bottom)); + } + else + { + disp->buffor[buf_idx] = (uint8_t)tmp_buf16; + } + tmp_buf16 = tmp_buf16 >> 8; + } + } +} + void DISP_drawFillRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height) { GFX_bitmap_t area = { diff --git a/firmware/shared_libs/display/display_gfx.h b/firmware/shared_libs/display/display_gfx.h index 6d6afe4..b3b8dee 100644 --- a/firmware/shared_libs/display/display_gfx.h +++ b/firmware/shared_libs/display/display_gfx.h @@ -51,7 +51,7 @@ typedef struct void DISP_drawPixel(GFX_display_t *disp, uint8_t x, uint8_t y, GFX_Color_t color); void DISP_drawVerticalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t height, GFX_Color_t color); -void DISP_drawHorizontalLine(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, GFX_Color_t color); +void DISP_drawHorizontalLine(GFX_display_t *disp, uint8_t x, uint8_t y, uint8_t width, GFX_Color_t color); void DISP_drawSlashLine(GFX_display_t *disp, int16_t x0, int16_t y0, int16_t x1, int16_t y1, GFX_Color_t color); void DISP_drawRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height, GFX_Color_t color); void DISP_drawFillRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height); @@ -59,5 +59,8 @@ void DISP_drawCircle(GFX_display_t *disp, int16_t x0, int16_t y0, uint8_t radius void DISP_drawQuarterCircle(GFX_display_t *disp, int16_t x0, int16_t y0, uint8_t radius, GFX_CircCorners_t corner, GFX_Color_t color); void DISP_drawRoundRect(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height, int16_t radius, GFX_Color_t color); void DISP_drawBitmap(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, GFX_BitmapColor_t color); +void DISP_drawBitmapShift(GFX_display_t *disp, const GFX_bitmap_t *bitmap, int8_t pos_x, int8_t pos_y, uint8_t shift_left, GFX_BitmapColor_t color); void DISP_clearRegion(GFX_display_t *disp, int16_t x, int16_t y, int16_t width, int16_t height); void DISP_clearScreen(GFX_display_t *disp); + +void DISP_drawBitmapSlow(GFX_display_t *disp, const GFX_bitmap_t *bitmap, uint8_t x, uint8_t y); From f729829cb2844bdc3e6a7aa0c92621047043ca00 Mon Sep 17 00:00:00 2001 From: bartool Date: Mon, 1 May 2023 13:26:02 +0200 Subject: [PATCH 08/10] [wip] added encoder --- firmware/.vscode/c_cpp_properties.json | 3 +- firmware/.vscode/launch.json | 56 +- firmware/.vscode/settings.json | 3 +- .../Core/Inc/main.h | 66 +- .../Core/Src/main.c | 185 ++--- firmware/func_gen_stm32f303re_nucleo/Makefile | 7 +- firmware/shared_libs/controllers/ctrl_app.c | 688 +++++++++++------- firmware/shared_libs/controllers/ctrl_app.h | 3 +- .../shared_libs/controllers/ctrl_app_types.h | 8 + .../shared_libs/controllers/ctrl_encoder.c | 16 + .../shared_libs/controllers/ctrl_encoder.h | 3 + .../shared_libs/disp_layout/disp_layout.c | 44 +- firmware/shared_libs/utils/ulog/ulog.c | 154 ++++ firmware/shared_libs/utils/ulog/ulog.h | 188 +++++ 14 files changed, 981 insertions(+), 443 deletions(-) create mode 100644 firmware/shared_libs/controllers/ctrl_encoder.c create mode 100644 firmware/shared_libs/controllers/ctrl_encoder.h create mode 100644 firmware/shared_libs/utils/ulog/ulog.c create mode 100644 firmware/shared_libs/utils/ulog/ulog.h diff --git a/firmware/.vscode/c_cpp_properties.json b/firmware/.vscode/c_cpp_properties.json index b0931cd..2b6970c 100644 --- a/firmware/.vscode/c_cpp_properties.json +++ b/firmware/.vscode/c_cpp_properties.json @@ -20,7 +20,8 @@ "UNICODE", "_UNICODE", "STM32F303xE", - "USE_HAL_DRIVER" + "USE_HAL_DRIVER", + "ULOG_ENABLED" ], "compilerPath": "C:/MyApps/arm-gcc/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc.exe", "cStandard": "c11", diff --git a/firmware/.vscode/launch.json b/firmware/.vscode/launch.json index 3189b99..ae12e0f 100644 --- a/firmware/.vscode/launch.json +++ b/firmware/.vscode/launch.json @@ -27,36 +27,36 @@ "type": "console", "timestamp": true }, - { - "label": "RTT graph", - "port": 0, - "encoding": "unsigned", - "graphId": "1", - "scale": 1 - } + // { + // "label": "RTT graph", + // "port": 0, + // "encoding": "unsigned", + // "graphId": "1", + // "scale": 1 + // } ] }, - "graphConfig": [ - { - "label": "Graph 1", - "type": "realtime", - "minimum": 0, - "maximum": 65535, - "timespan": 30, - "plots": [ - { - "graphId": "1", - "label": "data 1", - "color": "#53753c", - }, - { - "graphId": "2", - "label": "data 2", - "color": "#955f20" - } - ] - } - ] + // "graphConfig": [ + // { + // "label": "Graph 1", + // "type": "realtime", + // "minimum": 0, + // "maximum": 65535, + // "timespan": 30, + // "plots": [ + // { + // "graphId": "1", + // "label": "data 1", + // "color": "#53753c", + // }, + // { + // "graphId": "2", + // "label": "data 2", + // "color": "#955f20" + // } + // ] + // } + // ] } ] } \ No newline at end of file diff --git a/firmware/.vscode/settings.json b/firmware/.vscode/settings.json index c36b291..eed5eb5 100644 --- a/firmware/.vscode/settings.json +++ b/firmware/.vscode/settings.json @@ -14,6 +14,7 @@ "disp_layout_template.h": "c", "disp_layout_types.h": "c", "ctrl_app_types.h": "c", - "tim.h": "c" + "tim.h": "c", + "ulog.h": "c" } } \ No newline at end of file diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h index cb9931c..3aab5bd 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Inc/main.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ @@ -23,7 +23,8 @@ #define __MAIN_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif /* Includes ------------------------------------------------------------------*/ @@ -31,26 +32,27 @@ extern "C" { /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +// #include "SEGGER_RTT.h" +#include "ulog.h" + /* USER CODE END Includes */ -/* USER CODE END Includes */ + /* Exported types ------------------------------------------------------------*/ + /* USER CODE BEGIN ET */ -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ + /* USER CODE END ET */ -/* USER CODE END ET */ + /* Exported constants --------------------------------------------------------*/ + /* USER CODE BEGIN EC */ -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ + /* USER CODE END EC */ -/* USER CODE END EC */ + /* Exported macro ------------------------------------------------------------*/ + /* USER CODE BEGIN EM */ -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ + /* USER CODE END EM */ -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); + /* Exported functions prototypes ---------------------------------------------*/ + void Error_Handler(void); /* USER CODE BEGIN EFP */ @@ -91,9 +93,9 @@ void Error_Handler(void); #define ST7565_A0_GPIO_Port GPIOD #define SWO_Pin GPIO_PIN_3 #define SWO_GPIO_Port GPIOB -/* USER CODE BEGIN Private defines */ + /* USER CODE BEGIN Private defines */ -/* USER CODE END Private defines */ + /* USER CODE END Private defines */ #ifdef __cplusplus } diff --git a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c index b48f5e0..c3e49e8 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c +++ b/firmware/func_gen_stm32f303re_nucleo/Core/Src/main.c @@ -30,6 +30,7 @@ #include "display_gfx.h" #include "disp_layout.h" #include "st7565.h" +#include "SEGGER_RTT.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -57,7 +58,7 @@ APP_data_t app_data; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ - +void RTT_console_logger(ulog_level_t severity, char *msg); /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ @@ -66,41 +67,47 @@ void SystemClock_Config(void); /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ + * @brief The application entry point. + * @retval int + */ int main(void) { - /* USER CODE BEGIN 1 */ + /* USER CODE BEGIN 1 */ - /* USER CODE END 1 */ + /* USER CODE END 1 */ - /* MCU Configuration--------------------------------------------------------*/ + /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN Init */ - /* USER CODE END Init */ + /* USER CODE END Init */ - /* Configure the system clock */ - SystemClock_Config(); + /* Configure the system clock */ + SystemClock_Config(); - /* USER CODE BEGIN SysInit */ + /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + MX_SPI2_Init(); + MX_I2C1_Init(); + MX_SPI3_Init(); + MX_TIM2_Init(); + MX_TIM3_Init(); + /* USER CODE BEGIN 2 */ + ulog_init(); + ulog_subscribe(RTT_console_logger, ULOG_DEBUG_LEVEL); - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_USART2_UART_Init(); - MX_SPI2_Init(); - MX_I2C1_Init(); - MX_SPI3_Init(); - MX_TIM2_Init(); - MX_TIM3_Init(); - /* USER CODE BEGIN 2 */ APP_init(&app_data); + HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); + // SEGGER_RTT_WriteString(0, "App start...\n"); + ULOG_INFO("start app..."); hst7565.hspi = &hspi3; hst7565.cs_port = ST7565_CS_GPIO_Port; @@ -111,10 +118,10 @@ int main(void) hst7565.rst_pin = ST7565_RST_Pin; ST7565_Init(&hst7565, &disp); - /* USER CODE END 2 */ + /* USER CODE END 2 */ - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ DISP_clearScreen(&disp); ST7565_DisplayAll(&hst7565); @@ -128,95 +135,99 @@ int main(void) ST7565_DisplayAll(&hst7565); LAY_drawDisplayLayout(&disp, &app_data); } - /* USER CODE END WHILE */ + /* USER CODE END WHILE */ - /* USER CODE BEGIN 3 */ + /* USER CODE BEGIN 3 */ } - /* USER CODE END 3 */ + /* USER CODE END 3 */ } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; - RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) - { - Error_Handler(); - } - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_I2C1 - |RCC_PERIPHCLK_TIM2|RCC_PERIPHCLK_TIM34; - PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; - PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; - PeriphClkInit.Tim2ClockSelection = RCC_TIM2CLK_HCLK; - PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) - { - Error_Handler(); - } + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_TIM2 | RCC_PERIPHCLK_TIM34; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + PeriphClkInit.Tim2ClockSelection = RCC_TIM2CLK_HCLK; + PeriphClkInit.Tim34ClockSelection = RCC_TIM34CLK_HCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } } /* USER CODE BEGIN 4 */ - +void RTT_console_logger(ulog_level_t severity, char *msg) +{ + SEGGER_RTT_printf(0, "[%s]: %s\n", + // HAL_GetTick(), // user defined function + ulog_level_name(severity), + msg); +} /* USER CODE END 4 */ /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ void Error_Handler(void) { - /* USER CODE BEGIN Error_Handler_Debug */ + /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } - /* USER CODE END Error_Handler_Debug */ + /* USER CODE END Error_Handler_Debug */ } -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ void assert_failed(uint8_t *file, uint32_t line) { - /* USER CODE BEGIN 6 */ + /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ + /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ diff --git a/firmware/func_gen_stm32f303re_nucleo/Makefile b/firmware/func_gen_stm32f303re_nucleo/Makefile index 1718e2f..c5a2606 100644 --- a/firmware/func_gen_stm32f303re_nucleo/Makefile +++ b/firmware/func_gen_stm32f303re_nucleo/Makefile @@ -91,12 +91,15 @@ C_SOURCES += ../shared_libs/disp_layout/disp_layout.c C_SOURCES += ../shared_libs/controllers/ctrl_bottom_button.c C_SOURCES += ../shared_libs/controllers/ctrl_channel_button.c C_SOURCES += ../shared_libs/controllers/ctrl_app.c +C_SOURCES += ../shared_libs/controllers/ctrl_encoder.c # utils/printf C_SOURCES += ../shared_libs/utils/printf/printf.c # utils/rtt C_SOURCES += ../shared_libs/utils/rtt/SEGGER_RTT.c C_SOURCES += ../shared_libs/utils/rtt/SEGGER_RTT_printf.c +# utils/ulog +C_SOURCES += ../shared_libs/utils/ulog/ulog.c # ASM sources ASM_SOURCES = \ @@ -145,7 +148,8 @@ AS_DEFS = # C defines C_DEFS = \ -DUSE_HAL_DRIVER \ --DSTM32F303xE +-DSTM32F303xE \ +-DULOG_ENABLED # AS includes @@ -181,6 +185,7 @@ C_INCLUDES += -I../shared_libs/controllers # utils includes C_INCLUDES += -I../shared_libs/utils/printf C_INCLUDES += -I../shared_libs/utils/rtt +C_INCLUDES += -I../shared_libs/utils/ulog # compile gcc flags diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c index 3d5cb34..4d76d96 100644 --- a/firmware/shared_libs/controllers/ctrl_app.c +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -2,18 +2,16 @@ #include "hw_button.h" #include "ctrl_bottom_button.h" #include "ctrl_channel_button.h" +#include "ctrl_encoder.h" #include "ctrl_app.h" -#define FUN_GEN_FOCUS_MAX 6U -#define PWM_GEN_FOCUS_MAX 4U - typedef void (*btn_action_t)(void); typedef struct { - btn_action_t command; - BITMAP_buttonName_t bitmap_name; + btn_action_t command; + BITMAP_buttonName_t bitmap_name; } CMD_button_t; static GEN_fg_t func_gen[3]; @@ -21,382 +19,528 @@ static GEN_pwm_t pwm_gen[3]; static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX]; static const LAY_dispBtn_t btn_hw_to_disp[BTN_BOT_MAX] = {DISP_BTN_1, DISP_BTN_2, DISP_BTN_3, DISP_BTN_4, DISP_BTN_5}; +static const uint32_t pow_of_10[7] = {1, 10, 100, 1000, 10000, 100000, 1000000}; static HW_BotBtnName_t last_key; static APP_data_t *_app_data; static const GENERATOR_t generators[CHANNEL_MAX] = { - {.gen_type = GEN_FG_TYPE, .gen = &func_gen[0]}, - {.gen_type = GEN_FG_TYPE, .gen = &func_gen[1]}, - {.gen_type = GEN_FG_TYPE, .gen = &func_gen[2]}, - {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[0]}, - {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[1]}, - {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[2]}, + {.gen_type = GEN_FG_TYPE, .gen = &func_gen[0]}, + {.gen_type = GEN_FG_TYPE, .gen = &func_gen[1]}, + {.gen_type = GEN_FG_TYPE, .gen = &func_gen[2]}, + {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[0]}, + {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[1]}, + {.gen_type = GEN_PWM_TYPE, .gen = &pwm_gen[2]}, }; void APP_init(APP_data_t *app_data) { - _app_data = app_data; - _app_data->freq_focus_digit = 0; - _app_data->ampl_focus_digit = 0; - _app_data->offs_focus_digit = 0; - _app_data->phas_focus_digit = 0; - _app_data->duty_focus_digit = 0; + _app_data = app_data; + _app_data->freq_focus_digit = 4; + _app_data->ampl_focus_digit = 1; + _app_data->offs_focus_digit = 1; + _app_data->phas_focus_digit = 0; + _app_data->duty_focus_digit = 0; - _app_data->curr_gen_type = GEN_FG_TYPE; - _app_data->generator = generators[CHANNEL1].gen; + _app_data->curr_gen_type = GEN_FG_TYPE; + _app_data->generator = generators[CHANNEL1].gen; - _app_data->curr_state_lay = LAY_MAIN; - _app_data->curr_state_btn = BTN_MAIN_FG; + _app_data->curr_state_lay = LAY_MAIN; + _app_data->curr_state_btn = BTN_MAIN_FG; - _app_data->isChannelChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; - _app_data->isButtonChange = 1; - _app_data->isButtonBlink = 1; + _app_data->isChannelChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isButtonBlink = 1; - CTRL_buttonsInit(); + CTRL_buttonsInit(); } void CTRL_buttonsInit(void) { - CTRL_bottomButtonInit(); - // CTRL_channelButtonInit(); + CTRL_bottomButtonInit(); + // CTRL_channelButtonInit(); } void CTRL_buttonsHandler(void) { - CTRL_bottomButtonsHandler(); - CTRL_channelButtonsHandler(); + CTRL_bottomButtonsHandler(); + CTRL_channelButtonsHandler(); + CTRL_encoderHandler(); } void CTRL_pushedDispBtnEvent(ButtonKey_t *key) { - last_key = btn_hw_to_disp[key->instance]; - btn_command[_app_data->curr_state_btn][last_key].command(); + ULOG_TRACE("Disp btn: %d", key->instance); + last_key = btn_hw_to_disp[key->instance]; + btn_command[_app_data->curr_state_btn][last_key].command(); } void CTRL_pushedChanBtnEvent(ButtonKey_t *key) { - UNUSED(key); + ULOG_TRACE("Chan btn: %d", key->instance); + UNUSED(key); +} + +static void _changeValueFunGen(int8_t dir) +{ + GEN_fg_t *gen = (GEN_fg_t *)_app_data->generator; + + switch (_app_data->curr_state_lay) + { + case LAY_FREQ: + { + uint32_t new_freq = dir * pow_of_10[_app_data->freq_focus_digit] + gen->frequency; + ULOG_DEBUG(" New freq: %lu", new_freq); + if (new_freq > MAX_FREQ) + { + return; + } + gen->frequency = new_freq; + break; + } + case LAY_AMPL: + { + uint16_t new_ampl = dir * pow_of_10[_app_data->ampl_focus_digit] + gen->amplitude; + ULOG_DEBUG(" New ampl: %u", new_ampl); + if (gen->offset + new_ampl > MAX_VOLT_POS || gen->offset - new_ampl < MAX_VOLT_NEG) + { + return; + } + gen->amplitude = new_ampl; + break; + } + case LAY_OFFS: + { + int16_t new_offs = dir * pow_of_10[_app_data->offs_focus_digit] + gen->offset; + ULOG_DEBUG(" New offs: %i", new_offs); + if (new_offs + gen->amplitude > MAX_VOLT_POS || new_offs - gen->amplitude < MAX_VOLT_NEG) + { + return; + } + gen->offset = new_offs; + break; + } + case LAY_PHAS: + { + uint16_t new_phas = dir * pow_of_10[_app_data->phas_focus_digit] + gen->phase; + ULOG_DEBUG(" New phas: %u", new_phas); + if (new_phas > MAX_PHAS) + { + return; + } + gen->phase = new_phas; + break; + } + default: + ULOG_ERROR("%s:%d: Unknown layout: %d", __FILE__, __LINE__, _app_data->curr_state_lay); + break; + } +} + +static void _changeValuePwmGen(int8_t dir) +{ + GEN_pwm_t *gen = (GEN_pwm_t *)_app_data->generator; + + switch (_app_data->curr_state_lay) + { + case LAY_FREQ: + { + uint32_t new_freq = dir * pow_of_10[_app_data->freq_focus_digit] + gen->frequency; + ULOG_DEBUG(" New freq: %lu", new_freq); + if (new_freq > MAX_FREQ) + { + return; + } + gen->frequency = new_freq; + break; + } + case LAY_AMPL: + { + uint16_t new_ampl = dir * pow_of_10[_app_data->ampl_focus_digit] + gen->amplitude; + ULOG_DEBUG(" New ampl: %u", new_ampl); + if (gen->offset + new_ampl > MAX_VOLT_POS || gen->offset - new_ampl < MAX_VOLT_NEG) + { + return; + } + gen->amplitude = new_ampl; + break; + } + case LAY_OFFS: + { + int16_t new_offs = dir * pow_of_10[_app_data->offs_focus_digit] + gen->offset; + ULOG_DEBUG(" New offs: %i", new_offs); + if (new_offs + gen->amplitude > MAX_VOLT_POS || new_offs - gen->amplitude < MAX_VOLT_NEG) + { + return; + } + gen->offset = new_offs; + break; + } + case LAY_PHAS: + { + uint16_t new_phas = dir * pow_of_10[_app_data->phas_focus_digit] + gen->phase; + ULOG_DEBUG(" New phas: %u", new_phas); + if (new_phas > MAX_PHAS) + { + return; + } + gen->phase = new_phas; + break; + } + case LAY_DUTY: + { + uint8_t new_duty = dir * pow_of_10[_app_data->duty_focus_digit] + gen->duty; + ULOG_DEBUG(" New duty: %u", new_duty); + if (new_duty > MAX_DUTY) + { + return; + } + gen->duty = new_duty; + break; + } + default: + break; + } +} + +void CTRL_encoderEvent(int8_t enc) +{ + ULOG_TRACE("Enco event: %i", enc); + switch (_app_data->curr_gen_type) + { + case GEN_FG_TYPE: + _changeValueFunGen(enc / 2); + break; + case GEN_PWM_TYPE: + _changeValuePwmGen(enc / 2); + break; + + default: + ULOG_ERROR("%s:%d: Unknown generator type.", __FILE__, __LINE__); + break; + } + + _app_data->isValueChange = 1; } inline BITMAP_buttonName_t CTRL_getBitmapName(LAY_dispBtn_t disp_btn) { - return btn_command[_app_data->curr_state_btn][disp_btn].bitmap_name; + return btn_command[_app_data->curr_state_btn][disp_btn].bitmap_name; } static void _doNoting(void) { - return; + return; } static void _backToMain(void) { - _app_data->curr_state_lay = LAY_MAIN; + _app_data->curr_state_lay = LAY_MAIN; - switch (_app_data->curr_gen_type) - { - case GEN_FG_TYPE: - _app_data->curr_state_btn = BTN_MAIN_FG; - break; + switch (_app_data->curr_gen_type) + { + case GEN_FG_TYPE: + _app_data->curr_state_btn = BTN_MAIN_FG; + break; - case GEN_PWM_TYPE: - _app_data->curr_state_btn = BTN_MAIN_PWM; - break; + case GEN_PWM_TYPE: + _app_data->curr_state_btn = BTN_MAIN_PWM; + break; - default: - break; - } + default: + break; + } - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; - _app_data->isGraphChange = 1; + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; + _app_data->isGraphChange = 1; } static void _blockFocusAtMaxAndMin(void) { - switch (_app_data->curr_state_btn) - { - case BTN_FREQ_MIN: - if (_app_data->freq_focus_digit > 0) - { - _app_data->curr_state_btn = BTN_FREQ; - _app_data->isButtonChange = 1; - } - break; - case BTN_FREQ_MAX: - if (_app_data->freq_focus_digit < FUN_GEN_FOCUS_MAX) - { - _app_data->curr_state_btn = BTN_FREQ; - _app_data->isButtonChange = 1; - } - break; - case BTN_FREQ: - if (_app_data->freq_focus_digit == 0) - { - _app_data->curr_state_btn = BTN_FREQ_MIN; - _app_data->isButtonChange = 1; - } - else if (_app_data->freq_focus_digit == FUN_GEN_FOCUS_MAX) - { - _app_data->curr_state_btn = BTN_FREQ_MAX; - _app_data->isButtonChange = 1; - } - break; - default: - break; - } + switch (_app_data->curr_state_btn) + { + case BTN_FREQ_MIN: + if (_app_data->freq_focus_digit > 0) + { + _app_data->curr_state_btn = BTN_FREQ; + _app_data->isButtonChange = 1; + } + break; + case BTN_FREQ_MAX: + if (_app_data->freq_focus_digit < FUN_GEN_FOCUS_MAX) + { + _app_data->curr_state_btn = BTN_FREQ; + _app_data->isButtonChange = 1; + } + break; + case BTN_FREQ: + if (_app_data->freq_focus_digit == 0) + { + _app_data->curr_state_btn = BTN_FREQ_MIN; + _app_data->isButtonChange = 1; + } + else if (_app_data->freq_focus_digit == FUN_GEN_FOCUS_MAX) + { + _app_data->curr_state_btn = BTN_FREQ_MAX; + _app_data->isButtonChange = 1; + } + break; + default: + break; + } } static void _enterToFreqLayout(void) { - _app_data->curr_state_lay = LAY_FREQ; - _app_data->curr_state_btn = BTN_FREQ; - _blockFocusAtMaxAndMin(); + _app_data->curr_state_lay = LAY_FREQ; + _app_data->curr_state_btn = BTN_FREQ; + _blockFocusAtMaxAndMin(); - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; } static void _enterToAmplLayout(void) { - _app_data->curr_state_lay = LAY_AMPL; - _app_data->curr_state_btn = BTN_AMPL; + _app_data->curr_state_lay = LAY_AMPL; + _app_data->curr_state_btn = BTN_AMPL; - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; } static void _enterToOffslLayout(void) { - _app_data->curr_state_lay = LAY_OFFS; - _app_data->curr_state_btn = BTN_OFFS; + _app_data->curr_state_lay = LAY_OFFS; + _app_data->curr_state_btn = BTN_OFFS; - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; } static void _enterToPhasLayout(void) { - _app_data->curr_state_lay = LAY_PHAS; - _app_data->curr_state_btn = BTN_PHAS; + _app_data->curr_state_lay = LAY_PHAS; + _app_data->curr_state_btn = BTN_PHAS; - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; } static void _enterToDutyLayout(void) { - _app_data->curr_state_lay = LAY_DUTY; - _app_data->curr_state_btn = BTN_DUTY; + _app_data->curr_state_lay = LAY_DUTY; + _app_data->curr_state_btn = BTN_DUTY; - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; } static void _enterToWavelLayout(void) { - _app_data->curr_state_lay = LAY_WAVE; - _app_data->curr_state_btn = BTN_WAVE; + _app_data->curr_state_lay = LAY_WAVE; + _app_data->curr_state_btn = BTN_WAVE; - _app_data->isButtonChange = 1; - _app_data->isGraphChange = 1; - _app_data->isValueChange = 1; + _app_data->isButtonChange = 1; + _app_data->isGraphChange = 1; + _app_data->isValueChange = 1; } static void _moveToLeftFocusFreqNumber(void) { - _app_data->freq_focus_digit += 1; - _app_data->isValueChange = 1; + _app_data->freq_focus_digit += 1; + _app_data->isValueChange = 1; - _blockFocusAtMaxAndMin(); - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); + _blockFocusAtMaxAndMin(); + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); } static void _moveToRighttFocusFreqNumber(void) { - _app_data->freq_focus_digit -= 1; - _app_data->isValueChange = 1; + _app_data->freq_focus_digit -= 1; + _app_data->isValueChange = 1; - _blockFocusAtMaxAndMin(); - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); + _blockFocusAtMaxAndMin(); + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); } static void _setTo0_01xFocusNumber(void) { - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 0; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 0; - break; - default: - break; - } + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 0; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 0; + break; + default: + break; + } - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; } static void _setTo0_1xFocusNumber(void) { - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 1; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 1; - break; - default: - break; - } + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 1; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 1; + break; + default: + break; + } - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; } static void _setTo1xFocusNumber(void) { - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 2; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 2; - break; - case LAY_PHAS: - _app_data->offs_focus_digit = 0; - break; - case LAY_DUTY: - _app_data->offs_focus_digit = 0; - break; - default: - break; - } + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 2; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 2; + break; + case LAY_PHAS: + _app_data->phas_focus_digit = 0; + break; + case LAY_DUTY: + _app_data->duty_focus_digit = 0; + break; + default: + break; + } - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; } static void _setTo10xFocusNumber(void) { - switch (_app_data->curr_state_lay) - { - case LAY_AMPL: - _app_data->ampl_focus_digit = 3; - break; - case LAY_OFFS: - _app_data->offs_focus_digit = 3; - break; - case LAY_PHAS: - _app_data->offs_focus_digit = 1; - break; - case LAY_DUTY: - _app_data->offs_focus_digit = 1; - break; - default: - break; - } + switch (_app_data->curr_state_lay) + { + case LAY_AMPL: + _app_data->ampl_focus_digit = 3; + break; + case LAY_OFFS: + _app_data->offs_focus_digit = 3; + break; + case LAY_PHAS: + _app_data->phas_focus_digit = 1; + break; + case LAY_DUTY: + _app_data->duty_focus_digit = 1; + break; + default: + break; + } - _app_data->timer_blink[last_key] = 2; - _app_data->isButtonBlink |= (1 << last_key); - _app_data->isValueChange = 1; + _app_data->timer_blink[last_key] = 2; + _app_data->isButtonBlink |= (1 << last_key); + _app_data->isValueChange = 1; } static const CMD_button_t btn_command[BTN_STATE_MAX][DISP_BTN_MAX] = { - { - // BTN_MAIN_FG - {_enterToFreqLayout, BITMAP_BTN_FREQ}, - {_enterToAmplLayout, BITMAP_BTN_AMPL}, - {_enterToOffslLayout, BITMAP_BTN_OFFS}, - {_enterToPhasLayout, BITMAP_BTN_PHAS}, - {_enterToWavelLayout, BITMAP_BTN_WAVE}, - }, - { - // BTN_MAIN_PWM - {_enterToFreqLayout, BITMAP_BTN_FREQ}, - {_enterToAmplLayout, BITMAP_BTN_AMPL}, - {_enterToOffslLayout, BITMAP_BTN_OFFS}, - {_enterToPhasLayout, BITMAP_BTN_PHAS}, - {_enterToDutyLayout, BITMAP_BTN_NONE}, - }, - { - // BTN_FREQ - {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, - {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, - { - // BTN_FREQ_MIN - {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, - {_doNoting, BITMAP_BTN_EMPTY}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, - { - // BTN_FREQ_MAX - {_doNoting, BITMAP_BTN_EMPTY}, - {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, - { - // BTN_AMPL - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, - {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, - { - // BTN_OFFS - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, - {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, - { - // BTN_PHAS - {_setTo10xFocusNumber, BITMAP_BTN_X10}, - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, - { - // BTN_DUTY - {_setTo10xFocusNumber, BITMAP_BTN_X10}, - {_setTo1xFocusNumber, BITMAP_BTN_X1}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, - { - // BTN_WAVE - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_doNoting, BITMAP_BTN_NONE}, - {_backToMain, BITMAP_BTN_BACK}, - }, + { + // BTN_MAIN_FG + {_enterToFreqLayout, BITMAP_BTN_FREQ}, + {_enterToAmplLayout, BITMAP_BTN_AMPL}, + {_enterToOffslLayout, BITMAP_BTN_OFFS}, + {_enterToPhasLayout, BITMAP_BTN_PHAS}, + {_enterToWavelLayout, BITMAP_BTN_WAVE}, + }, + { + // BTN_MAIN_PWM + {_enterToFreqLayout, BITMAP_BTN_FREQ}, + {_enterToAmplLayout, BITMAP_BTN_AMPL}, + {_enterToOffslLayout, BITMAP_BTN_OFFS}, + {_enterToPhasLayout, BITMAP_BTN_PHAS}, + {_enterToDutyLayout, BITMAP_BTN_NONE}, + }, + { + // BTN_FREQ + {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, + {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_FREQ_MIN + {_moveToLeftFocusFreqNumber, BITMAP_BTN_LEFT}, + {_doNoting, BITMAP_BTN_EMPTY}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_FREQ_MAX + {_doNoting, BITMAP_BTN_EMPTY}, + {_moveToRighttFocusFreqNumber, BITMAP_BTN_RIGHT}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_AMPL + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, + {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_OFFS + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_setTo0_1xFocusNumber, BITMAP_BTN_X0_1}, + {_setTo0_01xFocusNumber, BITMAP_BTN_X0_01}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_PHAS + {_setTo10xFocusNumber, BITMAP_BTN_X10}, + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_DUTY + {_setTo10xFocusNumber, BITMAP_BTN_X10}, + {_setTo1xFocusNumber, BITMAP_BTN_X1}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, + { + // BTN_WAVE + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_doNoting, BITMAP_BTN_NONE}, + {_backToMain, BITMAP_BTN_BACK}, + }, }; diff --git a/firmware/shared_libs/controllers/ctrl_app.h b/firmware/shared_libs/controllers/ctrl_app.h index 9dc33bf..89b4a5a 100644 --- a/firmware/shared_libs/controllers/ctrl_app.h +++ b/firmware/shared_libs/controllers/ctrl_app.h @@ -21,7 +21,7 @@ typedef struct uint16_t phase; uint8_t wave; uint8_t enabled; - uint8_t connected; + uint8_t link; } GEN_fg_t; typedef struct @@ -59,4 +59,5 @@ void CTRL_buttonsInit(void); void CTRL_buttonsHandler(void); void CTRL_pushedDispBtnEvent(ButtonKey_t *key); void CTRL_pushedChanBtnEvent(ButtonKey_t *key); +void CTRL_encoderEvent(int8_t enc); BITMAP_buttonName_t CTRL_getBitmapName(LAY_dispBtn_t disp_btn); diff --git a/firmware/shared_libs/controllers/ctrl_app_types.h b/firmware/shared_libs/controllers/ctrl_app_types.h index 91a6de9..d2d5c1e 100644 --- a/firmware/shared_libs/controllers/ctrl_app_types.h +++ b/firmware/shared_libs/controllers/ctrl_app_types.h @@ -1,5 +1,13 @@ #pragma once +#define FUN_GEN_FOCUS_MAX 6U +#define PWM_GEN_FOCUS_MAX 4U +#define MAX_FREQ 1000000U +#define MAX_VOLT_POS 500 +#define MAX_VOLT_NEG -500 +#define MAX_PHAS 360 +#define MAX_DUTY 100 + typedef enum { GEN_FG_TYPE, diff --git a/firmware/shared_libs/controllers/ctrl_encoder.c b/firmware/shared_libs/controllers/ctrl_encoder.c new file mode 100644 index 0000000..6d43074 --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_encoder.c @@ -0,0 +1,16 @@ +#include "main.h" +#include "tim.h" +#include "ctrl_app.h" + +void CTRL_encoderHandler(void) +{ + static uint8_t cnt; + if (htim3.Instance->CNT == cnt || htim3.Instance->CNT % 2 == 1) + { + return; + } + + // SEGGER_RTT_printf(0, "TIM3.cnt: %d\n", htim3.Instance->CNT); + CTRL_encoderEvent(htim3.Instance->CNT - cnt); + cnt = (uint8_t)htim3.Instance->CNT; +} \ No newline at end of file diff --git a/firmware/shared_libs/controllers/ctrl_encoder.h b/firmware/shared_libs/controllers/ctrl_encoder.h new file mode 100644 index 0000000..3dccd1a --- /dev/null +++ b/firmware/shared_libs/controllers/ctrl_encoder.h @@ -0,0 +1,3 @@ +#pragma once + +void CTRL_encoderHandler(void); \ No newline at end of file diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index 1a3bc06..42e9ff3 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -16,6 +16,7 @@ const uint8_t btn_pos_x[DISP_BTN_MAX] = {0, 26, 52, 78, 104}; const uint8_t marker_freq_pos_x[FREQ_MAX_DIGIT] = {76, 84, 90, 96, 105, 111, 118}; const uint8_t marker_ampl_pos_x[AMPL_MAX_DIGIT] = {82, 94, 100}; +const uint8_t marker_phas_pos_x[AMPL_MAX_DIGIT] = {82, 88, 96}; // clang-format off const GFX_bitmap_t marker_down = {05, 03, (uint8_t[]){0x01,0x03,0x07,0x03,0x01}};// res: 5x3(8) - 5 bytes @@ -28,7 +29,6 @@ static void _drawFreqValue(GFX_display_t *disp, uint32_t freq, uint8_t pos_y) uint8_t data[8]; snprintf((char *)data, 8, "%07u", freq); DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[0], 0}, 76, pos_y, BM_NORMAL); - DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[0], 0}, 76, pos_y, BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[1], data[2], data[3], 0}, 84, pos_y, BM_NORMAL); DISP_writeString(disp, &font5x7Info, (uint8_t[]){data[4], data[5], data[6], 0}, 105, pos_y, BM_NORMAL); } @@ -44,6 +44,10 @@ static void _drawOffsValue(GFX_display_t *disp, int16_t offs, uint8_t pos_y) { uint8_t data[8]; snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, abs(offs) % 100); + if (offs < 0) + { + data[0] = '-'; + } DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } @@ -54,12 +58,12 @@ static void _drawPhasValue(GFX_display_t *disp, uint16_t phase, uint8_t pos_y) DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); } -static void _drawDutyValue(GFX_display_t *disp, uint8_t duty, uint8_t pos_y) -{ - uint8_t data[8]; - snprintf((char *)data, 8, "%03u%%", duty); - DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); -} +// static void _drawDutyValue(GFX_display_t *disp, uint8_t duty, uint8_t pos_y) +// { +// uint8_t data[8]; +// snprintf((char *)data, 8, "%03u%%", duty); +// DISP_writeString(disp, &font5x7Info, data, 76, pos_y, BM_NORMAL); +// } static void _blinkButtons(GFX_display_t *disp, APP_data_t *app_data) { @@ -168,7 +172,7 @@ static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t f DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 20, BM_NORMAL); _drawPhasValue(disp, phase, 20); - DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_phas_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) @@ -178,19 +182,19 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) { case LAY_FREQ: _drawFreqValueHelper(disp, fun_gen->frequency, app_data->freq_focus_digit); - _drawMeterHelper(disp, "1", "1M", _calcMarkerPos(990000, 1000000)); + _drawMeterHelper(disp, "1", "1M", _calcMarkerPos(fun_gen->frequency, MAX_FREQ)); break; case LAY_AMPL: _drawAmplValueHelper(disp, fun_gen->amplitude, app_data->ampl_focus_digit); - _drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(100, 500)); + _drawMeterHelper(disp, "0V", "5V", _calcMarkerPos(fun_gen->amplitude, MAX_VOLT_POS)); break; case LAY_OFFS: _drawOffsValueHelper(disp, fun_gen->offset, app_data->offs_focus_digit); - _drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(100 + 250, 500 + 250)); + _drawMeterHelper(disp, "-5V", "+5V", _calcMarkerPos(MAX_VOLT_POS + fun_gen->offset, MAX_VOLT_POS * 2)); break; case LAY_PHAS: _drawPhaseValueHelper(disp, fun_gen->phase, app_data->phas_focus_digit); - _drawMeterHelper(disp, "0", "360", _calcMarkerPos(100, 500)); + _drawMeterHelper(disp, "0", "360", _calcMarkerPos(fun_gen->phase, MAX_PHAS)); break; case LAY_MAIN: DISP_clearRegion(disp, 62, 13, 66, 40); @@ -213,7 +217,7 @@ static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data) static void _drawPwmGenValues(GFX_display_t *disp, APP_data_t *app_data) { - GEN_pwm_t *pwm_gen = app_data->generator; + // GEN_pwm_t *pwm_gen = app_data->generator; } static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) @@ -251,14 +255,14 @@ static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) DISP_drawHorizontalLine(disp, 2, 31 + offs_shift, 57, GFX_WHITE); } -static void _drawMaxAmpLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) -{ - DISP_drawHorizontalLine(disp, 2, 12, 57, GFX_WHITE); - DISP_drawBitmap(disp, &marker_up, 0, 13, BM_NORMAL); +// static void _drawMaxAmpLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) +// { +// DISP_drawHorizontalLine(disp, 2, 12, 57, GFX_WHITE); +// DISP_drawBitmap(disp, &marker_up, 0, 13, BM_NORMAL); - DISP_drawHorizontalLine(disp, 2, 51, 57, GFX_WHITE); - DISP_drawBitmap(disp, &marker_down, 0, 48, BM_NORMAL); -} +// DISP_drawHorizontalLine(disp, 2, 51, 57, GFX_WHITE); +// DISP_drawBitmap(disp, &marker_down, 0, 48, BM_NORMAL); +// } static void _drawFunGenGraph(GFX_display_t *disp, APP_data_t *app_data) { diff --git a/firmware/shared_libs/utils/ulog/ulog.c b/firmware/shared_libs/utils/ulog/ulog.c new file mode 100644 index 0000000..52b8ae3 --- /dev/null +++ b/firmware/shared_libs/utils/ulog/ulog.c @@ -0,0 +1,154 @@ +/** +MIT License + +Copyright (c) 2019 R. Dunbar Poor + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +/** + * \file ulog.c + * + * \brief uLog: lightweight logging for embedded systems + * + * See ulog.h for sparse documentation. + */ + +#include "ulog.h" + +#ifdef ULOG_ENABLED // whole file... + +// #include +#include "printf.h" +#include +#include + +// ============================================================================= +// types and definitions + +typedef struct +{ + ulog_function_t fn; + ulog_level_t threshold; +} subscriber_t; + +// ============================================================================= +// local storage + +static subscriber_t s_subscribers[ULOG_MAX_SUBSCRIBERS]; +static char s_message[ULOG_MAX_MESSAGE_LENGTH]; + +// ============================================================================= +// user-visible code + +void ulog_init() +{ + memset(s_subscribers, 0, sizeof(s_subscribers)); +} + +// search the s_subscribers table to install or update fn +ulog_err_t ulog_subscribe(ulog_function_t fn, ulog_level_t threshold) +{ + int available_slot = -1; + int i; + for (i = 0; i < ULOG_MAX_SUBSCRIBERS; i++) + { + if (s_subscribers[i].fn == fn) + { + // already subscribed: update threshold and return immediately. + s_subscribers[i].threshold = threshold; + return ULOG_ERR_NONE; + } + else if (s_subscribers[i].fn == NULL) + { + // found a free slot + available_slot = i; + } + } + // fn is not yet a subscriber. assign if possible. + if (available_slot == -1) + { + return ULOG_ERR_SUBSCRIBERS_EXCEEDED; + } + s_subscribers[available_slot].fn = fn; + s_subscribers[available_slot].threshold = threshold; + return ULOG_ERR_NONE; +} + +// search the s_subscribers table to remove +ulog_err_t ulog_unsubscribe(ulog_function_t fn) +{ + int i; + for (i = 0; i < ULOG_MAX_SUBSCRIBERS; i++) + { + if (s_subscribers[i].fn == fn) + { + s_subscribers[i].fn = NULL; // mark as empty + return ULOG_ERR_NONE; + } + } + return ULOG_ERR_NOT_SUBSCRIBED; +} + +const char *ulog_level_name(ulog_level_t severity) +{ + switch (severity) + { + case ULOG_TRACE_LEVEL: + return "TRACE"; + case ULOG_DEBUG_LEVEL: + return "DEBUG"; + case ULOG_INFO_LEVEL: + return "INFO"; + case ULOG_WARNING_LEVEL: + return "WARNING"; + case ULOG_ERROR_LEVEL: + return "ERROR"; + case ULOG_CRITICAL_LEVEL: + return "CRITICAL"; + case ULOG_ALWAYS_LEVEL: + return "ALWAYS"; + default: + return "UNKNOWN"; + } +} + +void ulog_message(ulog_level_t severity, const char *fmt, ...) +{ + va_list ap; + int i; + va_start(ap, fmt); + vsnprintf(s_message, ULOG_MAX_MESSAGE_LENGTH, fmt, ap); + va_end(ap); + + for (i = 0; i < ULOG_MAX_SUBSCRIBERS; i++) + { + if (s_subscribers[i].fn != NULL) + { + if (severity >= s_subscribers[i].threshold) + { + s_subscribers[i].fn(severity, s_message); + } + } + } +} + +// ============================================================================= +// private code + +#endif // #ifdef ULOG_ENABLED diff --git a/firmware/shared_libs/utils/ulog/ulog.h b/firmware/shared_libs/utils/ulog/ulog.h new file mode 100644 index 0000000..6186896 --- /dev/null +++ b/firmware/shared_libs/utils/ulog/ulog.h @@ -0,0 +1,188 @@ +/** +MIT License + +Copyright (c) 2019 R. Dunbar Poor + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +/** + * \file + * + * \brief uLog: lightweight logging for embedded systems + * + * A quick intro by example: + * + * #include "ulog.h" + * + * // To use uLog, you must define a function to process logging messages. + * // It can write the messages to a console, to a file, to an in-memory + * // buffer: the choice is yours. And you get to choose the format of + * // the message. This example prints to the console. One caveat: msg + * // is a static string and will be over-written at the next call to ULOG. + * // You may print it or copy it, but saving a pointer to it will lead to + * // confusion and astonishment. + * // + * void my_console_logger(ulog_level_t level, const char *msg) { + * printf("%s [%s]: %s\n", + * get_timestamp(), + * ulog_level_name(level), + * msg); + * } + * + * int main() { + * ULOG_INIT(); + * + * // log to the console messages that are WARNING or more severe. You + * // can re-subscribe at any point to change the severity level. + * ULOG_SUBSCRIBE(my_console_logger, ULOG_WARNING); + * + * // log to a file messages that are DEBUG or more severe + * ULOG_SUBSCRIBE(my_file_logger, ULOG_DEBUG); + * + * int arg = 42; + * ULOG_INFO("Arg is %d", arg); // logs to file but not console + * } + */ + +#ifndef ULOG_H_ +#define ULOG_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + + typedef enum + { + ULOG_TRACE_LEVEL = 100, + ULOG_DEBUG_LEVEL, + ULOG_INFO_LEVEL, + ULOG_WARNING_LEVEL, + ULOG_ERROR_LEVEL, + ULOG_CRITICAL_LEVEL, + ULOG_ALWAYS_LEVEL + } ulog_level_t; + + // The following macros enable or disable uLog. If `ULOG_ENABLED` is + // defined at compile time, a macro such as `ULOG_INFO(...)` expands + // into `ulog_message(ULOG_INFO_LEVEL, ...)`. If `ULOG_ENABLED` is not + // defined, then the same macro expands into `do {} while(0)` and will + // not generate any code at all. + // + // There are two ways to enable uLog: you can uncomment the following + // line, or -- if it is commented out -- you can add -DULOG_ENABLED to + // your compiler switches. + // #define ULOG_ENABLED + +#ifdef ULOG_ENABLED +#define ULOG_INIT() ulog_init() +#define ULOG_SUBSCRIBE(a, b) ulog_subscribe(a, b) +#define ULOG_UNSUBSCRIBE(a) ulog_unsubscribe(a) +#define ULOG_LEVEL_NAME(a) ulog_level_name(a) +#define ULOG(...) ulog_message(__VA_ARGS__) +#define ULOG_TRACE(...) ulog_message(ULOG_TRACE_LEVEL, __VA_ARGS__) +#define ULOG_DEBUG(...) ulog_message(ULOG_DEBUG_LEVEL, __VA_ARGS__) +#define ULOG_INFO(...) ulog_message(ULOG_INFO_LEVEL, __VA_ARGS__) +#define ULOG_WARNING(...) ulog_message(ULOG_WARNING_LEVEL, __VA_ARGS__) +#define ULOG_ERROR(...) ulog_message(ULOG_ERROR_LEVEL, __VA_ARGS__) +#define ULOG_CRITICAL(...) ulog_message(ULOG_CRITICAL_LEVEL, __VA_ARGS__) +#define ULOG_ALWAYS(...) ulog_message(ULOG_ALWAYS_LEVEL, __VA_ARGS__) +#else +// uLog vanishes when disabled at compile time... +#define ULOG_INIT() \ + do \ + { \ + } while (0) +#define ULOG_SUBSCRIBE(a, b) \ + do \ + { \ + } while (0) +#define ULOG_UNSUBSCRIBE(a) \ + do \ + { \ + } while (0) +#define ULOG_LEVEL_NAME(a) \ + do \ + { \ + } while (0) +#define ULOG(s, f, ...) \ + do \ + { \ + } while (0) +#define ULOG_TRACE(f, ...) \ + do \ + { \ + } while (0) +#define ULOG_DEBUG(f, ...) \ + do \ + { \ + } while (0) +#define ULOG_INFO(f, ...) \ + do \ + { \ + } while (0) +#define ULOG_WARNING(f, ...) \ + do \ + { \ + } while (0) +#define ULOG_ERROR(f, ...) \ + do \ + { \ + } while (0) +#define ULOG_CRITICAL(f, ...) \ + do \ + { \ + } while (0) +#define ULOG_ALWAYS(f, ...) \ + do \ + { \ + } while (0) +#endif + + typedef enum + { + ULOG_ERR_NONE = 0, + ULOG_ERR_SUBSCRIBERS_EXCEEDED, + ULOG_ERR_NOT_SUBSCRIBED, + } ulog_err_t; + +// define the maximum number of concurrent subscribers +#ifndef ULOG_MAX_SUBSCRIBERS +#define ULOG_MAX_SUBSCRIBERS 6 +#endif +// maximum length of formatted log message +#ifndef ULOG_MAX_MESSAGE_LENGTH +#define ULOG_MAX_MESSAGE_LENGTH 120 +#endif + /** + * @brief: prototype for uLog subscribers. + */ + typedef void (*ulog_function_t)(ulog_level_t severity, char *msg); + + void ulog_init(void); + ulog_err_t ulog_subscribe(ulog_function_t fn, ulog_level_t threshold); + ulog_err_t ulog_unsubscribe(ulog_function_t fn); + const char *ulog_level_name(ulog_level_t level); + void ulog_message(ulog_level_t severity, const char *fmt, ...); + +#ifdef __cplusplus +} +#endif + +#endif /* ULOG_H_ */ From f0f71f3252152503bdef5a8d092b1613fc21f6d2 Mon Sep 17 00:00:00 2001 From: bartool Date: Mon, 1 May 2023 15:12:54 +0200 Subject: [PATCH 09/10] [fix] clean screen before draw new graph --- firmware/shared_libs/controllers/ctrl_app.c | 25 +++++++++++-------- .../shared_libs/disp_layout/disp_layout.c | 22 ++++++++-------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/firmware/shared_libs/controllers/ctrl_app.c b/firmware/shared_libs/controllers/ctrl_app.c index 4d76d96..d4004d4 100644 --- a/firmware/shared_libs/controllers/ctrl_app.c +++ b/firmware/shared_libs/controllers/ctrl_app.c @@ -136,8 +136,11 @@ static void _changeValueFunGen(int8_t dir) } default: ULOG_ERROR("%s:%d: Unknown layout: %d", __FILE__, __LINE__, _app_data->curr_state_lay); - break; + return; } + + _app_data->isValueChange = 1; + _app_data->isGraphChange = 1; } static void _changeValuePwmGen(int8_t dir) @@ -149,7 +152,7 @@ static void _changeValuePwmGen(int8_t dir) case LAY_FREQ: { uint32_t new_freq = dir * pow_of_10[_app_data->freq_focus_digit] + gen->frequency; - ULOG_DEBUG(" New freq: %lu", new_freq); + ULOG_DEBUG(" New freq: %lu", new_freq); if (new_freq > MAX_FREQ) { return; @@ -160,7 +163,7 @@ static void _changeValuePwmGen(int8_t dir) case LAY_AMPL: { uint16_t new_ampl = dir * pow_of_10[_app_data->ampl_focus_digit] + gen->amplitude; - ULOG_DEBUG(" New ampl: %u", new_ampl); + ULOG_DEBUG(" New ampl: %u", new_ampl); if (gen->offset + new_ampl > MAX_VOLT_POS || gen->offset - new_ampl < MAX_VOLT_NEG) { return; @@ -171,7 +174,7 @@ static void _changeValuePwmGen(int8_t dir) case LAY_OFFS: { int16_t new_offs = dir * pow_of_10[_app_data->offs_focus_digit] + gen->offset; - ULOG_DEBUG(" New offs: %i", new_offs); + ULOG_DEBUG(" New offs: %i", new_offs); if (new_offs + gen->amplitude > MAX_VOLT_POS || new_offs - gen->amplitude < MAX_VOLT_NEG) { return; @@ -182,7 +185,7 @@ static void _changeValuePwmGen(int8_t dir) case LAY_PHAS: { uint16_t new_phas = dir * pow_of_10[_app_data->phas_focus_digit] + gen->phase; - ULOG_DEBUG(" New phas: %u", new_phas); + ULOG_DEBUG(" New phas: %u", new_phas); if (new_phas > MAX_PHAS) { return; @@ -193,7 +196,7 @@ static void _changeValuePwmGen(int8_t dir) case LAY_DUTY: { uint8_t new_duty = dir * pow_of_10[_app_data->duty_focus_digit] + gen->duty; - ULOG_DEBUG(" New duty: %u", new_duty); + ULOG_DEBUG(" New duty: %u", new_duty); if (new_duty > MAX_DUTY) { return; @@ -202,8 +205,12 @@ static void _changeValuePwmGen(int8_t dir) break; } default: - break; + ULOG_ERROR("%s:%d: Unknown layout: %d", __FILE__, __LINE__, _app_data->curr_state_lay); + return; } + + _app_data->isValueChange = 1; + _app_data->isGraphChange = 1; } void CTRL_encoderEvent(int8_t enc) @@ -219,11 +226,9 @@ void CTRL_encoderEvent(int8_t enc) break; default: - ULOG_ERROR("%s:%d: Unknown generator type.", __FILE__, __LINE__); + ULOG_ERROR("%s:%d: Unknown generator type: %d", __FILE__, __LINE__, _app_data->curr_gen_type); break; } - - _app_data->isValueChange = 1; } inline BITMAP_buttonName_t CTRL_getBitmapName(LAY_dispBtn_t disp_btn) diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index 42e9ff3..b407123 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -8,7 +8,9 @@ #include "disp_layout.h" -#define abs(x) ((x) < 0 ? -(x) : (x)) +#define ABS(x) ((x) < 0 ? -(x) : (x)) +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) #define FREQ_MAX_DIGIT 7 #define AMPL_MAX_DIGIT 3 @@ -43,7 +45,7 @@ static void _drawAmplValue(GFX_display_t *disp, uint16_t ampl, uint8_t pos_y) static void _drawOffsValue(GFX_display_t *disp, int16_t offs, uint8_t pos_y) { uint8_t data[8]; - snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, abs(offs) % 100); + snprintf((char *)data, 8, "%+01d.%02d V", offs / 100, ABS(offs) % 100); if (offs < 0) { data[0] = '-'; @@ -241,18 +243,13 @@ static void _drawValues(GFX_display_t *disp, APP_data_t *app_data) static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) { - int8_t offs_shift = _calcVerticalShiftInPxl(offs, ampl); + int8_t vert_shift = _calcVerticalShiftInPxl(offs, ampl); - if (offs_shift > 20) - { - offs_shift = 20; - } - if (offs_shift < -19) - { - offs_shift = -19; - } + vert_shift = MIN(vert_shift, 20); + vert_shift = MAX(vert_shift, -19); - DISP_drawHorizontalLine(disp, 2, 31 + offs_shift, 57, GFX_WHITE); + ULOG_TRACE(" shift: %i", vert_shift); + DISP_drawHorizontalLine(disp, 2, 31 + vert_shift, 57, GFX_WHITE); } // static void _drawMaxAmpLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) @@ -267,6 +264,7 @@ static void _drawOffsetLine(GFX_display_t *disp, int16_t offs, uint32_t ampl) static void _drawFunGenGraph(GFX_display_t *disp, APP_data_t *app_data) { GEN_fg_t *fun_gen = (GEN_fg_t *)app_data->generator; + DISP_clearRegion(disp, 3, 12, 57, 40); switch (fun_gen->wave) { From 8c0137a59c79f04e1d162274fec37729e22cf7a7 Mon Sep 17 00:00:00 2001 From: bartool Date: Mon, 1 May 2023 15:59:10 +0200 Subject: [PATCH 10/10] [fix] wrong display marker in phase helper --- .../shared_libs/disp_layout/disp_layout.c | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/firmware/shared_libs/disp_layout/disp_layout.c b/firmware/shared_libs/disp_layout/disp_layout.c index b407123..23a927e 100644 --- a/firmware/shared_libs/disp_layout/disp_layout.c +++ b/firmware/shared_libs/disp_layout/disp_layout.c @@ -12,13 +12,14 @@ #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #define MIN(x, y) (((x) < (y)) ? (x) : (y)) -#define FREQ_MAX_DIGIT 7 -#define AMPL_MAX_DIGIT 3 +#define SEVEN_DIGIT 7 +#define FOUR_DIGIT 3 +#define THREE_DIGIT 2 const uint8_t btn_pos_x[DISP_BTN_MAX] = {0, 26, 52, 78, 104}; -const uint8_t marker_freq_pos_x[FREQ_MAX_DIGIT] = {76, 84, 90, 96, 105, 111, 118}; -const uint8_t marker_ampl_pos_x[AMPL_MAX_DIGIT] = {82, 94, 100}; -const uint8_t marker_phas_pos_x[AMPL_MAX_DIGIT] = {82, 88, 96}; +const uint8_t marker_pos_7dig[SEVEN_DIGIT] = {76, 84, 90, 96, 105, 111, 118}; +const uint8_t marker_pos_4dig[FOUR_DIGIT] = {82, 94, 100}; +const uint8_t marker_pos_3dig[THREE_DIGIT] = {82, 88}; // clang-format off const GFX_bitmap_t marker_down = {05, 03, (uint8_t[]){0x01,0x03,0x07,0x03,0x01}};// res: 5x3(8) - 5 bytes @@ -109,7 +110,7 @@ static void _drawButtons(GFX_display_t *disp, APP_data_t *app_data) static uint8_t _calcMarkerPos(uint32_t value, uint32_t max) { - return ((62 * value) + (max / 2)) / max; + return ((61 * value) + (max / 2)) / max; // return (value < 0) ? ((62 * value) - (max / 2)) / max : ((62 * value) + (max / 2)) / max; } @@ -150,7 +151,7 @@ static void _drawFreqValueHelper(GFX_display_t *disp, uint32_t freq, uint8_t foc DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"F:", 64, 20, BM_NORMAL); _drawFreqValue(disp, freq, 20); - DISP_drawBitmap(disp, &marker_down, marker_freq_pos_x[(FREQ_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_pos_7dig[(SEVEN_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t focus_digit) @@ -158,7 +159,7 @@ static void _drawAmplValueHelper(GFX_display_t *disp, uint32_t ampl, uint8_t foc DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"A:", 64, 20, BM_NORMAL); _drawAmplValue(disp, ampl, 20); - DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_pos_4dig[(FOUR_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focus_digit) @@ -166,7 +167,7 @@ static void _drawOffsValueHelper(GFX_display_t *disp, int32_t offs, uint8_t focu DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"O:", 64, 20, BM_NORMAL); _drawOffsValue(disp, offs, 20); - DISP_drawBitmap(disp, &marker_down, marker_ampl_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_pos_4dig[(FOUR_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t focus_digit) @@ -174,7 +175,7 @@ static void _drawPhaseValueHelper(GFX_display_t *disp, uint32_t phase, uint8_t f DISP_clearRegion(disp, 64, 13, 66, 40); DISP_writeString(disp, &font5x7Info, (uint8_t *)"P:", 64, 20, BM_NORMAL); _drawPhasValue(disp, phase, 20); - DISP_drawBitmap(disp, &marker_down, marker_phas_pos_x[(AMPL_MAX_DIGIT - 1) - focus_digit], 15, BM_NORMAL); + DISP_drawBitmap(disp, &marker_down, marker_pos_3dig[(THREE_DIGIT - 1) - focus_digit], 15, BM_NORMAL); } static void _drawFuncGenValues(GFX_display_t *disp, APP_data_t *app_data)