*Menu class now is responsible for the whole logic with temperature and set_point. *void NotifyAndRefreshUI (const char *str) is a placeholder for sending a string value on a queue to UI task, which will handle the lcd screen. *Added error return value to Manager::parseEvent(Event* e)
167 lines
4.7 KiB
C++
167 lines
4.7 KiB
C++
/*
|
|
* Menu.cpp
|
|
*
|
|
* Created on: 29 Apr 2023
|
|
* Author: dave
|
|
*/
|
|
|
|
#include "Menu.h"
|
|
#include <assert.h>
|
|
|
|
Menu::Menu(): current(&Menu::sInitView), set_point(0, 100, 1),
|
|
main_text ("CURRENT %2d DESIRED %2d "),
|
|
set_point_text("CURRENT %2d DESIRED[%2d] ")
|
|
{
|
|
this->SetState(&Menu::sInitView);
|
|
set_point.setCurrent(0);
|
|
}
|
|
|
|
Menu::~Menu()
|
|
{
|
|
}
|
|
|
|
void Menu::HandleEventPair (Event::EventPair *ep)
|
|
{
|
|
switch(ep->et/*EventType*/)
|
|
{
|
|
case Event::Rotary:
|
|
// can be wrapped in a function, but this was found to be more clear solution,
|
|
// since we are still handling eventpair here, although nested
|
|
switch(static_cast<ThreadCommon::RotaryAction>(ep->rd)/*RawData*/)
|
|
{
|
|
case ThreadCommon::RotaryAction::Right:
|
|
this->HandleObj(MenuObjEvent (MenuObjEvent::eRollClockWise));
|
|
break;
|
|
case ThreadCommon::RotaryAction::Left:
|
|
this->HandleObj(MenuObjEvent (MenuObjEvent::eRollCClockWise));
|
|
break;
|
|
case ThreadCommon::RotaryAction::Press:
|
|
this->HandleObj(MenuObjEvent (MenuObjEvent::eClick));
|
|
break;
|
|
case ThreadCommon::RotaryAction::Idle:
|
|
/*I guess this is left for debugging purposes ;D*/
|
|
this->HandleObj(MenuObjEvent (MenuObjEvent::eRefresh));
|
|
break;
|
|
default:
|
|
assert(0);
|
|
/* Pretty damn bad code if reached here */
|
|
break;
|
|
}
|
|
break;
|
|
case Event::ExternalTemp:
|
|
//Change ExternalTemp value.
|
|
this->ext_temp = ep->rd;
|
|
//Refresh the menu screen.
|
|
this->HandleObj(MenuObjEvent (MenuObjEvent::eRefresh));
|
|
break;
|
|
default:
|
|
assert(0);
|
|
/* Manager has big issues... */
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
/* States */
|
|
void Menu::sInitView(const MenuObjEvent &e)
|
|
{
|
|
switch (e.type)
|
|
{
|
|
case MenuObjEvent::eFocus:
|
|
this->NotifyAndRefreshUI("Loading...");
|
|
break;
|
|
case MenuObjEvent::eUnFocus:
|
|
this->NotifyAndRefreshUI("");
|
|
break;
|
|
case MenuObjEvent::eRollClockWise:
|
|
break;
|
|
case MenuObjEvent::eRollCClockWise:
|
|
break;
|
|
case MenuObjEvent::eClick:
|
|
break;
|
|
case MenuObjEvent::eRefresh:
|
|
this->SetState(&Menu::sMainView);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Menu::sMainView(const MenuObjEvent &e)
|
|
{
|
|
char screen_text[64];
|
|
switch (e.type)
|
|
{
|
|
case MenuObjEvent::eFocus:
|
|
sprintf(screen_text, main_text, this->ext_temp, this->set_point.getCurrent());
|
|
this->NotifyAndRefreshUI(screen_text);
|
|
break;
|
|
case MenuObjEvent::eUnFocus:
|
|
this->NotifyAndRefreshUI("");
|
|
break;
|
|
case MenuObjEvent::eRollClockWise:
|
|
break;
|
|
case MenuObjEvent::eRollCClockWise:
|
|
break;
|
|
case MenuObjEvent::eClick:
|
|
this->SetState(&Menu::sSetPointMod);
|
|
break;
|
|
case MenuObjEvent::eRefresh:
|
|
sprintf(screen_text, main_text, this->ext_temp, this->set_point.getCurrent());
|
|
this->NotifyAndRefreshUI(screen_text);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Menu::sSetPointMod(const MenuObjEvent &e)
|
|
{
|
|
char screen_text[64];
|
|
switch (e.type)
|
|
{
|
|
case MenuObjEvent::eFocus:
|
|
sprintf(screen_text, set_point_text, this->ext_temp, this->set_point.getCurrent());
|
|
this->NotifyAndRefreshUI(screen_text);
|
|
break;
|
|
case MenuObjEvent::eUnFocus:
|
|
this->NotifyAndRefreshUI("");
|
|
break;
|
|
case MenuObjEvent::eRollClockWise:
|
|
set_point.inc();
|
|
sprintf(screen_text, set_point_text, this->ext_temp, this->set_point.getCurrent());
|
|
this->NotifyAndRefreshUI(screen_text);
|
|
break;
|
|
case MenuObjEvent::eRollCClockWise:
|
|
set_point.dec();
|
|
sprintf(screen_text, set_point_text, this->ext_temp, this->set_point.getCurrent());
|
|
this->NotifyAndRefreshUI(screen_text);
|
|
break;
|
|
case MenuObjEvent::eClick:
|
|
this->SetState(&Menu::sMainView);
|
|
break;
|
|
case MenuObjEvent::eRefresh:
|
|
sprintf(screen_text, set_point_text, this->ext_temp, this->set_point.getCurrent());
|
|
this->NotifyAndRefreshUI(screen_text);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Menu::SetState (p_state new_state)
|
|
{
|
|
(this->*current) (MenuObjEvent (MenuObjEvent::eUnFocus));
|
|
current = new_state;
|
|
(this->*current) (MenuObjEvent (MenuObjEvent::eFocus));
|
|
}
|
|
|
|
void Menu::HandleObj (const MenuObjEvent &event)
|
|
{
|
|
(this->*current) (event);
|
|
}
|
|
|
|
void Menu::NotifyAndRefreshUI (const char *str)
|
|
{
|
|
//Send string on a queue to UI task.
|
|
} |