state-handler: add timeout_error handling

This commit is contained in:
Vasily Davydov 2022-10-26 21:21:54 +03:00
parent 942e87b37c
commit a6d7bc0b27
4 changed files with 48 additions and 25 deletions

View File

@ -60,7 +60,8 @@ enum _mode
{ {
MANUAL, MANUAL,
AUTO, AUTO,
SENSORS SENSORS,
ERROR_TIMEOUT
}; };
enum _sensors enum _sensors

View File

@ -48,6 +48,12 @@ StateHandler::displaySet (size_t mode)
snprintf (line_down, 16, "HUM:%02d CO2:%02d", sensors_data[HUMIDITY], snprintf (line_down, 16, "HUM:%02d CO2:%02d", sensors_data[HUMIDITY],
sensors_data[CO2]); sensors_data[CO2]);
break; break;
case ERROR_TIMEOUT:
snprintf (line_up, 16, " FORCE STOP ", sensors_data[PRESSUREDAT],
sensors_data[TEMPERATURE]);
snprintf (line_down, 16, "REAS: TIMEOUT", sensors_data[HUMIDITY],
sensors_data[CO2]);
break;
default: default:
break; break;
} }
@ -93,7 +99,6 @@ StateHandler::stateInit (const Event &event)
case Event::eEnter: case Event::eEnter:
break; break;
case Event::eExit: case Event::eExit:
_lcd->clear ();
break; break;
case Event::eKey: case Event::eKey:
handleControlButtons (event.value); handleControlButtons (event.value);
@ -133,8 +138,15 @@ StateHandler::stateManual (const Event &event)
if (event.value % 500 == 0) if (event.value % 500 == 0)
{ {
SetState (&StateHandler::stateGetPressure); SetState (&StateHandler::stateGetPressure);
break;
} }
if (event.value < 0)
{
displaySet (ERROR_TIMEOUT);
fan_speed.setInit (0);
value[(current_mode)].setInit (0);
SetState (&StateHandler::stateInit);
}
break;
} }
} }
@ -161,6 +173,13 @@ StateHandler::stateAuto (const Event &event)
{ {
SetState (&StateHandler::stateGetPressure); SetState (&StateHandler::stateGetPressure);
} }
if (event.value < 0)
{
displaySet (ERROR_TIMEOUT);
fan_speed.setInit (0);
value[(current_mode)].setInit (0);
SetState (&StateHandler::stateInit);
}
pid (); pid ();
this->A01->write (fan_speed.getCurrent ()); this->A01->write (fan_speed.getCurrent ());
break; break;
@ -199,10 +218,10 @@ StateHandler::handleControlButtons (uint8_t button)
switch (button) switch (button)
{ {
case BUTTON_CONTROL_DOWN: case BUTTON_CONTROL_DOWN:
this->value[(current_mode) ? AUTO : MANUAL].dec (); this->value[(current_mode)].dec ();
break; break;
case BUTTON_CONTROL_UP: case BUTTON_CONTROL_UP:
this->value[(current_mode) ? AUTO : MANUAL].inc (); this->value[(current_mode)].inc ();
break; break;
case BUTTON_CONTROL_TOG_MODE: case BUTTON_CONTROL_TOG_MODE:
current_mode = !current_mode; current_mode = !current_mode;
@ -235,7 +254,6 @@ StateHandler::fan_speed_normalized ()
return speed * 10; return speed * 10;
} }
void void
StateHandler::pid () StateHandler::pid ()
{ {
@ -255,7 +273,6 @@ StateHandler::updateSensorValues ()
sensors_data[TEMPERATURE] = humidity.readT (); sensors_data[TEMPERATURE] = humidity.readT ();
sensors_data[PRESSUREDAT] = pressure->getPressure (); sensors_data[PRESSUREDAT] = pressure->getPressure ();
sensors_data[CO2] = co2.read (); sensors_data[CO2] = co2.read ();
state_timer->tickCounter(5); state_timer->tickCounter (5);
sensors_data[HUMIDITY] = humidity.readRH (); sensors_data[HUMIDITY] = humidity.readRH ();
} }

View File

@ -20,19 +20,19 @@ extern "C"
Timer::Timer (uint32_t freq) : freq (freq) Timer::Timer (uint32_t freq) : freq (freq)
{ {
mode = true; mode = true;
Chip_Clock_SetSysTickClockDiv (1); Chip_Clock_SetSysTickClockDiv (1);
uint32_t sysTickRate = Chip_Clock_GetSysTickClockRate (); uint32_t sysTickRate = Chip_Clock_GetSysTickClockRate ();
SysTick_Config (sysTickRate / freq); SysTick_Config (sysTickRate / freq);
resetCounter(); resetCounter ();
timer = 0; timer = 0;
systicks.store (0, std::memory_order_relaxed); systicks.store (0, std::memory_order_relaxed);
} }
Timer::Timer(bool mode) Timer::Timer (bool mode)
{ {
this->mode = false; this->mode = false;
resetCounter(); resetCounter ();
timer = 0; timer = 0;
systicks.store (0, std::memory_order_relaxed); systicks.store (0, std::memory_order_relaxed);
} }
@ -47,9 +47,9 @@ Timer::tickCounter (int ms)
{ {
if (counter >= INT_MAX) if (counter >= INT_MAX)
{ {
resetCounter(); resetCounter ();
} }
counter.fetch_add(ms, std::memory_order_relaxed); counter.fetch_add (ms, std::memory_order_relaxed);
Sleep (ms); Sleep (ms);
} }
@ -78,5 +78,5 @@ Timer::resetCounter ()
uint32_t uint32_t
millis () millis ()
{ {
return systicks.load(std::memory_order_relaxed); return systicks.load (std::memory_order_relaxed);
} }

View File

@ -82,7 +82,12 @@ main (void)
int getcounterValue = 0; int getcounterValue = 0;
while (1) while (1)
{ {
getcounterValue = glob_time.getCounter(); getcounterValue = glob_time.getCounter ();
if (getcounterValue > 15000)
{
glob_time.resetCounter ();
ventMachine.HandleState (Event (Event::eTick, -1));
}
sw_up.listen (); sw_up.listen ();
sw_down.listen (); sw_down.listen ();
sw_toggle.listen (); sw_toggle.listen ();