mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-30 03:26:13 +01:00
Updates to power
Updates to powere routines and EXRAIL
This commit is contained in:
parent
17c004aecf
commit
2a46b96083
|
@ -556,7 +556,7 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
||||||
bool prog=false;
|
bool prog=false;
|
||||||
bool join=false;
|
bool join=false;
|
||||||
bool singletrack=false;
|
bool singletrack=false;
|
||||||
byte t=0;
|
//byte t=0;
|
||||||
if (params > 1) break;
|
if (params > 1) break;
|
||||||
if (params==0) { // All
|
if (params==0) { // All
|
||||||
main=true;
|
main=true;
|
||||||
|
@ -577,7 +577,7 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (p[0] >= 'A' && p[0] <= 'H') { // <1 A-H>
|
else if (p[0] >= 'A' && p[0] <= 'H') { // <1 A-H>
|
||||||
t = (p[0] - 'A');
|
byte t = (p[0] - 'A');
|
||||||
//DIAG(F("Processing track - %d "), t);
|
//DIAG(F("Processing track - %d "), t);
|
||||||
if (TrackManager::isProg(t)) {
|
if (TrackManager::isProg(t)) {
|
||||||
main = false;
|
main = false;
|
||||||
|
@ -589,31 +589,35 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
||||||
prog=false;
|
prog=false;
|
||||||
}
|
}
|
||||||
singletrack=true;
|
singletrack=true;
|
||||||
|
if (main) TrackManager::setTrackPower(false, POWERMODE::ON, t);
|
||||||
|
if (prog) TrackManager::setTrackPower(true, POWERMODE::ON, t);
|
||||||
|
//CommandDistributor::broadcastPower();
|
||||||
|
//TrackManager::streamTrackState(stream, t);
|
||||||
|
TrackManager::streamTrackState(NULL,t);
|
||||||
|
StringFormatter::send(stream, F("Track %d ON\n"), t);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
else break; // will reply <X>
|
else break; // will reply <X>
|
||||||
}
|
}
|
||||||
TrackManager::setJoin(join);
|
|
||||||
if (!singletrack) {
|
if (!singletrack) {
|
||||||
|
TrackManager::setJoin(join);
|
||||||
if (main) TrackManager::setMainPower(POWERMODE::ON);
|
if (main) TrackManager::setMainPower(POWERMODE::ON);
|
||||||
if (prog) TrackManager::setProgPower(POWERMODE::ON);
|
if (prog) TrackManager::setProgPower(POWERMODE::ON);
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (main) TrackManager::setTrackPower(false, POWERMODE::ON, t);
|
|
||||||
if (prog) {
|
|
||||||
TrackManager::setTrackPower(true, POWERMODE::ON, t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CommandDistributor::broadcastPower();
|
CommandDistributor::broadcastPower();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
case '0': // POWEROFF <0 [MAIN | PROG] >
|
case '0': // POWEROFF <0 [MAIN | PROG] >
|
||||||
{
|
{
|
||||||
bool main=false;
|
bool main=false;
|
||||||
bool prog=false;
|
bool prog=false;
|
||||||
bool singletrack=false;
|
bool singletrack=false;
|
||||||
byte t=0;
|
//byte t=0;
|
||||||
if (params > 1) break;
|
if (params > 1) break;
|
||||||
if (params==0) { // All
|
if (params==0) { // All
|
||||||
main=true;
|
main=true;
|
||||||
|
@ -627,9 +631,9 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
||||||
else if (p[0]==HASH_KEYWORD_PROG) { // <0 PROG>
|
else if (p[0]==HASH_KEYWORD_PROG) { // <0 PROG>
|
||||||
prog=true;
|
prog=true;
|
||||||
}
|
}
|
||||||
#endif <=
|
#endif
|
||||||
else if (p[0] >= 'A' && p[0] <= 'H') { // <1 A-H>
|
else if (p[0] >= 'A' && p[0] <= 'H') { // <1 A-H>
|
||||||
t = (p[0] - 'A');
|
byte t = (p[0] - 'A');
|
||||||
//DIAG(F("Processing track - %d "), t);
|
//DIAG(F("Processing track - %d "), t);
|
||||||
if (TrackManager::isProg(t)) {
|
if (TrackManager::isProg(t)) {
|
||||||
main = false;
|
main = false;
|
||||||
|
@ -641,28 +645,33 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
||||||
prog=false;
|
prog=false;
|
||||||
}
|
}
|
||||||
singletrack=true;
|
singletrack=true;
|
||||||
|
TrackManager::setJoin(false);
|
||||||
|
if (main) TrackManager::setTrackPower(false, POWERMODE::OFF, t);
|
||||||
|
if (prog) {
|
||||||
|
TrackManager::progTrackBoosted=false; // Prog track boost mode will not outlive prog track off
|
||||||
|
TrackManager::setTrackPower(true, POWERMODE::OFF, t);
|
||||||
|
CommandDistributor::broadcastPower();
|
||||||
}
|
}
|
||||||
|
StringFormatter::send(stream, F("Track %d OFF\n"), t);
|
||||||
|
TrackManager::streamTrackState(NULL, t);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
else break; // will reply <X>
|
else break; // will reply <X>
|
||||||
}
|
}
|
||||||
|
|
||||||
TrackManager::setJoin(false);
|
|
||||||
if (!singletrack) {
|
if (!singletrack) {
|
||||||
|
TrackManager::setJoin(false);
|
||||||
|
|
||||||
if (main) TrackManager::setMainPower(POWERMODE::OFF);
|
if (main) TrackManager::setMainPower(POWERMODE::OFF);
|
||||||
if (prog) {
|
if (prog) {
|
||||||
TrackManager::progTrackBoosted=false; // Prog track boost mode will not outlive prog track off
|
TrackManager::progTrackBoosted=false; // Prog track boost mode will not outlive prog track off
|
||||||
TrackManager::setProgPower(POWERMODE::OFF);
|
TrackManager::setProgPower(POWERMODE::OFF);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (main) TrackManager::setTrackPower(false, POWERMODE::OFF, t);
|
|
||||||
if (prog) {
|
|
||||||
TrackManager::progTrackBoosted=false; // Prog track boost mode will not outlive prog track off
|
|
||||||
TrackManager::setTrackPower(true, POWERMODE::OFF, t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CommandDistributor::broadcastPower();
|
CommandDistributor::broadcastPower();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case '!': // ESTOP ALL <!>
|
case '!': // ESTOP ALL <!>
|
||||||
DCC::setThrottle(0,1,1); // this broadcasts speed 1(estop) and sets all reminders to speed 1.
|
DCC::setThrottle(0,1,1); // this broadcasts speed 1(estop) and sets all reminders to speed 1.
|
||||||
|
|
|
@ -26,7 +26,8 @@
|
||||||
#include "MotorDriver.h"
|
#include "MotorDriver.h"
|
||||||
#include "DCCTimer.h"
|
#include "DCCTimer.h"
|
||||||
#include "DIAG.h"
|
#include "DIAG.h"
|
||||||
#include"CommandDistributor.h"
|
#include "CommandDistributor.h"
|
||||||
|
#include "DCCEXParser.h"
|
||||||
// Virtualised Motor shield multi-track hardware Interface
|
// Virtualised Motor shield multi-track hardware Interface
|
||||||
#define FOR_EACH_TRACK(t) for (byte t=0;t<=lastTrack;t++)
|
#define FOR_EACH_TRACK(t) for (byte t=0;t<=lastTrack;t++)
|
||||||
|
|
||||||
|
@ -319,6 +320,7 @@ bool TrackManager::parseJ(Print *stream, int16_t params, int16_t p[])
|
||||||
FOR_EACH_TRACK(t)
|
FOR_EACH_TRACK(t)
|
||||||
streamTrackState(stream,t);
|
streamTrackState(stream,t);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p[0]-=HASH_KEYWORD_A; // convert A... to 0....
|
p[0]-=HASH_KEYWORD_A; // convert A... to 0....
|
||||||
|
@ -378,8 +380,10 @@ void TrackManager::streamTrackState(Print* stream, byte t) {
|
||||||
default:
|
default:
|
||||||
break; // unknown, dont care
|
break; // unknown, dont care
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream) StringFormatter::send(stream,format,'A'+t, trackDCAddr[t]);
|
if (stream) StringFormatter::send(stream,format,'A'+t, trackDCAddr[t]);
|
||||||
else CommandDistributor::broadcastTrackState(format,'A'+t, trackDCAddr[t]);
|
else CommandDistributor::broadcastTrackState(format,'A'+t, trackDCAddr[t]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
byte TrackManager::nextCycleTrack=MAX_TRACKS;
|
byte TrackManager::nextCycleTrack=MAX_TRACKS;
|
||||||
|
@ -416,47 +420,16 @@ std::vector<MotorDriver *>TrackManager::getMainDrivers() {
|
||||||
void TrackManager::setPower2(bool setProg,POWERMODE mode) {
|
void TrackManager::setPower2(bool setProg,POWERMODE mode) {
|
||||||
if (!setProg) mainPowerGuess=mode;
|
if (!setProg) mainPowerGuess=mode;
|
||||||
FOR_EACH_TRACK(t) {
|
FOR_EACH_TRACK(t) {
|
||||||
|
|
||||||
TrackManager::setTrackPower(setProg, mode, t);
|
TrackManager::setTrackPower(setProg, mode, t);
|
||||||
// MotorDriver * driver=track[t];
|
|
||||||
// if (!driver) continue;
|
|
||||||
// switch (track[t]->getMode()) {
|
|
||||||
// case TRACK_MODE_MAIN:
|
|
||||||
// if (setProg) break;
|
|
||||||
// // toggle brake before turning power on - resets overcurrent error
|
|
||||||
// // on the Pololu board if brake is wired to ^D2.
|
|
||||||
// // XXX see if we can make this conditional
|
|
||||||
// driver->setBrake(true);
|
|
||||||
// driver->setBrake(false); // DCC runs with brake off
|
|
||||||
// driver->setPower(mode);
|
|
||||||
// break;
|
|
||||||
// case TRACK_MODE_DC:
|
|
||||||
// case TRACK_MODE_DCX:
|
|
||||||
// if (setProg) break;
|
|
||||||
// driver->setBrake(true); // DC starts with brake on
|
|
||||||
// applyDCSpeed(t); // speed match DCC throttles
|
|
||||||
// driver->setPower(mode);
|
|
||||||
// break;
|
|
||||||
// case TRACK_MODE_PROG:
|
|
||||||
// if (!setProg) break;
|
|
||||||
// driver->setBrake(true);
|
|
||||||
// driver->setBrake(false);
|
|
||||||
// driver->setPower(mode);
|
|
||||||
// break;
|
|
||||||
// case TRACK_MODE_EXT:
|
|
||||||
// driver->setBrake(true);
|
|
||||||
// driver->setBrake(false);
|
|
||||||
// driver->setPower(mode);
|
|
||||||
// break;
|
|
||||||
// case TRACK_MODE_NONE:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackManager::setTrackPower(bool setProg, POWERMODE mode, byte thistrack) {
|
void TrackManager::setTrackPower(bool setProg, POWERMODE mode, byte thistrack) {
|
||||||
|
|
||||||
DIAG(F("SetTrackPower Processing Track %d"), thistrack);
|
//DIAG(F("SetTrackPower Processing Track %d"), thistrack);
|
||||||
MotorDriver * driver=track[thistrack];
|
MotorDriver * driver=track[thistrack];
|
||||||
if (!driver) return;
|
if (!driver) return;
|
||||||
|
|
||||||
|
@ -491,12 +464,18 @@ void TrackManager::setTrackPower(bool setProg, POWERMODE mode, byte thistrack) {
|
||||||
case TRACK_MODE_NONE:
|
case TRACK_MODE_NONE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (mode == POWERMODE::ON) {DIAG(F("Power Track %d ON"), thistrack);}
|
|
||||||
else {DIAG(F("Power Track %d OFF"), thistrack);}
|
|
||||||
//driver->setPower(mode);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TrackManager::reportPowerChange(Print* stream, byte thistrack) {
|
||||||
|
// This function is for backward JMRI compatibility only
|
||||||
|
// It reports the first track only, as main, regardless of track settings.
|
||||||
|
// <c MeterName value C/V unit min max res warn>
|
||||||
|
int maxCurrent=track[0]->raw2mA(track[0]->getRawCurrentTripValue());
|
||||||
|
StringFormatter::send(stream, F("<c CurrentMAIN %d C Milli 0 %d 1 %d>\n"),
|
||||||
|
track[0]->raw2mA(track[0]->getCurrentRaw(false)), maxCurrent, maxCurrent);
|
||||||
|
}
|
||||||
|
|
||||||
POWERMODE TrackManager::getProgPower() {
|
POWERMODE TrackManager::getProgPower() {
|
||||||
FOR_EACH_TRACK(t)
|
FOR_EACH_TRACK(t)
|
||||||
if (track[t]->getMode()==TRACK_MODE_PROG)
|
if (track[t]->getMode()==TRACK_MODE_PROG)
|
||||||
|
|
|
@ -64,12 +64,12 @@ class TrackManager {
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
static std::vector<MotorDriver *>getMainDrivers();
|
static std::vector<MotorDriver *>getMainDrivers();
|
||||||
#endif
|
#endif
|
||||||
static void setTrackPower(bool setProg, POWERMODE mode, byte thistrack);
|
|
||||||
static void setPower2(bool progTrack,POWERMODE mode);
|
static void setPower2(bool progTrack,POWERMODE mode);
|
||||||
static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);}
|
static void setPower(POWERMODE mode) {setMainPower(mode); setProgPower(mode);}
|
||||||
static void setMainPower(POWERMODE mode) {setPower2(false,mode);}
|
static void setMainPower(POWERMODE mode) {setPower2(false,mode);}
|
||||||
static void setProgPower(POWERMODE mode) {setPower2(true,mode);}
|
static void setProgPower(POWERMODE mode) {setPower2(true,mode);}
|
||||||
|
static void setTrackPower(bool setProg, POWERMODE mode, byte thistrack);
|
||||||
|
|
||||||
|
|
||||||
static const int16_t MAX_TRACKS=8;
|
static const int16_t MAX_TRACKS=8;
|
||||||
|
@ -84,6 +84,7 @@ class TrackManager {
|
||||||
static void sampleCurrent();
|
static void sampleCurrent();
|
||||||
static void reportGauges(Print* stream);
|
static void reportGauges(Print* stream);
|
||||||
static void reportCurrent(Print* stream);
|
static void reportCurrent(Print* stream);
|
||||||
|
static void reportPowerChange(Print* stream, byte thistrack);
|
||||||
static void reportObsoleteCurrent(Print* stream);
|
static void reportObsoleteCurrent(Print* stream);
|
||||||
static void streamTrackState(Print* stream, byte t);
|
static void streamTrackState(Print* stream, byte t);
|
||||||
static bool isPowerOn(byte t);
|
static bool isPowerOn(byte t);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user