#include "stm32g4xx_hal.h" #include "FreeRTOS.h" #include "task.h" #include "menu_items.h" #include "menu.h" #include "config.h" #include "settings.h" #include "uart_bridge.h" #include "oled_common.h" #include #include extern "C" { #include "OLED_SSD1327.h" #include "GFX_SSD1327.h" #include "fonts.h" } #define DBG if(1) extern bool update_flag; #ifdef SCREEN_MENU #define SCREEN_BUF_LEN 30 char screen_str_buf[SCREEN_BUF_LEN]; static void screen_draw_main(uint8_t sel); static void screen_draw_settings(uint8_t sel); #endif #ifdef KEYBOARD_MENU #define CLI_BUF_LEN 30 char cli_str_buf[CLI_BUF_LEN]; static void cli_draw_main(uint8_t sel); static void cli_draw_settings(uint8_t sel); static void cli_print_int_param(char* name, uint32_t val, bool hl); static void cli_print_str_param(char *name, char *val, bool hl); #endif // void menuChange(void* NewMenu, bool direction) { if ((void *) NewMenu == NULL) return; if (selectedMenuItem->Focus) { selectedMenuItem->func_change(direction); (*(selectedMenuItem->func_draw))(selectedMenuItem->Select); } else { selectedMenuItem = (menuItem*)NewMenu; (*(selectedMenuItem->func_draw))(selectedMenuItem->Select); } } // void menuFocus(void) { // Пункт "Сбросить счетчики" if (selectedMenuItem->Select == MCELL_RES) { set_raw_counters(0, 0, 0); return; } // Пункт "Сохранить настройки" if (selectedMenuItem->Select == MCELL_SAVE) { settings_save(); return; } // Главный экран меню. При нажатии кнопки - переход на следующий экран. if (selectedMenuItem->Select == MCELL_MAIN) { menuChange(NEXT, true); } if (!selectedMenuItem->Focus) selectedMenuItem->Focus = true; else selectedMenuItem->Focus = false; } // -------------------------------------------------------------------------- // // Отрисовка // Главное меню. Отрисовка. void draw_main(uint8_t sel) { update_flag = true; #ifdef SCREEN_MENU screen_draw_main(sel); #endif #ifdef KEYBOARD_MENU cli_draw_main(sel); #endif } // void draw_settings(uint8_t sel) { update_flag = false; #ifdef SCREEN_MENU screen_draw_settings(sel); #endif #ifdef KEYBOARD_MENU cli_draw_settings(sel); #endif } // void empty_func_bool(bool) {} // -------------------------------------------------------------------------- // // Изменение значений параметров // void change_factor_1(bool dir) { if (dir) { if (settings.factor_1 != FACTOR_1_UP_THR) settings.factor_1++; } else { if (settings.factor_1 != FACTOR_1_DOWN_THR) settings.factor_1--; } } // void change_factor_2(bool dir) { if (dir) { if (settings.factor_2 != FACTOR_2_UP_THR) settings.factor_2++; } else { if (settings.factor_2 != FACTOR_2_DOWN_THR) settings.factor_2--; } } // void change_revers(bool dir) { if (settings.revers) settings.revers = false; else settings.revers = true; } // -------------------------------------------------------------------------- // // Экранное меню OLDED. #ifdef SCREEN_MENU // Отрисовка главного экрана static void screen_draw_main(uint8_t sel) { uint32_t raw_forw_turns, raw_back_turns, dir; int total; move_t move; get_raw_params(&raw_forw_turns, &raw_back_turns, &dir); get_total(&total); move = get_move(); SSD1327_Clear(BLACK); // Основнаая рамка GFX_DrawRectangle(1, 1, 126, 125, 15); GFX_SetFont(font_8x5); GFX_SetFontSize(2); memset(screen_str_buf, 0, SCREEN_BUF_LEN); sprintf(screen_str_buf, "F: %u", raw_forw_turns); GFX_DrawString(8, 20, (char*)screen_str_buf, 15, 0); memset(screen_str_buf, 0, SCREEN_BUF_LEN); sprintf(screen_str_buf, "B: %u", raw_back_turns); GFX_DrawString(8, 40, (char*)screen_str_buf, 15, 0); memset(screen_str_buf, 0, SCREEN_BUF_LEN); sprintf(screen_str_buf, "T: %d", total); GFX_DrawString(8, 60, (char*)screen_str_buf, 15, 0); memset(screen_str_buf, 0, SCREEN_BUF_LEN); if (move == m_forward) sprintf(screen_str_buf, "M: forward"); else if (move == m_back) sprintf(screen_str_buf, "M: back"); else sprintf(screen_str_buf, "M: stop"); GFX_DrawString(8, 80, (char*)screen_str_buf, 15, 0); SSD1327_Display(); } // Отрисовка экрана настроек static void screen_draw_settings(uint8_t sel) { bool select; SSD1327_Clear(BLACK); // Рамка GFX_DrawRoundRectangle(1, 1, 126, 125, 3, 15); select = sel == MCELL_K1 ? true : false; memset(screen_str_buf, 0, SCREEN_BUF_LEN); sprintf(screen_str_buf, "F 1: %u", settings.factor_1); GFX_DrawString(8, 20, (char*)screen_str_buf, 15, 0); if (select) oled_draw_string_frame(0); select = sel == MCELL_K2 ? true : false; memset(screen_str_buf, 0, SCREEN_BUF_LEN); sprintf(screen_str_buf, "F 2: %u", settings.factor_2); GFX_DrawString(8, 40, (char*)screen_str_buf, 15, 0); if (select) oled_draw_string_frame(1); select = sel == MCELL_REV ? true : false; memset(screen_str_buf, 0, SCREEN_BUF_LEN); if (settings.revers == true) sprintf(screen_str_buf, "Rev.: yes"); else sprintf(screen_str_buf, "Rev.: no"); GFX_DrawString(8, 60, (char*)screen_str_buf, 15, 0); if (select) oled_draw_string_frame(2); select = sel == MCELL_RES ? true : false; memset(screen_str_buf, 0, SCREEN_BUF_LEN); if (settings.revers == true) sprintf(screen_str_buf, "Reset"); else sprintf(screen_str_buf, "Reset"); GFX_DrawString(8, 80, (char*)screen_str_buf, 15, 0); if (select) oled_draw_string_frame(3); SSD1327_Display(); select = sel == MCELL_SAVE ? true : false; memset(screen_str_buf, 0, SCREEN_BUF_LEN); if (settings.revers == true) sprintf(screen_str_buf, "Save set"); else sprintf(screen_str_buf, "Save set"); GFX_DrawString(8, 100, (char*)screen_str_buf, 15, 0); if (select) oled_draw_string_frame(4); SSD1327_Display(); } #endif // -------------------------------------------------------------------------- // // Консольное меню. Вспомогательные функции. #ifdef KEYBOARD_MENU static void cli_draw_main(uint8_t sel) { uint32_t raw_forw_turns, raw_back_turns, dir; get_raw_params(&raw_forw_turns, &raw_back_turns, &dir); DBG printf("\033c"); DBG printf("~~~ MAIN SCREEN ~~~\r\n\n"); cli_print_int_param((char*)"Turns forward: ", raw_forw_turns, false); cli_print_int_param((char*)"Turns back : ", raw_back_turns, false); cli_print_int_param((char*)"Direction : ", dir, false); update_flag = true; } // static void cli_draw_settings(uint8_t sel) { bool select; DBG printf("\033c"); DBG printf("~~~ SETTINGS SCREEN ~~~\r\n\n"); select = sel == MCELL_K1 ? true : false; cli_print_int_param((char*)"Factor 1: ", settings.factor_1, select); select = sel == MCELL_K2 ? true : false; cli_print_int_param((char*)"Factor 2: ", settings.factor_2, select); select = sel == MCELL_REV ? true : false; if (settings.revers == true) cli_print_str_param((char*)"Revers: ", (char*)"yes", select); else cli_print_str_param((char*)"Revers: ", (char*)"no", select); select = sel == MCELL_RES ? true : false; cli_print_str_param((char*)"Reset counters", (char*)"", select); select = sel == MCELL_SAVE ? true : false; cli_print_str_param((char*)"Save settings", (char*)"", select); //DBG printf("\r\nSelect item: %u\r\n", sel); } // static void cli_print_int_param(char* name, uint32_t val, bool hl) { memset(cli_str_buf, 0, CLI_BUF_LEN); if (hl) sprintf(cli_str_buf, "\033[7m%s%d\033[0m\r\n", name, val); else sprintf(cli_str_buf, "%s%d\r\n", name, val); DBG printf("%s", cli_str_buf); } // static void cli_print_str_param(char *name, char *val, bool hl) { memset(cli_str_buf, 0, CLI_BUF_LEN); if (hl) sprintf(cli_str_buf, "\033[7m%s%s\033[0m\r\n", name, val); else sprintf(cli_str_buf, "%s%s\r\n", name, val); DBG printf("%s", cli_str_buf); } #endif