Digitum/src/domain/stateMachine.cpp
Svante Kaiser 5f1849caf1 led added
2023-11-02 16:52:57 +03:00

142 lines
2.9 KiB
C++

#include "utils/print.h"
#include "config/config.h"
#include "infra/mqtt.h"
#include "infra/led.h"
#include "domain/stateMachine.h"
State currentState = NOT_CONNECTED;
int countZeros = 0;
int countOnes = 0;
int previousData = 0;
int dataLength = 0;
int signalDuration = 0;
void resetCounters() {
countZeros = 0;
countOnes = 0;
previousData = 0;
dataLength = 0;
signalDuration = 0;
}
void writeState(char* message) {
println(message);
publishToMQTT(STATE_MQTT_TOPIC, message);
}
void receiveData(int data) {
if (data != previousData) {
if (previousData == HIGH) {
dataLength++;
}
signalDuration = 0;
} else {
signalDuration++;
}
previousData = data;
}
void changeState(State state, bool resetCountersFlag=true) {
currentState = state;
switch (state) {
case NOT_CONNECTED:
ledTurnOff();
writeState("not connected");
break;
case CONNECTED:
ledTurnOn();
writeState("connected");
break;
case RECEIVING_DATA:
writeState("receiving data");
break;
}
if (resetCountersFlag)
resetCounters();
}
void flatReceived() {
int flat = dataLength/2;
if (flat < 1)
return;
println("| data length: ", dataLength);
println("| flat: ", flat);
publishToMQTT(FLAT_NUMBER_MQTT_TOPIC, flat);
}
void updateStateMachine(int data) {
switch (currentState) {
case NOT_CONNECTED:
if (data == LOW) {}
else if (data == HIGH) {
changeState(CONNECTED);
}
break;
case CONNECTED:
if (data == LOW) {
countZeros++;
if (countZeros >= NOT_CONNECTED_THRESHOLD) {
changeState(NOT_CONNECTED);
}
} else if (data == HIGH) {
if (countZeros >= INITIALIZING_CALL_THRESHOLD) {
changeState(RECEIVING_DATA);
}
}
break;
case RECEIVING_DATA:
receiveData(data);
if (data == LOW) {
countOnes = 0;
countZeros++;
if (countZeros >= DATA_RECEIVED_THESHOLD) {
flatReceived();
changeState(DATA_RECEIVED);
}
} else if (data == HIGH) {
countZeros = 0;
countOnes++;
if (countOnes >= CONNECTED_THRESHOLD) {
changeState(CONNECTED);
}
}
break;
case DATA_RECEIVED:
if (data == LOW) {
countZeros++;
if (countZeros >= CALL_ENDED_THRESHOLD) {
changeState(CALL_ENDED);
}
} else if (data == HIGH) {
countOnes++;
if (countOnes >= CONNECTED_THRESHOLD) {
changeState(CONNECTED);
}
break;
}
case CALL_ENDED:
if (data == LOW) {
countZeros++;
if (countZeros >= NOT_CONNECTED_THRESHOLD) {
changeState(NOT_CONNECTED);
}
} else if (data == HIGH) {
countOnes++;
if (countOnes >= CONNECTED_THRESHOLD) {
changeState(CONNECTED);
}
break;
}
}
}