339 Zeilen
9.8 KiB
C
339 Zeilen
9.8 KiB
C
//--------------------------------------------------------------
|
|
/*
|
|
|
|
XpressNetMaster Interface for Arduino
|
|
|
|
Funktionsumfang:
|
|
- Fahren per LokMaus2 und MultiMaus
|
|
- Schalten von DCC Weichen mit der MultiMaus
|
|
- CV Programmieren CV Direct only
|
|
|
|
Copyright (c) by Philipp Gahtow, year 2022
|
|
*/
|
|
#if defined(XPRESSNET)
|
|
|
|
//**************************************************************
|
|
//byte XNetUserOps = 0x00;
|
|
//byte XNetReturnLoco = 0x00;
|
|
|
|
//--------------------------------------------------------------
|
|
//Change Power Status
|
|
void notifyXNetPower(uint8_t State) {
|
|
if (Railpower != State) {
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet ");
|
|
#if !defined(DEBUG)
|
|
Debug.print("Power: ");
|
|
Debug.println(State, HEX);
|
|
#endif
|
|
#endif
|
|
globalPower(State);
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetgiveLocoInfo(uint8_t UserOps, uint16_t Address) {
|
|
//XNetReturnLoco |= 0x01;
|
|
//XNetUserOps = UserOps;
|
|
#if defined(DCC)
|
|
//dcc.getLocoStateFull(Address, false); //request for XpressNet only!
|
|
uint8_t ldata[6];
|
|
AllLocoData(Address, ldata); //uint8_t Steps[0], uint8_t Speed[1], uint8_t F0[2], uint8_t F1[3], uint8_t F2[4], uint8_t F3[5]
|
|
if (ldata[0] == 0x03) //128 Steps?
|
|
ldata[0]++; //set Steps to 0x04
|
|
XpressNet.SetLocoInfo(UserOps, ldata[0], ldata[1], ldata[2] & 0x1F, ldata[3]); //UserOps,Steps,Speed,F0,F1
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetgiveLocoFunc(uint8_t UserOps, uint16_t Address) {
|
|
//XNetReturnLoco |= 0x02;
|
|
//XNetUserOps = UserOps;
|
|
#if defined(DCC)
|
|
//dcc.getLocoStateFull(Address, false); //request for XpressNet only!
|
|
XpressNet.SetFktStatus(UserOps, dcc.getFunktion13to20(Address), dcc.getFunktion21to28(Address)); //Fkt4, Fkt5
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetgiveLocoMM(uint8_t UserOps, uint16_t Address) {
|
|
uint8_t ldata[6];
|
|
AllLocoData(Address, ldata); //uint8_t Steps[0], uint8_t Speed[1], uint8_t F0[2], uint8_t F1[3], uint8_t F2[4], uint8_t F3[5]
|
|
if (ldata[0] == 0x03) //128 Steps?
|
|
ldata[0]++; //set Steps to 0x04
|
|
XpressNet.SetLocoInfoMM(UserOps, ldata[0], ldata[1], ldata[2] & 0x1F, ldata[3], ldata[4], ldata[5]); //Steps,Speed,F0,F1,F2,F3
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetLocoDrive14(uint16_t Address, uint8_t Speed) {
|
|
#if defined(LOCONET)
|
|
sendLNSPD(Address, map(Speed, -14, 14, -128, 128));
|
|
#endif
|
|
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet A:");
|
|
Debug.print(Address);
|
|
Debug.print(", S14:");
|
|
Debug.println(Speed, BIN);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
if (Speed == 0)
|
|
dcc.setSpeed14(Address, (dcc.getLocoDir(Address) << 7) | (Speed & B01111111));
|
|
else dcc.setSpeed14(Address, Speed);
|
|
//dcc.getLocoStateFull(Address); //request for other devices
|
|
#endif
|
|
#if defined(LAN) || defined(WIFI) || defined(ESP_WIFI)
|
|
z21.setLocoStateExt (Address);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetLocoDrive28(uint16_t Address, uint8_t Speed) {
|
|
#if defined(LOCONET)
|
|
sendLNSPD(Address, map(Speed, -28, 28, -128, 128));
|
|
#endif
|
|
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet A:");
|
|
Debug.print(Address);
|
|
Debug.print(", S28:");
|
|
Debug.println(Speed, BIN);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
if (Speed == 0)
|
|
dcc.setSpeed28(Address, (dcc.getLocoDir(Address) << 7) | (Speed & B01111111));
|
|
else dcc.setSpeed28(Address, Speed);
|
|
//dcc.getLocoStateFull(Address); //request for other devices
|
|
#endif
|
|
#if defined(LAN) || defined(WIFI) || defined(ESP_WIFI)
|
|
z21.setLocoStateExt (Address);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetLocoDrive128(uint16_t Address, uint8_t Speed) {
|
|
#if defined(LOCONET)
|
|
sendLNSPD(Address, Speed);
|
|
#endif
|
|
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet A:");
|
|
Debug.print(Address);
|
|
Debug.print(", S128:");
|
|
Debug.println(Speed, BIN);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
//if ((Speed & 0x7F) == 0)
|
|
// dcc.setSpeed128(Address, (dcc.getLocoDir(Address) << 7) | (Speed & B01111111));
|
|
//else
|
|
dcc.setSpeed128(Address, Speed);
|
|
//dcc.getLocoStateFull(Address); //request for other devices
|
|
#endif
|
|
#if defined(LAN) || defined(WIFI) || defined(ESP_WIFI)
|
|
z21.setLocoStateExt (Address);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetLocoFunc1(uint16_t Address, uint8_t Func1) {
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet A:");
|
|
Debug.print(Address);
|
|
Debug.print(", F1:");
|
|
Debug.println(Func1, BIN);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
dcc.setFunctions0to4(Address, Func1); //- F0 F4 F3 F2 F1
|
|
//dcc.getLocoStateFull(Address); //request for other devices
|
|
#endif
|
|
#if defined(LAN) || defined(WIFI) || defined(ESP_WIFI)
|
|
z21.setLocoStateExt (Address);
|
|
#endif
|
|
|
|
#if defined(LOCONET)
|
|
byte DIRF = Func1 | (!dcc.getLocoDir(Address) << 5); //invertierte Fahrtrichtung!
|
|
//Beim einschalten einer Funktion wird die Fahrtrichtung geändert - deshalb hier invertiert!
|
|
sendLNDIRF(Address, DIRF);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetLocoFunc2(uint16_t Address, uint8_t Func2) {
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet A:");
|
|
Debug.print(Address);
|
|
Debug.print(", F2:");
|
|
Debug.println(Func2, BIN);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
dcc.setFunctions5to8(Address, Func2); //- F8 F7 F6 F5
|
|
//dcc.getLocoStateFull(Address); //request for other devices
|
|
#endif
|
|
#if defined(LAN) || defined(WIFI) || defined(ESP_WIFI)
|
|
z21.setLocoStateExt (Address);
|
|
#endif
|
|
|
|
#if defined(LOCONET)
|
|
sendLNSND(Address, Func2);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetLocoFunc3(uint16_t Address, uint8_t Func3) {
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet A:");
|
|
Debug.print(Address);
|
|
Debug.print(", F3:");
|
|
Debug.println(Func3, BIN);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
dcc.setFunctions9to12(Address, Func3); //- F12 F11 F10 F9
|
|
//dcc.getLocoStateFull(Address); //request for other devices
|
|
#endif
|
|
|
|
#if defined(LAN) || defined(WIFI) || defined(ESP_WIFI)
|
|
z21.setLocoStateExt (Address);
|
|
#endif
|
|
|
|
#if defined(LOCONET)
|
|
sendLNF3(Address, Func3);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetLocoFuncX(uint16_t Address, uint8_t group, uint8_t Func) {
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet A:");
|
|
Debug.print(Address);
|
|
Debug.print(", F");
|
|
Debug.print(group);
|
|
Debug.print(":");
|
|
Debug.println(Func, BIN);
|
|
#endif
|
|
|
|
if (group == 0x04) {
|
|
#if defined(DCC)
|
|
dcc.setFunctions13to20(Address, Func); //F20 F19 F18 F17 F16 F15 F14 F13
|
|
#endif
|
|
#if defined(LOCONET)
|
|
sendLNF4(Address, Func);
|
|
#endif
|
|
}
|
|
else if (group == 0x05) {
|
|
#if defined(DCC)
|
|
dcc.setFunctions21to28(Address, Func); //F28 F27 F26 F25 F24 F23 F22 F21
|
|
#endif
|
|
#if defined(LOCONET)
|
|
sendLNF5(Address, Func);
|
|
#endif
|
|
}
|
|
else if (group == 0x06) {
|
|
#if defined(DCC)
|
|
dcc.setFunctions29to36(Address, Func);
|
|
#endif
|
|
}
|
|
|
|
#if defined(LAN) || defined(WIFI) || defined(ESP_WIFI)
|
|
z21.setLocoStateExt (Address);
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetTrntInfo(uint8_t UserOps, uint16_t Address, uint8_t data) {
|
|
uint16_t adr = ((Address * 4) + ((data & 0x01) * 2));
|
|
byte pos = data << 4;
|
|
bitWrite(pos, 7, 1); //command completed!
|
|
if (dcc.getBasicAccessoryInfo(adr) == false)
|
|
bitWrite(pos, 0, 1);
|
|
else bitWrite(pos, 1, 1);
|
|
if (dcc.getBasicAccessoryInfo(adr+1) == false)
|
|
bitWrite(pos, 2, 1);
|
|
else bitWrite(pos, 3, 1);
|
|
XpressNet.SetTrntStatus(UserOps, Address, pos);
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet: ");
|
|
Debug.print(adr);
|
|
Debug.print(", P:");
|
|
Debug.println(pos, BIN);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetTrnt(uint16_t Address, uint8_t data) {
|
|
#if defined(XnDEB)
|
|
Debug.print("XNet TA:");
|
|
Debug.print(Address);
|
|
Debug.print(", P:");
|
|
Debug.println(data, BIN);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
dcc.setBasicAccessoryPos(Address,data & 0x01, bitRead(data,3)); //Adr, left/right, activ
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetDirectCV(uint16_t CV, uint8_t data) {
|
|
#if defined(XnDEB)
|
|
Debug.print(F("XNet CV#:"));
|
|
Debug.print(CV+1);
|
|
Debug.print(" - ");
|
|
Debug.println(data);
|
|
#endif
|
|
|
|
#if defined(DCC)
|
|
dcc.opsProgDirectCV(CV,data); //return value from DCC via 'notifyCVVerify'
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetDirectReadCV(uint16_t cvAdr) {
|
|
#if defined(DCC)
|
|
dcc.opsReadDirectCV(cvAdr); //read cv
|
|
#endif
|
|
#if defined(XnDEB)
|
|
Debug.print(F("XNet CV#:"));
|
|
Debug.println(cvAdr+1);
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetPOMwriteByte (uint16_t Adr, uint16_t CV, uint8_t data) {
|
|
#if defined(XnDEB)
|
|
Debug.print(F("XNet POM:"));
|
|
Debug.print(Adr);
|
|
Debug.print(" CV#");
|
|
Debug.print(CV+1);
|
|
Debug.print("-");
|
|
Debug.println(data);
|
|
#endif
|
|
#if defined(DCC)
|
|
dcc.opsProgramCV(Adr, CV, data); //set decoder byte
|
|
#endif
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
void notifyXNetPOMwriteBit (uint16_t Adr, uint16_t CV, uint8_t data) {
|
|
#if defined(XnDEB)
|
|
Debug.print(F("XNet POM Bit:"));
|
|
Debug.print(Adr);
|
|
Debug.print("- CV: ");
|
|
Debug.print(CV+1);
|
|
Debug.print(" - ");
|
|
Debug.println(data, BIN);
|
|
#endif
|
|
#if defined(DCC)
|
|
dcc.opsPOMwriteBit(Adr, CV, data); //set decoder bit
|
|
#endif
|
|
}
|
|
|
|
#endif
|