From 45ae1d0e3ea888473968d084f8ef32b3dd7c6781 Mon Sep 17 00:00:00 2001 From: Evgenii Meshcheriakov Date: Thu, 20 Oct 2022 17:25:54 +0300 Subject: [PATCH] StateHandler: new state - stateSensors which pools data from sensors and displays it --- SDP600Sensor/inc/PressureWrapper.h | 48 +++++++++++++++++++++++++++++ StateHandler/inc/StateHandler.h | 24 +++++++++++++-- StateHandler/src/StateHandler.cpp | 35 ++++++++++++++++++++- esp-vent-main/src/esp-vent-main.cpp | 5 +-- 4 files changed, 106 insertions(+), 6 deletions(-) diff --git a/SDP600Sensor/inc/PressureWrapper.h b/SDP600Sensor/inc/PressureWrapper.h index e69de29..6ee2936 100644 --- a/SDP600Sensor/inc/PressureWrapper.h +++ b/SDP600Sensor/inc/PressureWrapper.h @@ -0,0 +1,48 @@ +/* + * PressureWrapper.h + * + * Created on: 5 Oct 2022 + * Author: evgenymeshcheryakov + */ + +#ifndef PRESSUREWRAPPER_H_ +#define PRESSUREWRAPPER_H_ + +#include "I2C.h" +#include + +#define ADDRESS 0x40 + + +/** + * @brief structure to hold a raw data from + * the pressure sensor + */ + +typedef struct _PRESSURE{ + uint8_t rBuffer[2]; + uint8_t crc; +}PRESSURE_DATA; + +class PressureWrapper +{ +public: + PressureWrapper (); + /* + * @return pressure in Pascal + */ + int getPressure (); + + virtual ~PressureWrapper (); + +private: + I2C *i2c; + PRESSURE_DATA data = {{0, 0}, 0}; + /* + * @return struct with pressure data in + * rBuffer and CRC check in crc + */ + bool getRawPressure (); +}; + +#endif /* PRESSUREWRAPPER_H_ */ diff --git a/StateHandler/inc/StateHandler.h b/StateHandler/inc/StateHandler.h index 7d014f9..70a244c 100644 --- a/StateHandler/inc/StateHandler.h +++ b/StateHandler/inc/StateHandler.h @@ -23,6 +23,7 @@ #include "ModbusRegister.h" #include "GMP252.h" #include "HMP60.h" +#include "PressureWrapper.h" /** Buttons enumeration * @@ -61,13 +62,21 @@ enum _mode AUTO }; +enum _sensors +{ + PRESSUREDAT, + TEMPERATURE, + HUMIDITY, + CO2 +}; + class StateHandler; typedef void (StateHandler::*state_pointer) (const Event &); class StateHandler { public: - StateHandler (LiquidCrystal *lcd, ModbusRegister *A01); + StateHandler (LiquidCrystal *lcd, ModbusRegister *A01, PressureWrapper *pressure); virtual ~StateHandler (); /** Get currently set pressure @@ -117,9 +126,10 @@ private: int integral = 0; int saved_set_value[2] = { 0, 0 }; int saved_curr_value[2] = { 0, 0 }; + int sensors_data[4] = {0}; LiquidCrystal *_lcd; ModbusRegister *A01; - + PressureWrapper * pressure; /* CO2 sensor object */ GMP252 co2; @@ -151,7 +161,15 @@ private: */ void stateAuto (const Event &event); - /** Hnadle button presses + /** Sensors state + * + * - print current sensrs readings + * + * @param event + */ + void stateSensors (const Event &event); + + /** Handle button presses * * @param button current button */ diff --git a/StateHandler/src/StateHandler.cpp b/StateHandler/src/StateHandler.cpp index 884d2bd..0a90e24 100644 --- a/StateHandler/src/StateHandler.cpp +++ b/StateHandler/src/StateHandler.cpp @@ -7,10 +7,11 @@ #include -StateHandler::StateHandler (LiquidCrystal *lcd, ModbusRegister *A01) +StateHandler::StateHandler (LiquidCrystal *lcd, ModbusRegister *A01, PressureWrapper *pressure) { this->_lcd = lcd; this->A01 = A01; + this->pressure = pressure; current = &StateHandler::stateInit; (this->*current) (Event (Event::eEnter)); current_mode = MANUAL; @@ -77,6 +78,7 @@ StateHandler::stateInit (const Event &event) switch (event.type) { case Event::eEnter: + SetState(&StateHandler::stateSensors); break; case Event::eExit: _lcd->clear (); @@ -152,6 +154,37 @@ StateHandler::stateAuto (const Event &event) } } +void +StateHandler::stateSensors (const Event &event) +{ + switch (event.type) + { + case Event::eEnter: + break; + case Event::eExit: + break; + case Event::eKey: + break; + case Event::eTick: + sensors_data[PRESSUREDAT] = pressure->getPressure(); + sensors_data[TEMPERATURE] = humidity.readT(); + sensors_data[HUMIDITY] = humidity.readRH(); + sensors_data[CO2] = co2.read(); + char line_up[16] = { 0 }; + char line_down[16] = { 0 }; + + snprintf (line_up, 16, "PRE:%02dPa TEM:%02dC", sensors_data[PRESSUREDAT],sensors_data[TEMPERATURE]); + snprintf (line_down, 16, "HUM:%02d CO2:%02d", sensors_data[HUMIDITY], sensors_data[CO2]); + + _lcd->clear (); + _lcd->setCursor (0, 0); + _lcd->print (line_up); + _lcd->setCursor (0, 1); + _lcd->print (line_down); + SetState (&StateHandler::stateManual); + break; + } +} void StateHandler::handleControlButtons (uint8_t button) diff --git a/esp-vent-main/src/esp-vent-main.cpp b/esp-vent-main/src/esp-vent-main.cpp index be77b29..9bb2230 100644 --- a/esp-vent-main/src/esp-vent-main.cpp +++ b/esp-vent-main/src/esp-vent-main.cpp @@ -65,8 +65,10 @@ main (void) ModbusRegister A01(&fan, 0); // ModbusRegister DI1(&fan, 4, false); + PressureWrapper sens; - StateHandler ventMachine (&lcd, &A01); + + StateHandler ventMachine (&lcd, &A01, &sens); /** Common pins */ DigitalIoPin b_up (0, 7, true, true, true); // A5 SwitchController sw_up (&b_up, &glob_time, &ventMachine, BUTTON_CONTROL_UP); @@ -79,7 +81,6 @@ main (void) SwitchController sw_toggle (&b_toggle, &glob_time, &ventMachine, BUTTON_CONTROL_TOG_MODE); - PressureWrapper sens; int pressure = 0, pressure_time = 0; while (1)