From a95a4dded2e6a173cf3741a1d3fca820e8798125 Mon Sep 17 00:00:00 2001 From: "Hans R. Tanner" Date: Wed, 5 Oct 2022 19:52:52 -0400 Subject: [PATCH] add broadcastCurrent --- CommandDistributor.cpp | 6 ++++++ CommandDistributor.h | 1 + DCCEXParser.cpp | 16 ++++++++-------- DCCWaveform.cpp | 16 ++++++++-------- DCCWaveform.h | 40 +++++++++++++++++++--------------------- SerialManager.cpp | 3 ++- 6 files changed, 44 insertions(+), 38 deletions(-) diff --git a/CommandDistributor.cpp b/CommandDistributor.cpp index 9bde259..dcbce4f 100644 --- a/CommandDistributor.cpp +++ b/CommandDistributor.cpp @@ -118,6 +118,12 @@ void CommandDistributor::broadcastLoco(byte slot) { #endif } +void CommandDistributor::broadcastCurrent(uint8_t track, uint16_t value) +{ + StringFormatter::send(broadcastBufferWriter,F("\n"), track, value); + broadcast(false); +} + void CommandDistributor::broadcastPower() { bool main=DCCWaveform::mainTrack.getPowerMode()==POWERMODE::ON; bool prog=DCCWaveform::progTrack.getPowerMode()==POWERMODE::ON; diff --git a/CommandDistributor.h b/CommandDistributor.h index a9af3bb..868cb78 100644 --- a/CommandDistributor.h +++ b/CommandDistributor.h @@ -32,6 +32,7 @@ public : static void broadcastSensor(int16_t id, bool value); static void broadcastTurnout(int16_t id, bool isClosed); static void broadcastPower(); + static void broadcastCurrent(uint8_t track, uint16_t value); static void broadcastText(const FSH * msg); static void forget(byte clientId); private: diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index 1550e58..7e3c78f 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -293,10 +293,10 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream) break; case 'A': //switch current reporting on/off - if (params==2) { // + if ((params==2) && (p[0] <= 1) && (p[1] <= 1)) { // currently only 0,1 higher values reserved for buffer size for local calculation { - DCCWaveform::mainTrack.setRMSMode(p[0], stream); - DCCWaveform::progTrack.setRMSMode(p[1], stream); + DCCWaveform::mainTrack.setRMSMode(p[0]); + DCCWaveform::progTrack.setRMSMode(p[1]); } return; } @@ -496,16 +496,16 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream) case 'c': // SEND METER RESPONSES // - if (params==0) +// if (params==0) { StringFormatter::send(stream, F("\n"), round(DCCWaveform::mainTrack.getCurrentmA()), DCCWaveform::mainTrack.getMaxmA(), DCCWaveform::mainTrack.getTripmA()); // StringFormatter::send(stream, F("\n"), DCCWaveform::mainTrack.get1024Current()); //'a' message deprecated, remove once JMRI 4.22 is available } - else - if (p[0]== 0) - StringFormatter::send(stream, F("\n"), round(DCCWaveform::mainTrack.getCurrentRMS()), round(DCCWaveform::progTrack.getCurrentRMS()), - DCCWaveform::mainTrack.getMaxmA(), DCCWaveform::mainTrack.getTripmA()); +// else +// if (p[0]== 0) +// StringFormatter::send(stream, F("\n"), round(DCCWaveform::mainTrack.getCurrentRMS()), round(DCCWaveform::progTrack.getCurrentRMS()), +// DCCWaveform::mainTrack.getMaxmA(), DCCWaveform::mainTrack.getTripmA()); return; case 'Q': // SENSORS diff --git a/DCCWaveform.cpp b/DCCWaveform.cpp index 18cbf58..7b1062f 100644 --- a/DCCWaveform.cpp +++ b/DCCWaveform.cpp @@ -24,11 +24,11 @@ #include -#include "StringFormatter.h" #include "DCCWaveform.h" #include "DCCTimer.h" #include "DIAG.h" #include "freeMemory.h" +#include "CommandDistributor.h" DCCWaveform DCCWaveform::mainTrack(PREAMBLE_BITS_MAIN, true); DCCWaveform DCCWaveform::progTrack(PREAMBLE_BITS_PROG, false); @@ -135,17 +135,17 @@ void DCCWaveform::checkPowerOverload(bool ackManagerActive) { switch (powerMode) { case POWERMODE::OFF: sampleDelay = POWER_SAMPLE_OFF_WAIT; - if (sendCurrentSample || (accuSize > 0)) - StringFormatter::send(outStream, F("\n"), isMainTrack ? 0 : 1, 0); + if (sendCurrentSample) // || (accuSize > 0)) + CommandDistributor::broadcastCurrent(isMainTrack ? 0 : 1, 0); break; case POWERMODE::ON: // Check current lastCurrent=motorDriver->getCurrentRaw(); - if (sendCurrentSample) - StringFormatter::send(outStream, F("\n"), isMainTrack ? 0 : 1, getCurrentmA()); - else - if (accuSize > 0) - currAccu = (currAccu * accuFact) + (sq((float)getCurrentmA())); + if (sendCurrentSample) // || (accuSize > 0)) + CommandDistributor::broadcastCurrent(isMainTrack ? 0 : 1, getCurrentmA()); +// else +// if (accuSize > 0) +// currAccu = (currAccu * accuFact) + (sq((float)getCurrentmA())); if (lastCurrent < 0) { // We have a fault pin condition to take care of lastCurrent = -lastCurrent; diff --git a/DCCWaveform.h b/DCCWaveform.h index ba84531..77dec2c 100644 --- a/DCCWaveform.h +++ b/DCCWaveform.h @@ -25,6 +25,7 @@ #define DCCWaveform_h #include "MotorDriver.h" +#include "StringFormatter.h" // Wait times for power management. Unit: milliseconds const int POWER_SAMPLE_ON_WAIT = 100; @@ -57,7 +58,6 @@ class DCCWaveform { static void loop(bool ackManagerActive); static DCCWaveform mainTrack; static DCCWaveform progTrack; - void beginTrack(); void setPowerMode(POWERMODE); POWERMODE getPowerMode(); @@ -72,22 +72,21 @@ class DCCWaveform { return motorDriver->raw2mA(lastCurrent); return 0; } - inline void setRMSMode(byte newMode, Print* stream) { //0: OFF 1: Broadcast mA Reading >1: Internal calc buffer size - outStream = stream; - sendCurrentSample = newMode == 1; - accuSize = newMode; - if (newMode > 1) - { - accuFact = (float)(newMode - 1) / newMode; - currAccu = 0; - } - } - inline float getCurrentRMS() { - if (accuSize == 0) - return 0; - else - return sqrt(currAccu / accuSize); + inline void setRMSMode(byte newMode) { //0: OFF 1: Broadcast mA Reading >1: Internal calc buffer size + sendCurrentSample = (newMode == 0x01); +// accuSize = newMode; +// if (newMode > 1) +// { +// accuFact = (float)(newMode - 1) / newMode; +// currAccu = 0; +// } } +// inline float getCurrentRMS() { +// if (accuSize == 0) +// return 0; +// else +// return sqrt(currAccu / accuSize); +// } inline int getMaxmA() { if (maxmA == 0) { //only calculate this for first request, it doesn't change maxmA = motorDriver->raw2mA(motorDriver->getRawCurrentTripValue()); //TODO: replace with actual max value or calc @@ -169,11 +168,10 @@ class DCCWaveform { unsigned long power_sample_overload_wait = POWER_SAMPLE_OVERLOAD_WAIT; unsigned int power_good_counter = 0; - bool sendCurrentSample; - Print* outStream; - volatile double currAccu = 0; - byte accuSize = 0; - float accuFact = 0; + bool sendCurrentSample = false; +// volatile double currAccu = 0; +// byte accuSize = 0; +// float accuFact = 0; // ACK management (Prog track only) volatile bool ackPending; volatile bool ackDetected; diff --git a/SerialManager.cpp b/SerialManager.cpp index 8717227..16c9519 100644 --- a/SerialManager.cpp +++ b/SerialManager.cpp @@ -21,6 +21,8 @@ #include "SerialManager.h" #include "DCCEXParser.h" +#include "DCCWaveform.h" + SerialManager * SerialManager::first=NULL; SerialManager::SerialManager(Stream * myserial) { @@ -78,5 +80,4 @@ void SerialManager::loop2() { if (bufferLength < (COMMAND_BUFFER_SIZE-1)) buffer[bufferLength++] = ch; } } - }