#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]; 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]}, {.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->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}, }, };