Skip to content

Commit

Permalink
Merge branch 'ackdiag' into candidate
Browse files Browse the repository at this point in the history
  • Loading branch information
habazut committed Nov 26, 2020
2 parents 89fd98e + edc39e7 commit f2db288
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 17 deletions.
26 changes: 19 additions & 7 deletions DCCEXParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ const int HASH_KEYWORD_PROGBOOST = -6353;
const int HASH_KEYWORD_EEPROM = -7168;
const int HASH_KEYWORD_LIMIT = 27413;
const int HASH_KEYWORD_ETHERNET = -30767;
const int HASH_KEYWORD_MAX = 16244;
const int HASH_KEYWORD_MIN = 15978;

int DCCEXParser::stashP[MAX_PARAMS];
bool DCCEXParser::stashBusy;
Expand Down Expand Up @@ -671,12 +673,22 @@ bool DCCEXParser::parseD(Print *stream, int params, int p[])
StringFormatter::send(stream, F("\nFree memory=%d\n"), freeMemory());
break;

case HASH_KEYWORD_ACK: // <D ACK ON/OFF>
if (params >= 2 && p[1] == HASH_KEYWORD_LIMIT) {
DCCWaveform::progTrack.setAckLimit(p[2]);
StringFormatter::send(stream, F("\nAck limit=%dmA\n"), p[2]);
} else
case HASH_KEYWORD_ACK: // <D ACK ON/OFF> <D ACK [LIMIT|MIN|MAX] Value>
if (params >= 3) {
if (p[1] == HASH_KEYWORD_LIMIT) {
DCCWaveform::progTrack.setAckLimit(p[2]);
StringFormatter::send(stream, F("\nAck limit=%dmA\n"), p[2]);
} else if (p[1] == HASH_KEYWORD_MIN) {
DCCWaveform::progTrack.setMinAckPulseDuration(p[2]);
StringFormatter::send(stream, F("\nAck min=%dus\n"), p[2]);
} else if (p[1] == HASH_KEYWORD_MAX) {
DCCWaveform::progTrack.setMaxAckPulseDuration(p[2]);
StringFormatter::send(stream, F("\nAck max=%dus\n"), p[2]);
}
} else {
StringFormatter::send(stream, F("\nAck diag %S\n"), onOff ? F("on") : F("off"));
Diag::ACK = onOff;
}
return true;

case HASH_KEYWORD_CMD: // <D CMD ON/OFF>
Expand All @@ -703,8 +715,8 @@ bool DCCEXParser::parseD(Print *stream, int params, int p[])
DCC::setProgTrackBoost(true);
return true;

case HASH_KEYWORD_EEPROM:
if (params >= 1)
case HASH_KEYWORD_EEPROM: // <D EEPROM NumEntries>
if (params >= 2)
EEStore::dump(p[1]);
return true;

Expand Down
11 changes: 6 additions & 5 deletions DCCWaveform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -295,9 +295,10 @@ void DCCWaveform::setAckBaseline() {
if (isMainTrack) return;
int baseline = motorDriver->getCurrentRaw();
ackThreshold= baseline + motorDriver->mA2raw(ackLimitmA);
if (Diag::ACK) DIAG(F("\nACK baseline=%d/%dmA threshold=%d/%dmA"),
if (Diag::ACK) DIAG(F("\nACK baseline=%d/%dmA Threshold=%d/%dmA Duration: %dus <= pulse <= %dus"),
baseline,motorDriver->raw2mA(baseline),
ackThreshold,motorDriver->raw2mA(ackThreshold));
ackThreshold,motorDriver->raw2mA(ackThreshold),
minAckPulseDuration, maxAckPulseDuration);
}

void DCCWaveform::setAckPending() {
Expand All @@ -312,7 +313,7 @@ void DCCWaveform::setAckPending() {

byte DCCWaveform::getAck() {
if (ackPending) return (2); // still waiting
if (Diag::ACK) DIAG(F("\nACK-%S after %dmS max=%d/%dmA pulse=%duS"),ackDetected?F("OK"):F("FAIL"), ackCheckDuration,
if (Diag::ACK) DIAG(F("\n%S after %dmS max=%d/%dmA pulse=%duS"),ackDetected?F("ACK"):F("NO-ACK"), ackCheckDuration,
ackMaxCurrent,motorDriver->raw2mA(ackMaxCurrent), ackPulseDuration);
if (ackDetected) return (1); // Yes we had an ack
return(0); // pending set off but not detected means no ACK.
Expand All @@ -329,7 +330,7 @@ void DCCWaveform::checkAck() {

lastCurrent=motorDriver->getCurrentRaw();
if (lastCurrent > ackMaxCurrent) ackMaxCurrent=lastCurrent;
// An ACK is a pulse lasting between MIN_ACK_PULSE_DURATION and MAX_ACK_PULSE_DURATION uSecs (refer @haba)
// An ACK is a pulse lasting between minAckPulseDuration and maxAckPulseDuration uSecs (refer @haba)

if (lastCurrent>ackThreshold) {
if (ackPulseStart==0) ackPulseStart=micros(); // leading edge of pulse detected
Expand All @@ -342,7 +343,7 @@ void DCCWaveform::checkAck() {
// detected trailing edge of pulse
ackPulseDuration=micros()-ackPulseStart;

if (ackPulseDuration>=MIN_ACK_PULSE_DURATION && ackPulseDuration<=MAX_ACK_PULSE_DURATION) {
if (ackPulseDuration>=minAckPulseDuration && ackPulseDuration<=maxAckPulseDuration) {
ackCheckDuration=millis()-ackCheckStart;
ackDetected=true;
ackPending=false;
Expand Down
15 changes: 10 additions & 5 deletions DCCWaveform.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@ const int POWER_SAMPLE_ON_WAIT = 100;
const int POWER_SAMPLE_OFF_WAIT = 1000;
const int POWER_SAMPLE_OVERLOAD_WAIT = 20;

// Ack time thresholds. Unit: microseconds
const int MIN_ACK_PULSE_DURATION = 2000;
const int MAX_ACK_PULSE_DURATION = 8500;

// Number of preamble bits.
const int PREAMBLE_BITS_MAIN = 16;
const int PREAMBLE_BITS_PROG = 22;
Expand Down Expand Up @@ -79,7 +75,13 @@ class DCCWaveform {
inline void setAckLimit(int mA) {
ackLimitmA = mA;
}

inline void setMinAckPulseDuration(unsigned int i) {
minAckPulseDuration = i;
}
inline void setMaxAckPulseDuration(unsigned int i) {
maxAckPulseDuration = i;
}

private:
static VirtualTimer * interruptTimer;
static void interruptHandler();
Expand Down Expand Up @@ -128,6 +130,9 @@ class DCCWaveform {

unsigned int ackPulseDuration; // micros
unsigned long ackPulseStart; // micros

unsigned int minAckPulseDuration = 2000; // micros
unsigned int maxAckPulseDuration = 8500; // micros

};
#endif

0 comments on commit f2db288

Please sign in to comment.