pressure: create state for reading pressure
This commit is contained in:
parent
cf8d491516
commit
7871953fe6
@ -13,13 +13,13 @@
|
|||||||
|
|
||||||
#define ADDRESS 0x40
|
#define ADDRESS 0x40
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief structure to hold a raw data from
|
* @brief structure to hold a raw data from
|
||||||
* the pressure sensor
|
* the pressure sensor
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct _PRESSURE{
|
typedef struct _PRESSURE
|
||||||
|
{
|
||||||
uint8_t rBuffer[2];
|
uint8_t rBuffer[2];
|
||||||
uint8_t crc;
|
uint8_t crc;
|
||||||
} PRESSURE_DATA;
|
} PRESSURE_DATA;
|
||||||
@ -33,6 +33,20 @@ public:
|
|||||||
*/
|
*/
|
||||||
int getPressure ();
|
int getPressure ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if sensor is ready
|
||||||
|
*
|
||||||
|
* @return true if awake
|
||||||
|
* @return false if asleep
|
||||||
|
*/
|
||||||
|
bool isAwake ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Wake the sensor up
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void wakeUp ();
|
||||||
|
|
||||||
virtual ~PressureWrapper ();
|
virtual ~PressureWrapper ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -132,6 +132,7 @@ private:
|
|||||||
LiquidCrystal *_lcd;
|
LiquidCrystal *_lcd;
|
||||||
ModbusRegister *A01;
|
ModbusRegister *A01;
|
||||||
PressureWrapper *pressure;
|
PressureWrapper *pressure;
|
||||||
|
bool pressure_status;
|
||||||
Timer *state_timer;
|
Timer *state_timer;
|
||||||
/* CO2 sensor object */
|
/* CO2 sensor object */
|
||||||
GMP252 co2;
|
GMP252 co2;
|
||||||
|
|||||||
@ -8,15 +8,21 @@
|
|||||||
#include "PressureWrapper.h"
|
#include "PressureWrapper.h"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
static uint8_t crc8(uint8_t *data, size_t size) {
|
static uint8_t
|
||||||
|
crc8 (uint8_t *data, size_t size)
|
||||||
|
{
|
||||||
uint8_t crc = 0x00;
|
uint8_t crc = 0x00;
|
||||||
uint8_t byteCtr;
|
uint8_t byteCtr;
|
||||||
// calculates 8-Bit checksum with given polynomial
|
// calculates 8-Bit checksum with given polynomial
|
||||||
for (byteCtr = 0; byteCtr < size; ++byteCtr) {
|
for (byteCtr = 0; byteCtr < size; ++byteCtr)
|
||||||
|
{
|
||||||
crc ^= (data[byteCtr]);
|
crc ^= (data[byteCtr]);
|
||||||
for (uint8_t bit = 8; bit > 0; --bit) {
|
for (uint8_t bit = 8; bit > 0; --bit)
|
||||||
if (crc & 0x80) crc = (crc << 1) ^ 0x131; //P(x)=x^8+x^5+x^4+1 = 0001 0011 0001
|
{
|
||||||
else crc = (crc << 1);
|
if (crc & 0x80)
|
||||||
|
crc = (crc << 1) ^ 0x131; // P(x)=x^8+x^5+x^4+1 = 0001 0011 0001
|
||||||
|
else
|
||||||
|
crc = (crc << 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return crc;
|
return crc;
|
||||||
@ -35,15 +41,20 @@ PressureWrapper::~PressureWrapper ()
|
|||||||
// TODO Auto-generated destructor stub
|
// TODO Auto-generated destructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
int PressureWrapper::getPressure() {
|
int
|
||||||
|
PressureWrapper::getPressure ()
|
||||||
|
{
|
||||||
int16_t pressure = 0;
|
int16_t pressure = 0;
|
||||||
if(!getRawPressure ()) {
|
if (!getRawPressure ())
|
||||||
|
{
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
while(i<7200) i++;
|
while (i < 7200)
|
||||||
|
i++;
|
||||||
getRawPressure ();
|
getRawPressure ();
|
||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
if(crc8(data.rBuffer, 2) == data.crc){
|
if (crc8 (data.rBuffer, 2) == data.crc)
|
||||||
|
{
|
||||||
pressure = data.rBuffer[0];
|
pressure = data.rBuffer[0];
|
||||||
pressure = pressure << 8;
|
pressure = pressure << 8;
|
||||||
pressure |= data.rBuffer[1];
|
pressure |= data.rBuffer[1];
|
||||||
@ -53,9 +64,20 @@ int PressureWrapper::getPressure() {
|
|||||||
return -255;
|
return -255;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PressureWrapper::getRawPressure () {
|
bool
|
||||||
|
PressureWrapper::isAwake ()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PressureWrapper::wakeUp ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
PressureWrapper::getRawPressure ()
|
||||||
|
{
|
||||||
uint8_t getMeasurementComm = 0xF1;
|
uint8_t getMeasurementComm = 0xF1;
|
||||||
return (i2c->transaction (ADDRESS, &getMeasurementComm, 1, data.rBuffer, 3));
|
return (i2c->transaction (ADDRESS, &getMeasurementComm, 1, data.rBuffer, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -202,13 +202,22 @@ StateHandler::stateGetPressure (const Event &event)
|
|||||||
switch (event.type)
|
switch (event.type)
|
||||||
{
|
{
|
||||||
case Event::eEnter:
|
case Event::eEnter:
|
||||||
|
pressure_status = pressure->isAwake ();
|
||||||
break;
|
break;
|
||||||
case Event::eExit:
|
case Event::eExit:
|
||||||
break;
|
break;
|
||||||
case Event::eKey:
|
case Event::eKey:
|
||||||
|
handleControlButtons (event.value);
|
||||||
break;
|
break;
|
||||||
case Event::eTick:
|
case Event::eTick:
|
||||||
|
if (pressure_status)
|
||||||
|
{
|
||||||
|
save (pressure->getPressure (), ((current_mode) ? AUTO : MANUAL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pressure->wakeUp ();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user