mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-12-24 13:21:23 +01:00
Merge branch 'Broadcast' into EXRAILPlus
This commit is contained in:
commit
82092075bf
33
DCC.cpp
33
DCC.cpp
@ -193,38 +193,15 @@ void DCC::setFn( int cab, int16_t functionNumber, bool on) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change function according to how button was pressed,
|
// Flip function state
|
||||||
// typically in WiThrottle.
|
void DCC::changeFn( int cab, int16_t functionNumber) {
|
||||||
// Returns new state or -1 if nothing was changed.
|
if (cab<=0 || functionNumber>28) return;
|
||||||
int DCC::changeFn( int cab, int16_t functionNumber, bool pressed) {
|
|
||||||
int funcstate = -1;
|
|
||||||
if (cab<=0 || functionNumber>28) return funcstate;
|
|
||||||
int reg = lookupSpeedTable(cab);
|
int reg = lookupSpeedTable(cab);
|
||||||
if (reg<0) return funcstate;
|
if (reg<0) return;
|
||||||
|
|
||||||
// Take care of functions:
|
|
||||||
// Imitate how many command stations do it: Button press is
|
|
||||||
// toggle but for F2 where it is momentary
|
|
||||||
unsigned long funcmask = (1UL<<functionNumber);
|
unsigned long funcmask = (1UL<<functionNumber);
|
||||||
if (functionNumber == 2) {
|
|
||||||
// turn on F2 on press and off again at release of button
|
|
||||||
if (pressed) {
|
|
||||||
speedTable[reg].functions |= funcmask;
|
|
||||||
funcstate = 1;
|
|
||||||
} else {
|
|
||||||
speedTable[reg].functions &= ~funcmask;
|
|
||||||
funcstate = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// toggle function on press, ignore release
|
|
||||||
if (pressed) {
|
|
||||||
speedTable[reg].functions ^= funcmask;
|
speedTable[reg].functions ^= funcmask;
|
||||||
}
|
|
||||||
funcstate = (speedTable[reg].functions & funcmask)? 1 : 0;
|
|
||||||
}
|
|
||||||
updateGroupflags(speedTable[reg].groupFlags, functionNumber);
|
updateGroupflags(speedTable[reg].groupFlags, functionNumber);
|
||||||
CommandDistributor::broadcastLoco(reg);
|
CommandDistributor::broadcastLoco(reg);
|
||||||
return funcstate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int DCC::getFn( int cab, int16_t functionNumber) {
|
int DCC::getFn( int cab, int16_t functionNumber) {
|
||||||
@ -700,7 +677,7 @@ void DCC::updateLocoReminder(int loco, byte speedCode) {
|
|||||||
|
|
||||||
// determine speed reg for this loco
|
// determine speed reg for this loco
|
||||||
int reg=lookupSpeedTable(loco);
|
int reg=lookupSpeedTable(loco);
|
||||||
if (reg>=0) {
|
if (reg>=0 && speedTable[reg].speedCode!=speedCode) {
|
||||||
speedTable[reg].speedCode = speedCode;
|
speedTable[reg].speedCode = speedCode;
|
||||||
CommandDistributor::broadcastLoco(reg);
|
CommandDistributor::broadcastLoco(reg);
|
||||||
}
|
}
|
||||||
|
2
DCC.h
2
DCC.h
@ -99,7 +99,7 @@ public:
|
|||||||
static void writeCVBitMain(int cab, int cv, byte bNum, bool bValue);
|
static void writeCVBitMain(int cab, int cv, byte bNum, bool bValue);
|
||||||
static void setFunction(int cab, byte fByte, byte eByte);
|
static void setFunction(int cab, byte fByte, byte eByte);
|
||||||
static void setFn(int cab, int16_t functionNumber, bool on);
|
static void setFn(int cab, int16_t functionNumber, bool on);
|
||||||
static int changeFn(int cab, int16_t functionNumber, bool pressed);
|
static void changeFn(int cab, int16_t functionNumber);
|
||||||
static int getFn(int cab, int16_t functionNumber);
|
static int getFn(int cab, int16_t functionNumber);
|
||||||
static uint32_t getFunctionMap(int cab);
|
static uint32_t getFunctionMap(int cab);
|
||||||
static void updateGroupflags(byte &flags, int16_t functionNumber);
|
static void updateGroupflags(byte &flags, int16_t functionNumber);
|
||||||
|
@ -310,6 +310,7 @@ void WiThrottle::multithrottle(RingStream * stream, byte * cmd){
|
|||||||
void WiThrottle::locoAction(RingStream * stream, byte* aval, char throttleChar, int cab){
|
void WiThrottle::locoAction(RingStream * stream, byte* aval, char throttleChar, int cab){
|
||||||
// Note cab=-1 for all cabs in the consist called throttleChar.
|
// Note cab=-1 for all cabs in the consist called throttleChar.
|
||||||
// DIAG(F("Loco Action aval=%c%c throttleChar=%c, cab=%d"), aval[0],aval[1],throttleChar, cab);
|
// DIAG(F("Loco Action aval=%c%c throttleChar=%c, cab=%d"), aval[0],aval[1],throttleChar, cab);
|
||||||
|
(void) stream;
|
||||||
switch (aval[0]) {
|
switch (aval[0]) {
|
||||||
case 'V': // Vspeed
|
case 'V': // Vspeed
|
||||||
{
|
{
|
||||||
@ -317,23 +318,21 @@ void WiThrottle::locoAction(RingStream * stream, byte* aval, char throttleChar,
|
|||||||
LOOPLOCOS(throttleChar, cab) {
|
LOOPLOCOS(throttleChar, cab) {
|
||||||
mostRecentCab=myLocos[loco].cab;
|
mostRecentCab=myLocos[loco].cab;
|
||||||
DCC::setThrottle(myLocos[loco].cab, WiTToDCCSpeed(witSpeed), DCC::getThrottleDirection(myLocos[loco].cab));
|
DCC::setThrottle(myLocos[loco].cab, WiTToDCCSpeed(witSpeed), DCC::getThrottleDirection(myLocos[loco].cab));
|
||||||
StringFormatter::send(stream,F("M%cA%c%d<;>V%d\n"), throttleChar, LorS(myLocos[loco].cab), myLocos[loco].cab, witSpeed);
|
// SetThrottle will cause speed change broadcast
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'F': //F onOff function
|
case 'F': // Function key pressed/released
|
||||||
{
|
{
|
||||||
bool funcstate;
|
|
||||||
bool pressed=aval[1]=='1';
|
bool pressed=aval[1]=='1';
|
||||||
int fKey = getInt(aval+2);
|
int fKey = getInt(aval+2);
|
||||||
|
if (fKey!=2 && !pressed) break; // ignore releases except key 2
|
||||||
LOOPLOCOS(throttleChar, cab) {
|
LOOPLOCOS(throttleChar, cab) {
|
||||||
funcstate = DCC::changeFn(myLocos[loco].cab, fKey, pressed);
|
if (fKey==2) DCC::setFn(myLocos[loco].cab,fKey, pressed);
|
||||||
if(funcstate==0 || funcstate==1)
|
else DCC::changeFn(myLocos[loco].cab, fKey);
|
||||||
StringFormatter::send(stream,F("M%cA%c%d<;>F%d%d\n"), throttleChar, LorS(myLocos[loco].cab),
|
|
||||||
myLocos[loco].cab, funcstate, fKey);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'q':
|
case 'q':
|
||||||
if (aval[1]=='V' || aval[1]=='R' ) { //qV or qR
|
if (aval[1]=='V' || aval[1]=='R' ) { //qV or qR
|
||||||
// just flag the loco for broadcast and it will happen.
|
// just flag the loco for broadcast and it will happen.
|
||||||
|
@ -40,8 +40,8 @@ class WiThrottle {
|
|||||||
~WiThrottle();
|
~WiThrottle();
|
||||||
|
|
||||||
static const int MAX_MY_LOCO=10; // maximum number of locos assigned to a single client
|
static const int MAX_MY_LOCO=10; // maximum number of locos assigned to a single client
|
||||||
static const int HEARTBEAT_SECONDS=4; // heartbeat at 4secs to provide messaging transport
|
static const int HEARTBEAT_SECONDS=10; // heartbeat at 4secs to provide messaging transport
|
||||||
static const int ESTOP_SECONDS=8; // eStop if no incoming messages for more than 8secs
|
static const int ESTOP_SECONDS=20; // eStop if no incoming messages for more than 8secs
|
||||||
static WiThrottle* firstThrottle;
|
static WiThrottle* firstThrottle;
|
||||||
static int getInt(byte * cmd);
|
static int getInt(byte * cmd);
|
||||||
static int getLocoId(byte * cmd);
|
static int getLocoId(byte * cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user