menu: [#25] Made states. Moved logic to Menu.

*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)
This commit is contained in:
RedHawk 2023-05-08 13:08:01 +03:00
parent fad70c9f37
commit d3f5cdebbc
4 changed files with 114 additions and 19 deletions

View File

@ -9,9 +9,8 @@
#include "ThreadCommon.h"
Manager::Manager(ThreadCommon::QueueManager* qm, Menu * menu)
: _qm(qm), _menu(menu), set_point(0, 100, 5)
: _qm(qm), _menu(menu)
{
set_point.setCurrent(0);
}
Manager::~Manager()
@ -33,7 +32,7 @@ Event::EventPair Manager::parseEvent(Event* e)
return p;
}
}
return {ERROR_RETURN, Event::Null};
}
void Manager::taskFunction()

View File

@ -22,11 +22,8 @@ public:
private:
Event::EventPair parseEvent(Event* e);
ThreadCommon::QueueManager* _qm;
Counter<EventRawData> set_point;
Menu* _menu;
EventRawData int_temp;
EventRawData ext_temp;
EventRawData rotary_action;
};

View File

@ -8,15 +8,16 @@
#include "Menu.h"
#include <assert.h>
Menu::Menu()
Menu::Menu(): current(&Menu::sInitView), set_point(0, 100, 1),
main_text ("CURRENT %2d DESIRED %2d "),
set_point_text("CURRENT %2d DESIRED[%2d] ")
{
// TODO Auto-generated constructor stub
this->SetState(&Menu::sInitView);
set_point.setCurrent(0);
}
Menu::~Menu()
{
// TODO Auto-generated destructor stub
}
void Menu::HandleEventPair (Event::EventPair *ep)
@ -47,13 +48,11 @@ void Menu::HandleEventPair (Event::EventPair *ep)
break;
}
break;
case Event::InternalTemp:
// TODO
assert(0);
break;
case Event::ExternalTemp:
// TODO
assert(0);
//Change ExternalTemp value.
this->ext_temp = ep->rd;
//Refresh the menu screen.
this->HandleObj(MenuObjEvent (MenuObjEvent::eRefresh));
break;
default:
assert(0);
@ -63,6 +62,93 @@ void Menu::HandleEventPair (Event::EventPair *ep)
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));
@ -75,3 +161,7 @@ void Menu::HandleObj (const MenuObjEvent &event)
(this->*current) (event);
}
void Menu::NotifyAndRefreshUI (const char *str)
{
//Send string on a queue to UI task.
}

View File

@ -5,14 +5,14 @@
* Author: dave
*/
#ifndef THREADS_MANAGER_MENU_H_
#define THREADS_MANAGER_MENU_H_
#include "Counter.h"
#include "MenuObjEvent.h"
#include "ThreadCommon.h"
#include "Event.h"
#ifndef THREADS_MANAGER_MENU_H_
#define THREADS_MANAGER_MENU_H_
class Menu;
typedef void (Menu::*p_state) (const MenuObjEvent &);
@ -26,9 +26,18 @@ public:
private:
/* Variables and objects */
p_state current;
int ext_temp;
Counter<EventRawData> set_point;
const char main_text[64];
const char set_point_text[64];
/* States */
void sInitView(const MenuObjEvent &e);
void sMainView(const MenuObjEvent &e);
void sSetPointMod(const MenuObjEvent &e);
/* Methods */
void SetState (p_state new_state);
void HandleObj (const MenuObjEvent &event);
void NotifyAndRefreshUI (const char *str);
};
#endif /* THREADS_MANAGER_MENU_H_ */