1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-27 10:06:13 +01:00

fork ceated

This commit is contained in:
Hans R. Tanner 2022-10-04 08:42:07 -04:00
parent 2da28ad2db
commit 9d48f696d2
3 changed files with 51 additions and 2 deletions

View File

@ -292,6 +292,15 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
return; return;
break; break;
case 'A': //switch current reporting on/off
if (params==2) { // <A MAINSTATUS PROGSTATUS>
{
DCCWaveform::mainTrack.setRMSMode(p[0], stream);
DCCWaveform::progTrack.setRMSMode(p[1], stream);
}
return;
}
break;
case 'a': // ACCESSORY <a ADDRESS SUBADDRESS ACTIVATE> or <a LINEARADDRESS ACTIVATE> case 'a': // ACCESSORY <a ADDRESS SUBADDRESS ACTIVATE> or <a LINEARADDRESS ACTIVATE>
{ {
int address; int address;
@ -487,9 +496,16 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
case 'c': // SEND METER RESPONSES <c> case 'c': // SEND METER RESPONSES <c>
// <c MeterName value C/V unit min max res warn> // <c MeterName value C/V unit min max res warn>
StringFormatter::send(stream, F("<c CurrentMAIN %d C Milli 0 %d 1 %d>\n"), DCCWaveform::mainTrack.getCurrentmA(), if (params==0)
{
StringFormatter::send(stream, F("<c CurrentMAIN %d C Milli 0 %d 1 %d>\n"), round(DCCWaveform::mainTrack.getCurrentmA()),
DCCWaveform::mainTrack.getMaxmA(), DCCWaveform::mainTrack.getTripmA());
// StringFormatter::send(stream, F("<a %d>\n"), DCCWaveform::mainTrack.get1024Current()); //'a' message deprecated, remove once JMRI 4.22 is available
}
else
if (p[0]== 0)
StringFormatter::send(stream, F("<c CurrentMAIN %d %d C Milli 0 %d 1 %d>\n"), round(DCCWaveform::mainTrack.getCurrentRMS()), round(DCCWaveform::progTrack.getCurrentRMS()),
DCCWaveform::mainTrack.getMaxmA(), DCCWaveform::mainTrack.getTripmA()); DCCWaveform::mainTrack.getMaxmA(), DCCWaveform::mainTrack.getTripmA());
StringFormatter::send(stream, F("<a %d>\n"), DCCWaveform::mainTrack.get1024Current()); //'a' message deprecated, remove once JMRI 4.22 is available
return; return;
case 'Q': // SENSORS <Q> case 'Q': // SENSORS <Q>

View File

@ -24,6 +24,7 @@
#include <Arduino.h> #include <Arduino.h>
#include "StringFormatter.h"
#include "DCCWaveform.h" #include "DCCWaveform.h"
#include "DCCTimer.h" #include "DCCTimer.h"
#include "DIAG.h" #include "DIAG.h"
@ -134,10 +135,17 @@ void DCCWaveform::checkPowerOverload(bool ackManagerActive) {
switch (powerMode) { switch (powerMode) {
case POWERMODE::OFF: case POWERMODE::OFF:
sampleDelay = POWER_SAMPLE_OFF_WAIT; sampleDelay = POWER_SAMPLE_OFF_WAIT;
if (sendCurrentSample || (accuSize > 0))
StringFormatter::send(outStream, F("<a %d %d>\n"), isMainTrack ? 0 : 1, 0);
break; break;
case POWERMODE::ON: case POWERMODE::ON:
// Check current // Check current
lastCurrent=motorDriver->getCurrentRaw(); lastCurrent=motorDriver->getCurrentRaw();
if (sendCurrentSample)
StringFormatter::send(outStream, F("<a %d %d>\n"), isMainTrack ? 0 : 1, getCurrentmA());
else
if (accuSize > 0)
currAccu = (currAccu * accuFact) + (sq((float)getCurrentmA()));
if (lastCurrent < 0) { if (lastCurrent < 0) {
// We have a fault pin condition to take care of // We have a fault pin condition to take care of
lastCurrent = -lastCurrent; lastCurrent = -lastCurrent;

View File

@ -72,6 +72,22 @@ class DCCWaveform {
return motorDriver->raw2mA(lastCurrent); return motorDriver->raw2mA(lastCurrent);
return 0; 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 int getMaxmA() { inline int getMaxmA() {
if (maxmA == 0) { //only calculate this for first request, it doesn't change 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 maxmA = motorDriver->raw2mA(motorDriver->getRawCurrentTripValue()); //TODO: replace with actual max value or calc
@ -102,6 +118,10 @@ class DCCWaveform {
inline bool canMeasureCurrent() { inline bool canMeasureCurrent() {
return motorDriver->canMeasureCurrent(); return motorDriver->canMeasureCurrent();
}; };
inline void setReportCurrent(bool newStatus, Print *stream) {
sendCurrentSample = newStatus;
outStream = stream;
};
inline void setAckLimit(int mA) { inline void setAckLimit(int mA) {
ackLimitmA = mA; ackLimitmA = mA;
} }
@ -153,6 +173,11 @@ class DCCWaveform {
unsigned long power_sample_overload_wait = POWER_SAMPLE_OVERLOAD_WAIT; unsigned long power_sample_overload_wait = POWER_SAMPLE_OVERLOAD_WAIT;
unsigned int power_good_counter = 0; unsigned int power_good_counter = 0;
bool sendCurrentSample;
Print* outStream;
volatile double currAccu = 0;
byte accuSize = 0;
float accuFact = 0;
// ACK management (Prog track only) // ACK management (Prog track only)
volatile bool ackPending; volatile bool ackPending;
volatile bool ackDetected; volatile bool ackDetected;