LanXLocoInfo: rework max function index support

Dieser Commit ist enthalten in:
Filippo Gentile 2023-11-05 23:21:10 +01:00
Ursprung 39eef0f273
Commit ff428c4b85
3 geänderte Dateien mit 39 neuen und 15 gelöschten Zeilen

Datei anzeigen

@ -121,10 +121,11 @@ void ClientKernel::receive(const Message& message)
{
const auto& reply = static_cast<const LanXLocoInfo&>(message);
const int maxFunc = reply.supportsF29F31() ? 31 : 28;
bool val[31 + 1] = {};
//NOTE: there is also a function at index 0, hence +1
const int functionIndexMax = std::min(reply.functionIndexMax(), LanXLocoInfo::supportedFunctionIndexMax);
bool val[LanXLocoInfo::supportedFunctionIndexMax + 1] = {};
for(int i = 0; i <= maxFunc; i++)
for(int i = 0; i <= functionIndexMax; i++)
{
val[i] = reply.getFunction(i);
}
@ -231,7 +232,7 @@ void ClientKernel::receive(const Message& message)
EventLoop::call(
[this, address=reply.address(), isEStop=reply.isEmergencyStop(),
speed = reply.speedStep(), speedMax=reply.speedSteps(),
dir = reply.direction(), val, maxFunc, changes]()
dir = reply.direction(), val, functionIndexMax, changes]()
{
try
{
@ -262,7 +263,7 @@ void ClientKernel::receive(const Message& message)
//Function get always updated because we do not store a copy in cache
//so there is no way to tell in advance if they changed
for(int i = 0; i <= maxFunc; i++)
for(int i = 0; i <= functionIndexMax; i++)
{
decoder->setFunctionValue(i, val[i]);
}

Datei anzeigen

@ -195,7 +195,8 @@ std::string toString(const Message& message, bool raw)
s.append("estop");
else
s.append(std::to_string(locoInfo.speedStep())).append("/").append(std::to_string(locoInfo.speedSteps()));
for(uint8_t i = 0; i <= LanXLocoInfo::functionIndexMax; i++)
const uint8_t functionIndexMax = locoInfo.functionIndexMax();
for(uint8_t i = 0; i <= functionIndexMax; i++)
s.append(" f").append(std::to_string(i)).append("=").append(locoInfo.getFunction(i) ? "1" : "0");
s.append(" busy=").append(locoInfo.isBusy() ? "1" : "0");
break;

Datei anzeigen

@ -1121,7 +1121,7 @@ struct LanXLocoInfo : LanX
static constexpr uint8_t directionFlag = 0x80;
static constexpr uint8_t speedStepMask = 0x7F;
static constexpr uint8_t flagF0 = 0x10;
static constexpr uint8_t functionIndexMax = 28;
static constexpr uint8_t supportedFunctionIndexMax = 31; ///< \sa functionIndexMax
static constexpr uint8_t minMessageSize = 7 + 7;
static constexpr uint8_t maxMessageSize = 7 + 14;
@ -1131,11 +1131,11 @@ struct LanXLocoInfo : LanX
uint8_t db2 = 0;
uint8_t speedAndDirection = 0; //db3
uint8_t db4 = 0;
uint8_t f5f12 = 0; //db5
uint8_t f13f20 = 0; //db6
uint8_t f21f28 = 0; //db7
uint8_t f29f31 = 0; //db8 (firmware >= 1.42)
uint8_t checksum = 0;
uint8_t f5f12 = 0; //db5
uint8_t f13f20 = 0; //db6
uint8_t f21f28 = 0; //db7
uint8_t db8 = 0; //db8 is f29f31 (firmware >= 1.42) otherwise checksum
uint8_t db9 = 0; //checksum (firmware >= 1.42)
LanXLocoInfo() :
LanX(sizeof(LanXLocoInfo), LAN_X_LOCO_INFO)
@ -1233,6 +1233,28 @@ struct LanXLocoInfo : LanX
return dataLen() >= 15;
}
/*!
* \brief Get maximum fuction index stored in this message
* \return Maximum index
*
* \note There is also a function at index 0 so count it
*
* Maximum function index depends on Z21 firmware protocol version
* versions < 1.42 support up to F28
* versions >= 1.42 support up to F31
*
* Messages are backward compatible but older version will only read
* up to their maximum function number
*
* We currently support up to F31 in trasmission and reception \sa supportedFunctionIndexMax
*/
inline uint8_t functionIndexMax() const
{
if(supportsF29F31())
return 31;
return 28;
}
bool getFunction(uint8_t index) const
{
if(index == 0)
@ -1246,7 +1268,7 @@ struct LanXLocoInfo : LanX
else if(index <= 28)
return f21f28 & (1 << (index - 21));
else if(index <= 31 && supportsF29F31())
return f29f31 & (1 << (index - 29));
return db8 & (1 << (index - 29));
else
return false;
}
@ -1296,9 +1318,9 @@ struct LanXLocoInfo : LanX
{
const uint8_t flag = (1 << (index - 29));
if(value)
f29f31 |= flag;
db8 |= flag;
else
f29f31 &= ~flag;
db8 &= ~flag;
}
}