2024-07-11 14:03:00 +02:00

88 lines
2.1 KiB
C++

/**
* @copyright Utilitech AS 2023
* License: Fair Source
*
*/
#include "PulseMeterCommunicator.h"
#include "Uptime.h"
#if defined(AMS_REMOTE_DEBUG)
PulseMeterCommunicator::PulseMeterCommunicator(RemoteDebug* debugger) {
#else
PulseMeterCommunicator::PulseMeterCommunicator(Stream* debugger) {
#endif
this->debugger = debugger;
}
void PulseMeterCommunicator::configure(MeterConfig& meterConfig, Timezone* tz) {
this->meterConfig = meterConfig;
this->configChanged = false;
this->tz = tz;
setupGpio();
}
bool PulseMeterCommunicator::loop() {
return updated || !initialized;
}
AmsData* PulseMeterCommunicator::getData(AmsData& meterState) {
if(!initialized) {
state.apply(meterState);
initialized = true;
return NULL;
}
updated = false;
AmsData* ret = new AmsData();
ret->apply(state);
return ret;
}
int PulseMeterCommunicator::getLastError() {
return 0;
}
bool PulseMeterCommunicator::isConfigChanged() {
return this->configChanged;
}
void PulseMeterCommunicator::getCurrentConfig(MeterConfig& meterConfig) {
meterConfig = this->meterConfig;
}
void PulseMeterCommunicator::setupGpio() {
#if defined(AMS_REMOTE_DEBUG)
if (debugger->isActive(RemoteDebug::DEBUG))
#endif
debugger->printf_P(PSTR("Setting up Pulse Meter GPIO, rx: %d, tx: %d\n"), meterConfig.rxPin, meterConfig.txPin);
if(meterConfig.rxPin != NOT_A_PIN) {
pinMode(meterConfig.rxPin, meterConfig.rxPinPullup ? INPUT_PULLUP : INPUT);
}
// Export counter?
// if(meterConfig.txPin != NOT_A_PIN) {
// pinMode(meterConfig.txPin, meterConfig.rxPinPullup ? INPUT_PULLUP : INPUT);
// }
}
void PulseMeterCommunicator::onPulse(uint8_t pulses) {
uint64_t now = millis64();
if(initialized && pulses == 0) {
if(now - lastUpdate > 10000) {
ImpulseAmsData update(state, meterConfig.baud, pulses);
state.apply(update);
updated = true;
lastUpdate = now;
}
return;
}
if(!initialized) {
return;
}
ImpulseAmsData update(state, meterConfig.baud, pulses);
state.apply(update);
updated = true;
lastUpdate = now;
}