167 lines
3.6 KiB
C++
167 lines
3.6 KiB
C++
/*
|
|
* StateHandler.h
|
|
*
|
|
* Created on: Sep 21, 2022
|
|
* Author: tylen
|
|
*
|
|
* Purpose of this class is to store and pass
|
|
* the events of the current mode to further process.
|
|
*
|
|
* Current goal is to make it to operate on interrupts
|
|
* caused by button presses.
|
|
*
|
|
*/
|
|
|
|
#ifndef STATE_HANDLER_H_
|
|
#define STATE_HANDLER_H_
|
|
|
|
#include "Counter.h"
|
|
#include "DigitalIoPin.h"
|
|
#include "Event.h"
|
|
#include "LiquidCrystal.h"
|
|
#include "ModbusMaster.h"
|
|
#include "ModbusRegister.h"
|
|
|
|
/** Buttons enumeration
|
|
*
|
|
* Current switch state is being passed
|
|
* from main to StateHandler through
|
|
* a keyEvent. Enumeration determines the state
|
|
* of the particular button.
|
|
* */
|
|
|
|
enum _buttons
|
|
{
|
|
/** Raises the bar up */
|
|
BUTTON_CONTROL_UP,
|
|
/** Raises the bar down */
|
|
BUTTON_CONTROL_DOWN,
|
|
/** Toggles the mode between auto and
|
|
* manual, which changes the state */
|
|
BUTTON_CONTROL_TOG_MODE,
|
|
/** Optional button to toggle the
|
|
* activation of the current setting.
|
|
* Not compulsory to be used. */
|
|
BUTTON_CONTROL_TOG_ACTIVE
|
|
};
|
|
|
|
enum _bars
|
|
{
|
|
/** 0-100 % */
|
|
FAN_SPEED,
|
|
/** 0-120 Pa */
|
|
PRESSURE
|
|
};
|
|
|
|
enum _mode
|
|
{
|
|
MANUAL,
|
|
AUTO
|
|
};
|
|
|
|
class StateHandler;
|
|
typedef void (StateHandler::*state_pointer) (const Event &);
|
|
|
|
class StateHandler
|
|
{
|
|
public:
|
|
StateHandler (LiquidCrystal *lcd, ModbusRegister *A01);
|
|
virtual ~StateHandler ();
|
|
|
|
/** Get currently set pressure
|
|
*
|
|
* @return pressure in range of 0-120
|
|
*/
|
|
unsigned int getSetPressure ();
|
|
|
|
/** Get currently set FanSpeed
|
|
*
|
|
* @return speed in range of 0-100
|
|
*/
|
|
unsigned int getSetSpeed ();
|
|
|
|
/** Display values on LCD depending on current mode
|
|
*
|
|
* MANUAL MODE: SPEED: XX% PRESSURE: XXPa
|
|
*
|
|
* AUTO MODE: P. SET: XXPa P. CURR: XXPa
|
|
*
|
|
* @param value1 value to be displayed on LCD line 0
|
|
* @param value2 value to be displayed on LCD line 1
|
|
*/
|
|
void displaySet (unsigned int value1, unsigned int value2);
|
|
|
|
/** Handle the given event of the current state
|
|
*
|
|
* @param event event to be handled in the current state
|
|
*/
|
|
void HandleState (const Event &event);
|
|
|
|
private:
|
|
state_pointer current;
|
|
/** Set a new curremt state
|
|
* @param newstate new state to be set to current
|
|
*/
|
|
void SetState (state_pointer newstate);
|
|
bool current_mode;
|
|
Counter value[2] = { { 0, 100 }, { 0, 120 } };
|
|
/* motor of fan starts at value 90. probably because of some
|
|
* weigh of fan, so voltage within range of 0-89 is not
|
|
* sufficient to start motor.
|
|
* TODO: Value 89 should be scaled to 0 at some point */
|
|
Counter fan_speed = {89, 1000};
|
|
/*integral controller for PID. should be global, since it
|
|
* accumulates error signals encountered since startup*/
|
|
int integral = 0;
|
|
int saved_set_value[2] = { 0, 0 };
|
|
int saved_curr_value[2] = { 0, 0 };
|
|
LiquidCrystal *_lcd;
|
|
ModbusRegister *A01;
|
|
|
|
/** Initialization state
|
|
*
|
|
* @param event event of the state
|
|
*/
|
|
void stateInit (const Event &event);
|
|
|
|
/** Manual state
|
|
*
|
|
* - set current speed
|
|
* - print current pressure
|
|
*
|
|
* @param event event of the state
|
|
*/
|
|
void stateManual (const Event &event);
|
|
|
|
/** Automated state
|
|
*
|
|
* - print current pressure
|
|
* - print set pressure
|
|
* - inc/dec fan speed
|
|
*
|
|
* @param event
|
|
*/
|
|
void stateAuto (const Event &event);
|
|
|
|
/** Hnadle button presses
|
|
*
|
|
* @param button current button
|
|
*/
|
|
void handleControlButtons (uint8_t button);
|
|
|
|
/** Save values to class' varibales
|
|
*
|
|
* @param eventValue value coming from an event
|
|
* @param counterValue value of the inner Counter
|
|
* @param mode current mode
|
|
*/
|
|
void save (int eventValue, int counterValue, size_t mode);
|
|
|
|
/** Calculates pid for fan control value
|
|
*
|
|
*/
|
|
void pid ();
|
|
};
|
|
|
|
#endif /* STATE_HANDLER_H_ */
|