prep measure state machine

This commit is contained in:
2022-03-22 21:56:07 +01:00
parent 0eae51d837
commit 9537ac76ac
10 changed files with 173 additions and 6 deletions

View File

@@ -25,6 +25,16 @@ void initInputs(void)
log_i("Init Inputs: OK");
}
bool getLevelIn(void)
{
return digitalRead(LEVEL_IN);
}
bool getErrorIn(void)
{
return digitalRead(ERROR_IN);
}
void initOutputs(void)
{
pinMode(UC01, OUTPUT);

View File

@@ -1,7 +1,9 @@
#pragma once
void initBoard(void);
void scanI2C(void);
bool getLevelIn(void);
bool getErrorIn(void);
#define HAS_DISPLAY
#define HAS_SSD1322

View File

@@ -1,13 +1,55 @@
#include "gain_control.h"
c_gainControl modeNone(e_measureMode::mNone, 0, 0, 0, 0, 0, 0);
c_gainControl mode20mA(e_measureMode::mA20, 1, 1, 0, 0, 1, 1);
std::vector<c_gainControl> gainList;
e_measureMode lastGain = e_measureMode::mNone;
void initGainControl(void)
{
gainList.push_back(modeNone);
gainList.push_back(mode20mA);
}
void handleGainControl(void)
{
}
bool setGain(e_measureMode mode)
{
bool found = false;
if(mode == lastGain)
{
return false;
}
for (auto &&gain : gainList)
{
if (gain.getMode() == mode)
{
gain.activate();
found = true;
lastGain = mode;
}
}
if(!found)
{
log_e("measureMode %d not found", mode);
resetGain();
return false;
}
return true;
}
void resetGain(void)
{
log_d("reset gain control");
for (auto &&gain : gainList)
{
gain.deactivate();
}
setGain(mNone);
}

View File

@@ -3,6 +3,7 @@
#include "Arduino.h"
#include "measure_mode.h"
#include "board.h"
#include <vector>
#define UCCONTROLIO 6
@@ -12,6 +13,7 @@ class c_gainControl
bool _uc[UCCONTROLIO];
uint8_t _ucPin[UCCONTROLIO] = {UC01, UC02, UC03, UC04, UC05, UC06};
bool state = false;
public:
c_gainControl(e_measureMode mode, bool uc01, bool uc02, bool uc03, bool uc04, bool uc05, bool uc06) : _mode(mode)
@@ -30,6 +32,12 @@ public:
{
digitalWrite(_ucPin[i], _uc[i]);
}
state = true;
}
void deactivate(void)
{
state = false;
}
e_measureMode getMode(void)
@@ -39,4 +47,7 @@ public:
};
void initGainControl(void);
void handleGainControl(void);
void handleGainControl(void);
void resetGain(void);
bool setGain(e_measureMode mode);

View File

@@ -6,6 +6,8 @@ void initMeasure(void)
log_i("init measure");
initMeasureHall();
initMeasureMode();
initMeasureState();
log_i("init measure: OK");
}
@@ -14,6 +16,7 @@ void handleMeasure(void)
log_d("handle measure");
handleMeasureHall();
handleMeasureMode();
handleMeasureState();
}
double getMin(void)

View File

@@ -4,6 +4,7 @@
#include "board.h"
#include "measure_hall.h"
#include "measure_mode.h"
#include "measure_state.h"
#define DACINTERVAL 10 //ms
#define DACSTEP 8 //ticks

View File

@@ -18,7 +18,7 @@ e_measureMode getMeasureMode(void)
bool getErrorState(void)
{
return measureError;
return getErrorIn();
}
bool getOkState(void)
@@ -31,7 +31,6 @@ bool getOpenState(void)
return measureOpen;
}
void initMeasureMode(void)
{
log_i("init measure mode");
@@ -39,5 +38,5 @@ void initMeasureMode(void)
void handleMeasureMode(void)
{
}

View File

@@ -1,6 +1,8 @@
#pragma once
#include "Arduino.h"
#include "board.h"
enum e_measureMode
{
@@ -13,6 +15,7 @@ enum e_measureMode
mNone
};
e_measureMode getMeasureMode( void );
void setMeasureMode(e_measureMode newMode);
bool getErrorState(void);

View File

@@ -0,0 +1,61 @@
#include "measure_state.h"
e_measureStates currentMeasureState = e_measureStates::stateInit;
e_measureStates lastMeasureState = e_measureStates::stateInit;
uint32_t lastMeasureTime = 0;
void setMeasureState(e_measureStates newState)
{
if (currentMeasureState != e_measureStates::stateError && currentMeasureState != e_measureStates::stateFatalError )
{
currentMeasureState = newState;
}
else
{
log_e("system in error state, not changing states");
}
}
void initMeasureState(void)
{
currentMeasureState = e_measureStates::stateInit;
lastMeasureTime = millis();
}
void handleMeasureState(void)
{
uint32_t currentTime = millis();
bool newState = false;
if (currentTime - lastMeasureTime > MEASURESTATEINTERVAL)
{
if (currentMeasureState != lastMeasureState)
{
log_i("measureState: %s", s_measureState[currentMeasureState]);
newState = true;
}
switch (currentMeasureState)
{
case e_measureStates::stateInit:
{
setGain(mNone);
currentMeasureState = stateIdle;
}
break;
case e_measureStates::stateError:
{
setGain(mNone);
if(!getErrorIn())
{
currentMeasureState = e_measureStates::stateIdle;
}
}
break;
default:
break;
}
lastMeasureTime = currentTime;
}
}

View File

@@ -0,0 +1,35 @@
#pragma once
#include "Arduino.h"
#include "gain_control.h"
#include "measure_mode.h"
#define MEASURESTATEINTERVAL 200
typedef enum
{
stateInit,
stateIdle,
stateConnected,
stateAllGood,
stateOpen,
stateError,
stateFatalError,
lastState
}e_measureStates;
String s_measureState[lastState+1] =
{
"init",
"idle",
"connected",
"allGood",
"Open",
"Error",
"FatalError",
"invalidstate"
};
void initMeasureState(void);
void handleMeasureState(void);
void setMeasureState(e_measureStates newState);