diff --git a/communication/message/flexray/control/flexraycontrolmessage.cpp b/communication/message/flexray/control/flexraycontrolmessage.cpp index 934fce4..5da67da 100644 --- a/communication/message/flexray/control/flexraycontrolmessage.cpp +++ b/communication/message/flexray/control/flexraycontrolmessage.cpp @@ -38,6 +38,18 @@ std::vector FlexRayControlMessage::BuildWriteCCRegArgs(uint8_t controll }); } +std::vector FlexRayControlMessage::BuildAddConfiguredTxMessageArgs( + uint8_t controller, uint16_t descriptionId, uint16_t slotId, uint8_t baseCycle, uint8_t cycleReps, FlexRay::Channel channel) { + return BuildBaseControlArgs(controller, FlexRay::Opcode::AddConfiguredTxMessage, { + uint8_t(descriptionId), + uint8_t(descriptionId >> 8), + uint8_t(slotId), + uint8_t(slotId >> 8), + uint8_t(baseCycle + cycleReps), + uint8_t(channel) + }); +} + FlexRayControlMessage::FlexRayControlMessage(const Packet& packet) : Message() { if(packet.data.size() < 2) return; // huh? diff --git a/communication/packet/flexraypacket.cpp b/communication/packet/flexraypacket.cpp index 6c6146d..e24e35a 100644 --- a/communication/packet/flexraypacket.cpp +++ b/communication/packet/flexraypacket.cpp @@ -21,7 +21,7 @@ std::shared_ptr HardwareFlexRayPacket::DecodeToMessage(const std // Eventually we'll have to get this from the framelen } else { msg->tsslen = data->tss_length_12_5ns * 12.5e-9; - msg->channelB = data->statusBits.bits.chb; + msg->channel = data->statusBits.bits.chb ? icsneo::FlexRay::Channel::B : icsneo::FlexRay::Channel::A; if(data->statusBits.bits.bytesRxed >= 5) { if(data->statusBits.bits.hcrc_error) diff --git a/include/icsneo/communication/message/flexray/control/flexraycontrolmessage.h b/include/icsneo/communication/message/flexray/control/flexraycontrolmessage.h index 2a427fa..39f6594 100644 --- a/include/icsneo/communication/message/flexray/control/flexraycontrolmessage.h +++ b/include/icsneo/communication/message/flexray/control/flexraycontrolmessage.h @@ -5,6 +5,7 @@ #include "icsneo/communication/packet.h" #include "icsneo/device/extensions/flexray/opcode.h" #include "icsneo/device/extensions/flexray/pocstatus.h" +#include "icsneo/device/extensions/flexray/channel.h" namespace icsneo { @@ -14,6 +15,8 @@ public: static std::vector BuildBaseControlArgs(uint8_t controller, FlexRay::Opcode op, std::initializer_list args); static std::vector BuildReadCCRegsArgs(uint8_t controller, uint16_t startAddress, uint8_t numRegisters = 1); static std::vector BuildWriteCCRegArgs(uint8_t controller, uint16_t address, uint32_t value); + static std::vector BuildAddConfiguredTxMessageArgs( + uint8_t controller, uint16_t descriptionId, uint16_t slotId, uint8_t baseCycle, uint8_t cycleReps, FlexRay::Channel channel); FlexRayControlMessage(const Packet& packet); virtual ~FlexRayControlMessage() = default; diff --git a/include/icsneo/communication/message/flexray/flexraymessage.h b/include/icsneo/communication/message/flexray/flexraymessage.h index d43bc27..499b1d2 100644 --- a/include/icsneo/communication/message/flexray/flexraymessage.h +++ b/include/icsneo/communication/message/flexray/flexraymessage.h @@ -4,6 +4,7 @@ #include "icsneo/communication/message/message.h" #include "icsneo/device/extensions/flexray/symbol.h" #include "icsneo/device/extensions/flexray/crcstatus.h" +#include "icsneo/device/extensions/flexray/channel.h" namespace icsneo { @@ -17,7 +18,7 @@ public: uint16_t headerCRC = 0; FlexRay::CRCStatus crcStatus = FlexRay::CRCStatus::OK; uint32_t frameCRC = 0; - bool channelB = false; + FlexRay::Channel channel = FlexRay::Channel::None; bool nullFrame = false; bool reserved0was1 = false; bool payloadPreamble = false; diff --git a/include/icsneo/device/extensions/flexray/channel.h b/include/icsneo/device/extensions/flexray/channel.h new file mode 100644 index 0000000..b554ab5 --- /dev/null +++ b/include/icsneo/device/extensions/flexray/channel.h @@ -0,0 +1,22 @@ +#ifndef __FLEXRAYCHANNEL_H_ +#define __FLEXRAYCHANNEL_H_ + +#include + +namespace icsneo { + +namespace FlexRay { + +// In some cases used as a bitfield +enum class Channel { + None = 0, // Usually an invalid/unset value + A = 1, + B = 2, + AB = 3 +}; + +} // namespace FlexRay + +} // namespace icsneo + +#endif // __FLEXRAYCHANNEL_H_ \ No newline at end of file diff --git a/include/icsneo/device/extensions/flexray/opcode.h b/include/icsneo/device/extensions/flexray/opcode.h index af24896..d2c5e42 100644 --- a/include/icsneo/device/extensions/flexray/opcode.h +++ b/include/icsneo/device/extensions/flexray/opcode.h @@ -14,7 +14,7 @@ enum class Opcode : uint8_t { WriteCCReg = 0x02, WriteMessageBuffer = 0x03, ReadCCStatus = 0x04, - AddConfiguredMessage = 0x05, + AddConfiguredTxMessage = 0x05, InitForRun = 0x06, Unknown = 0xff };