From ae46832d88d1a83e71062835e00a5c7cffc14087 Mon Sep 17 00:00:00 2001 From: Svante Kaiser Date: Thu, 14 Dec 2023 16:15:23 +0300 Subject: [PATCH] vizit support --- src/domain/stateMachine.cpp | 65 ++++++++++++++----- src/domain/stateMachine.h | 7 +- ...sabled => stateMachineCyfral.cpp.disabled} | 21 +++--- ...disabled => stateMachineCyfral.h.disabled} | 7 +- src/infra/mqtt.cpp | 4 +- src/main.cpp | 12 +++- 6 files changed, 81 insertions(+), 35 deletions(-) rename src/domain/{stateMachineVizit.cpp.disabled => stateMachineCyfral.cpp.disabled} (89%) rename src/domain/{stateMachineVizit.h.disabled => stateMachineCyfral.h.disabled} (69%) diff --git a/src/domain/stateMachine.cpp b/src/domain/stateMachine.cpp index f14bcc3..6f5e1e1 100644 --- a/src/domain/stateMachine.cpp +++ b/src/domain/stateMachine.cpp @@ -12,23 +12,26 @@ int previousData = 0; int dataLength = 0; int signalDuration = 0; +int flat = 0; + void resetCounters() { countZeros = 0; countOnes = 0; previousData = 0; - dataLength = 0; + dataLength = 1; signalDuration = 0; } void writeState(char* message) { - println(message); + //println(message); publishToMQTT(STATE_MQTT_TOPIC, message); } -void receiveData(int data) { +void receiveDigit(int data) { if (data != previousData) { if (previousData == HIGH) { + //println("AAAA ", dataLength, " ", signalDuration); dataLength++; } signalDuration = 0; @@ -50,7 +53,7 @@ void changeState(State state, bool resetCountersFlag=true) { ledTurnOn(); writeState("connected"); break; - case RECEIVING_DATA: + case RECEIVING_FIRST_DIGIT: writeState("receiving data"); break; } @@ -59,13 +62,24 @@ void changeState(State state, bool resetCountersFlag=true) { resetCounters(); } -void flatReceived() { - int flat = dataLength/2; +void firstDigitReceived() { + println("| 1 data length: ", dataLength); + flat = dataLength*10; +} - if (flat < 1) - return; +void secondDigitReceived() { + if (dataLength == 11) { + dataLength = 1; + } - println("| data length: ", dataLength); + flat += dataLength; + flat -= 1; + + if (flat > 100 && flat < 110) { + flat -= 100; + } + + println("| 2 data length: ", dataLength); println("| flat: ", flat); publishToMQTT(FLAT_NUMBER_MQTT_TOPIC, flat); } @@ -87,24 +101,43 @@ void updateStateMachine(int data) { } } else if (data == HIGH) { if (countZeros >= INITIALIZING_CALL_THRESHOLD) { - changeState(RECEIVING_DATA); + changeState(RECEIVING_FIRST_DIGIT); } } break; - case RECEIVING_DATA: - receiveData(data); + case RECEIVING_FIRST_DIGIT: + receiveDigit(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 >= DATA_RECEIVED_THESHOLD) { + firstDigitReceived(); + changeState(RECEIVING_SECOND_DIGIT); + } + if (countOnes >= CONNECTED_THRESHOLD) { + changeState(CONNECTED); + } + } + break; + + case RECEIVING_SECOND_DIGIT: + receiveDigit(data); + + if (data == LOW) { + countOnes = 0; + countZeros++; + } else if (data == HIGH) { + countZeros = 0; + countOnes++; + if (countOnes >= DATA_RECEIVED_THESHOLD) { + secondDigitReceived(); + changeState(DATA_RECEIVED); + } if (countOnes >= CONNECTED_THRESHOLD) { changeState(CONNECTED); } diff --git a/src/domain/stateMachine.h b/src/domain/stateMachine.h index 09fa79a..3aea586 100644 --- a/src/domain/stateMachine.h +++ b/src/domain/stateMachine.h @@ -5,14 +5,15 @@ #define CONNECTED_THRESHOLD 50000 #define NOT_CONNECTED_THRESHOLD 50000 -#define INITIALIZING_CALL_THRESHOLD 15000 -#define DATA_RECEIVED_THESHOLD 30000 +#define INITIALIZING_CALL_THRESHOLD 45 +#define DATA_RECEIVED_THESHOLD 5000 #define CALL_ENDED_THRESHOLD 10000 enum State { NOT_CONNECTED, CONNECTED, - RECEIVING_DATA, + RECEIVING_FIRST_DIGIT, + RECEIVING_SECOND_DIGIT, DATA_RECEIVED, CALL_ENDED }; diff --git a/src/domain/stateMachineVizit.cpp.disabled b/src/domain/stateMachineCyfral.cpp.disabled similarity index 89% rename from src/domain/stateMachineVizit.cpp.disabled rename to src/domain/stateMachineCyfral.cpp.disabled index aaa6ebf..c0ba8b4 100644 --- a/src/domain/stateMachineVizit.cpp.disabled +++ b/src/domain/stateMachineCyfral.cpp.disabled @@ -2,7 +2,7 @@ #include "config/config.h" #include "infra/mqtt.h" #include "infra/led.h" -#include "domain/stateMachineVizit.h" +#include "domain/stateMachine.h" State currentState = NOT_CONNECTED; int countZeros = 0; @@ -12,6 +12,8 @@ int previousData = 0; int dataLength = 0; int signalDuration = 0; +int flat = 0; + void resetCounters() { countZeros = 0; countOnes = 0; @@ -26,7 +28,7 @@ void writeState(char* message) { publishToMQTT(STATE_MQTT_TOPIC, message); } -void receiveDigit(int data) { +void receiveData(int data) { if (data != previousData) { if (previousData == HIGH) { dataLength++; @@ -50,7 +52,7 @@ void changeState(State state, bool resetCountersFlag=true) { ledTurnOn(); writeState("connected"); break; - case RECEIVING_FIRST_DIGIT: + case RECEIVING_DATA: writeState("receiving data"); break; } @@ -87,23 +89,24 @@ void updateStateMachine(int data) { } } else if (data == HIGH) { if (countZeros >= INITIALIZING_CALL_THRESHOLD) { - changeState(RECEIVING_FIRST_DIGIT); + changeState(RECEIVING_DATA); } } break; - case RECEIVING_FIRST_DIGIT: - receiveDigit(data); + 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 >= DATA_RECEIVED_THESHOLD) { - changeState(CONNECTED); - } if (countOnes >= CONNECTED_THRESHOLD) { changeState(CONNECTED); } diff --git a/src/domain/stateMachineVizit.h.disabled b/src/domain/stateMachineCyfral.h.disabled similarity index 69% rename from src/domain/stateMachineVizit.h.disabled rename to src/domain/stateMachineCyfral.h.disabled index cfd282b..09fa79a 100644 --- a/src/domain/stateMachineVizit.h.disabled +++ b/src/domain/stateMachineCyfral.h.disabled @@ -5,15 +5,14 @@ #define CONNECTED_THRESHOLD 50000 #define NOT_CONNECTED_THRESHOLD 50000 -#define INITIALIZING_CALL_THRESHOLD 45 -#define DATA_RECEIVED_THESHOLD 250 +#define INITIALIZING_CALL_THRESHOLD 15000 +#define DATA_RECEIVED_THESHOLD 30000 #define CALL_ENDED_THRESHOLD 10000 enum State { NOT_CONNECTED, CONNECTED, - RECEIVING_FIRST_DIGIT, - RECEIVING_SECOND_DIGIT, + RECEIVING_DATA, DATA_RECEIVED, CALL_ENDED }; diff --git a/src/infra/mqtt.cpp b/src/infra/mqtt.cpp index f2d782d..8e60af2 100644 --- a/src/infra/mqtt.cpp +++ b/src/infra/mqtt.cpp @@ -57,7 +57,7 @@ void publishToMQTT(const char* topic, int message) { char num_char[10]; sprintf(num_char, "%d", message); - mqttClient.publish(topic, 2, true, num_char); + mqttClient.publish(fullTopic, 2, true, num_char); publishJSONToMQTT(topic, message); } @@ -70,7 +70,7 @@ void publishToMQTT(const char* topic, float message) { char num_char[10]; dtostrf(message, 1, 2, num_char); // Convert float to string - mqttClient.publish(topic, 2, true, num_char); + mqttClient.publish(fullTopic, 2, true, num_char); publishJSONToMQTT(topic, message); } diff --git a/src/main.cpp b/src/main.cpp index bc4fd5a..76ce856 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,14 +26,24 @@ int data = 0; bool flag = false; +void IRAM_ATTR one() { + flag = true; +} + +void IRAM_ATTR zero() { + flag = false; +} + void setup() { Serial.begin(115200); WiFi.onEvent(WiFiEvent); - pinMode(DATA_PIN, INPUT); + pinMode(DATA_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); pinMode(DRY_CONT_PIN, OUTPUT); + attachInterrupt(DATA_PIN, one, RISING); + attachInterrupt(DATA_PIN, zero, FALLING); digitalWrite(LED_PIN, HIGH);