marklin_can: added Ping reply message

see #11
Dieser Commit ist enthalten in:
Reinder Feenstra 2023-07-23 00:50:14 +02:00
Ursprung 024980f831
Commit f6115ba207
2 geänderte Dateien mit 91 neuen und 1 gelöschten Zeilen

Datei anzeigen

@ -251,6 +251,14 @@ std::string toString(const Message& message)
case Command::Ping:
s.append("Ping");
if(message.dlc == 8)
{
const auto& pingReply = static_cast<const PingReply&>(message);
s.append(" ").append(UID::toString(pingReply.uid()));
s.append(" software_version=").append(std::to_string(pingReply.softwareVersionMajor())).append(".").append(std::to_string(pingReply.softwareVersionMinor()));
s.append(" device_id=0x").append(toHex(static_cast<uint16_t>(pingReply.deviceId())));
s.append(" (").append(toString(pingReply.deviceId())).append(")");
}
break;
case Command::Update:
@ -295,4 +303,30 @@ std::string toString(const Message& message)
return s;
}
std::string_view toString(MarklinCAN::DeviceId value)
{
switch(value)
{
case DeviceId::GleisFormatProzessorOrBooster:
return "Gleis Format Prozessor 60213,60214 / Booster 60173, 60174";
case DeviceId::Gleisbox:
return "Gleisbox 60112 und 60113";
case DeviceId::Connect6021:
return "Connect 6021 Art-Nr.60128";
case DeviceId::MS2:
return "MS 2 60653, Txxxxx";
case DeviceId::WirelessDevices:
return "Wireless Devices";
case DeviceId::CS2GUI:
return "CS2-GUI (Master)";
}
assert(false);
return {};
}
}

Datei anzeigen

@ -83,6 +83,16 @@ enum class SystemSubCommand : uint8_t
ModelClock = 0x20,
};
enum class DeviceId : uint16_t
{
GleisFormatProzessorOrBooster= 0x0000, //!< Gleis Format Prozessor 60213,60214 / Booster 60173, 60174
Gleisbox = 0x0010, //!< Gleisbox 60112 und 60113
Connect6021 = 0x0020, //!< Connect 6021 Art-Nr.60128
MS2 = 0x0030, //!< MS 2 60653, Txxxxx
WirelessDevices = 0xFFE0, //!< Wireless Devices
CS2GUI = 0xFFFF //!< CS2-GUI (Master)
};
struct Message
{
static constexpr uint32_t responseMask = 0x00010000;
@ -638,6 +648,52 @@ struct FeedbackState : FeedbackMessage
}
};
struct Ping : Message
{
Ping()
: Message(Command::Ping, false)
{
}
};
struct PingReply : UidMessage
{
PingReply(uint32_t uid)
: UidMessage(Command::Ping, true, uid)
{
dlc = 8;
}
uint8_t softwareVersionMajor() const
{
return data[4];
}
uint8_t softwareVersionMinor() const
{
return data[5];
}
void setSoftwareVersion(uint8_t major, uint8_t minor)
{
data[4] = major;
data[5] = minor;
}
DeviceId deviceId() const
{
return static_cast<DeviceId>(to16(data[7], data[6]));
}
void setDeviceId(DeviceId value)
{
data[6] = high8(static_cast<uint16_t>(value));
data[7] = low8(static_cast<uint16_t>(value));
}
};
std::string_view toString(MarklinCAN::DeviceId value);
}
#endif
#endif