From 53e66b87728163627ea7ccff39a6994383f9785b Mon Sep 17 00:00:00 2001 From: Jonathan Schwartz Date: Mon, 14 Aug 2023 21:47:35 +0000 Subject: [PATCH] Communication: Fix NetID VNET conflict There exists a potential conflict with some existing NetIDs and VNET NetIDs in the 200 range. To resolve this there is now an additional optional "expand" argument in various functions that could conflict. In most situations this should be false, and is false for MessageFilters to retain the existing behavior. --- communication/packetizer.cpp | 2 +- .../message/filter/messagefilter.h | 2 +- include/icsneo/communication/network.h | 2477 ++++++++--------- 3 files changed, 1234 insertions(+), 1247 deletions(-) diff --git a/communication/packetizer.cpp b/communication/packetizer.cpp index 6ec6231..6827ef6 100644 --- a/communication/packetizer.cpp +++ b/communication/packetizer.cpp @@ -72,7 +72,7 @@ bool Packetizer::input(const std::vector& inputBytes) { packetLength = bytes[2]; // Long packets have a little endian length on bytes 3 and 4 packetLength |= bytes[3] << 8; - packet.network = Network((bytes[5] << 8) | bytes[4]); // Long packets have their netid stored as little endian on bytes 5 and 6 + packet.network = Network(((bytes[5] << 8) | bytes[4]), false); // Long packets have their netid stored as little endian on bytes 5 and 6. Devices never send actual VNET IDs so we must not perform ID expansion here. currentIndex += 4; /* Long packets can't have a length less than 6, because that would indicate a negative payload size. diff --git a/include/icsneo/communication/message/filter/messagefilter.h b/include/icsneo/communication/message/filter/messagefilter.h index d512948..e97fbbc 100644 --- a/include/icsneo/communication/message/filter/messagefilter.h +++ b/include/icsneo/communication/message/filter/messagefilter.h @@ -13,7 +13,7 @@ class MessageFilter { public: MessageFilter() {} MessageFilter(Message::Type type) : includeInternalInAny(neomessagetype_t(type) & 0x8000), messageType(type) {} - MessageFilter(Network::NetID netid) : MessageFilter(Network::GetTypeOfNetID(netid), netid) {} + MessageFilter(Network::NetID netid) : MessageFilter(Network::GetTypeOfNetID(netid, false), netid) {} // Messages on the communication layer are never encoded as VNET ID + common ID, so skip the expansion step MessageFilter(Network::Type type, Network::NetID net = Network::NetID::Any) : networkType(type), netid(net) { // If a Network::Type::Internal is used, we want to also get internal Message::Types // The NetID we want may be in there diff --git a/include/icsneo/communication/network.h b/include/icsneo/communication/network.h index a3030d0..c016c8a 100644 --- a/include/icsneo/communication/network.h +++ b/include/icsneo/communication/network.h @@ -10,1258 +10,1245 @@ typedef uint8_t neonettype_t; #include #include +#include namespace icsneo { - class Network { - static constexpr uint16_t OFFSET_PLASMA_SLAVE1 = 100; - static constexpr uint16_t OFFSET_PLASMA_SLAVE2 = 200; - static constexpr uint16_t COUNT_PLASMA_SLAVE = 51; - static constexpr uint16_t OFFSET_PLASMA_SLAVE1_RANGE2 = 4608; - static constexpr uint16_t OFFSET_PLASMA_SLAVE2_RANGE2 = 8704; - static constexpr uint16_t OFFSET_PLASMA_SLAVE3_RANGE2 = 12800; +class Network { + static constexpr uint16_t OFFSET_PLASMA_SLAVE1 = 100; + static constexpr uint16_t OFFSET_PLASMA_SLAVE2 = 200; + static constexpr uint16_t COUNT_PLASMA_SLAVE = 51; + static constexpr uint16_t OFFSET_PLASMA_SLAVE1_RANGE2 = 4608; + static constexpr uint16_t OFFSET_PLASMA_SLAVE2_RANGE2 = 8704; + static constexpr uint16_t OFFSET_PLASMA_SLAVE3_RANGE2 = 12800; - public: - enum class NetID : neonetid_t { - Device = 0, - HSCAN = 1, - MSCAN = 2, - SWCAN = 3, - LSFTCAN = 4, - FordSCP = 5, - J1708 = 6, - Aux = 7, - J1850VPW = 8, - ISO9141 = 9, - ISOPIC = 10, - Main51 = 11, - RED = 12, - SCI = 13, - ISO9141_2 = 14, - ISO14230 = 15, - LIN = 16, - OP_Ethernet1 = 17, - OP_Ethernet2 = 18, - OP_Ethernet3 = 19, +public: + enum class NetID : neonetid_t { + Device = 0, + HSCAN = 1, + MSCAN = 2, + SWCAN = 3, + LSFTCAN = 4, + FordSCP = 5, + J1708 = 6, + Aux = 7, + J1850VPW = 8, + ISO9141 = 9, + ISOPIC = 10, + Main51 = 11, + RED = 12, + SCI = 13, + ISO9141_2 = 14, + ISO14230 = 15, + LIN = 16, + OP_Ethernet1 = 17, + OP_Ethernet2 = 18, + OP_Ethernet3 = 19, - // START Device Command Returns - // When we send a command, the device returns on one of these, depending on command - RED_EXT_MEMORYREAD = 20, - RED_INT_MEMORYREAD = 21, - RED_DFLASH_READ = 22, - NeoMemorySDRead = 23, // Response from NeoMemory (MemoryTypeSD) - CAN_ERRBITS = 24, - NeoMemoryWriteDone = 25, - RED_WAVE_CAN1_LOGICAL = 26, - RED_WAVE_CAN2_LOGICAL = 27, - RED_WAVE_LIN1_LOGICAL = 28, - RED_WAVE_LIN2_LOGICAL = 29, - RED_WAVE_LIN1_ANALOG = 30, - RED_WAVE_LIN2_ANALOG = 31, - RED_WAVE_MISC_ANALOG = 32, - RED_WAVE_MISCDIO2_LOGICAL = 33, - RED_NETWORK_COM_ENABLE_EX = 34, - RED_NEOVI_NETWORK = 35, - RED_READ_BAUD_SETTINGS = 36, - RED_OLDFORMAT = 37, - RED_SCOPE_CAPTURE = 38, - RED_HARDWARE_EXCEP = 39, - RED_GET_RTC = 40, - // END Device Command Returns + // START Device Command Returns + // When we send a command, the device returns on one of these, depending on command + RED_EXT_MEMORYREAD = 20, + RED_INT_MEMORYREAD = 21, + RED_DFLASH_READ = 22, + NeoMemorySDRead = 23, // Response from NeoMemory (MemoryTypeSD) + CAN_ERRBITS = 24, + NeoMemoryWriteDone = 25, + RED_WAVE_CAN1_LOGICAL = 26, + RED_WAVE_CAN2_LOGICAL = 27, + RED_WAVE_LIN1_LOGICAL = 28, + RED_WAVE_LIN2_LOGICAL = 29, + RED_WAVE_LIN1_ANALOG = 30, + RED_WAVE_LIN2_ANALOG = 31, + RED_WAVE_MISC_ANALOG = 32, + RED_WAVE_MISCDIO2_LOGICAL = 33, + RED_NETWORK_COM_ENABLE_EX = 34, + RED_NEOVI_NETWORK = 35, + RED_READ_BAUD_SETTINGS = 36, + RED_OLDFORMAT = 37, + RED_SCOPE_CAPTURE = 38, + RED_HARDWARE_EXCEP = 39, + RED_GET_RTC = 40, + // END Device Command Returns - ISO9141_3 = 41, - HSCAN2 = 42, - HSCAN3 = 44, - OP_Ethernet4 = 45, - OP_Ethernet5 = 46, - ISO9141_4 = 47, - LIN2 = 48, - LIN3 = 49, - LIN4 = 50, - // MOST = 51, Old and unused - RED_App_Error = 52, - CGI = 53, - Reset_Status = 54, - FB_Status = 55, - App_Signal_Status = 56, - Read_Datalink_Cm_Tx_Msg = 57, - Read_Datalink_Cm_Rx_Msg = 58, - Logging_Overflow = 59, - ReadSettings = 60, - HSCAN4 = 61, - HSCAN5 = 62, - RS232 = 63, - UART = 64, - UART2 = 65, - UART3 = 66, - UART4 = 67, - SWCAN2 = 68, - Ethernet_DAQ = 69, - Data_To_Host = 70, - TextAPI_To_Host = 71, - SPI1 = 72, - OP_Ethernet6 = 73, - Red_VBat = 74, - OP_Ethernet7 = 75, - OP_Ethernet8 = 76, - OP_Ethernet9 = 77, - OP_Ethernet10 = 78, - OP_Ethernet11 = 79, - FlexRay1a = 80, - FlexRay1b = 81, - FlexRay2a = 82, - FlexRay2b = 83, - LIN5 = 84, - FlexRay = 85, - FlexRay2 = 86, - OP_Ethernet12 = 87, - I2C = 88, - MOST25 = 90, - MOST50 = 91, - MOST150 = 92, - Ethernet = 93, - GMFSA = 94, - TCP = 95, - HSCAN6 = 96, - HSCAN7 = 97, - LIN6 = 98, - LSFTCAN2 = 99, - LogicalDiskInfo = 187, - WiVICommand = 221, - ScriptStatus = 224, - EthPHYControl = 239, - ExtendedCommand = 240, - ExtendedData = 242, - FlexRayControl = 243, - CoreMiniPreLoad = 244, - HW_COM_Latency_Test = 512, - DeviceStatus = 513, - UDP = 514, - ForwardedMessage = 516, - I2C2 = 517, - I2C3 = 518, - I2C4 = 519, - Ethernet2 = 520, - A2B1 = 522, - A2B2 = 523, - Ethernet3 = 524, - WBMS = 532, - DWCAN9 = 534, - DWCAN10 = 535, - DWCAN11 = 536, - DWCAN12 = 537, - DWCAN13 = 538, - DWCAN14 = 539, - DWCAN15 = 540, - DWCAN16 = 541, - LIN7 = 542, - LIN8 = 543, - SPI2 = 544, - MDIO1 = 545, - MDIO2 = 546, - MDIO3 = 547, - MDIO4 = 548, - MDIO5 = 549, - MDIO6 = 550, - MDIO7 = 551, - MDIO8 = 552, - Any = 0xfffe, // Never actually set as type, but used as flag for filtering - Invalid = 0xffff - }; - enum class Type : neonettype_t { - Invalid = 0, - Internal = 1, // Used for statuses that don't actually need to be transferred to the client application - CAN = 2, - LIN = 3, - FlexRay = 4, - MOST = 5, - Ethernet = 6, - LSFTCAN = 7, - SWCAN = 8, - ISO9141 = 9, - I2C = 10, - A2B = 11, - SPI = 12, - MDIO = 13, - Any = 0xFE, // Never actually set as type, but used as flag for filtering - Other = 0xFF - }; - enum class CoreMini : uint8_t { - HSCAN = 0, - MSCAN = 1, - LIN = 2, - LIN2 = 3, - Virtual = 4, - HSCAN2 = 5, - LSFTCAN = 6, - SWCAN = 7, - HSCAN3 = 8, - CGI = 9, - J1850VPW = 10, - LIN3 = 11, - LIN4 = 12, - J1708 = 13, - HSCAN4 = 14, - HSCAN5 = 15, - KLine1 = 16, - KLine2 = 17, - KLine3 = 18, - KLine4 = 19, - FlexRay1a = 20, - UART = 21, - UART2 = 22, - LIN5 = 23, - MOST25 = 24, - MOST50 = 25, - FlexRay1b = 26, - SWCAN2 = 27, - EthernetDAQ = 28, - Ethernet = 29, - FlexRay2a = 30, - FlexRay2b = 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, - TCPVirtual = 48, - UDPVirtual = 49, - FlexRay1 = 50, - FlexRay2 = 51, - ForwardedMessage = 52, - I2C1 = 53, - I2C2 = 54, - I2C3 = 55, - I2C4 = 56, - Ethernet2 = 57, - A2B1 = 58, - A2B2 = 59, - Ethernet3 = 60, - WBMS = 61, - DWCAN9 = 62, - DWCAN10 = 63, - DWCAN11 = 64, - DWCAN12 = 65, - DWCAN13 = 66, - DWCAN14 = 67, - DWCAN15 = 68, - DWCAN16 = 69, - LIN7 = 70, - LIN8 = 71, - SPI1 = 72, - SPI2 = 73, - MDIO1 = 75, - MDIO2 = 76, - MDIO3 = 77, - MDIO4 = 78, - MDIO5 = 79, - MDIO6 = 80, - MDIO7 = 81, - MDIO8 = 82, - }; - static const char* GetTypeString(Type type) { - switch (type) { - case Type::CAN: - return "CAN"; - case Type::LIN: - return "LIN"; - case Type::FlexRay: - return "FlexRay"; - case Type::MOST: - return "MOST"; - case Type::Other: - return "Other"; - case Type::Internal: - return "Internal"; - case Type::ISO9141: - return "ISO 9141-2"; - case Type::Ethernet: - return "Ethernet"; - case Type::LSFTCAN: - return "Low Speed Fault Tolerant CAN"; - case Type::SWCAN: - return "Single Wire CAN"; - case Type::I2C: - return "I²C"; - case Type::A2B: - return "A2B"; - case Type::SPI: - return "SPI"; - case Type::MDIO: - return "MDIO"; - case Type::Invalid: - default: - return "Invalid Type"; - } - } - - enum class VnetId : uint8_t { - None = 0, - VNET_A = 1, - VNET_B = 2, - }; - /** - * So if you are passing in the offset from OFFSET_PLASMA_SLAVE1 or - * the offset from OFFSET_PLASMA_SLAVE2, return the vnet agnostic - * netid so caller can commonize handlers without caring about WHICH slave. - */ - static NetID OffsetToSimpleNetworkId(uint16_t offset) - { - switch (offset) - { - default: - case 0: - return NetID::Device; - case 1: - return NetID::HSCAN; - case 2: - return NetID::MSCAN; - case 3: - return NetID::SWCAN; - case 4: - return NetID::LSFTCAN; - case 5: - return NetID::FordSCP; - case 6: - return NetID::J1708; - case 7: - return NetID::Aux; - case 8: - return NetID::J1850VPW; - case 9: - return NetID::ISO9141; - case 10: - return NetID::ISOPIC; - case 11: - return NetID::Main51; - case 12: - return NetID::RED; - case 13: - return NetID::SCI; - case 14: - return NetID::ISO9141_2; - case 15: - return NetID::ISO14230; - case 16: - return NetID::LIN; - case 17: - return NetID::ISO9141_3; - case 18: - return NetID::HSCAN2; - case 19: - return NetID::HSCAN3; - case 20: - return NetID::ISO9141_4; - case 21: - return NetID::LIN2; - case 22: - return NetID::LIN3; - case 23: - return NetID::LIN4; - //case 24: - // return NetID::MOST; // Deprecated - case 25: - return NetID::CGI; - case 26: - return NetID::I2C; - case 27: - return NetID::SPI1; - case 28: - return NetID::FlexRay1a; - case 29: - return NetID::MOST25; - case 30: - return NetID::MOST50; - case 31: - return NetID::MOST150; - case 32: - return NetID::HSCAN4; - case 33: - return NetID::HSCAN5; - case 34: - return NetID::RS232; - case 35: - return NetID::UART; - case 36: - return NetID::UART2; - case 37: - return NetID::UART3; - case 38: - return NetID::UART4; - case 39: - return NetID::SWCAN2; - case 40: - return NetID::FlexRay1b; - case 41: - return NetID::FlexRay2a; - case 42: - return NetID::FlexRay2b; - case 43: - return NetID::LIN5; - case 44: - return NetID::Ethernet; - case 45: - return NetID::Ethernet_DAQ; - case 46: - return NetID::RED_App_Error; - case 47: - return NetID::HSCAN6; - case 48: - return NetID::HSCAN7; - case 49: - return NetID::LIN6; - case 50: - return NetID::LSFTCAN2; - } - } - static bool Within(neonetid_t value, neonetid_t min, neonetid_t max) - { - return ((min <= value) && (value < max)); - } - static bool IdIsSlaveARange1(neonetid_t fullNetid) - { - return Within(fullNetid, OFFSET_PLASMA_SLAVE1, OFFSET_PLASMA_SLAVE1 + COUNT_PLASMA_SLAVE); - } - static bool IdIsSlaveARange2(neonetid_t fullNetid) - { - return Within(fullNetid, OFFSET_PLASMA_SLAVE1_RANGE2, OFFSET_PLASMA_SLAVE2_RANGE2); - } - static bool IdIsSlaveBRange1(neonetid_t fullNetid) - { - return Within(fullNetid, OFFSET_PLASMA_SLAVE2, OFFSET_PLASMA_SLAVE2 + COUNT_PLASMA_SLAVE); - } - static bool IdIsSlaveBRange2(neonetid_t fullNetid) - { - return Within(fullNetid, OFFSET_PLASMA_SLAVE2_RANGE2, OFFSET_PLASMA_SLAVE3_RANGE2); - } - static std::pair GetVnetAgnosticNetid(neonetid_t fullNetid) - { - VnetId vnetId = VnetId::None; - NetID netId; - - if (fullNetid < OFFSET_PLASMA_SLAVE1) - { - netId = static_cast(fullNetid); - } - else if (IdIsSlaveARange1(fullNetid)) - { - netId = OffsetToSimpleNetworkId(fullNetid - OFFSET_PLASMA_SLAVE1); - vnetId = VnetId::VNET_A; - } - else if (IdIsSlaveARange2(fullNetid)) - { - netId = static_cast((fullNetid - OFFSET_PLASMA_SLAVE1_RANGE2)); - vnetId = VnetId::VNET_A; - } - else if (IdIsSlaveBRange1(fullNetid)) - { - netId = OffsetToSimpleNetworkId(fullNetid - OFFSET_PLASMA_SLAVE2); - vnetId = VnetId::VNET_B; - } - else if (IdIsSlaveBRange2(fullNetid)) - { - netId = static_cast((fullNetid - OFFSET_PLASMA_SLAVE2_RANGE2)); - vnetId = VnetId::VNET_B; - } - else - { - netId = static_cast(fullNetid); - } - - return std::make_pair(vnetId, netId); - } - static const char* GetVnetIdString(VnetId vnetId) - { - switch (vnetId) - { - case VnetId::None: - return "None"; - case VnetId::VNET_A: - return "VNET A"; - case VnetId::VNET_B: - return "VNET B"; - } - return "Invalid VNET ID"; - } - static Type GetTypeOfNetID(NetID netid) { - const auto [vnetId, commonNetId] = GetVnetAgnosticNetid((neonetid_t)netid); - (void)vnetId; - - switch (commonNetId) { - case NetID::HSCAN: - case NetID::MSCAN: - case NetID::HSCAN2: - case NetID::HSCAN3: - case NetID::HSCAN4: - case NetID::HSCAN5: - case NetID::HSCAN6: - case NetID::HSCAN7: - case NetID::DWCAN9: - case NetID::DWCAN10: - case NetID::DWCAN11: - case NetID::DWCAN12: - case NetID::DWCAN13: - case NetID::DWCAN14: - case NetID::DWCAN15: - case NetID::DWCAN16: - return Type::CAN; - case NetID::LIN: - case NetID::LIN2: - case NetID::LIN3: - case NetID::LIN4: - case NetID::LIN5: - case NetID::LIN6: - case NetID::LIN7: - case NetID::LIN8: - return Type::LIN; - case NetID::FlexRay: - case NetID::FlexRay1a: - case NetID::FlexRay1b: - case NetID::FlexRay2: - case NetID::FlexRay2a: - case NetID::FlexRay2b: - return Type::FlexRay; - case NetID::MOST25: - case NetID::MOST50: - case NetID::MOST150: - return Type::MOST; - case NetID::RED: - case NetID::RED_OLDFORMAT: - case NetID::Device: - case NetID::Reset_Status: - case NetID::DeviceStatus: - case NetID::FlexRayControl: - case NetID::Main51: - case NetID::ReadSettings: - case NetID::LogicalDiskInfo: - case NetID::WiVICommand: - case NetID::ScriptStatus: - case NetID::EthPHYControl: - case NetID::CoreMiniPreLoad: - case NetID::ExtendedCommand: - case NetID::ExtendedData: - case NetID::NeoMemorySDRead: - case NetID::NeoMemoryWriteDone: - case NetID::RED_GET_RTC: - return Type::Internal; - case NetID::Invalid: - case NetID::Any: - return Type::Invalid; - case NetID::Ethernet: - case NetID::Ethernet_DAQ: - case NetID::Ethernet2: - case NetID::Ethernet3: - case NetID::OP_Ethernet1: - case NetID::OP_Ethernet2: - case NetID::OP_Ethernet3: - case NetID::OP_Ethernet4: - case NetID::OP_Ethernet5: - case NetID::OP_Ethernet6: - case NetID::OP_Ethernet7: - case NetID::OP_Ethernet8: - case NetID::OP_Ethernet9: - case NetID::OP_Ethernet10: - case NetID::OP_Ethernet11: - case NetID::OP_Ethernet12: - return Type::Ethernet; - case NetID::LSFTCAN: - case NetID::LSFTCAN2: - return Type::LSFTCAN; - case NetID::SWCAN: - case NetID::SWCAN2: - return Type::SWCAN; - case NetID::ISO9141: - case NetID::ISO9141_2: - case NetID::ISO9141_3: - case NetID::ISO9141_4: - return Type::ISO9141; - case NetID::I2C: - case NetID::I2C2: - case NetID::I2C3: - case NetID::I2C4: - return Type::I2C; - case NetID::A2B1: - case NetID::A2B2: - return Type::A2B; - case NetID::SPI1: - case NetID::SPI2: - return Type::SPI; - case NetID::MDIO1: - case NetID::MDIO2: - case NetID::MDIO3: - case NetID::MDIO4: - case NetID::MDIO5: - case NetID::MDIO6: - case NetID::MDIO7: - case NetID::MDIO8: - return Type::MDIO; - default: - return Type::Other; - } - } - static const char* GetNetIDString(NetID netid) { - const auto [vnetId, commonNetId] = GetVnetAgnosticNetid((neonetid_t)netid); - (void)vnetId; - - switch (commonNetId) { - case NetID::Device: - return "neoVI"; - case NetID::HSCAN: - return "HSCAN"; - case NetID::MSCAN: - return "MSCAN"; - case NetID::SWCAN: - return "SWCAN"; - case NetID::LSFTCAN: - return "LSFTCAN"; - case NetID::FordSCP: - return "FordSCP"; - case NetID::J1708: - return "J1708"; - case NetID::Aux: - return "Aux"; - case NetID::J1850VPW: - return "J1850 VPW"; - case NetID::ISO9141: - return "ISO 9141"; - case NetID::ISOPIC: - return "ISOPIC"; - case NetID::Main51: - return "Main51"; - case NetID::RED: - return "RED"; - case NetID::SCI: - return "SCI"; - case NetID::ISO9141_2: - return "ISO 9141 2"; - case NetID::ISO14230: - return "ISO 14230"; - case NetID::LIN: - return "LIN"; - case NetID::OP_Ethernet1: - return "OP (BR) Ethernet 1"; - case NetID::OP_Ethernet2: - return "OP (BR) Ethernet 2"; - case NetID::OP_Ethernet3: - return "OP (BR) Ethernet 3"; - case NetID::RED_EXT_MEMORYREAD: - return "RED_EXT_MEMORYREAD"; - case NetID::RED_INT_MEMORYREAD: - return "RED_INT_MEMORYREAD"; - case NetID::RED_DFLASH_READ: - return "RED_DFLASH_READ"; - case NetID::NeoMemorySDRead: - return "NeoMemorySDRead"; - case NetID::CAN_ERRBITS: - return "CAN_ERRBITS"; - case NetID::NeoMemoryWriteDone: - return "NeoMemoryWriteDone"; - case NetID::RED_WAVE_CAN1_LOGICAL: - return "RED_WAVE_CAN1_LOGICAL"; - case NetID::RED_WAVE_CAN2_LOGICAL: - return "RED_WAVE_CAN2_LOGICAL"; - case NetID::RED_WAVE_LIN1_LOGICAL: - return "RED_WAVE_LIN1_LOGICAL"; - case NetID::RED_WAVE_LIN2_LOGICAL: - return "RED_WAVE_LIN2_LOGICAL"; - case NetID::RED_WAVE_LIN1_ANALOG: - return "RED_WAVE_LIN1_ANALOG"; - case NetID::RED_WAVE_LIN2_ANALOG: - return "RED_WAVE_LIN2_ANALOG"; - case NetID::RED_WAVE_MISC_ANALOG: - return "RED_WAVE_MISC_ANALOG"; - case NetID::RED_WAVE_MISCDIO2_LOGICAL: - return "RED_WAVE_MISCDIO2_LOGICAL"; - case NetID::RED_NETWORK_COM_ENABLE_EX: - return "RED_NETWORK_COM_ENABLE_EX"; - case NetID::RED_NEOVI_NETWORK: - return "RED_NEOVI_NETWORK"; - case NetID::RED_READ_BAUD_SETTINGS: - return "RED_READ_BAUD_SETTINGS"; - case NetID::RED_OLDFORMAT: - return "RED_OLDFORMAT"; - case NetID::RED_SCOPE_CAPTURE: - return "RED_SCOPE_CAPTURE"; - case NetID::RED_HARDWARE_EXCEP: - return "RED_HARDWARE_EXCEP"; - case NetID::RED_GET_RTC: - return "RED_GET_RTC"; - case NetID::ISO9141_3: - return "ISO 9141 3"; - case NetID::HSCAN2: - return "HSCAN 2"; - case NetID::HSCAN3: - return "HSCAN 3"; - case NetID::OP_Ethernet4: - return "OP (BR) Ethernet 4"; - case NetID::OP_Ethernet5: - return "OP (BR) Ethernet 5"; - case NetID::ISO9141_4: - return "ISO 9141 4"; - case NetID::LIN2: - return "LIN 2"; - case NetID::LIN3: - return "LIN 3"; - case NetID::LIN4: - return "LIN 4"; - case NetID::RED_App_Error: - return "App Error"; - case NetID::CGI: - return "CGI"; - case NetID::Reset_Status: - return "Reset Status"; - case NetID::FB_Status: - return "FB Status"; - case NetID::App_Signal_Status: - return "App Signal Status"; - case NetID::Read_Datalink_Cm_Tx_Msg: - return "Read Datalink Cm Tx Msg"; - case NetID::Read_Datalink_Cm_Rx_Msg: - return "Read Datalink Cm Rx Msg"; - case NetID::Logging_Overflow: - return "Logging Overflow"; - case NetID::ReadSettings: - return "Read Settings"; - case NetID::HSCAN4: - return "HSCAN 4"; - case NetID::HSCAN5: - return "HSCAN 5"; - case NetID::RS232: - return "RS232"; - case NetID::UART: - return "UART"; - case NetID::UART2: - return "UART 2"; - case NetID::UART3: - return "UART 3"; - case NetID::UART4: - return "UART 4"; - case NetID::SWCAN2: - return "SWCAN 2"; - case NetID::Ethernet_DAQ: - return "Ethernet DAQ"; - case NetID::Data_To_Host: - return "Data To Host"; - case NetID::TextAPI_To_Host: - return "TextAPI To Host"; - case NetID::OP_Ethernet6: - return "OP (BR) Ethernet 6"; - case NetID::Red_VBat: - return "Red VBat"; - case NetID::OP_Ethernet7: - return "OP (BR) Ethernet 7"; - case NetID::OP_Ethernet8: - return "OP (BR) Ethernet 8"; - case NetID::OP_Ethernet9: - return "OP (BR) Ethernet 9"; - case NetID::OP_Ethernet10: - return "OP (BR) Ethernet 10"; - case NetID::OP_Ethernet11: - return "OP (BR) Ethernet 11"; - case NetID::FlexRay1a: - return "FlexRay 1a"; - case NetID::FlexRay1b: - return "FlexRay 1b"; - case NetID::FlexRay2a: - return "FlexRay 2a"; - case NetID::FlexRay2b: - return "FlexRay 2b"; - case NetID::LIN5: - return "LIN 5"; - case NetID::FlexRay: - return "FlexRay"; - case NetID::FlexRay2: - return "FlexRay 2"; - case NetID::OP_Ethernet12: - return "OP (BR) Ethernet 12"; - case NetID::I2C: - return "I2C"; - case NetID::MOST25: - return "MOST25"; - case NetID::MOST50: - return "MOST50"; - case NetID::MOST150: - return "MOST150"; - case NetID::Ethernet: - return "Ethernet"; - case NetID::GMFSA: - return "GMFSA"; - case NetID::TCP: - return "TCP"; - case NetID::HSCAN6: - return "HSCAN 6"; - case NetID::HSCAN7: - return "HSCAN 7"; - case NetID::LIN6: - return "LIN 6"; - case NetID::LSFTCAN2: - return "LSFTCAN 2"; - case NetID::LogicalDiskInfo: - return "Logical Disk Information"; - case NetID::WiVICommand: - return "WiVI Command"; - case NetID::ScriptStatus: - return "Script Status"; - case NetID::CoreMiniPreLoad: - return "CoreMini PreLoad"; - case NetID::EthPHYControl: - return "Ethernet PHY Register Control"; - case NetID::ExtendedCommand: - return "Extended Command"; - case NetID::ExtendedData: - return "Extended Data"; - case NetID::FlexRayControl: - return "FlexRay Control"; - case NetID::HW_COM_Latency_Test: - return "HW COM Latency Test"; - case NetID::DeviceStatus: - return "Device Status"; - case NetID::UDP: - return "UDP"; - case NetID::ForwardedMessage: - return "Forwarded Message"; - case NetID::I2C2: - return "I2C 2"; - case NetID::I2C3: - return "I2C 3"; - case NetID::I2C4: - return "I2C 4"; - case NetID::Ethernet2: - return "Ethernet 2"; - case NetID::A2B1: - return "A2B 1"; - case NetID::A2B2: - return "A2B 2"; - case NetID::DWCAN9: - return "DWCAN 09"; - case NetID::DWCAN10: - return "DWCAN 10"; - case NetID::DWCAN11: - return "DWCAN 11"; - case NetID::DWCAN12: - return "DWCAN 12"; - case NetID::DWCAN13: - return "DWCAN 13"; - case NetID::DWCAN14: - return "DWCAN 14"; - case NetID::DWCAN15: - return "DWCAN 15"; - case NetID::DWCAN16: - return "DWCAN 16"; - case NetID::Ethernet3: - return "Ethernet 03"; - case NetID::LIN7: - return "LIN 07"; - case NetID::LIN8: - return "LIN 08"; - case NetID::WBMS: - return "WBMS"; - case NetID::SPI1: - return "SPI 1"; - case NetID::SPI2: - return "SPI 2"; - case NetID::MDIO1: - return "MDIO 1"; - case NetID::MDIO2: - return "MDIO 2"; - case NetID::MDIO3: - return "MDIO 3"; - case NetID::MDIO4: - return "MDIO 4"; - case NetID::MDIO5: - return "MDIO 5"; - case NetID::MDIO6: - return "MDIO 6"; - case NetID::MDIO7: - return "MDIO 7"; - case NetID::MDIO8: - return "MDIO 8"; - case NetID::Any: - case NetID::Invalid: - break; - } - return "Invalid Network"; - } - static std::optional GetCoreMiniNetworkFromNetID(NetID netid) { - switch (netid) { - case NetID::HSCAN: - return CoreMini::HSCAN; - case NetID::MSCAN: - return CoreMini::MSCAN; - case NetID::LIN: - return CoreMini::LIN; - case NetID::LIN2: - return CoreMini::LIN2; - case NetID::Device: - return CoreMini::Virtual; - case NetID::HSCAN2: - return CoreMini::HSCAN2; - case NetID::LSFTCAN: - return CoreMini::LSFTCAN; - case NetID::SWCAN: - return CoreMini::SWCAN; - case NetID::HSCAN3: - return CoreMini::HSCAN3; - case NetID::CGI: - return CoreMini::CGI; - case NetID::J1850VPW: - return CoreMini::J1850VPW; - case NetID::LIN3: - return CoreMini::LIN3; - case NetID::LIN4: - return CoreMini::LIN4; - case NetID::J1708: - return CoreMini::J1708; - case NetID::HSCAN4: - return CoreMini::HSCAN4; - case NetID::HSCAN5: - return CoreMini::HSCAN5; - case NetID::ISO9141: - return CoreMini::KLine1; - case NetID::ISO9141_2: - return CoreMini::KLine2; - case NetID::ISO9141_3: - return CoreMini::KLine3; - case NetID::ISO9141_4: - return CoreMini::KLine4; - case NetID::FlexRay1a: - return CoreMini::FlexRay1a; - case NetID::UART: - return CoreMini::UART; - case NetID::UART2: - return CoreMini::UART2; - case NetID::LIN5: - return CoreMini::LIN5; - case NetID::MOST25: - return CoreMini::MOST25; - case NetID::MOST50: - return CoreMini::MOST50; - case NetID::FlexRay1b: - return CoreMini::FlexRay1b; - case NetID::SWCAN2: - return CoreMini::SWCAN2; - case NetID::Ethernet_DAQ: - return CoreMini::EthernetDAQ; - case NetID::Ethernet: - return CoreMini::Ethernet; - case NetID::FlexRay2a: - return CoreMini::FlexRay2a; - case NetID::FlexRay2b: - return CoreMini::FlexRay2b; - case NetID::HSCAN6: - return CoreMini::HSCAN6; - case NetID::HSCAN7: - return CoreMini::HSCAN7; - case NetID::LIN6: - return CoreMini::LIN6; - case NetID::LSFTCAN2: - return CoreMini::LSFTCAN2; - case NetID::OP_Ethernet1: - return CoreMini::OP_Ethernet1; - case NetID::OP_Ethernet2: - return CoreMini::OP_Ethernet2; - case NetID::OP_Ethernet3: - return CoreMini::OP_Ethernet3; - case NetID::OP_Ethernet4: - return CoreMini::OP_Ethernet4; - case NetID::OP_Ethernet5: - return CoreMini::OP_Ethernet5; - case NetID::OP_Ethernet6: - return CoreMini::OP_Ethernet6; - case NetID::OP_Ethernet7: - return CoreMini::OP_Ethernet7; - case NetID::OP_Ethernet8: - return CoreMini::OP_Ethernet8; - case NetID::OP_Ethernet9: - return CoreMini::OP_Ethernet9; - case NetID::OP_Ethernet10: - return CoreMini::OP_Ethernet10; - case NetID::OP_Ethernet11: - return CoreMini::OP_Ethernet11; - case NetID::OP_Ethernet12: - return CoreMini::OP_Ethernet12; - case NetID::TCP: - return CoreMini::TCPVirtual; - case NetID::UDP: - return CoreMini::UDPVirtual; - case NetID::FlexRay: - return CoreMini::FlexRay1; - case NetID::FlexRay2: - return CoreMini::FlexRay2; - case NetID::ForwardedMessage: - return CoreMini::ForwardedMessage; - case NetID::I2C: - return CoreMini::I2C1; - case NetID::I2C2: - return CoreMini::I2C2; - case NetID::I2C3: - return CoreMini::I2C3; - case NetID::I2C4: - return CoreMini::I2C4; - case NetID::Ethernet2: - return CoreMini::Ethernet2; - case NetID::A2B1: - return CoreMini::A2B1; - case NetID::A2B2: - return CoreMini::A2B2; - case NetID::Ethernet3: - return CoreMini::Ethernet3; - case NetID::WBMS: - return CoreMini::WBMS; - case NetID::DWCAN9: - return CoreMini::DWCAN9; - case NetID::DWCAN10: - return CoreMini::DWCAN10; - case NetID::DWCAN11: - return CoreMini::DWCAN11; - case NetID::DWCAN12: - return CoreMini::DWCAN12; - case NetID::DWCAN13: - return CoreMini::DWCAN13; - case NetID::DWCAN14: - return CoreMini::DWCAN14; - case NetID::DWCAN15: - return CoreMini::DWCAN15; - case NetID::DWCAN16: - return CoreMini::DWCAN16; - case NetID::LIN7: - return CoreMini::LIN7; - case NetID::LIN8: - return CoreMini::LIN8; - case NetID::SPI1: - return CoreMini::SPI1; - case NetID::SPI2: - return CoreMini::SPI2; - case NetID::MDIO1: - return CoreMini::MDIO1; - case NetID::MDIO2: - return CoreMini::MDIO2; - case NetID::MDIO3: - return CoreMini::MDIO3; - case NetID::MDIO4: - return CoreMini::MDIO4; - case NetID::MDIO5: - return CoreMini::MDIO5; - case NetID::MDIO6: - return CoreMini::MDIO6; - case NetID::MDIO7: - return CoreMini::MDIO7; - case NetID::MDIO8: - return CoreMini::MDIO8; - default: - return std::nullopt; - } - } - static NetID GetNetIDFromCoreMiniNetwork(CoreMini cm) { - switch (cm) { - case CoreMini::HSCAN: - return NetID::HSCAN; - case CoreMini::MSCAN: - return NetID::MSCAN; - case CoreMini::LIN: - return NetID::LIN; - case CoreMini::LIN2: - return NetID::LIN2; - case CoreMini::Virtual: - return NetID::Device; - case CoreMini::HSCAN2: - return NetID::HSCAN2; - case CoreMini::LSFTCAN: - return NetID::LSFTCAN; - case CoreMini::SWCAN: - return NetID::SWCAN; - case CoreMini::HSCAN3: - return NetID::HSCAN3; - case CoreMini::CGI: - return NetID::CGI; - case CoreMini::J1850VPW: - return NetID::J1850VPW; - case CoreMini::LIN3: - return NetID::LIN3; - case CoreMini::LIN4: - return NetID::LIN4; - case CoreMini::J1708: - return NetID::J1708; - case CoreMini::HSCAN4: - return NetID::HSCAN4; - case CoreMini::HSCAN5: - return NetID::HSCAN5; - case CoreMini::KLine1: - return NetID::ISO9141; - case CoreMini::KLine2: - return NetID::ISO9141_2; - case CoreMini::KLine3: - return NetID::ISO9141_3; - case CoreMini::KLine4: - return NetID::ISO9141_4; - case CoreMini::FlexRay1a: - return NetID::FlexRay1a; - case CoreMini::UART: - return NetID::UART; - case CoreMini::UART2: - return NetID::UART2; - case CoreMini::LIN5: - return NetID::LIN5; - case CoreMini::MOST25: - return NetID::MOST25; - case CoreMini::MOST50: - return NetID::MOST50; - case CoreMini::FlexRay1b: - return NetID::FlexRay1b; - case CoreMini::SWCAN2: - return NetID::SWCAN2; - case CoreMini::EthernetDAQ: - return NetID::Ethernet_DAQ; - case CoreMini::Ethernet: - return NetID::Ethernet; - case CoreMini::FlexRay2a: - return NetID::FlexRay2a; - case CoreMini::FlexRay2b: - return NetID::FlexRay2b; - case CoreMini::HSCAN6: - return NetID::HSCAN6; - case CoreMini::HSCAN7: - return NetID::HSCAN7; - case CoreMini::LIN6: - return NetID::LIN6; - case CoreMini::LSFTCAN2: - return NetID::LSFTCAN2; - case CoreMini::OP_Ethernet1: - return NetID::OP_Ethernet1; - case CoreMini::OP_Ethernet2: - return NetID::OP_Ethernet2; - case CoreMini::OP_Ethernet3: - return NetID::OP_Ethernet3; - case CoreMini::OP_Ethernet4: - return NetID::OP_Ethernet4; - case CoreMini::OP_Ethernet5: - return NetID::OP_Ethernet5; - case CoreMini::OP_Ethernet6: - return NetID::OP_Ethernet6; - case CoreMini::OP_Ethernet7: - return NetID::OP_Ethernet7; - case CoreMini::OP_Ethernet8: - return NetID::OP_Ethernet8; - case CoreMini::OP_Ethernet9: - return NetID::OP_Ethernet9; - case CoreMini::OP_Ethernet10: - return NetID::OP_Ethernet10; - case CoreMini::OP_Ethernet11: - return NetID::OP_Ethernet11; - case CoreMini::OP_Ethernet12: - return NetID::OP_Ethernet12; - case CoreMini::TCPVirtual: - return NetID::TCP; - case CoreMini::UDPVirtual: - return NetID::UDP; - case CoreMini::FlexRay1: - return NetID::FlexRay; - case CoreMini::FlexRay2: - return NetID::FlexRay2; - case CoreMini::ForwardedMessage: - return NetID::ForwardedMessage; - case CoreMini::I2C1: - return NetID::I2C; - case CoreMini::I2C2: - return NetID::I2C2; - case CoreMini::I2C3: - return NetID::I2C3; - case CoreMini::I2C4: - return NetID::I2C4; - case CoreMini::Ethernet2: - return NetID::Ethernet2; - case CoreMini::A2B1: - return NetID::A2B1; - case CoreMini::A2B2: - return NetID::A2B2; - case CoreMini::Ethernet3: - return NetID::Ethernet3; - case CoreMini::WBMS: - return NetID::WBMS; - case CoreMini::DWCAN9: - return NetID::DWCAN9; - case CoreMini::DWCAN10: - return NetID::DWCAN10; - case CoreMini::DWCAN11: - return NetID::DWCAN11; - case CoreMini::DWCAN12: - return NetID::DWCAN12; - case CoreMini::DWCAN13: - return NetID::DWCAN13; - case CoreMini::DWCAN14: - return NetID::DWCAN14; - case CoreMini::DWCAN15: - return NetID::DWCAN15; - case CoreMini::DWCAN16: - return NetID::DWCAN16; - case CoreMini::LIN7: - return NetID::LIN7; - case CoreMini::LIN8: - return NetID::LIN8; - case CoreMini::SPI1: - return NetID::SPI1; - case CoreMini::SPI2: - return NetID::SPI2; - case CoreMini::MDIO1: - return NetID::MDIO1; - case CoreMini::MDIO2: - return NetID::MDIO2; - case CoreMini::MDIO3: - return NetID::MDIO3; - case CoreMini::MDIO4: - return NetID::MDIO4; - case CoreMini::MDIO5: - return NetID::MDIO5; - case CoreMini::MDIO6: - return NetID::MDIO6; - case CoreMini::MDIO7: - return NetID::MDIO7; - case CoreMini::MDIO8: - return NetID::MDIO8; - - } - return NetID::Invalid; // Should be unreachable, the compiler should warn about new CoreMini IDs - } - - Network() { setValue(NetID::Invalid); } - Network(neonetid_t netid) { setValue(static_cast(netid)); } - Network(NetID netid) { setValue(netid); } - Network(CoreMini cm) { setValue(GetNetIDFromCoreMiniNetwork(cm)); } - NetID getNetID() const { return value; } - Type getType() const { return type; } - VnetId getVnetId() const { return vnetId; } - std::optional getCoreMini() const { return GetCoreMiniNetworkFromNetID(getNetID()); } - friend std::ostream& operator<<(std::ostream& os, const Network& network) { - os << GetNetIDString(network.getNetID()); - return os; - } - friend bool operator==(const Network& net1, const Network& net2) { return net1.getNetID() == net2.getNetID(); } - friend bool operator!=(const Network& net1, const Network& net2) { return !(net1 == net2); } - - private: - NetID value; // Always use setValue so that value and type stay in sync - Type type; - NetID commonNetId; - VnetId vnetId; - void setValue(NetID id) { - value = id; - type = GetTypeOfNetID(value); - const auto vnetIdInfo = GetVnetAgnosticNetid((neonetid_t)id); - vnetId = vnetIdInfo.first; - commonNetId = vnetIdInfo.second; - } + ISO9141_3 = 41, + HSCAN2 = 42, + HSCAN3 = 44, + OP_Ethernet4 = 45, + OP_Ethernet5 = 46, + ISO9141_4 = 47, + LIN2 = 48, + LIN3 = 49, + LIN4 = 50, + // MOST = 51, Old and unused + RED_App_Error = 52, + CGI = 53, + Reset_Status = 54, + FB_Status = 55, + App_Signal_Status = 56, + Read_Datalink_Cm_Tx_Msg = 57, + Read_Datalink_Cm_Rx_Msg = 58, + Logging_Overflow = 59, + ReadSettings = 60, + HSCAN4 = 61, + HSCAN5 = 62, + RS232 = 63, + UART = 64, + UART2 = 65, + UART3 = 66, + UART4 = 67, + SWCAN2 = 68, + Ethernet_DAQ = 69, + Data_To_Host = 70, + TextAPI_To_Host = 71, + SPI1 = 72, + OP_Ethernet6 = 73, + Red_VBat = 74, + OP_Ethernet7 = 75, + OP_Ethernet8 = 76, + OP_Ethernet9 = 77, + OP_Ethernet10 = 78, + OP_Ethernet11 = 79, + FlexRay1a = 80, + FlexRay1b = 81, + FlexRay2a = 82, + FlexRay2b = 83, + LIN5 = 84, + FlexRay = 85, + FlexRay2 = 86, + OP_Ethernet12 = 87, + I2C = 88, + MOST25 = 90, + MOST50 = 91, + MOST150 = 92, + Ethernet = 93, + GMFSA = 94, + TCP = 95, + HSCAN6 = 96, + HSCAN7 = 97, + LIN6 = 98, + LSFTCAN2 = 99, + LogicalDiskInfo = 187, + WiVICommand = 221, + ScriptStatus = 224, + EthPHYControl = 239, + ExtendedCommand = 240, + ExtendedData = 242, + FlexRayControl = 243, + CoreMiniPreLoad = 244, + HW_COM_Latency_Test = 512, + DeviceStatus = 513, + UDP = 514, + ForwardedMessage = 516, + I2C2 = 517, + I2C3 = 518, + I2C4 = 519, + Ethernet2 = 520, + A2B1 = 522, + A2B2 = 523, + Ethernet3 = 524, + WBMS = 532, + DWCAN9 = 534, + DWCAN10 = 535, + DWCAN11 = 536, + DWCAN12 = 537, + DWCAN13 = 538, + DWCAN14 = 539, + DWCAN15 = 540, + DWCAN16 = 541, + LIN7 = 542, + LIN8 = 543, + SPI2 = 544, + MDIO1 = 545, + MDIO2 = 546, + MDIO3 = 547, + MDIO4 = 548, + MDIO5 = 549, + MDIO6 = 550, + MDIO7 = 551, + MDIO8 = 552, + Any = 0xfffe, // Never actually set as type, but used as flag for filtering + Invalid = 0xffff }; + enum class Type : neonettype_t { + Invalid = 0, + Internal = 1, // Used for statuses that don't actually need to be transferred to the client application + CAN = 2, + LIN = 3, + FlexRay = 4, + MOST = 5, + Ethernet = 6, + LSFTCAN = 7, + SWCAN = 8, + ISO9141 = 9, + I2C = 10, + A2B = 11, + SPI = 12, + MDIO = 13, + Any = 0xFE, // Never actually set as type, but used as flag for filtering + Other = 0xFF + }; + enum class CoreMini : uint8_t { + HSCAN = 0, + MSCAN = 1, + LIN = 2, + LIN2 = 3, + Virtual = 4, + HSCAN2 = 5, + LSFTCAN = 6, + SWCAN = 7, + HSCAN3 = 8, + CGI = 9, + J1850VPW = 10, + LIN3 = 11, + LIN4 = 12, + J1708 = 13, + HSCAN4 = 14, + HSCAN5 = 15, + KLine1 = 16, + KLine2 = 17, + KLine3 = 18, + KLine4 = 19, + FlexRay1a = 20, + UART = 21, + UART2 = 22, + LIN5 = 23, + MOST25 = 24, + MOST50 = 25, + FlexRay1b = 26, + SWCAN2 = 27, + EthernetDAQ = 28, + Ethernet = 29, + FlexRay2a = 30, + FlexRay2b = 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, + TCPVirtual = 48, + UDPVirtual = 49, + FlexRay1 = 50, + FlexRay2 = 51, + ForwardedMessage = 52, + I2C1 = 53, + I2C2 = 54, + I2C3 = 55, + I2C4 = 56, + Ethernet2 = 57, + A2B1 = 58, + A2B2 = 59, + Ethernet3 = 60, + WBMS = 61, + DWCAN9 = 62, + DWCAN10 = 63, + DWCAN11 = 64, + DWCAN12 = 65, + DWCAN13 = 66, + DWCAN14 = 67, + DWCAN15 = 68, + DWCAN16 = 69, + LIN7 = 70, + LIN8 = 71, + SPI1 = 72, + SPI2 = 73, + MDIO1 = 75, + MDIO2 = 76, + MDIO3 = 77, + MDIO4 = 78, + MDIO5 = 79, + MDIO6 = 80, + MDIO7 = 81, + MDIO8 = 82, + }; + static const char* GetTypeString(Type type) { + switch(type) { + case Type::CAN: + return "CAN"; + case Type::LIN: + return "LIN"; + case Type::FlexRay: + return "FlexRay"; + case Type::MOST: + return "MOST"; + case Type::Other: + return "Other"; + case Type::Internal: + return "Internal"; + case Type::ISO9141: + return "ISO 9141-2"; + case Type::Ethernet: + return "Ethernet"; + case Type::LSFTCAN: + return "Low Speed Fault Tolerant CAN"; + case Type::SWCAN: + return "Single Wire CAN"; + case Type::I2C: + return "I²C"; + case Type::A2B: + return "A2B"; + case Type::SPI: + return "SPI"; + case Type::MDIO: + return "MDIO"; + case Type::Invalid: + default: + return "Invalid Type"; + } + } + + enum class VnetId : uint8_t { + None = 0, + VNET_A = 1, + VNET_B = 2, + }; + + /** + * So if you are passing in the offset from OFFSET_PLASMA_SLAVE1 or + * the offset from OFFSET_PLASMA_SLAVE2, return the vnet agnostic + * netid so caller can commonize handlers without caring about WHICH slave. + */ + static NetID OffsetToSimpleNetworkId(uint16_t offset) { + switch(offset) { + default: + case 0: + return NetID::Device; + case 1: + return NetID::HSCAN; + case 2: + return NetID::MSCAN; + case 3: + return NetID::SWCAN; + case 4: + return NetID::LSFTCAN; + case 5: + return NetID::FordSCP; + case 6: + return NetID::J1708; + case 7: + return NetID::Aux; + case 8: + return NetID::J1850VPW; + case 9: + return NetID::ISO9141; + case 10: + return NetID::ISOPIC; + case 11: + return NetID::Main51; + case 12: + return NetID::RED; + case 13: + return NetID::SCI; + case 14: + return NetID::ISO9141_2; + case 15: + return NetID::ISO14230; + case 16: + return NetID::LIN; + case 17: + return NetID::ISO9141_3; + case 18: + return NetID::HSCAN2; + case 19: + return NetID::HSCAN3; + case 20: + return NetID::ISO9141_4; + case 21: + return NetID::LIN2; + case 22: + return NetID::LIN3; + case 23: + return NetID::LIN4; + //case 24: + // return NetID::MOST; // Deprecated + case 25: + return NetID::CGI; + case 26: + return NetID::I2C; + case 27: + return NetID::SPI1; + case 28: + return NetID::FlexRay1a; + case 29: + return NetID::MOST25; + case 30: + return NetID::MOST50; + case 31: + return NetID::MOST150; + case 32: + return NetID::HSCAN4; + case 33: + return NetID::HSCAN5; + case 34: + return NetID::RS232; + case 35: + return NetID::UART; + case 36: + return NetID::UART2; + case 37: + return NetID::UART3; + case 38: + return NetID::UART4; + case 39: + return NetID::SWCAN2; + case 40: + return NetID::FlexRay1b; + case 41: + return NetID::FlexRay2a; + case 42: + return NetID::FlexRay2b; + case 43: + return NetID::LIN5; + case 44: + return NetID::Ethernet; + case 45: + return NetID::Ethernet_DAQ; + case 46: + return NetID::RED_App_Error; + case 47: + return NetID::HSCAN6; + case 48: + return NetID::HSCAN7; + case 49: + return NetID::LIN6; + case 50: + return NetID::LSFTCAN2; + } + } + static bool Within(neonetid_t value, neonetid_t min, neonetid_t max) { + return ((min <= value) && (value < max)); + } + static bool IdIsSlaveARange1(neonetid_t fullNetid) { + return Within(fullNetid, OFFSET_PLASMA_SLAVE1, OFFSET_PLASMA_SLAVE1 + COUNT_PLASMA_SLAVE); + } + static bool IdIsSlaveARange2(neonetid_t fullNetid) { + return Within(fullNetid, OFFSET_PLASMA_SLAVE1_RANGE2, OFFSET_PLASMA_SLAVE2_RANGE2); + } + static bool IdIsSlaveBRange1(neonetid_t fullNetid) { + return Within(fullNetid, OFFSET_PLASMA_SLAVE2, OFFSET_PLASMA_SLAVE2 + COUNT_PLASMA_SLAVE); + } + static bool IdIsSlaveBRange2(neonetid_t fullNetid) { + return Within(fullNetid, OFFSET_PLASMA_SLAVE2_RANGE2, OFFSET_PLASMA_SLAVE3_RANGE2); + } + static std::pair GetVnetAgnosticNetid(neonetid_t fullNetid) { + VnetId vnetId = VnetId::None; + NetID netId; + + if(fullNetid < OFFSET_PLASMA_SLAVE1) { + netId = static_cast(fullNetid); + } else if(IdIsSlaveARange1(fullNetid)) { + netId = OffsetToSimpleNetworkId(fullNetid - OFFSET_PLASMA_SLAVE1); + vnetId = VnetId::VNET_A; + } else if(IdIsSlaveARange2(fullNetid)) { + netId = static_cast((fullNetid - OFFSET_PLASMA_SLAVE1_RANGE2)); + vnetId = VnetId::VNET_A; + } else if(IdIsSlaveBRange1(fullNetid)) { + netId = OffsetToSimpleNetworkId(fullNetid - OFFSET_PLASMA_SLAVE2); + vnetId = VnetId::VNET_B; + } else if(IdIsSlaveBRange2(fullNetid)) { + netId = static_cast((fullNetid - OFFSET_PLASMA_SLAVE2_RANGE2)); + vnetId = VnetId::VNET_B; + } else { + netId = static_cast(fullNetid); + } + + return std::make_pair(vnetId, netId); + } + static const char* GetVnetIdString(VnetId vnetId) { + switch(vnetId) { + case VnetId::None: + return "None"; + case VnetId::VNET_A: + return "VNET A"; + case VnetId::VNET_B: + return "VNET B"; + } + return "Invalid VNET ID"; + } + static Type GetTypeOfNetID(NetID netid, bool expand = true) { + if(expand) { + netid = GetVnetAgnosticNetid((neonetid_t)netid).second; + } + + switch(netid) { + case NetID::HSCAN: + case NetID::MSCAN: + case NetID::HSCAN2: + case NetID::HSCAN3: + case NetID::HSCAN4: + case NetID::HSCAN5: + case NetID::HSCAN6: + case NetID::HSCAN7: + case NetID::DWCAN9: + case NetID::DWCAN10: + case NetID::DWCAN11: + case NetID::DWCAN12: + case NetID::DWCAN13: + case NetID::DWCAN14: + case NetID::DWCAN15: + case NetID::DWCAN16: + return Type::CAN; + case NetID::LIN: + case NetID::LIN2: + case NetID::LIN3: + case NetID::LIN4: + case NetID::LIN5: + case NetID::LIN6: + case NetID::LIN7: + case NetID::LIN8: + return Type::LIN; + case NetID::FlexRay: + case NetID::FlexRay1a: + case NetID::FlexRay1b: + case NetID::FlexRay2: + case NetID::FlexRay2a: + case NetID::FlexRay2b: + return Type::FlexRay; + case NetID::MOST25: + case NetID::MOST50: + case NetID::MOST150: + return Type::MOST; + case NetID::RED: + case NetID::RED_OLDFORMAT: + case NetID::Device: + case NetID::Reset_Status: + case NetID::DeviceStatus: + case NetID::FlexRayControl: + case NetID::Main51: + case NetID::ReadSettings: + case NetID::LogicalDiskInfo: + case NetID::WiVICommand: + case NetID::ScriptStatus: + case NetID::EthPHYControl: + case NetID::CoreMiniPreLoad: + case NetID::ExtendedCommand: + case NetID::ExtendedData: + case NetID::NeoMemorySDRead: + case NetID::NeoMemoryWriteDone: + case NetID::RED_GET_RTC: + return Type::Internal; + case NetID::Invalid: + case NetID::Any: + return Type::Invalid; + case NetID::Ethernet: + case NetID::Ethernet_DAQ: + case NetID::Ethernet2: + case NetID::Ethernet3: + case NetID::OP_Ethernet1: + case NetID::OP_Ethernet2: + case NetID::OP_Ethernet3: + case NetID::OP_Ethernet4: + case NetID::OP_Ethernet5: + case NetID::OP_Ethernet6: + case NetID::OP_Ethernet7: + case NetID::OP_Ethernet8: + case NetID::OP_Ethernet9: + case NetID::OP_Ethernet10: + case NetID::OP_Ethernet11: + case NetID::OP_Ethernet12: + return Type::Ethernet; + case NetID::LSFTCAN: + case NetID::LSFTCAN2: + return Type::LSFTCAN; + case NetID::SWCAN: + case NetID::SWCAN2: + return Type::SWCAN; + case NetID::ISO9141: + case NetID::ISO9141_2: + case NetID::ISO9141_3: + case NetID::ISO9141_4: + return Type::ISO9141; + case NetID::I2C: + case NetID::I2C2: + case NetID::I2C3: + case NetID::I2C4: + return Type::I2C; + case NetID::A2B1: + case NetID::A2B2: + return Type::A2B; + case NetID::SPI1: + case NetID::SPI2: + return Type::SPI; + case NetID::MDIO1: + case NetID::MDIO2: + case NetID::MDIO3: + case NetID::MDIO4: + case NetID::MDIO5: + case NetID::MDIO6: + case NetID::MDIO7: + case NetID::MDIO8: + return Type::MDIO; + default: + return Type::Other; + } + } + static const char* GetNetIDString(NetID netid, bool expand = true) { + if(expand) { + netid = GetVnetAgnosticNetid((neonetid_t)netid).second; + } + switch(netid) { + case NetID::Device: + return "neoVI"; + case NetID::HSCAN: + return "HSCAN"; + case NetID::MSCAN: + return "MSCAN"; + case NetID::SWCAN: + return "SWCAN"; + case NetID::LSFTCAN: + return "LSFTCAN"; + case NetID::FordSCP: + return "FordSCP"; + case NetID::J1708: + return "J1708"; + case NetID::Aux: + return "Aux"; + case NetID::J1850VPW: + return "J1850 VPW"; + case NetID::ISO9141: + return "ISO 9141"; + case NetID::ISOPIC: + return "ISOPIC"; + case NetID::Main51: + return "Main51"; + case NetID::RED: + return "RED"; + case NetID::SCI: + return "SCI"; + case NetID::ISO9141_2: + return "ISO 9141 2"; + case NetID::ISO14230: + return "ISO 14230"; + case NetID::LIN: + return "LIN"; + case NetID::OP_Ethernet1: + return "OP (BR) Ethernet 1"; + case NetID::OP_Ethernet2: + return "OP (BR) Ethernet 2"; + case NetID::OP_Ethernet3: + return "OP (BR) Ethernet 3"; + case NetID::RED_EXT_MEMORYREAD: + return "RED_EXT_MEMORYREAD"; + case NetID::RED_INT_MEMORYREAD: + return "RED_INT_MEMORYREAD"; + case NetID::RED_DFLASH_READ: + return "RED_DFLASH_READ"; + case NetID::NeoMemorySDRead: + return "NeoMemorySDRead"; + case NetID::CAN_ERRBITS: + return "CAN_ERRBITS"; + case NetID::NeoMemoryWriteDone: + return "NeoMemoryWriteDone"; + case NetID::RED_WAVE_CAN1_LOGICAL: + return "RED_WAVE_CAN1_LOGICAL"; + case NetID::RED_WAVE_CAN2_LOGICAL: + return "RED_WAVE_CAN2_LOGICAL"; + case NetID::RED_WAVE_LIN1_LOGICAL: + return "RED_WAVE_LIN1_LOGICAL"; + case NetID::RED_WAVE_LIN2_LOGICAL: + return "RED_WAVE_LIN2_LOGICAL"; + case NetID::RED_WAVE_LIN1_ANALOG: + return "RED_WAVE_LIN1_ANALOG"; + case NetID::RED_WAVE_LIN2_ANALOG: + return "RED_WAVE_LIN2_ANALOG"; + case NetID::RED_WAVE_MISC_ANALOG: + return "RED_WAVE_MISC_ANALOG"; + case NetID::RED_WAVE_MISCDIO2_LOGICAL: + return "RED_WAVE_MISCDIO2_LOGICAL"; + case NetID::RED_NETWORK_COM_ENABLE_EX: + return "RED_NETWORK_COM_ENABLE_EX"; + case NetID::RED_NEOVI_NETWORK: + return "RED_NEOVI_NETWORK"; + case NetID::RED_READ_BAUD_SETTINGS: + return "RED_READ_BAUD_SETTINGS"; + case NetID::RED_OLDFORMAT: + return "RED_OLDFORMAT"; + case NetID::RED_SCOPE_CAPTURE: + return "RED_SCOPE_CAPTURE"; + case NetID::RED_HARDWARE_EXCEP: + return "RED_HARDWARE_EXCEP"; + case NetID::RED_GET_RTC: + return "RED_GET_RTC"; + case NetID::ISO9141_3: + return "ISO 9141 3"; + case NetID::HSCAN2: + return "HSCAN 2"; + case NetID::HSCAN3: + return "HSCAN 3"; + case NetID::OP_Ethernet4: + return "OP (BR) Ethernet 4"; + case NetID::OP_Ethernet5: + return "OP (BR) Ethernet 5"; + case NetID::ISO9141_4: + return "ISO 9141 4"; + case NetID::LIN2: + return "LIN 2"; + case NetID::LIN3: + return "LIN 3"; + case NetID::LIN4: + return "LIN 4"; + case NetID::RED_App_Error: + return "App Error"; + case NetID::CGI: + return "CGI"; + case NetID::Reset_Status: + return "Reset Status"; + case NetID::FB_Status: + return "FB Status"; + case NetID::App_Signal_Status: + return "App Signal Status"; + case NetID::Read_Datalink_Cm_Tx_Msg: + return "Read Datalink Cm Tx Msg"; + case NetID::Read_Datalink_Cm_Rx_Msg: + return "Read Datalink Cm Rx Msg"; + case NetID::Logging_Overflow: + return "Logging Overflow"; + case NetID::ReadSettings: + return "Read Settings"; + case NetID::HSCAN4: + return "HSCAN 4"; + case NetID::HSCAN5: + return "HSCAN 5"; + case NetID::RS232: + return "RS232"; + case NetID::UART: + return "UART"; + case NetID::UART2: + return "UART 2"; + case NetID::UART3: + return "UART 3"; + case NetID::UART4: + return "UART 4"; + case NetID::SWCAN2: + return "SWCAN 2"; + case NetID::Ethernet_DAQ: + return "Ethernet DAQ"; + case NetID::Data_To_Host: + return "Data To Host"; + case NetID::TextAPI_To_Host: + return "TextAPI To Host"; + case NetID::OP_Ethernet6: + return "OP (BR) Ethernet 6"; + case NetID::Red_VBat: + return "Red VBat"; + case NetID::OP_Ethernet7: + return "OP (BR) Ethernet 7"; + case NetID::OP_Ethernet8: + return "OP (BR) Ethernet 8"; + case NetID::OP_Ethernet9: + return "OP (BR) Ethernet 9"; + case NetID::OP_Ethernet10: + return "OP (BR) Ethernet 10"; + case NetID::OP_Ethernet11: + return "OP (BR) Ethernet 11"; + case NetID::FlexRay1a: + return "FlexRay 1a"; + case NetID::FlexRay1b: + return "FlexRay 1b"; + case NetID::FlexRay2a: + return "FlexRay 2a"; + case NetID::FlexRay2b: + return "FlexRay 2b"; + case NetID::LIN5: + return "LIN 5"; + case NetID::FlexRay: + return "FlexRay"; + case NetID::FlexRay2: + return "FlexRay 2"; + case NetID::OP_Ethernet12: + return "OP (BR) Ethernet 12"; + case NetID::I2C: + return "I2C"; + case NetID::MOST25: + return "MOST25"; + case NetID::MOST50: + return "MOST50"; + case NetID::MOST150: + return "MOST150"; + case NetID::Ethernet: + return "Ethernet"; + case NetID::GMFSA: + return "GMFSA"; + case NetID::TCP: + return "TCP"; + case NetID::HSCAN6: + return "HSCAN 6"; + case NetID::HSCAN7: + return "HSCAN 7"; + case NetID::LIN6: + return "LIN 6"; + case NetID::LSFTCAN2: + return "LSFTCAN 2"; + case NetID::LogicalDiskInfo: + return "Logical Disk Information"; + case NetID::WiVICommand: + return "WiVI Command"; + case NetID::ScriptStatus: + return "Script Status"; + case NetID::CoreMiniPreLoad: + return "CoreMini PreLoad"; + case NetID::EthPHYControl: + return "Ethernet PHY Register Control"; + case NetID::ExtendedCommand: + return "Extended Command"; + case NetID::ExtendedData: + return "Extended Data"; + case NetID::FlexRayControl: + return "FlexRay Control"; + case NetID::HW_COM_Latency_Test: + return "HW COM Latency Test"; + case NetID::DeviceStatus: + return "Device Status"; + case NetID::UDP: + return "UDP"; + case NetID::ForwardedMessage: + return "Forwarded Message"; + case NetID::I2C2: + return "I2C 2"; + case NetID::I2C3: + return "I2C 3"; + case NetID::I2C4: + return "I2C 4"; + case NetID::Ethernet2: + return "Ethernet 2"; + case NetID::A2B1: + return "A2B 1"; + case NetID::A2B2: + return "A2B 2"; + case NetID::DWCAN9: + return "DWCAN 09"; + case NetID::DWCAN10: + return "DWCAN 10"; + case NetID::DWCAN11: + return "DWCAN 11"; + case NetID::DWCAN12: + return "DWCAN 12"; + case NetID::DWCAN13: + return "DWCAN 13"; + case NetID::DWCAN14: + return "DWCAN 14"; + case NetID::DWCAN15: + return "DWCAN 15"; + case NetID::DWCAN16: + return "DWCAN 16"; + case NetID::Ethernet3: + return "Ethernet 03"; + case NetID::LIN7: + return "LIN 07"; + case NetID::LIN8: + return "LIN 08"; + case NetID::WBMS: + return "WBMS"; + case NetID::SPI1: + return "SPI 1"; + case NetID::SPI2: + return "SPI 2"; + case NetID::MDIO1: + return "MDIO 1"; + case NetID::MDIO2: + return "MDIO 2"; + case NetID::MDIO3: + return "MDIO 3"; + case NetID::MDIO4: + return "MDIO 4"; + case NetID::MDIO5: + return "MDIO 5"; + case NetID::MDIO6: + return "MDIO 6"; + case NetID::MDIO7: + return "MDIO 7"; + case NetID::MDIO8: + return "MDIO 8"; + case NetID::Any: + case NetID::Invalid: + break; + } + return "Invalid Network"; + } + static std::optional GetCoreMiniNetworkFromNetID(NetID netid) { + switch(netid) { + case NetID::HSCAN: + return CoreMini::HSCAN; + case NetID::MSCAN: + return CoreMini::MSCAN; + case NetID::LIN: + return CoreMini::LIN; + case NetID::LIN2: + return CoreMini::LIN2; + case NetID::Device: + return CoreMini::Virtual; + case NetID::HSCAN2: + return CoreMini::HSCAN2; + case NetID::LSFTCAN: + return CoreMini::LSFTCAN; + case NetID::SWCAN: + return CoreMini::SWCAN; + case NetID::HSCAN3: + return CoreMini::HSCAN3; + case NetID::CGI: + return CoreMini::CGI; + case NetID::J1850VPW: + return CoreMini::J1850VPW; + case NetID::LIN3: + return CoreMini::LIN3; + case NetID::LIN4: + return CoreMini::LIN4; + case NetID::J1708: + return CoreMini::J1708; + case NetID::HSCAN4: + return CoreMini::HSCAN4; + case NetID::HSCAN5: + return CoreMini::HSCAN5; + case NetID::ISO9141: + return CoreMini::KLine1; + case NetID::ISO9141_2: + return CoreMini::KLine2; + case NetID::ISO9141_3: + return CoreMini::KLine3; + case NetID::ISO9141_4: + return CoreMini::KLine4; + case NetID::FlexRay1a: + return CoreMini::FlexRay1a; + case NetID::UART: + return CoreMini::UART; + case NetID::UART2: + return CoreMini::UART2; + case NetID::LIN5: + return CoreMini::LIN5; + case NetID::MOST25: + return CoreMini::MOST25; + case NetID::MOST50: + return CoreMini::MOST50; + case NetID::FlexRay1b: + return CoreMini::FlexRay1b; + case NetID::SWCAN2: + return CoreMini::SWCAN2; + case NetID::Ethernet_DAQ: + return CoreMini::EthernetDAQ; + case NetID::Ethernet: + return CoreMini::Ethernet; + case NetID::FlexRay2a: + return CoreMini::FlexRay2a; + case NetID::FlexRay2b: + return CoreMini::FlexRay2b; + case NetID::HSCAN6: + return CoreMini::HSCAN6; + case NetID::HSCAN7: + return CoreMini::HSCAN7; + case NetID::LIN6: + return CoreMini::LIN6; + case NetID::LSFTCAN2: + return CoreMini::LSFTCAN2; + case NetID::OP_Ethernet1: + return CoreMini::OP_Ethernet1; + case NetID::OP_Ethernet2: + return CoreMini::OP_Ethernet2; + case NetID::OP_Ethernet3: + return CoreMini::OP_Ethernet3; + case NetID::OP_Ethernet4: + return CoreMini::OP_Ethernet4; + case NetID::OP_Ethernet5: + return CoreMini::OP_Ethernet5; + case NetID::OP_Ethernet6: + return CoreMini::OP_Ethernet6; + case NetID::OP_Ethernet7: + return CoreMini::OP_Ethernet7; + case NetID::OP_Ethernet8: + return CoreMini::OP_Ethernet8; + case NetID::OP_Ethernet9: + return CoreMini::OP_Ethernet9; + case NetID::OP_Ethernet10: + return CoreMini::OP_Ethernet10; + case NetID::OP_Ethernet11: + return CoreMini::OP_Ethernet11; + case NetID::OP_Ethernet12: + return CoreMini::OP_Ethernet12; + case NetID::TCP: + return CoreMini::TCPVirtual; + case NetID::UDP: + return CoreMini::UDPVirtual; + case NetID::FlexRay: + return CoreMini::FlexRay1; + case NetID::FlexRay2: + return CoreMini::FlexRay2; + case NetID::ForwardedMessage: + return CoreMini::ForwardedMessage; + case NetID::I2C: + return CoreMini::I2C1; + case NetID::I2C2: + return CoreMini::I2C2; + case NetID::I2C3: + return CoreMini::I2C3; + case NetID::I2C4: + return CoreMini::I2C4; + case NetID::Ethernet2: + return CoreMini::Ethernet2; + case NetID::A2B1: + return CoreMini::A2B1; + case NetID::A2B2: + return CoreMini::A2B2; + case NetID::Ethernet3: + return CoreMini::Ethernet3; + case NetID::WBMS: + return CoreMini::WBMS; + case NetID::DWCAN9: + return CoreMini::DWCAN9; + case NetID::DWCAN10: + return CoreMini::DWCAN10; + case NetID::DWCAN11: + return CoreMini::DWCAN11; + case NetID::DWCAN12: + return CoreMini::DWCAN12; + case NetID::DWCAN13: + return CoreMini::DWCAN13; + case NetID::DWCAN14: + return CoreMini::DWCAN14; + case NetID::DWCAN15: + return CoreMini::DWCAN15; + case NetID::DWCAN16: + return CoreMini::DWCAN16; + case NetID::LIN7: + return CoreMini::LIN7; + case NetID::LIN8: + return CoreMini::LIN8; + case NetID::SPI1: + return CoreMini::SPI1; + case NetID::SPI2: + return CoreMini::SPI2; + case NetID::MDIO1: + return CoreMini::MDIO1; + case NetID::MDIO2: + return CoreMini::MDIO2; + case NetID::MDIO3: + return CoreMini::MDIO3; + case NetID::MDIO4: + return CoreMini::MDIO4; + case NetID::MDIO5: + return CoreMini::MDIO5; + case NetID::MDIO6: + return CoreMini::MDIO6; + case NetID::MDIO7: + return CoreMini::MDIO7; + case NetID::MDIO8: + return CoreMini::MDIO8; + default: + return std::nullopt; + } + } + static NetID GetNetIDFromCoreMiniNetwork(CoreMini cm) { + switch(cm) { + case CoreMini::HSCAN: + return NetID::HSCAN; + case CoreMini::MSCAN: + return NetID::MSCAN; + case CoreMini::LIN: + return NetID::LIN; + case CoreMini::LIN2: + return NetID::LIN2; + case CoreMini::Virtual: + return NetID::Device; + case CoreMini::HSCAN2: + return NetID::HSCAN2; + case CoreMini::LSFTCAN: + return NetID::LSFTCAN; + case CoreMini::SWCAN: + return NetID::SWCAN; + case CoreMini::HSCAN3: + return NetID::HSCAN3; + case CoreMini::CGI: + return NetID::CGI; + case CoreMini::J1850VPW: + return NetID::J1850VPW; + case CoreMini::LIN3: + return NetID::LIN3; + case CoreMini::LIN4: + return NetID::LIN4; + case CoreMini::J1708: + return NetID::J1708; + case CoreMini::HSCAN4: + return NetID::HSCAN4; + case CoreMini::HSCAN5: + return NetID::HSCAN5; + case CoreMini::KLine1: + return NetID::ISO9141; + case CoreMini::KLine2: + return NetID::ISO9141_2; + case CoreMini::KLine3: + return NetID::ISO9141_3; + case CoreMini::KLine4: + return NetID::ISO9141_4; + case CoreMini::FlexRay1a: + return NetID::FlexRay1a; + case CoreMini::UART: + return NetID::UART; + case CoreMini::UART2: + return NetID::UART2; + case CoreMini::LIN5: + return NetID::LIN5; + case CoreMini::MOST25: + return NetID::MOST25; + case CoreMini::MOST50: + return NetID::MOST50; + case CoreMini::FlexRay1b: + return NetID::FlexRay1b; + case CoreMini::SWCAN2: + return NetID::SWCAN2; + case CoreMini::EthernetDAQ: + return NetID::Ethernet_DAQ; + case CoreMini::Ethernet: + return NetID::Ethernet; + case CoreMini::FlexRay2a: + return NetID::FlexRay2a; + case CoreMini::FlexRay2b: + return NetID::FlexRay2b; + case CoreMini::HSCAN6: + return NetID::HSCAN6; + case CoreMini::HSCAN7: + return NetID::HSCAN7; + case CoreMini::LIN6: + return NetID::LIN6; + case CoreMini::LSFTCAN2: + return NetID::LSFTCAN2; + case CoreMini::OP_Ethernet1: + return NetID::OP_Ethernet1; + case CoreMini::OP_Ethernet2: + return NetID::OP_Ethernet2; + case CoreMini::OP_Ethernet3: + return NetID::OP_Ethernet3; + case CoreMini::OP_Ethernet4: + return NetID::OP_Ethernet4; + case CoreMini::OP_Ethernet5: + return NetID::OP_Ethernet5; + case CoreMini::OP_Ethernet6: + return NetID::OP_Ethernet6; + case CoreMini::OP_Ethernet7: + return NetID::OP_Ethernet7; + case CoreMini::OP_Ethernet8: + return NetID::OP_Ethernet8; + case CoreMini::OP_Ethernet9: + return NetID::OP_Ethernet9; + case CoreMini::OP_Ethernet10: + return NetID::OP_Ethernet10; + case CoreMini::OP_Ethernet11: + return NetID::OP_Ethernet11; + case CoreMini::OP_Ethernet12: + return NetID::OP_Ethernet12; + case CoreMini::TCPVirtual: + return NetID::TCP; + case CoreMini::UDPVirtual: + return NetID::UDP; + case CoreMini::FlexRay1: + return NetID::FlexRay; + case CoreMini::FlexRay2: + return NetID::FlexRay2; + case CoreMini::ForwardedMessage: + return NetID::ForwardedMessage; + case CoreMini::I2C1: + return NetID::I2C; + case CoreMini::I2C2: + return NetID::I2C2; + case CoreMini::I2C3: + return NetID::I2C3; + case CoreMini::I2C4: + return NetID::I2C4; + case CoreMini::Ethernet2: + return NetID::Ethernet2; + case CoreMini::A2B1: + return NetID::A2B1; + case CoreMini::A2B2: + return NetID::A2B2; + case CoreMini::Ethernet3: + return NetID::Ethernet3; + case CoreMini::WBMS: + return NetID::WBMS; + case CoreMini::DWCAN9: + return NetID::DWCAN9; + case CoreMini::DWCAN10: + return NetID::DWCAN10; + case CoreMini::DWCAN11: + return NetID::DWCAN11; + case CoreMini::DWCAN12: + return NetID::DWCAN12; + case CoreMini::DWCAN13: + return NetID::DWCAN13; + case CoreMini::DWCAN14: + return NetID::DWCAN14; + case CoreMini::DWCAN15: + return NetID::DWCAN15; + case CoreMini::DWCAN16: + return NetID::DWCAN16; + case CoreMini::LIN7: + return NetID::LIN7; + case CoreMini::LIN8: + return NetID::LIN8; + case CoreMini::SPI1: + return NetID::SPI1; + case CoreMini::SPI2: + return NetID::SPI2; + case CoreMini::MDIO1: + return NetID::MDIO1; + case CoreMini::MDIO2: + return NetID::MDIO2; + case CoreMini::MDIO3: + return NetID::MDIO3; + case CoreMini::MDIO4: + return NetID::MDIO4; + case CoreMini::MDIO5: + return NetID::MDIO5; + case CoreMini::MDIO6: + return NetID::MDIO6; + case CoreMini::MDIO7: + return NetID::MDIO7; + case CoreMini::MDIO8: + return NetID::MDIO8; + + } + return NetID::Invalid; // Should be unreachable, the compiler should warn about new CoreMini IDs + } + + Network() { setValue(NetID::Invalid); } + Network(neonetid_t netid, bool expand = true) { setValue(static_cast(netid), expand); } + Network(NetID netid) { setValue(netid); } + Network(CoreMini cm) { setValue(GetNetIDFromCoreMiniNetwork(cm)); } + NetID getNetID() const { return value; } + Type getType() const { return type; } + VnetId getVnetId() const { return vnetId; } + std::optional getCoreMini() const { return GetCoreMiniNetworkFromNetID(getNetID()); } + friend std::ostream& operator<<(std::ostream& os, const Network& network) { + os << GetNetIDString(network.getNetID()); + return os; + } + friend bool operator==(const Network& net1, const Network& net2) { return net1.getNetID() == net2.getNetID(); } + friend bool operator!=(const Network& net1, const Network& net2) { return !(net1 == net2); } + +private: + NetID value; // Always use setValue so that value and type stay in sync + Type type; + NetID commonNetId; + VnetId vnetId; + void setValue(NetID id, bool expand = true) { + value = id; + // Constructor can optionally suppress the expansion of of the ID into a VNET slot and common ID. The communication decoder and packetizer require this for device responses. + type = GetTypeOfNetID(value, expand); + if(expand) { + std::tie(vnetId, commonNetId) = GetVnetAgnosticNetid((neonetid_t)id); + } else { + // Caller wanted to suppress VNET ID decoding. + vnetId = VnetId::None; + commonNetId = id; + } + } +}; }