server: Z21 LanXLocoInfo support F29 to F31
Z21 Firmware 1.42 adds F29 to F31 to LAN_X_LOCO_INFO
Dieser Commit ist enthalten in:
Ursprung
50279a12d9
Commit
373c277cc7
@ -116,13 +116,13 @@ void ClientKernel::receive(const Message& message)
|
|||||||
|
|
||||||
case LAN_X_LOCO_INFO:
|
case LAN_X_LOCO_INFO:
|
||||||
{
|
{
|
||||||
const int n = message.dataLen() - 7;
|
if(message.dataLen() >= LanXLocoInfo::minMessageSize && message.dataLen() <= LanXLocoInfo::maxMessageSize)
|
||||||
if(n >= 7 && n <= 14)
|
|
||||||
{
|
{
|
||||||
const auto& reply = static_cast<const LanXLocoInfo&>(message);
|
const auto& reply = static_cast<const LanXLocoInfo&>(message);
|
||||||
|
|
||||||
|
const int maxFunc = reply.supportsF29F31() ? 31 : 28;
|
||||||
bool val[31 + 1] = {};
|
bool val[31 + 1] = {};
|
||||||
const int maxFunc = (n >= 8) ? 31 : 28;
|
|
||||||
for(int i = 0; i <= maxFunc; i++)
|
for(int i = 0; i <= maxFunc; i++)
|
||||||
{
|
{
|
||||||
val[i] = reply.getFunction(i);
|
val[i] = reply.getFunction(i);
|
||||||
|
|||||||
@ -1123,6 +1123,9 @@ struct LanXLocoInfo : LanX
|
|||||||
static constexpr uint8_t flagF0 = 0x10;
|
static constexpr uint8_t flagF0 = 0x10;
|
||||||
static constexpr uint8_t functionIndexMax = 28;
|
static constexpr uint8_t functionIndexMax = 28;
|
||||||
|
|
||||||
|
static constexpr uint8_t minMessageSize = 7 + 7;
|
||||||
|
static constexpr uint8_t maxMessageSize = 7 + 14;
|
||||||
|
|
||||||
uint8_t addressHigh = 0; //db0
|
uint8_t addressHigh = 0; //db0
|
||||||
uint8_t addressLow = 0; //db1
|
uint8_t addressLow = 0; //db1
|
||||||
uint8_t db2 = 0;
|
uint8_t db2 = 0;
|
||||||
@ -1131,6 +1134,7 @@ struct LanXLocoInfo : LanX
|
|||||||
uint8_t f5f12 = 0; //db5
|
uint8_t f5f12 = 0; //db5
|
||||||
uint8_t f13f20 = 0; //db6
|
uint8_t f13f20 = 0; //db6
|
||||||
uint8_t f21f28 = 0; //db7
|
uint8_t f21f28 = 0; //db7
|
||||||
|
uint8_t f29f31 = 0; //db8 (firmware >= 1.42)
|
||||||
uint8_t checksum = 0;
|
uint8_t checksum = 0;
|
||||||
|
|
||||||
LanXLocoInfo() :
|
LanXLocoInfo() :
|
||||||
@ -1223,6 +1227,12 @@ struct LanXLocoInfo : LanX
|
|||||||
Z21::Utils::setSpeedStep(speedAndDirection, speedSteps(), value);
|
Z21::Utils::setSpeedStep(speedAndDirection, speedSteps(), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool supportsF29F31() const
|
||||||
|
{
|
||||||
|
//Firmware >= 1.42 adds db8 to store F29-F31 so dataLen increases to 15
|
||||||
|
return dataLen() >= 15;
|
||||||
|
}
|
||||||
|
|
||||||
bool getFunction(uint8_t index) const
|
bool getFunction(uint8_t index) const
|
||||||
{
|
{
|
||||||
if(index == 0)
|
if(index == 0)
|
||||||
@ -1235,6 +1245,8 @@ struct LanXLocoInfo : LanX
|
|||||||
return f13f20 & (1 << (index - 13));
|
return f13f20 & (1 << (index - 13));
|
||||||
else if(index <= 28)
|
else if(index <= 28)
|
||||||
return f21f28 & (1 << (index - 21));
|
return f21f28 & (1 << (index - 21));
|
||||||
|
else if(index <= 31 && supportsF29F31())
|
||||||
|
return f29f31 & (1 << (index - 29));
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1280,6 +1292,14 @@ struct LanXLocoInfo : LanX
|
|||||||
else
|
else
|
||||||
f21f28 &= ~flag;
|
f21f28 &= ~flag;
|
||||||
}
|
}
|
||||||
|
else if(index <= 31 && supportsF29F31())
|
||||||
|
{
|
||||||
|
const uint8_t flag = (1 << (index - 29));
|
||||||
|
if(value)
|
||||||
|
f29f31 |= flag;
|
||||||
|
else
|
||||||
|
f29f31 &= ~flag;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void updateChecksum()
|
inline void updateChecksum()
|
||||||
@ -1288,7 +1308,8 @@ struct LanXLocoInfo : LanX
|
|||||||
LanX::updateChecksum(dataLen() - 6);
|
LanX::updateChecksum(dataLen() - 6);
|
||||||
}
|
}
|
||||||
} ATTRIBUTE_PACKED;
|
} ATTRIBUTE_PACKED;
|
||||||
static_assert(sizeof(LanXLocoInfo) == 14);
|
static_assert(sizeof(LanXLocoInfo) >= LanXLocoInfo::minMessageSize &&
|
||||||
|
sizeof(LanXLocoInfo) <= LanXLocoInfo::maxMessageSize);
|
||||||
|
|
||||||
// Reply to LAN_X_GET_FIRMWARE_VERSION
|
// Reply to LAN_X_GET_FIRMWARE_VERSION
|
||||||
|
|
||||||
|
|||||||
Laden…
x
In neuem Issue referenzieren
Einen Benutzer sperren