Begin work on FlexRay support

This commit is contained in:
Paul Hollinsky
2019-10-16 16:43:31 -04:00
parent 0607986114
commit 2f9844df92
65 changed files with 1137 additions and 120 deletions
+2 -1
View File
@@ -12,7 +12,8 @@ enum class Command : uint8_t {
SetDefaultSettings = 0xA8, // Follow up with SaveSettings to write to EEPROM
RequestStatusUpdate = 0xBC,
ReadSettings = 0xC7, // Previously known as 3G_READ_SETTINGS_EX
UpdateLEDState = 0xA7
UpdateLEDState = 0xA7,
FlexRayControl = 0xF3
};
}
@@ -64,6 +64,8 @@ protected:
std::map<int, MessageCallback> messageCallbacks;
std::atomic<bool> closing{false};
void dispatchMessage(const std::shared_ptr<Message>& msg);
private:
std::thread readTaskThread;
void readTask();
@@ -0,0 +1,35 @@
#ifndef __FLEXRAYCONTROLMESSAGE_H_
#define __FLEXRAYCONTROLMESSAGE_H_
#include "icsneo/communication/message/message.h"
#include "icsneo/communication/packet.h"
#include "icsneo/device/extensions/flexray/opcode.h"
#include "icsneo/device/extensions/flexray/pocstatus.h"
namespace icsneo {
// Internal message which gives us the state of the FlexRay Controllers
class FlexRayControlMessage : public Message {
public:
static std::vector<uint8_t> BuildBaseControlArgs(uint8_t controller, FlexRay::Opcode op, std::initializer_list<uint8_t> args);
static std::vector<uint8_t> BuildReadCCRegsArgs(uint8_t controller, uint16_t startAddress, uint8_t numRegisters = 1);
static std::vector<uint8_t> BuildWriteCCRegArgs(uint8_t controller, uint16_t address, uint32_t value);
FlexRayControlMessage(const Packet& packet);
virtual ~FlexRayControlMessage() = default;
bool decoded = false;
uint8_t controller = 0xff; // Controller index, either 0 or 1
FlexRay::Opcode opcode = FlexRay::Opcode::Unknown;
FlexRay::POCStatus pocStatus = FlexRay::POCStatus::Unknown;
uint16_t slotCounterA = 0;
uint16_t slotCounterB = 0;
uint16_t macroTick = 0;
uint16_t cycleCount = 0;
uint32_t rateCorrection = 0;
uint32_t offsetCorrection = 0;
std::vector<uint32_t> registers;
};
}
#endif
@@ -0,0 +1,32 @@
#ifndef __FLEXRAYMESSAGE_H_
#define __FLEXRAYMESSAGE_H_
#include "icsneo/communication/message/message.h"
#include "icsneo/device/extensions/flexray/symbol.h"
#include "icsneo/device/extensions/flexray/crcstatus.h"
namespace icsneo {
class FlexRayMessage : public Message {
public:
uint16_t id = 0;
double tsslen = 0;
double framelen = 0;
FlexRay::Symbol symbol = FlexRay::Symbol::None;
FlexRay::CRCStatus headerCRCStatus = FlexRay::CRCStatus::OK;
uint16_t headerCRC = 0;
FlexRay::CRCStatus crcStatus = FlexRay::CRCStatus::OK;
uint32_t frameCRC = 0;
bool channelB = false;
bool nullFrame = false;
bool reserved0was1 = false;
bool payloadPreamble = false;
bool sync = false;
bool startup = false;
bool dynamic = false;
uint8_t cycle = 0;
};
}
#endif
@@ -44,6 +44,62 @@ private:
HostPC_to_Microblaze = 0x80, // Host PC data to microblaze processor
Microblaze_to_HostPC = 0x81 // Microblaze processor data to host PC
};
static bool FixSlaveVNETPacketNetID(Packet& packet);
enum class CoreMiniNetwork : uint8_t {
HSCAN1 = (0),
MSCAN1 = (1),
LIN1 = (2),
LIN2 = (3),
VIRTUAL = (4),
HSCAN2 = (5),
LSFTCAN1 = (6),
SWCAN1 = (7),
HSCAN3 = (8),
GMCGI = (9),
J1850_VPW = (10),
LIN3 = (11),
LIN4 = (12),
J1708 = (13),
HSCAN4 = (14),
HSCAN5 = (15),
KLINE1 = (16),
KLINE2 = (17),
KLINE3 = (18),
KLINE4 = (19),
FLEXRAY_1A = (20),
UART = (21),
UART2 = (22),
LIN5 = (23),
MOST25 = (24),
MOST50 = (25),
FLEXRAY_1B = (26),
SWCAN2 = (27),
ETHERNET_DAQ = (28),
ETHERNET = (29),
FLEXRAY_2A = (30),
FLEXRAY_2B = (31),
HSCAN6 = (32),
HSCAN7 = (33),
LIN6 = (34),
LSFTCAN2 = (35),
OP_ETHERNET1 = (36),
OP_ETHERNET2 = (37),
OP_ETHERNET3 = (38),
OP_ETHERNET4 = (39),
OP_ETHERNET5 = (40),
OP_ETHERNET6 = (41),
OP_ETHERNET7 = (42),
OP_ETHERNET8 = (43),
OP_ETHERNET9 = (44),
OP_ETHERNET10 = (45),
OP_ETHERNET11 = (46),
OP_ETHERNET12 = (47),
KLINE5 = (48),
KLINE6 = (49),
FLEXRAY1 = (50),
FLEXRAY2 = (51)
};
static bool CommandTypeIsValid(CommandType cmd) {
switch(cmd) {
case CommandType::PlasmaReadRequest:
+7 -2
View File
@@ -112,6 +112,7 @@ public:
HSCAN7 = 97,
LIN6 = 98,
LSFTCAN2 = 99,
FlexRayControl = 243,
HW_COM_Latency_Test = 512,
Device_Status = 513,
Any = 0xfffe, // Never actually set as type, but used as flag for filtering
@@ -187,6 +188,7 @@ public:
case NetID::RED:
case NetID::Reset_Status:
case NetID::Device_Status:
case NetID::FlexRayControl:
return Type::Internal;
case NetID::Invalid:
case NetID::Any:
@@ -408,14 +410,17 @@ public:
return "LIN 6";
case NetID::LSFTCAN2:
return "LSFTCAN 2";
case NetID::FlexRayControl:
return "FlexRay Control";
case NetID::HW_COM_Latency_Test:
return "HW COM Latency Test";
case NetID::Device_Status:
return "Device Status";
case NetID::Any:
case NetID::Invalid:
default:
return "Invalid Network";
break;
}
return "Invalid Network";
}
Network() { setValue(NetID::Invalid); }
@@ -0,0 +1,66 @@
#ifndef __FLEXRAYPACKET_H__
#define __FLEXRAYPACKET_H__
#include "icsneo/communication/message/flexray/flexraymessage.h"
#include "icsneo/api/eventmanager.h"
#include <cstdint>
#include <memory>
namespace icsneo {
struct HardwareFlexRayPacket {
static std::shared_ptr<FlexRayMessage> DecodeToMessage(const std::vector<uint8_t>& bytestream);
static bool EncodeFromMessage(const FlexRayMessage& message, std::vector<uint8_t>& bytestream, const device_eventhandler_t& report);
//Word 0
uint16_t id : 11;
uint16_t startup : 1;
uint16_t sync : 1;
uint16_t null_frame : 1;
uint16_t payload_preamble : 1;
uint16_t reserved_0 : 1;
//Word 1
uint16_t hdr_crc_10 : 1;
uint16_t payload_len : 7;
uint16_t reserved_1 : 4;
uint16_t txmsg : 1;
uint16_t reserved_2 : 3;
//Word 2
uint16_t cycle : 6;
uint16_t hdr_crc_9_0 : 10;
//Word 3 (D0-D1)
union {
uint16_t word;
struct
{
uint16_t bytesRxed : 9;
uint16_t dynamic : 1;
uint16_t chb : 1;
uint16_t hcrc_error : 1;
uint16_t fcrc_error : 1;
uint16_t reserved_3 : 3;
} bits;
} statusBits;
//Word 4 (D2-D3)
uint16_t tss_length_12_5ns;
//Word 5 (D4-D5)
uint16_t frame_length_12_5ns;
//Word 6 (D6-D7)
uint16_t extra;
//Word 7
uint16_t stat;
//Word 8-14 (Timestamp)
struct {
uint64_t TS : 60;
uint64_t : 3; // Reserved for future status bits
uint64_t IsExtended : 1;
} timestamp;
//Word 15 (From Extended Header)
uint16_t NetworkID;
//Word 16 (From Extended Header)
uint16_t Length;
};
}
#endif