Merge pull request #50 from vas-dav/menu-array-2

menu: [#38] resolve Menu array of string elements
This commit is contained in:
RedHawk 2023-05-19 01:31:43 +03:00 committed by GitHub
commit 845f021a50
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 30 deletions

View File

@ -7,18 +7,34 @@
#include "Menu.h" #include "Menu.h"
#include <assert.h> #include <assert.h>
#include <string.h>
#include "UserInterface.h" #include "UserInterface.h"
#include "Log.h" #include "Log.h"
enum
{
CURRENT_TEMP,
DESIRED_TEMP,
DESIRED_TEMP_F,
LOADING
};
static const char * interface_messages [] =
{
"CURRENT %3d ",
"DESIRED %3d ",
"DESIRED[%3d] ",
" Loading... "
};
Menu::Menu(ThreadCommon::QueueManager* qm): _qm(qm), Menu::Menu(ThreadCommon::QueueManager* qm): _qm(qm),
current(&Menu::sInitView), ext_temp(-99, 99, 1), set_point(-99, 99, 1), current(&Menu::sInitView), ext_temp(-99, 99, 1), set_point(-99, 99, 1)
main_text ("CURRENT %3d DESIRED %3d "),
set_point_text("CURRENT %3d DESIRED[%3d] ")
{ {
LOG_DEBUG("Creating Menu"); LOG_DEBUG("Creating Menu");
this->SetState(&Menu::sInitView); this->SetState(&Menu::sInitView);
ext_temp.setCurrent(0); ext_temp.setCurrent(0);
set_point.setCurrent(0); set_point.setCurrent(0);
memset(screen_text, 0, 64); // Clear screen
readSetPointFromEEPROM(); readSetPointFromEEPROM();
} }
@ -89,11 +105,13 @@ void Menu::sInitView(const MenuObjEvent &e)
{ {
case MenuObjEvent::eFocus: case MenuObjEvent::eFocus:
LOG_DEBUG("enter sInitView"); LOG_DEBUG("enter sInitView");
this->NotifyAndRefreshUI("Loading..."); constructUIString(0, interface_messages[LOADING], this->ext_temp.getCurrent());
this->NotifyAndRefreshUI();
break; break;
case MenuObjEvent::eUnFocus: case MenuObjEvent::eUnFocus:
LOG_DEBUG("leave sInitView"); LOG_DEBUG("leave sInitView");
this->NotifyAndRefreshUI(""); memset(screen_text, 0, 64); // Clear screen
this->NotifyAndRefreshUI();
break; break;
case MenuObjEvent::eRollClockWise: case MenuObjEvent::eRollClockWise:
break; break;
@ -119,13 +137,14 @@ void Menu::sMainView(const MenuObjEvent &e)
{ {
case MenuObjEvent::eFocus: case MenuObjEvent::eFocus:
LOG_DEBUG("enter sMainView"); LOG_DEBUG("enter sMainView");
sprintf(screen_text, main_text, this->ext_temp.getCurrent(), constructUIString(0, interface_messages[CURRENT_TEMP], this->ext_temp.getCurrent());
this->set_point.getCurrent()); constructUIString(1, interface_messages[DESIRED_TEMP], this->set_point.getCurrent());
this->NotifyAndRefreshUI(screen_text); this->NotifyAndRefreshUI();
break; break;
case MenuObjEvent::eUnFocus: case MenuObjEvent::eUnFocus:
LOG_DEBUG("leave sMainView"); LOG_DEBUG("leave sMainView");
this->NotifyAndRefreshUI(""); memset(screen_text, 0, 64); // Clear screen
this->NotifyAndRefreshUI();
break; break;
case MenuObjEvent::eRollClockWise: case MenuObjEvent::eRollClockWise:
break; break;
@ -136,10 +155,9 @@ void Menu::sMainView(const MenuObjEvent &e)
this->SetState(&Menu::sSetPointMod); this->SetState(&Menu::sSetPointMod);
break; break;
case MenuObjEvent::eRefresh: case MenuObjEvent::eRefresh:
sprintf(screen_text, main_text, this->ext_temp.getCurrent(), constructUIString(0, interface_messages[CURRENT_TEMP], this->ext_temp.getCurrent());
this->set_point.getCurrent());
LOG_DEBUG("refresh sMainView"); LOG_DEBUG("refresh sMainView");
this->NotifyAndRefreshUI(screen_text); this->NotifyAndRefreshUI();
break; break;
default: default:
break; break;
@ -155,25 +173,24 @@ void Menu::sSetPointMod(const MenuObjEvent &e)
{ {
case MenuObjEvent::eFocus: case MenuObjEvent::eFocus:
LOG_DEBUG("enter sSetPointMod"); LOG_DEBUG("enter sSetPointMod");
sprintf(screen_text, set_point_text, this->ext_temp.getCurrent(), constructUIString(0, interface_messages[CURRENT_TEMP], this->ext_temp.getCurrent());
this->set_point.getCurrent()); constructUIString(1, interface_messages[DESIRED_TEMP_F], this->set_point.getCurrent());
this->NotifyAndRefreshUI(screen_text); this->NotifyAndRefreshUI();
break; break;
case MenuObjEvent::eUnFocus: case MenuObjEvent::eUnFocus:
LOG_DEBUG("leave sSetPointMod"); LOG_DEBUG("leave sSetPointMod");
this->NotifyAndRefreshUI(""); memset(screen_text, 0, 64); // Clear screen
this->NotifyAndRefreshUI();
break; break;
case MenuObjEvent::eRollClockWise: case MenuObjEvent::eRollClockWise:
set_point.inc(); set_point.inc();
sprintf(screen_text, set_point_text, this->ext_temp.getCurrent(), constructUIString(1, interface_messages[DESIRED_TEMP_F], this->set_point.getCurrent());
this->set_point.getCurrent()); this->NotifyAndRefreshUI();
this->NotifyAndRefreshUI(screen_text);
break; break;
case MenuObjEvent::eRollCClockWise: case MenuObjEvent::eRollCClockWise:
set_point.dec(); set_point.dec();
sprintf(screen_text, set_point_text, this->ext_temp.getCurrent(), constructUIString(1, interface_messages[DESIRED_TEMP_F], this->set_point.getCurrent());
this->set_point.getCurrent()); this->NotifyAndRefreshUI();
this->NotifyAndRefreshUI(screen_text);
break; break;
case MenuObjEvent::eClick: case MenuObjEvent::eClick:
LOG_DEBUG("click sSetPointMod"); LOG_DEBUG("click sSetPointMod");
@ -189,15 +206,31 @@ void Menu::sSetPointMod(const MenuObjEvent &e)
break; break;
case MenuObjEvent::eRefresh: case MenuObjEvent::eRefresh:
LOG_DEBUG("refresh sSetPointMod"); LOG_DEBUG("refresh sSetPointMod");
sprintf(screen_text, set_point_text, this->ext_temp.getCurrent(), constructUIString(0, interface_messages[CURRENT_TEMP], this->ext_temp.getCurrent());
this->set_point.getCurrent()); this->NotifyAndRefreshUI();
this->NotifyAndRefreshUI(screen_text);
break; break;
default: default:
break; break;
} }
} }
void Menu::constructUIString(uint8_t line, const char *fmt, ...)
{
char buff[17];
va_list args;
va_start (args, fmt);
size_t char_line_counter = 0;
for (uint8_t i = 0; i < line; i++)
{
char_line_counter += 16;
}
vsprintf (buff, fmt, args);
memcpy(screen_text + char_line_counter, buff, 16);
va_end (args);
}
void Menu::SetState (p_state new_state) void Menu::SetState (p_state new_state)
{ {
(this->*current) (MenuObjEvent (MenuObjEvent::eUnFocus)); (this->*current) (MenuObjEvent (MenuObjEvent::eUnFocus));
@ -210,10 +243,10 @@ void Menu::HandleObj (const MenuObjEvent &event)
(this->*current) (event); (this->*current) (event);
} }
void Menu::NotifyAndRefreshUI (const char *str) void Menu::NotifyAndRefreshUI ()
{ {
//Send string on a queue to UI task. //Send string on a queue to UI task.
UserInterface::InterfaceWithData ud = {UserInterface::LCD1, str}; UserInterface::InterfaceWithData ud = {UserInterface::LCD1, screen_text};
this->_qm->send<UserInterface::InterfaceWithData>( this->_qm->send<UserInterface::InterfaceWithData>(
ThreadCommon::QueueManager::ui_event_manager, &ud, portMAX_DELAY); ThreadCommon::QueueManager::ui_event_manager, &ud, portMAX_DELAY);
} }

View File

@ -31,16 +31,16 @@ private:
Counter<EventRawData> ext_temp; Counter<EventRawData> ext_temp;
Counter<EventRawData> set_point; Counter<EventRawData> set_point;
EEPROMio eeprom; EEPROMio eeprom;
const char main_text[64]; char screen_text[64];
const char set_point_text[64];
/* States */ /* States */
void sInitView(const MenuObjEvent &e); void sInitView(const MenuObjEvent &e);
void sMainView(const MenuObjEvent &e); void sMainView(const MenuObjEvent &e);
void sSetPointMod(const MenuObjEvent &e); void sSetPointMod(const MenuObjEvent &e);
/* Methods */ /* Methods */
void constructUIString(uint8_t line, const char *fmt, ...);
void SetState (p_state new_state); void SetState (p_state new_state);
void HandleObj (const MenuObjEvent &event); void HandleObj (const MenuObjEvent &event);
void NotifyAndRefreshUI (const char *str); void NotifyAndRefreshUI ();
void readSetPointFromEEPROM (void); void readSetPointFromEEPROM (void);
}; };