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;
}
}
-
}