From fc470d0fb97d1e30b91771d745164ebb695aefc7 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 23 Apr 2026 11:18:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8=20=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=BD=D0=B8=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Clock/clock_manager.c | 83 ++++++- Core/Clock/clock_manager.h | 15 ++ Core/Menu/clock.c | 1 + Core/Menu/clock.h | 4 +- Core/Menu/games.c | 1 + Core/Menu/menu_items.c | 264 +---------------------- Core/Menu/menu_items.h | 6 - Core/Menu/settings.c | 430 +++++++++++++++++++++++++++++++++++++ Core/Menu/settings.h | 15 ++ Core/Src/main.c | 3 +- MDK-ARM/lamp.uvoptx | 35 ++- MDK-ARM/lamp.uvprojx | 10 + 12 files changed, 589 insertions(+), 278 deletions(-) create mode 100644 Core/Menu/settings.c create mode 100644 Core/Menu/settings.h diff --git a/Core/Clock/clock_manager.c b/Core/Clock/clock_manager.c index 57c685c..cb7fc0a 100644 --- a/Core/Clock/clock_manager.c +++ b/Core/Clock/clock_manager.c @@ -4,15 +4,22 @@ static uint8_t dutyValue = 5; static time_t currentTime; +static uint8_t led_enable; RTC_TimeTypeDef rtc_time; +#define BKP_DR_DUTY RTC_BKP_DR1 +#define BKP_DR_LED_STATE RTC_BKP_DR2 +#define BKP_DR_POWERON_SONG RTC_BKP_DR5 +#define BKP_DR_ALARM_SONG RTC_BKP_DR6 +#define BKP_DR_MENU_SOUND RTC_BKP_DR3 + // Яркость в RTC Backup Register (используем BKP_DR1) static void SaveDuty(void) { - HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, dutyValue); + HAL_RTCEx_BKUPWrite(&hrtc, BKP_DR_DUTY, dutyValue); } static void LoadDuty(void) { - uint32_t val = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1); + uint32_t val = HAL_RTCEx_BKUPRead(&hrtc, BKP_DR_DUTY); dutyValue = (val <= 10 && val > 0) ? (uint8_t)val : 5; } @@ -24,6 +31,10 @@ void ClockManager_Init(void) { if (HAL_RTC_GetTime(&hrtc, &rtc_time, RTC_FORMAT_BIN) != HAL_OK) { ClockManager_ResetTime(); } + ClockManager_GetMenuSound(); + ClockManager_GetAlarmSong(); + ClockManager_GetPowerOnSong(); + ClockManager_GetPowerOnSong(); } time_t ClockManager_GetTime(int blink) { @@ -33,7 +44,12 @@ time_t ClockManager_GetTime(int blink) { if(blink) { if(currentTime.sec != rtc_time.Seconds) - HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); + { + if(led_enable) + HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); + else + HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); + } } currentTime.sec = rtc_time.Seconds; return currentTime; @@ -64,3 +80,64 @@ void ClockManager_SetDuty(uint8_t value) { void ClockManager_ResetTime(void) { ClockManager_SetTime(0, 0, 0); } + + +// LED State in Backup Register + +void ClockManager_SetLEDState(uint8_t state) { + if (state) { + led_enable = 1; + } else { + led_enable = 0; + } + HAL_RTCEx_BKUPWrite(&hrtc, BKP_DR_LED_STATE, state ? 1 : 0); +} + +uint8_t ClockManager_GetLEDState(void) { + uint32_t led_enable = HAL_RTCEx_BKUPRead(&hrtc, BKP_DR_LED_STATE); + if (led_enable == 0 || led_enable == 1) { + // Сохраненное значение корректно + } else { + led_enable = 1; // По умолчанию LED включен + } + return (uint8_t)led_enable; +} + +// PowerOn Song in Backup Register +void ClockManager_SetPowerOnSong(uint8_t song) { + if (song > 10) song = 10; + HAL_RTCEx_BKUPWrite(&hrtc, BKP_DR_POWERON_SONG, song); +} + +uint8_t ClockManager_GetPowerOnSong(void) { + uint32_t val = HAL_RTCEx_BKUPRead(&hrtc, BKP_DR_POWERON_SONG); + if (val > 10) val = 0; + return (uint8_t)val; +} + +// Alarm Song in Backup Register + +void ClockManager_SetAlarmSong(uint8_t song) { + if (song > 10) song = 10; + HAL_RTCEx_BKUPWrite(&hrtc, BKP_DR_ALARM_SONG, song); +} + +uint8_t ClockManager_GetAlarmSong(void) { + uint32_t val = HAL_RTCEx_BKUPRead(&hrtc, BKP_DR_ALARM_SONG); + if (val > 10) val = 0; + return (uint8_t)val; +} + +// Menu Sound State in Backup Register +extern uint8_t g_sound_enabled; + +void ClockManager_SetMenuSound(uint8_t enabled) { + g_sound_enabled = enabled ? 1 : 0; + HAL_RTCEx_BKUPWrite(&hrtc, BKP_DR_MENU_SOUND, g_sound_enabled); +} + +uint8_t ClockManager_GetMenuSound(void) { + uint32_t val = HAL_RTCEx_BKUPRead(&hrtc, BKP_DR_MENU_SOUND); + g_sound_enabled = (val == 0 || val == 1) ? (uint8_t)val : 1; + return g_sound_enabled; +} diff --git a/Core/Clock/clock_manager.h b/Core/Clock/clock_manager.h index fc1630a..211421f 100644 --- a/Core/Clock/clock_manager.h +++ b/Core/Clock/clock_manager.h @@ -23,4 +23,19 @@ void ClockManager_SetDuty(uint8_t value); // Сброс времени на 00:00:00 void ClockManager_ResetTime(void); +// LED control +void ClockManager_SetLEDState(uint8_t state); +uint8_t ClockManager_GetLEDState(void); + +// PowerOn Song (DR5) +void ClockManager_SetPowerOnSong(uint8_t song); +uint8_t ClockManager_GetPowerOnSong(void); + +// Alarm Song (DR6) +void ClockManager_SetAlarmSong(uint8_t song); +uint8_t ClockManager_GetAlarmSong(void); + +// Menu Sound +void ClockManager_SetMenuSound(uint8_t enabled); +uint8_t ClockManager_GetMenuSound(void); #endif diff --git a/Core/Menu/clock.c b/Core/Menu/clock.c index 6cc705f..0b76298 100644 --- a/Core/Menu/clock.c +++ b/Core/Menu/clock.c @@ -1,4 +1,5 @@ #include "menu_items.h" +#include "clock.h" #include "segment.h" #include "clock_manager.h" #include diff --git a/Core/Menu/clock.h b/Core/Menu/clock.h index 2bdaf44..f04cf9b 100644 --- a/Core/Menu/clock.h +++ b/Core/Menu/clock.h @@ -1,5 +1,5 @@ -#ifndef GAMES_H -#define GAMES_H +#ifndef CLOCK_H +#define CLOCK_H #include "menu.h" extern MenuNode g_clockNode; diff --git a/Core/Menu/games.c b/Core/Menu/games.c index c84ff25..680ca23 100644 --- a/Core/Menu/games.c +++ b/Core/Menu/games.c @@ -1,4 +1,5 @@ #include "menu_items.h" +#include "games.h" #include "segment.h" #include "clock_manager.h" #include "menu_items.h" diff --git a/Core/Menu/menu_items.c b/Core/Menu/menu_items.c index 06ec7e2..9bd4386 100644 --- a/Core/Menu/menu_items.c +++ b/Core/Menu/menu_items.c @@ -3,6 +3,7 @@ #include "clock_manager.h" #include "games.h" #include "clock.h" +#include "settings.h" #include #include #include @@ -10,32 +11,14 @@ MenuNode g_rootMenu; // объявляем узлы меню MenuNode g_gamesNode; MenuNode g_settingsNode; -MenuNode g_timeEditNode; -MenuNode g_dutyEditNode; -MenuNode g_LEDEditNode; -MenuNode g_MenuSoundNode; -MenuNode g_PowerOnSongNode; -MenuNode g_SongNode; -MenuNode g_resetNode; // ==================== Данные ==================== -typedef struct { - time_t editTime; - uint8_t editStep; - bool blinkState; - uint32_t lastBlink; -} TimeEditData; - -static TimeEditData g_timeData; -static uint8_t g_originalDuty; -static uint8_t g_editDuty; // Текущая активность в корне MenuNode* g_currentActivity = NULL; // ==================== Функции отображения активностей ==================== - static void Display_MenuItem(void) { MenuNode* current = Menu_GetCurrentNode(); if (current && current->selectedChild < current->childCount) { @@ -46,215 +29,9 @@ static void Display_MenuItem(void) { } } -static void Display_TimeEdit(void) { - char buf[7]; - sprintf(buf, "%02d%02d%02d", - g_timeData.editTime.hour, - g_timeData.editTime.min, - g_timeData.editTime.sec); - if (g_timeData.blinkState && g_timeData.editStep < 6) { - buf[g_timeData.editStep] = ' '; - } - Segment_SetString(buf); -} - -static void Display_DutyEdit(void) { - char buf[7] = "DUTY "; - if (g_editDuty == 10) { - buf[4] = '1'; - buf[5] = '0'; - } else { - buf[5] = '0' + g_editDuty; - } - Segment_SetString(buf); -} - -static void Display_Reset(void) { - Segment_SetString("RESET "); -} - -// ==================== Вход в активности ==================== - -static void OnEnter_TimeEdit(void) { - g_timeData.editTime = ClockManager_GetTime(0); - g_timeData.editStep = 0; - g_timeData.blinkState = true; - g_timeData.lastBlink = HAL_GetTick(); -} - -static void OnEnter_DutyEdit(void) { - g_originalDuty = ClockManager_GetDuty(); - g_editDuty = g_originalDuty; - Segment_SetBrightness(g_editDuty * 10); -} - -static void OnEnter_Reset(void) {} - -// ==================== Обновления ==================== -static void OnUpdate_TimeEdit(void) { - uint32_t tick = HAL_GetTick(); - if (tick - g_timeData.lastBlink >= 500) { - g_timeData.lastBlink = tick; - g_timeData.blinkState = !g_timeData.blinkState; - Menu_Refresh(); - } -} - -// ==================== Обработчики кнопок активностей ==================== -static void TimeEdit_OnButton(Button_Type btn, bool longPress) { - (void)longPress; - - switch (btn) { - case BUTTON_UP: { - uint8_t tens, units; - switch (g_timeData.editStep) { - case 0: - tens = g_timeData.editTime.hour / 10; - units = g_timeData.editTime.hour % 10; - tens = (tens + 1) % 3; - g_timeData.editTime.hour = tens * 10 + units; - break; - case 1: - tens = g_timeData.editTime.hour / 10; - units = (g_timeData.editTime.hour % 10 + 1) % 10; - if (tens == 2 && units > 3) units = 0; - g_timeData.editTime.hour = tens * 10 + units; - break; - case 2: - tens = (g_timeData.editTime.min / 10 + 1) % 6; - g_timeData.editTime.min = tens * 10 + (g_timeData.editTime.min % 10); - break; - case 3: - units = (g_timeData.editTime.min % 10 + 1) % 10; - g_timeData.editTime.min = (g_timeData.editTime.min / 10) * 10 + units; - break; - case 4: - tens = (g_timeData.editTime.sec / 10 + 1) % 6; - g_timeData.editTime.sec = tens * 10 + (g_timeData.editTime.sec % 10); - break; - case 5: - units = (g_timeData.editTime.sec % 10 + 1) % 10; - g_timeData.editTime.sec = (g_timeData.editTime.sec / 10) * 10 + units; - break; - } - Menu_Refresh(); - break; - } - case BUTTON_DOWN: { - uint8_t tens, units; - switch (g_timeData.editStep) { - case 0: - tens = g_timeData.editTime.hour / 10; - units = g_timeData.editTime.hour % 10; - tens = (tens == 0) ? 2 : tens - 1; - g_timeData.editTime.hour = tens * 10 + units; - break; - case 1: - tens = g_timeData.editTime.hour / 10; - units = g_timeData.editTime.hour % 10; - if (units == 0) units = (tens == 2) ? 3 : 9; - else units--; - g_timeData.editTime.hour = tens * 10 + units; - break; - case 2: - tens = g_timeData.editTime.min / 10; - tens = (tens == 0) ? 5 : tens - 1; - g_timeData.editTime.min = tens * 10 + (g_timeData.editTime.min % 10); - break; - case 3: - units = g_timeData.editTime.min % 10; - units = (units == 0) ? 9 : units - 1; - g_timeData.editTime.min = (g_timeData.editTime.min / 10) * 10 + units; - break; - case 4: - tens = g_timeData.editTime.sec / 10; - tens = (tens == 0) ? 5 : tens - 1; - g_timeData.editTime.sec = tens * 10 + (g_timeData.editTime.sec % 10); - break; - case 5: - units = g_timeData.editTime.sec % 10; - units = (units == 0) ? 9 : units - 1; - g_timeData.editTime.sec = (g_timeData.editTime.sec / 10) * 10 + units; - break; - } - Menu_Refresh(); - break; - } - case BUTTON_SELECT: - g_timeData.editStep++; - if (g_timeData.editStep >= 6) { - ClockManager_SetTime(g_timeData.editTime.hour, - g_timeData.editTime.min, - g_timeData.editTime.sec); - Menu_GoBack(); - } - Menu_Refresh(); - break; - case BUTTON_BACK: - Menu_GoBack(); - default: - break; - } -} - -static void DutyEdit_OnButton(Button_Type btn, bool longPress) { - (void)longPress; - switch (btn) { - case BUTTON_UP: - if (g_editDuty < 10) { - g_editDuty++; - Segment_SetBrightness(g_editDuty * 10); - Menu_Refresh(); - } - break; - case BUTTON_DOWN: - if (g_editDuty > 0) { - g_editDuty--; - Segment_SetBrightness(g_editDuty * 10); - Menu_Refresh(); - } - break; - case BUTTON_SELECT: - ClockManager_SetDuty(g_editDuty); - Menu_GoBack(); - break; - case BUTTON_BACK: - ClockManager_SetDuty(g_originalDuty); - Menu_GoBack(); - default: - break; - } -} - -static void Reset_OnButton(Button_Type btn, bool longPress) { - - if ((btn == BUTTON_SELECT) && longPress) { - ClockManager_ResetTime(); - ClockManager_SetDuty(5); - Menu_GoBack(); - } -} - // ==================== Узлы меню ==================== MenuNode g_gamesNode; MenuNode g_settingsNode; -MenuNode g_timeEditNode; -MenuNode g_dutyEditNode; -MenuNode g_LEDEditNode; -MenuNode g_MenuSoundNode; -MenuNode g_PowerOnSongNode; -MenuNode g_SongNode; -MenuNode g_resetNode; - -static MenuNode* g_settingsChildren[] = { - &g_timeEditNode, - &g_dutyEditNode, - &g_LEDEditNode, - &g_MenuSoundNode, - &g_PowerOnSongNode, - &g_SongNode, - &g_resetNode -}; static MenuNode* g_mainMenuChildren[] = { &g_clockNode, @@ -303,45 +80,6 @@ void MenuItems_Init(void) { .onButton = NULL, .data = NULL }; - - g_timeEditNode = (MenuNode){ - .name = "SET T", - .parent = &g_settingsNode, - .children = NULL, - .childCount = 0, - .selectedChild = 0, - .display = Display_TimeEdit, - .onEnter = OnEnter_TimeEdit, - .onUpdate = OnUpdate_TimeEdit, - .onButton = TimeEdit_OnButton, - .data = &g_timeData - }; - - g_dutyEditNode = (MenuNode){ - .name = "SET D", - .parent = &g_settingsNode, - .children = NULL, - .childCount = 0, - .selectedChild = 0, - .display = Display_DutyEdit, - .onEnter = OnEnter_DutyEdit, - .onUpdate = NULL, - .onButton = DutyEdit_OnButton, - .data = &g_editDuty - }; - - g_resetNode = (MenuNode){ - .name = "RESET", - .parent = &g_settingsNode, - .children = NULL, - .childCount = 0, - .selectedChild = 0, - .display = Display_Reset, - .onEnter = OnEnter_Reset, - .onUpdate = NULL, - .onButton = Reset_OnButton, - .data = NULL - }; } MenuNode* Menu_GetRootMenu(void) { diff --git a/Core/Menu/menu_items.h b/Core/Menu/menu_items.h index d224f9c..a49aa3f 100644 --- a/Core/Menu/menu_items.h +++ b/Core/Menu/menu_items.h @@ -6,14 +6,8 @@ extern MenuNode* g_currentActivity; // Глобальные узлы меню (для доступа из main.c) extern MenuNode g_rootMenu; -extern MenuNode g_clockNode; -extern MenuNode g_timerNode; -extern MenuNode g_stopwatchNode; extern MenuNode g_gamesNode; extern MenuNode g_settingsNode; -extern MenuNode g_timeEditNode; -extern MenuNode g_dutyEditNode; -extern MenuNode g_resetNode; // Инициализация всех пунктов меню void MenuItems_Init(void); diff --git a/Core/Menu/settings.c b/Core/Menu/settings.c new file mode 100644 index 0000000..e75c6df --- /dev/null +++ b/Core/Menu/settings.c @@ -0,0 +1,430 @@ +#include "menu_items.h" +#include "settings.h" +#include "segment.h" +#include "clock_manager.h" +#include +#include +#include + +typedef struct { + time_t editTime; + uint8_t editStep; + bool blinkState; + uint32_t lastBlink; +} TimeEditData; + +static TimeEditData g_timeData; +static uint8_t g_originalDuty; +static uint8_t g_editDuty; + +/////// TIME EDIT //////// +static void Display_TimeEdit(void) { + char buf[7]; + sprintf(buf, "%02d%02d%02d", + g_timeData.editTime.hour, + g_timeData.editTime.min, + g_timeData.editTime.sec); + if (g_timeData.blinkState && g_timeData.editStep < 6) { + buf[g_timeData.editStep] = ' '; + } + Segment_SetString(buf); +} + +static void OnEnter_TimeEdit(void) { + g_timeData.editTime = ClockManager_GetTime(0); + g_timeData.editStep = 0; + g_timeData.blinkState = true; + g_timeData.lastBlink = HAL_GetTick(); +} +static void OnUpdate_TimeEdit(void) { + uint32_t tick = HAL_GetTick(); + if (tick - g_timeData.lastBlink >= 500) { + g_timeData.lastBlink = tick; + g_timeData.blinkState = !g_timeData.blinkState; + Menu_Refresh(); + } +} +static void TimeEdit_OnButton(Button_Type btn, bool longPress) { + (void)longPress; + + switch (btn) { + case BUTTON_UP: { + uint8_t tens, units; + switch (g_timeData.editStep) { + case 0: + tens = g_timeData.editTime.hour / 10; + units = g_timeData.editTime.hour % 10; + tens = (tens + 1) % 3; + g_timeData.editTime.hour = tens * 10 + units; + break; + case 1: + tens = g_timeData.editTime.hour / 10; + units = (g_timeData.editTime.hour % 10 + 1) % 10; + if (tens == 2 && units > 3) units = 0; + g_timeData.editTime.hour = tens * 10 + units; + break; + case 2: + tens = (g_timeData.editTime.min / 10 + 1) % 6; + g_timeData.editTime.min = tens * 10 + (g_timeData.editTime.min % 10); + break; + case 3: + units = (g_timeData.editTime.min % 10 + 1) % 10; + g_timeData.editTime.min = (g_timeData.editTime.min / 10) * 10 + units; + break; + case 4: + tens = (g_timeData.editTime.sec / 10 + 1) % 6; + g_timeData.editTime.sec = tens * 10 + (g_timeData.editTime.sec % 10); + break; + case 5: + units = (g_timeData.editTime.sec % 10 + 1) % 10; + g_timeData.editTime.sec = (g_timeData.editTime.sec / 10) * 10 + units; + break; + } + Menu_Refresh(); + break; + } + case BUTTON_DOWN: { + uint8_t tens, units; + switch (g_timeData.editStep) { + case 0: + tens = g_timeData.editTime.hour / 10; + units = g_timeData.editTime.hour % 10; + tens = (tens == 0) ? 2 : tens - 1; + g_timeData.editTime.hour = tens * 10 + units; + break; + case 1: + tens = g_timeData.editTime.hour / 10; + units = g_timeData.editTime.hour % 10; + if (units == 0) units = (tens == 2) ? 3 : 9; + else units--; + g_timeData.editTime.hour = tens * 10 + units; + break; + case 2: + tens = g_timeData.editTime.min / 10; + tens = (tens == 0) ? 5 : tens - 1; + g_timeData.editTime.min = tens * 10 + (g_timeData.editTime.min % 10); + break; + case 3: + units = g_timeData.editTime.min % 10; + units = (units == 0) ? 9 : units - 1; + g_timeData.editTime.min = (g_timeData.editTime.min / 10) * 10 + units; + break; + case 4: + tens = g_timeData.editTime.sec / 10; + tens = (tens == 0) ? 5 : tens - 1; + g_timeData.editTime.sec = tens * 10 + (g_timeData.editTime.sec % 10); + break; + case 5: + units = g_timeData.editTime.sec % 10; + units = (units == 0) ? 9 : units - 1; + g_timeData.editTime.sec = (g_timeData.editTime.sec / 10) * 10 + units; + break; + } + Menu_Refresh(); + break; + } + case BUTTON_SELECT: + g_timeData.editStep++; + if (g_timeData.editStep >= 6) { + ClockManager_SetTime(g_timeData.editTime.hour, + g_timeData.editTime.min, + g_timeData.editTime.sec); + Menu_GoBack(); + } + Menu_Refresh(); + break; + case BUTTON_BACK: + Menu_GoBack(); + default: + break; + } +} + + + +/////// DUTY EDIT //////// +static void Display_DutyEdit(void) { + char buf[7] = "DUTY "; + if (g_editDuty == 10) { + buf[4] = '1'; + buf[5] = '0'; + } else { + buf[5] = '0' + g_editDuty; + } + Segment_SetString(buf); +} +static void OnEnter_DutyEdit(void) { + g_originalDuty = ClockManager_GetDuty(); + g_editDuty = g_originalDuty; + Segment_SetBrightness(g_editDuty * 10); +} + +static void DutyEdit_OnButton(Button_Type btn, bool longPress) { + (void)longPress; + switch (btn) { + case BUTTON_UP: + if (g_editDuty < 10) { + g_editDuty++; + Segment_SetBrightness(g_editDuty * 10); + Menu_Refresh(); + } + break; + case BUTTON_DOWN: + if (g_editDuty > 0) { + g_editDuty--; + Segment_SetBrightness(g_editDuty * 10); + Menu_Refresh(); + } + break; + case BUTTON_SELECT: + ClockManager_SetDuty(g_editDuty); + Menu_GoBack(); + break; + case BUTTON_BACK: + ClockManager_SetDuty(g_originalDuty); + Menu_GoBack(); + default: + break; + } +} + + + + +/////// RESET //////// +static void Display_Reset(void) { + Segment_SetString("RESET "); +} +static void OnEnter_Reset(void) {} +static void Reset_OnButton(Button_Type btn, bool longPress) { + + if ((btn == BUTTON_SELECT) && longPress) { + ClockManager_ResetTime(); + ClockManager_SetDuty(5); + Menu_GoBack(); + } +} + +/////// LED EDIT //////// +static void Display_LEDEdit(void) { + if (ClockManager_GetLEDState()) { + Segment_SetString("LED 1"); + } else { + Segment_SetString("LED 0"); + } +} + +static void LEDEdit_OnButton(Button_Type btn, bool longPress) { + (void)longPress; + uint8_t newState; + switch (btn) { + case BUTTON_SELECT: + newState = !ClockManager_GetLEDState(); + ClockManager_SetLEDState(newState); + Menu_Refresh(); + break; + case BUTTON_BACK: + Menu_GoBack(); + break; + default: + break; + } +} + + +/////// POWER ON SONG //////// +static void Display_PowerOnSong(void) { + char buf[7]; + sprintf(buf, "PnS%02d", ClockManager_GetPowerOnSong()); + Segment_SetString(buf); +} +static void PowerOnSong_OnButton(Button_Type btn, bool longPress) { + (void)longPress; + uint8_t current = ClockManager_GetPowerOnSong(); + + switch (btn) { + case BUTTON_UP: + if (current < 10) { + current++; + ClockManager_SetPowerOnSong(current); + Menu_Refresh(); + } + break; + case BUTTON_DOWN: + if (current > 0) { + current--; + ClockManager_SetPowerOnSong(current); + Menu_Refresh(); + } + break; + case BUTTON_SELECT: + case BUTTON_BACK: + Menu_GoBack(); + break; + default: + break; + } +} + +/////// ALARM SONG //////// +static void Display_AlarmSong(void) { + char buf[7]; + sprintf(buf, "AL%02d", ClockManager_GetAlarmSong()); + Segment_SetString(buf); +} + +static void AlarmSong_OnButton(Button_Type btn, bool longPress) { + (void)longPress; + uint8_t current = ClockManager_GetAlarmSong(); + + switch (btn) { + case BUTTON_UP: + if (current < 10) { + current++; + ClockManager_SetAlarmSong(current); + Menu_Refresh(); + } + break; + case BUTTON_DOWN: + if (current > 0) { + current--; + ClockManager_SetAlarmSong(current); + Menu_Refresh(); + } + break; + case BUTTON_SELECT: + case BUTTON_BACK: + Menu_GoBack(); + break; + default: + break; + } +} + +/////// ALARM SONG //////// +static void Display_MenuSound(void) { + if (ClockManager_GetMenuSound()) { + Segment_SetString("BEEP 1"); + } else { + Segment_SetString("BEEP 0"); + } +} + +static void MenuSound_OnButton(Button_Type btn, bool longPress) { + (void)longPress; + uint8_t newState; + switch (btn) { + case BUTTON_SELECT: + newState = !ClockManager_GetMenuSound(); + ClockManager_SetMenuSound(newState); + Menu_Refresh(); + break; + case BUTTON_BACK: + Menu_GoBack(); + break; + default: + break; + } +} + +// NODES// NODES +MenuNode g_timeEditNode = { + .name = "SET T", + .parent = &g_settingsNode, + .children = NULL, + .childCount = 0, + .selectedChild = 0, + .display = Display_TimeEdit, + .onEnter = OnEnter_TimeEdit, + .onUpdate = OnUpdate_TimeEdit, + .onButton = TimeEdit_OnButton, + .data = &g_timeData +}; + +MenuNode g_dutyEditNode = { + .name = "SET D", + .parent = &g_settingsNode, + .children = NULL, + .childCount = 0, + .selectedChild = 0, + .display = Display_DutyEdit, + .onEnter = OnEnter_DutyEdit, + .onUpdate = NULL, + .onButton = DutyEdit_OnButton, + .data = &g_editDuty +}; + +MenuNode g_LEDEditNode = { + .name = "LED", + .parent = &g_settingsNode, + .children = NULL, + .childCount = 0, + .selectedChild = 0, + .display = Display_LEDEdit, + .onEnter = NULL, + .onUpdate = NULL, + .onButton = LEDEdit_OnButton, + .data = NULL +}; + +MenuNode g_MenuSoundNode = { + .name = "BEEP", + .parent = &g_settingsNode, + .children = NULL, + .childCount = 0, + .selectedChild = 0, + .display = Display_MenuSound, + .onEnter = NULL, + .onUpdate = NULL, + .onButton = MenuSound_OnButton, + .data = NULL +}; + +MenuNode g_PowerOnSongNode = { + .name = "PonS", + .parent = &g_settingsNode, + .children = NULL, + .childCount = 0, + .selectedChild = 0, + .display = Display_PowerOnSong, + .onEnter = NULL, + .onUpdate = NULL, + .onButton = PowerOnSong_OnButton, + .data = NULL +}; + +MenuNode g_AlarmSongNode = { + .name = "AL", + .parent = &g_settingsNode, + .children = NULL, + .childCount = 0, + .selectedChild = 0, + .display = Display_AlarmSong, + .onEnter = NULL, + .onUpdate = NULL, + .onButton = AlarmSong_OnButton, + .data = NULL +}; + +MenuNode g_resetNode = { + .name = "RESET", + .parent = &g_settingsNode, + .children = NULL, + .childCount = 0, + .selectedChild = 0, + .display = Display_Reset, + .onEnter = OnEnter_Reset, + .onUpdate = NULL, + .onButton = Reset_OnButton, + .data = NULL +}; + +MenuNode* g_settingsChildren[] = { + &g_timeEditNode, + &g_dutyEditNode, + &g_LEDEditNode, + &g_MenuSoundNode, + &g_PowerOnSongNode, + &g_AlarmSongNode, + &g_resetNode +}; diff --git a/Core/Menu/settings.h b/Core/Menu/settings.h new file mode 100644 index 0000000..739f43c --- /dev/null +++ b/Core/Menu/settings.h @@ -0,0 +1,15 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +#include "menu.h" + +extern MenuNode g_timeEditNode; +extern MenuNode g_dutyEditNode; +extern MenuNode g_LEDEditNode; +extern MenuNode g_MenuSoundNode; +extern MenuNode g_PowerOnSongNode; +extern MenuNode g_AlarmSongNode; +extern MenuNode g_resetNode; +extern MenuNode* g_settingsChildren[7]; + +#endif diff --git a/Core/Src/main.c b/Core/Src/main.c index 3ea5898..1c299a7 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -29,6 +29,7 @@ #include "segment.h" #include "melody.h" #include "songs.h" +#include "clock.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -137,7 +138,7 @@ int main(void) { Menu_Process(); Melody_Update(&melody); - + ClockManager_GetTime(1); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ diff --git a/MDK-ARM/lamp.uvoptx b/MDK-ARM/lamp.uvoptx index 9cdff1b..19c0a76 100644 --- a/MDK-ARM/lamp.uvoptx +++ b/MDK-ARM/lamp.uvoptx @@ -180,6 +180,11 @@ 1 g_game1sec + + 6 + 1 + led_enable,0x0A + 0 @@ -752,6 +757,30 @@ 0 0 0 + ..\Core\Menu\settings.c + settings.c + 0 + 0 + + + 6 + 39 + 5 + 0 + 0 + 0 + ..\Core\Menu\settings.h + settings.h + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 ..\Core\Menu\menu_items.c menu_items.c 0 @@ -759,7 +788,7 @@ 6 - 39 + 41 5 0 0 @@ -771,7 +800,7 @@ 6 - 40 + 42 1 0 0 @@ -783,7 +812,7 @@ 6 - 41 + 43 5 0 0 diff --git a/MDK-ARM/lamp.uvprojx b/MDK-ARM/lamp.uvprojx index 81676a5..6b99bea 100644 --- a/MDK-ARM/lamp.uvprojx +++ b/MDK-ARM/lamp.uvprojx @@ -836,6 +836,16 @@ 5 ..\Core\Menu\games.h + + settings.c + 1 + ..\Core\Menu\settings.c + + + settings.h + 5 + ..\Core\Menu\settings.h + menu_items.c 1