diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index b4d1bcb..7262866 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -46,6 +46,26 @@ static std::vector supportedDevices = { RADGigalogETH::DEVICE_TYPE, #endif + #ifdef __RADGIGALOG_USB_H_ + RADGigalogUSB::DEVICE_TYPE, + #endif + + #ifdef __RADGIGASTAR_ETH_H_ + RADGigastarETH::DEVICE_TYPE, + #endif + + #ifdef __RADGIGASTAR_USB_H_ + RADGigastarUSB::DEVICE_TYPE, + #endif + + #ifdef __RADMOON2_H_ + RADMoon2::DEVICE_TYPE, + #endif + + #ifdef __RADMOONDUO_H_ + RADMoonDuo::DEVICE_TYPE, + #endif + #ifdef __RADPLUTOUSB_H_ RADPlutoUSB::DEVICE_TYPE, #endif @@ -136,6 +156,26 @@ std::vector> DeviceFinder::FindAll() { findResults.push_back(RADGigalogETH::Find(pcapDevices)); #endif + #ifdef __RADGIGALOG_USB_H_ + findResults.push_back(RADGigalogUSB::Find()); + #endif + + #ifdef __RADGIGASTAR_ETH_H_ + findResults.push_back(RADGigastarETH::Find(pcapDevices)); + #endif + + #ifdef __RADGIGASTAR_USB_H_ + findResults.push_back(RADGigastarUSB::Find()); + #endif + + #ifdef __RADMOON2_H_ + findResults.push_back(RADMoon2::Find()); + #endif + + #ifdef __RADMOONDUO_H_ + findResults.push_back(RADMoonDuo::Find()); + #endif + #ifdef __RADPLUTOUSB_H_ findResults.push_back(RADPlutoUSB::Find()); #endif diff --git a/include/icsneo/communication/network.h b/include/icsneo/communication/network.h index 6322f18..2292584 100644 --- a/include/icsneo/communication/network.h +++ b/include/icsneo/communication/network.h @@ -115,6 +115,10 @@ public: FlexRayControl = 243, HW_COM_Latency_Test = 512, Device_Status = 513, + I2C2 = 517, + I2C3 = 518, + I2C4 = 519, + Ethernet2 = 520, Any = 0xfffe, // Never actually set as type, but used as flag for filtering Invalid = 0xffff }; @@ -195,6 +199,7 @@ public: return Type::Invalid; case NetID::Ethernet: case NetID::Ethernet_DAQ: + case NetID::Ethernet2: case NetID::OP_Ethernet1: case NetID::OP_Ethernet2: case NetID::OP_Ethernet3: @@ -416,6 +421,14 @@ public: return "HW COM Latency Test"; case NetID::Device_Status: return "Device Status"; + 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::Any: case NetID::Invalid: break; @@ -552,6 +565,10 @@ private: #define ICSNEO_NETID_LSFTCAN2 99 #define ICSNEO_NETID_HW_COM_LATENCY_TEST 512 #define ICSNEO_NETID_DEVICE_STATUS 513 +#define ICSNEO_NETID_I2C2 517 +#define ICSNEO_NETID_I2C3 518 +#define ICSNEO_NETID_I2C4 519 +#define ICSNEO_NETID_ETHERNET2 520 #define ICSNEO_NETID_ANY 0xfffe // Never actually set as type, but used as flag for filtering #define ICSNEO_NETID_INVALID 0xffff diff --git a/include/icsneo/device/devicetype.h b/include/icsneo/device/devicetype.h index dbd6f41..4614069 100644 --- a/include/icsneo/device/devicetype.h +++ b/include/icsneo/device/devicetype.h @@ -35,7 +35,13 @@ public: RADPluto = (0x00000009), VCAN4_2EL = (0x0000000a), RADIO_CANHUB = (0x0000000b), + NEOECU12 = (0x0000000c), + OBD2_LCBADGE = (0x0000000d), + RADMoonDuo = (0x0000000e), VCAN3 = (0x00000010), + RADJupiter = (0x00000011), + VCAN4_IND = (0x00000012), + RADGigastar = (0x00000013), EtherBADGE = (0x00000016), RED = (0x00000040), ECU = (0x00000080), @@ -90,9 +96,21 @@ public: case VCAN4_2EL: return "ValueCAN 4-2EL"; case RADIO_CANHUB: - return "RADIO_CANHUB"; + return "RAD-IO2 CANHub"; + case NEOECU12: + return "neoECU 12"; + case OBD2_LCBADGE: + return "neoOBD2 LC BADGE"; + case RADMoonDuo: + return "RAD-Moon Duo"; case VCAN3: return "ValueCAN 3"; + case RADJupiter: + return "RAD-Jupiter"; + case VCAN4_IND: + return "ValueCAN 4 Industrial"; + case RADGigastar: + return "RAD-Gigastar"; case EtherBADGE: return "EtherBADGE"; case RED: @@ -181,7 +199,13 @@ private: #define ICSNEO_DEVICETYPE_RADPLUTO ((devicetype_t)0x00000009) #define ICSNEO_DEVICETYPE_VCAN4_2EL ((devicetype_t)0x0000000a) #define ICSNEO_DEVICETYPE_RADIO_CANHUB ((devicetype_t)0x0000000b) +#define ICSNEO_DEVICETYPE_NEOECU12 ((devicetype_t)0x0000000c) +#define ICSNEO_DEVICETYPE_OBD2_LCBADGE ((devicetype_t)0x0000000d) +#define ICSNEO_DEVICETYPE_RADMOONDUO ((devicetype_t)0x0000000e) #define ICSNEO_DEVICETYPE_VCAN3 ((devicetype_t)0x00000010) +#define ICSNEO_DEVICETYPE_RADJUPITER ((devicetype_t)0x00000011) +#define ICSNEO_DEVICETYPE_VCAN4_IND ((devicetype_t)0x00000012) +#define ICSNEO_DEVICETYPE_RADGIGASTAR ((devicetype_t)0x00000013) #define ICSNEO_DEVICETYPE_ETHERBADGE ((devicetype_t)0x00000016) #define ICSNEO_DEVICETYPE_RED ((devicetype_t)0x00000040) #define ICSNEO_DEVICETYPE_ECU ((devicetype_t)0x00000080) diff --git a/include/icsneo/device/idevicesettings.h b/include/icsneo/device/idevicesettings.h index e26aadd..23d8b91 100644 --- a/include/icsneo/device/idevicesettings.h +++ b/include/icsneo/device/idevicesettings.h @@ -45,6 +45,13 @@ enum LISTEN_ALL = 7 }; +enum OPEthLinkMode +{ + OPETH_LINK_AUTO = 0, + OPETH_LINK_MASTER, + OPETH_LINK_SLAVE +}; + typedef struct { uint8_t Mode; @@ -163,6 +170,143 @@ typedef struct DISK_SETTINGS_t } DISK_SETTINGS; #define DISK_SETTINGS_SIZE 14 +#define SERDESCAM_SETTINGS_FLAG_ENABLE 0x01 +#define SERDESCAM_SETTINGS_RTSP_ENABLE 0x02 +#define SERDESCAM_SETTINGS_AUTO_DETECT_ENABLE 0x04 +#define SERDESCAM_SETTINGS_CONFIG_ENABLE 0x08 + +/* mode in SERDESCAM_SETTINGS */ +enum +{ + SERDESCAM_MODE_PASSTHROUGH = 0, + SERDESCAM_MODE_TAP, + SERDESCAM_MODE_PLAYBACK, +}; + +/* ucCamConfigMode in SERDESCAM_SETTINGS */ +enum +{ + SERDESCAM_CONFIG_MODE_EXTERNAL_OVER_TAP = 0, + SERDESCAM_CONFIG_MODE_LOCAL_SCRIPT, +}; + +/* bitPos in SERDESCAM_SETTINGS */ +enum +{ + SERDESCAM_PIXEL_BIT_POS_0 = 0, + SERDESCAM_PIXEL_BIT_POS_1, + SERDESCAM_PIXEL_BIT_POS_2, + SERDESCAM_PIXEL_BIT_POS_3, +}; + +/* videoFormat in SERDESCAM_SETTINGS */ +enum +{ + SERDESCAM_VIDEO_FORMAT_NONE = -1, + SERDESCAM_VIDEO_FORMAT_UYVY_422_8 = 0, // packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + SERDESCAM_VIDEO_FORMAT_YUYV_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + SERDESCAM_VIDEO_FORMAT_YVYU_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + SERDESCAM_VIDEO_FORMAT_VYUY_422_8, // packed YUV 4:2:2, 16bpp, Cr Y0 Cb Y1 + SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_8, + SERDESCAM_VIDEO_FORMAT_RAW_8, // e.g. bayer 8 bit, gray 8 bit + SERDESCAM_VIDEO_FORMAT_RAW_10, // e.g. bayer 10 bit, gray 10 bit + SERDESCAM_VIDEO_FORMAT_RAW_12, + SERDESCAM_VIDEO_FORMAT_RAW_16, // e.g. planar YUV 4:2:2, 16bpp, 8 bit samples + SERDESCAM_VIDEO_FORMAT_RAW_20, // e.g. planar YUV 4:2:2, 20bpp, 10 bit samples + SERDESCAM_VIDEO_FORMAT_RAW_24, // e.g. packed RGB 8:8:8 24bpp, 8 bit samples + SERDESCAM_VIDEO_FORMAT_RAW_30, // e.g. planar YUV 4:4:4, 30bpp, 10 bit samples + SERDESCAM_VIDEO_FORMAT_RAW_32, // e.g. packed ARGB 8:8:8:8, 32bpp, 8 bit samples + SERDESCAM_VIDEO_FORMAT_RAW_36, + SERDESCAM_VIDEO_FORMAT_RGB888, // packed RGB 8:8:8, 24bpp, RGBRGB... + SERDESCAM_VIDEO_FORMAT_UYVY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cb Y0 Cr Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_YUYV_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cb Y1 Cr, FOURCC Y210 bitpacked + SERDESCAM_VIDEO_FORMAT_YVYU_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cr Y1 Cb, bitpacked + SERDESCAM_VIDEO_FORMAT_VYUY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cr Y0 Cb Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_10LE_PACKED,// 10-bit samples bitpacked into 40-bits little endian + SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_12LE_PACKED,// 12-bit samples bitpacked into 40-bits little endian + SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_16LE,// 16-bit samples little endian + SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_16BE,// 16-bit samples big endian + SERDESCAM_VIDEO_FORMAT_JPEG, + SERDESCAM_VIDEO_FORMAT_UYVY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cb Y0 Cr Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_YUYV_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cb Y1 Cr, bitpacked + SERDESCAM_VIDEO_FORMAT_YVYU_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cr Y1 Cb, bitpacked + SERDESCAM_VIDEO_FORMAT_VYUY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cr Y0 Cb Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_YUV422_10LE_PLANAR,// planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + SERDESCAM_VIDEO_FORMAT_YUV422_16LE_PLANAR,// planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian + SERDESCAM_VIDEO_FORMAT_RGB565, // packed RGB 5:6:5, 16bpp, RGBRGB... + SERDESCAM_VIDEO_FORMAT_RGB666, // packed RGB 6:6:6, 18bpp, RGBRGB... + SERDESCAM_VIDEO_FORMAT_RAW_11x2, + SERDESCAM_VIDEO_FORMAT_RAW_12x2, + SERDESCAM_VIDEO_FORMAT_RAW_14, + // NOTE: CSI2 formats are only used internal to VSPY + // Firmware should flag video as CSI2 source types + // Vspy will then convert formats into the proper CSI2 version + SERDESCAM_VIDEO_FORMAT_CSI2_UYVY_422_8, // packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 + SERDESCAM_VIDEO_FORMAT_CSI2_YUYV_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr + SERDESCAM_VIDEO_FORMAT_CSI2_YVYU_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb + SERDESCAM_VIDEO_FORMAT_CSI2_VYUY_422_8, // packed YUV 4:2:2, 16bpp, Cr Y0 Cb Y1 + SERDESCAM_VIDEO_FORMAT_CSI2_UYVY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cb Y0 Cr Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_YUYV_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cb Y1 Cr, FOURCC Y210 bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_YVYU_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cr Y1 Cb, bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_VYUY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cr Y0 Cb Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_UYVY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cb Y0 Cr Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_YUYV_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cb Y1 Cr, bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_YVYU_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cr Y1 Cb, bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_VYUY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cr Y0 Cb Y1, bitpacked + SERDESCAM_VIDEO_FORMAT_CSI2_RGB565, // packed RGB 5:6:5, 16bpp, BGRBGR... + SERDESCAM_VIDEO_FORMAT_CSI2_RGB666, // packed RGB 6:6:6, 18bpp, BGRBGR... + SERDESCAM_VIDEO_FORMAT_CSI2_RGB888, // packed RGB 8:8:8, 24bpp, BGRBGR... + SERDESCAM_VIDEO_FORMAT_CSI2_BAYER_BGGR_8, + SERDESCAM_VIDEO_FORMAT_CSI2_BAYER_BGGR_10LE_PACKED,// 10-bit samples bitpacked into 40-bits little endian + SERDESCAM_VIDEO_FORMAT_CSI2_BAYER_BGGR_12LE_PACKED,// 12-bit samples bitpacked into 40-bits little endian + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_8, // e.g. bayer 8 bit, gray 8 bit + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_10, // e.g. bayer 10 bit, gray 10 bit + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_11x2, + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_12, + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_12x2, + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_14, + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_16, // e.g. planar YUV 4:2:2, 16bpp, 8 bit samples + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_20, // e.g. planar YUV 4:2:2, 20bpp, 10 bit samples + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_24, // e.g. packed RGB 8:8:8 24bpp, 8 bit samples + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_30, // e.g. planar YUV 4:4:4, 30bpp, 10 bit samples + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_32, // e.g. packed ARGB 8:8:8:8, 32bpp, 8 bit samples + SERDESCAM_VIDEO_FORMAT_CSI2_RAW_36, + // NOTE: new entries must be appended to maintain backwards compatibility + // insert new entries before this + SERDESCAM_VIDEO_FORMAT_COUNT, +}; + +typedef struct SERDESCAM_SETTINGS_t +{ + /* bit0: enable + * bit1: RTSP stream enable + * bit2: auto detect resolution + */ + uint32_t flags; + uint8_t mode;// passthrough, tap, etc + uint8_t rsvd1; + uint8_t bitPos; + uint8_t videoFormat;// bytes per pixel + uint16_t resWidth; + uint16_t resHeight; + uint8_t frameSkip;// skip every nth frame + uint8_t rsvd2[19]; +} SERDESCAM_SETTINGS; +#define SERDESCAM_SETTINGS_SIZE 32 + +#define SERDESPOC_SETTINGS_MODE_DISABLED 0x00 +#define SERDESPOC_SETTINGS_MODE_SUPPLY 0x01 +#define SERDESPOC_SETTINGS_MODE_SERIALIZER 0x02 + +typedef struct SERDESPOC_SETTINGS_t +{ + uint8_t mode;// no poc, generated supply, serializer passthrough + uint8_t rsvd[6]; + uint8_t voltage;// generated voltage + uint16_t chksum;// checksum to protect settings structure (don't want corrupt voltage settings) +} SERDESPOC_SETTINGS; +#define SERDESPOC_SETTINGS_SIZE 10 + #define ETHERNET_SETTINGS2_FLAG_FULL_DUPLEX 0x01 #define ETHERNET_SETTINGS2_FLAG_AUTO_NEG 0x02 #define ETHERNET_SETTINGS2_FLAG_TCPIP_ENABLE 0x04 diff --git a/include/icsneo/device/tree/radgigalog/radgigalogsettings.h b/include/icsneo/device/tree/radgigalog/radgigalogsettings.h index d2f6590..030e9ec 100644 --- a/include/icsneo/device/tree/radgigalog/radgigalogsettings.h +++ b/include/icsneo/device/tree/radgigalog/radgigalogsettings.h @@ -11,143 +11,6 @@ namespace icsneo { #endif #pragma pack(push, 2) -#define SERDESCAM_SETTINGS_FLAG_ENABLE 0x01 -#define SERDESCAM_SETTINGS_RTSP_ENABLE 0x02 -#define SERDESCAM_SETTINGS_AUTO_DETECT_ENABLE 0x04 -#define SERDESCAM_SETTINGS_CONFIG_ENABLE 0x08 - -/* mode in SERDESCAM_SETTINGS */ -enum -{ - SERDESCAM_MODE_PASSTHROUGH = 0, - SERDESCAM_MODE_TAP, - SERDESCAM_MODE_PLAYBACK, -}; - -/* ucCamConfigMode in SERDESCAM_SETTINGS */ -enum -{ - SERDESCAM_CONFIG_MODE_EXTERNAL_OVER_TAP = 0, - SERDESCAM_CONFIG_MODE_LOCAL_SCRIPT, -}; - -/* bitPos in SERDESCAM_SETTINGS */ -enum -{ - SERDESCAM_PIXEL_BIT_POS_0 = 0, - SERDESCAM_PIXEL_BIT_POS_1, - SERDESCAM_PIXEL_BIT_POS_2, - SERDESCAM_PIXEL_BIT_POS_3, -}; - -/* videoFormat in SERDESCAM_SETTINGS */ -enum -{ - SERDESCAM_VIDEO_FORMAT_NONE = -1, - SERDESCAM_VIDEO_FORMAT_UYVY_422_8 = 0, // packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 - SERDESCAM_VIDEO_FORMAT_YUYV_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr - SERDESCAM_VIDEO_FORMAT_YVYU_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb - SERDESCAM_VIDEO_FORMAT_VYUY_422_8, // packed YUV 4:2:2, 16bpp, Cr Y0 Cb Y1 - SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_8, - SERDESCAM_VIDEO_FORMAT_RAW_8, // e.g. bayer 8 bit, gray 8 bit - SERDESCAM_VIDEO_FORMAT_RAW_10, // e.g. bayer 10 bit, gray 10 bit - SERDESCAM_VIDEO_FORMAT_RAW_12, - SERDESCAM_VIDEO_FORMAT_RAW_16, // e.g. planar YUV 4:2:2, 16bpp, 8 bit samples - SERDESCAM_VIDEO_FORMAT_RAW_20, // e.g. planar YUV 4:2:2, 20bpp, 10 bit samples - SERDESCAM_VIDEO_FORMAT_RAW_24, // e.g. packed RGB 8:8:8 24bpp, 8 bit samples - SERDESCAM_VIDEO_FORMAT_RAW_30, // e.g. planar YUV 4:4:4, 30bpp, 10 bit samples - SERDESCAM_VIDEO_FORMAT_RAW_32, // e.g. packed ARGB 8:8:8:8, 32bpp, 8 bit samples - SERDESCAM_VIDEO_FORMAT_RAW_36, - SERDESCAM_VIDEO_FORMAT_RGB888, // packed RGB 8:8:8, 24bpp, RGBRGB... - SERDESCAM_VIDEO_FORMAT_UYVY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cb Y0 Cr Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_YUYV_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cb Y1 Cr, FOURCC Y210 bitpacked - SERDESCAM_VIDEO_FORMAT_YVYU_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cr Y1 Cb, bitpacked - SERDESCAM_VIDEO_FORMAT_VYUY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cr Y0 Cb Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_10LE_PACKED,// 10-bit samples bitpacked into 40-bits little endian - SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_12LE_PACKED,// 12-bit samples bitpacked into 40-bits little endian - SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_16LE,// 16-bit samples little endian - SERDESCAM_VIDEO_FORMAT_BAYER_BGGR_16BE,// 16-bit samples big endian - SERDESCAM_VIDEO_FORMAT_JPEG, - SERDESCAM_VIDEO_FORMAT_UYVY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cb Y0 Cr Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_YUYV_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cb Y1 Cr, bitpacked - SERDESCAM_VIDEO_FORMAT_YVYU_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cr Y1 Cb, bitpacked - SERDESCAM_VIDEO_FORMAT_VYUY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cr Y0 Cb Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_YUV422_10LE_PLANAR,// planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - SERDESCAM_VIDEO_FORMAT_YUV422_16LE_PLANAR,// planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian - SERDESCAM_VIDEO_FORMAT_RGB565, // packed RGB 5:6:5, 16bpp, RGBRGB... - SERDESCAM_VIDEO_FORMAT_RGB666, // packed RGB 6:6:6, 18bpp, RGBRGB... - SERDESCAM_VIDEO_FORMAT_RAW_11x2, - SERDESCAM_VIDEO_FORMAT_RAW_12x2, - SERDESCAM_VIDEO_FORMAT_RAW_14, - // NOTE: CSI2 formats are only used internal to VSPY - // Firmware should flag video as CSI2 source types - // Vspy will then convert formats into the proper CSI2 version - SERDESCAM_VIDEO_FORMAT_CSI2_UYVY_422_8, // packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1 - SERDESCAM_VIDEO_FORMAT_CSI2_YUYV_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr - SERDESCAM_VIDEO_FORMAT_CSI2_YVYU_422_8, // packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb - SERDESCAM_VIDEO_FORMAT_CSI2_VYUY_422_8, // packed YUV 4:2:2, 16bpp, Cr Y0 Cb Y1 - SERDESCAM_VIDEO_FORMAT_CSI2_UYVY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cb Y0 Cr Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_YUYV_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cb Y1 Cr, FOURCC Y210 bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_YVYU_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Y0 Cr Y1 Cb, bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_VYUY_422_10LE_PACKED,// packed YUV 4:2:2, 20bpp, Cr Y0 Cb Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_UYVY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cb Y0 Cr Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_YUYV_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cb Y1 Cr, bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_YVYU_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Y0 Cr Y1 Cb, bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_VYUY_422_12LE_PACKED,// packed YUV 4:2:2, 24bpp, Cr Y0 Cb Y1, bitpacked - SERDESCAM_VIDEO_FORMAT_CSI2_RGB565, // packed RGB 5:6:5, 16bpp, BGRBGR... - SERDESCAM_VIDEO_FORMAT_CSI2_RGB666, // packed RGB 6:6:6, 18bpp, BGRBGR... - SERDESCAM_VIDEO_FORMAT_CSI2_RGB888, // packed RGB 8:8:8, 24bpp, BGRBGR... - SERDESCAM_VIDEO_FORMAT_CSI2_BAYER_BGGR_8, - SERDESCAM_VIDEO_FORMAT_CSI2_BAYER_BGGR_10LE_PACKED,// 10-bit samples bitpacked into 40-bits little endian - SERDESCAM_VIDEO_FORMAT_CSI2_BAYER_BGGR_12LE_PACKED,// 12-bit samples bitpacked into 40-bits little endian - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_8, // e.g. bayer 8 bit, gray 8 bit - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_10, // e.g. bayer 10 bit, gray 10 bit - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_11x2, - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_12, - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_12x2, - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_14, - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_16, // e.g. planar YUV 4:2:2, 16bpp, 8 bit samples - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_20, // e.g. planar YUV 4:2:2, 20bpp, 10 bit samples - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_24, // e.g. packed RGB 8:8:8 24bpp, 8 bit samples - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_30, // e.g. planar YUV 4:4:4, 30bpp, 10 bit samples - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_32, // e.g. packed ARGB 8:8:8:8, 32bpp, 8 bit samples - SERDESCAM_VIDEO_FORMAT_CSI2_RAW_36, - // NOTE: new entries must be appended to maintain backwards compatibility - // insert new entries before this - SERDESCAM_VIDEO_FORMAT_COUNT, -}; - -typedef struct SERDESCAM_SETTINGS_t -{ - /* bit0: enable - * bit1: RTSP stream enable - * bit2: auto detect resolution - */ - uint32_t flags; - uint8_t mode;// passthrough, tap, etc - uint8_t rsvd1; - uint8_t bitPos; - uint8_t videoFormat;// bytes per pixel - uint16_t resWidth; - uint16_t resHeight; - uint8_t frameSkip;// skip every nth frame - uint8_t rsvd2[19]; -} SERDESCAM_SETTINGS; -#define SERDESCAM_SETTINGS_SIZE 32 - -#define SERDESPOC_SETTINGS_MODE_DISABLED 0x00 -#define SERDESPOC_SETTINGS_MODE_SUPPLY 0x01 -#define SERDESPOC_SETTINGS_MODE_SERIALIZER 0x02 - -typedef struct SERDESPOC_SETTINGS_t -{ - uint8_t mode;// no poc, generated supply, serializer passthrough - uint8_t rsvd[6]; - uint8_t voltage;// generated voltage - uint16_t chksum;// checksum to protect settings structure (don't want corrupt voltage settings) -} SERDESPOC_SETTINGS; -#define SERDESPOC_SETTINGS_SIZE 10 - typedef struct { uint32_t ecu_id; diff --git a/include/icsneo/device/tree/radgigalog/radgigalogusb.h b/include/icsneo/device/tree/radgigalog/radgigalogusb.h new file mode 100644 index 0000000..3f492dd --- /dev/null +++ b/include/icsneo/device/tree/radgigalog/radgigalogusb.h @@ -0,0 +1,34 @@ +#ifndef __RADGIGALOG_USB_H_ +#define __RADGIGALOG_USB_H_ + +#ifdef __cplusplus + +#include "icsneo/device/tree/radgigalog/radgigalog.h" +#include "icsneo/platform/ftdi3.h" + +namespace icsneo { + +class RADGigalogUSB : public RADGigalog { +public: + static constexpr const uint16_t PRODUCT_ID = 0x1203; + static std::vector> Find() { + std::vector> found; + + for(auto neodevice : FTDI3::FindByProduct(PRODUCT_ID)) + found.emplace_back(new RADGigalogUSB(neodevice)); // Creation of the shared_ptr + + return found; + } + +private: + RADGigalogUSB(neodevice_t neodevice) : RADGigalog(neodevice) { + initialize(); + productId = PRODUCT_ID; + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radgigastar/radgigastar.h b/include/icsneo/device/tree/radgigastar/radgigastar.h new file mode 100644 index 0000000..c0aa250 --- /dev/null +++ b/include/icsneo/device/tree/radgigastar/radgigastar.h @@ -0,0 +1,87 @@ +#ifndef __RADGIGASTAR_H_ +#define __RADGIGASTAR_H_ + +#ifdef __cplusplus + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" +#include "icsneo/device/tree/radgigastar/radgigastarsettings.h" + +namespace icsneo { + +class RADGigastar : public Device { +public: + static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADGigastar; + static constexpr const char* SERIAL_START = "GS"; + +protected: + RADGigastar(neodevice_t neodevice) : Device(neodevice) { + getWritableNeoDevice().type = DEVICE_TYPE; + } + + void setupPacketizer(Packetizer& packetizer) override { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; + } + + void setupDecoder(Decoder& decoder) override { + Device::setupDecoder(decoder); + decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns + } + + void setupEncoder(Encoder& encoder) override { + Device::setupEncoder(encoder); + encoder.supportCANFD = true; + } + + void setupSupportedRXNetworks(std::vector& rxNetworks) override { + static std::vector supportedRxNetworks = { + Network::NetID::HSCAN, + Network::NetID::MSCAN, + Network::NetID::HSCAN2, + Network::NetID::HSCAN3, + Network::NetID::HSCAN4, + Network::NetID::HSCAN5, + + Network::NetID::Ethernet, + Network::NetID::Ethernet2, + + Network::NetID::OP_Ethernet1, + Network::NetID::OP_Ethernet2, + + Network::NetID::LIN, + + Network::NetID::FlexRay + }; + rxNetworks.insert(rxNetworks.end(), supportedRxNetworks.begin(), supportedRxNetworks.end()); + } + + void setupSupportedTXNetworks(std::vector& txNetworks) override { + static std::vector supportedTxNetworks = { + Network::NetID::HSCAN, + Network::NetID::MSCAN, + Network::NetID::HSCAN2, + Network::NetID::HSCAN3, + Network::NetID::HSCAN4, + Network::NetID::HSCAN5, + + Network::NetID::Ethernet, + Network::NetID::Ethernet2, + + Network::NetID::OP_Ethernet1, + Network::NetID::OP_Ethernet2, + + Network::NetID::LIN + + // FlexRay is Receive Only + }; + txNetworks.insert(txNetworks.end(), supportedTxNetworks.begin(), supportedTxNetworks.end()); + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radgigastar/radgigastareth.h b/include/icsneo/device/tree/radgigastar/radgigastareth.h new file mode 100644 index 0000000..1a4a57e --- /dev/null +++ b/include/icsneo/device/tree/radgigastar/radgigastareth.h @@ -0,0 +1,58 @@ +#ifndef __RADGIGASTAR_ETH_H_ +#define __RADGIGASTAR_ETH_H_ + +#ifdef __cplusplus + +#include "icsneo/device/tree/radgigastar/radgigastar.h" +#include "icsneo/platform/pcap.h" + +namespace icsneo { + +class RADGigastarETH : public RADGigastar { +public: + static constexpr const uint16_t PRODUCT_ID = 0x000F; + static std::vector> Find(const std::vector& pcapDevices) { + std::vector> found; + + for(auto& foundDev : pcapDevices) { + auto fakedev = std::shared_ptr(new RADGigastarETH({})); + for (auto& payload : foundDev.discoveryPackets) + fakedev->com->packetizer->input(payload); + for (auto& packet : fakedev->com->packetizer->output()) { + std::shared_ptr msg; + if (!fakedev->com->decoder->decode(msg, packet)) + continue; // We failed to decode this packet + + if(!msg || msg->network.getNetID() != Network::NetID::Main51) + continue; // Not a message we care about + auto sn = std::dynamic_pointer_cast(msg); + if(!sn) + continue; // Not a serial number message + + if(sn->deviceSerial.length() < 2) + continue; + if(sn->deviceSerial.substr(0, 2) != SERIAL_START) + continue; // Not a RADGigastar + + auto device = foundDev.device; + device.serial[sn->deviceSerial.copy(device.serial, sizeof(device.serial))] = '\0'; + found.push_back(std::shared_ptr(new RADGigastarETH(std::move(device)))); + break; + } + } + + return found; + } + +private: + RADGigastarETH(neodevice_t neodevice) : RADGigastar(neodevice) { + initialize(); + productId = PRODUCT_ID; + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radgigastar/radgigastarsettings.h b/include/icsneo/device/tree/radgigastar/radgigastarsettings.h new file mode 100644 index 0000000..c1aed9d --- /dev/null +++ b/include/icsneo/device/tree/radgigastar/radgigastarsettings.h @@ -0,0 +1,142 @@ +#ifndef __RADGIGASTARSETTINGS_H_ +#define __RADGIGASTARSETTINGS_H_ + +#include +#include "icsneo/device/idevicesettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +#endif + +#pragma pack(push, 2) +typedef struct { + uint32_t ecu_id; + + uint16_t perf_en; + + CAN_SETTINGS can1; + CANFD_SETTINGS canfd1; + CAN_SETTINGS can2; + CANFD_SETTINGS canfd2; + CAN_SETTINGS can3; + CANFD_SETTINGS canfd3; + CAN_SETTINGS can4; + CANFD_SETTINGS canfd4; + CAN_SETTINGS can5; + CANFD_SETTINGS canfd5; + CAN_SETTINGS can6; + CANFD_SETTINGS canfd6; + + uint16_t network_enables; + uint16_t network_enables_2; + + uint32_t pwr_man_timeout; + uint16_t pwr_man_enable; + + uint16_t network_enabled_on_boot; + + uint16_t iso15765_separation_time_offset; + + uint16_t iso_9141_kwp_enable_reserved; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_1; + uint16_t iso_parity_1; + + uint16_t iso_msg_termination_1; + + uint16_t idle_wakeup_network_enables_1; + uint16_t idle_wakeup_network_enables_2; + + uint16_t network_enables_3; + uint16_t idle_wakeup_network_enables_3; + + STextAPISettings text_api; + uint64_t termination_enables; + + DISK_SETTINGS disk; + + TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings; + struct + { + uint16_t hwComLatencyTestEn : 1; + uint16_t reserved : 15; + } flags; + ETHERNET_SETTINGS2 ethernet1; + ETHERNET_SETTINGS2 ethernet2; + + LIN_SETTINGS lin1; + + OP_ETH_GENERAL_SETTINGS opEthGen; + OP_ETH_SETTINGS opEth1; + OP_ETH_SETTINGS opEth2; + + SERDESCAM_SETTINGS serdescam1; + SERDESPOC_SETTINGS serdespoc; + LOGGER_SETTINGS logger; + SERDESCAM_SETTINGS serdescam2; + SERDESCAM_SETTINGS serdescam3; + SERDESCAM_SETTINGS serdescam4; + RAD_REPORTING_SETTINGS reporting; + uint16_t network_enables_4; +} radgigastar_settings_t; +#pragma pack(pop) + +#ifdef __cplusplus + +static_assert(sizeof(radgigastar_settings_t) == 634, "RADGigastar settings size mismatch"); + +#include + +class RADGigastarSettings : public IDeviceSettings { +public: + RADGigastarSettings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radgigastar_settings_t)) {} + const CAN_SETTINGS* getCANSettingsFor(Network net) const override { + auto cfg = getStructurePointer(); + if(cfg == nullptr) + return nullptr; + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->can1); + case Network::NetID::MSCAN: + return &(cfg->can2); + case Network::NetID::HSCAN2: + return &(cfg->can3); + case Network::NetID::HSCAN3: + return &(cfg->can4); + case Network::NetID::HSCAN4: + return &(cfg->can5); + case Network::NetID::HSCAN5: + return &(cfg->can6); + default: + return nullptr; + } + } + const CANFD_SETTINGS* getCANFDSettingsFor(Network net) const override { + auto cfg = getStructurePointer(); + if(cfg == nullptr) + return nullptr; + switch(net.getNetID()) { + case Network::NetID::HSCAN: + return &(cfg->canfd1); + case Network::NetID::MSCAN: + return &(cfg->canfd2); + case Network::NetID::HSCAN2: + return &(cfg->canfd3); + case Network::NetID::HSCAN3: + return &(cfg->canfd4); + case Network::NetID::HSCAN4: + return &(cfg->canfd5); + case Network::NetID::HSCAN5: + return &(cfg->canfd6); + default: + return nullptr; + } + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radgigastar/radgigastarusb.h b/include/icsneo/device/tree/radgigastar/radgigastarusb.h new file mode 100644 index 0000000..f4b10bb --- /dev/null +++ b/include/icsneo/device/tree/radgigastar/radgigastarusb.h @@ -0,0 +1,34 @@ +#ifndef __RADGIGASTAR_USB_H_ +#define __RADGIGASTAR_USB_H_ + +#ifdef __cplusplus + +#include "icsneo/device/tree/radgigastar/radgigastar.h" +#include "icsneo/platform/ftdi3.h" + +namespace icsneo { + +class RADGigastarUSB : public RADGigastar { +public: + static constexpr const uint16_t PRODUCT_ID = 0x1204; + static std::vector> Find() { + std::vector> found; + + for(auto neodevice : FTDI3::FindByProduct(PRODUCT_ID)) + found.emplace_back(new RADGigastarUSB(neodevice)); // Creation of the shared_ptr + + return found; + } + +private: + RADGigastarUSB(neodevice_t neodevice) : RADGigastar(neodevice) { + initialize(); + productId = PRODUCT_ID; + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radmoon2/radmoon2.h b/include/icsneo/device/tree/radmoon2/radmoon2.h new file mode 100644 index 0000000..7b7c38c --- /dev/null +++ b/include/icsneo/device/tree/radmoon2/radmoon2.h @@ -0,0 +1,63 @@ +#ifndef __RADMOON2_H_ +#define __RADMOON2_H_ + +#ifdef __cplusplus + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" +#include "icsneo/device/tree/radmoon2/radmoon2settings.h" +#include "icsneo/platform/ftdi3.h" + +namespace icsneo { + +class RADMoon2 : public Device { +public: + static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADMoon2; + static constexpr const uint16_t PRODUCT_ID = 0x1202; + static constexpr const char* SERIAL_START = "RM"; + + static std::vector> Find() { + std::vector> found; + + for(auto neodevice : FTDI3::FindByProduct(PRODUCT_ID)) + found.emplace_back(new RADMoon2(neodevice)); + + return found; + } + + // RADMoon 2 does not go online, you can only set settings and + // view PHY information (when supported) + bool goOnline() override { + report(APIEvent::Type::OnlineNotSupported, APIEvent::Severity::Error); + return false; + } + + bool goOffline() override { + report(APIEvent::Type::OnlineNotSupported, APIEvent::Severity::Error); + return false; + } + +protected: + RADMoon2(neodevice_t neodevice) : Device(neodevice) { + initialize(); + productId = PRODUCT_ID; + getWritableNeoDevice().type = DEVICE_TYPE; + } + + void setupPacketizer(Packetizer& packetizer) override { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; + } + + void setupDecoder(Decoder& decoder) override { + Device::setupDecoder(decoder); + decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radmoon2/radmoon2settings.h b/include/icsneo/device/tree/radmoon2/radmoon2settings.h new file mode 100644 index 0000000..d5814d7 --- /dev/null +++ b/include/icsneo/device/tree/radmoon2/radmoon2settings.h @@ -0,0 +1,46 @@ +#ifndef __RADMOON2SETTINGS_H_ +#define __RADMOON2SETTINGS_H_ + +#include +#include "icsneo/device/idevicesettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +#endif // __cplusplus + +#pragma pack(push, 2) +typedef struct { + uint16_t perf_en; + + OP_ETH_GENERAL_SETTINGS opEthGen; + OP_ETH_SETTINGS opEth1; + + uint16_t network_enables; + uint16_t network_enables_2; + uint16_t network_enabled_on_boot; + uint16_t network_enables_3; + + STextAPISettings text_api; + + uint16_t pc_com_mode; + TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings; + uint16_t hwComLatencyTestEn; +} radmoon2_settings_t; +#pragma pack(pop) + +#ifdef __cplusplus + +#include + +class RADMoon2Settings : public IDeviceSettings { +public: + RADMoon2Settings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radmoon2_settings_t)) {} +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radmoonduo/radmoonduo.h b/include/icsneo/device/tree/radmoonduo/radmoonduo.h new file mode 100644 index 0000000..75c2d05 --- /dev/null +++ b/include/icsneo/device/tree/radmoonduo/radmoonduo.h @@ -0,0 +1,56 @@ +#ifndef __RADMOONDUO_H_ +#define __RADMOONDUO_H_ + +#ifdef __cplusplus + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" +#include "icsneo/device/tree/radmoonduo/radmoonduosettings.h" +#include "icsneo/platform/stm32.h" + +namespace icsneo { + +class RADMoonDuo : public Device { +public: + static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADMoonDuo; + static constexpr const uint16_t PRODUCT_ID = 0x1106; + static constexpr const char* SERIAL_START = "MD"; + + static std::vector> Find() { + std::vector> found; + + for(auto neodevice : STM32::FindByProduct(PRODUCT_ID)) + found.emplace_back(new RADMoonDuo(neodevice)); + + return found; + } + + static const std::vector& GetSupportedNetworks() { + // If Converter1 Target is set to USB/CM, OP_Ethernet2 will be exposed to the PC + static std::vector supportedNetworks = { + Network::NetID::OP_Ethernet2 + }; + return supportedNetworks; + } + +protected: + RADMoonDuo(neodevice_t neodevice) : Device(neodevice) { + initialize(); + productId = PRODUCT_ID; + getWritableNeoDevice().type = DEVICE_TYPE; + } + + void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : GetSupportedNetworks()) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radmoonduo/radmoonduosettings.h b/include/icsneo/device/tree/radmoonduo/radmoonduosettings.h new file mode 100644 index 0000000..f33d0f0 --- /dev/null +++ b/include/icsneo/device/tree/radmoonduo/radmoonduosettings.h @@ -0,0 +1,64 @@ +#ifndef __RADMOONDUOSETTINGS_H_ +#define __RADMOONDUOSETTINGS_H_ + +#include +#include "icsneo/device/idevicesettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +#endif // __cplusplus + +#pragma pack(push, 2) +enum RadMoonDuoConverterMode { + CONVERTER_TARGET_RJ45 = 0, + CONVERTER_TARGET_USB_CM +}; + +typedef struct { + // OPETH_LINK_AUTO/MASTER/SLAVE + uint8_t linkMode0; + uint8_t linkMode1; + // USB/CM or RJ45 selection (RadMoonDuoConverterMode) + uint8_t converter1Mode; + // IP Settings if converter is hooked up to Coremini + // Currently unused + uint32_t ipAddress; + uint32_t ipMask; + uint32_t ipGateway; +} RadMoonDuoConverterSettings; + +typedef struct { + uint16_t perf_en; + uint16_t network_enabled_on_boot; + uint32_t pwr_man_timeout; + uint16_t pwr_man_enable; + RadMoonDuoConverterSettings converter; + uint64_t network_enables; + struct + { + uint32_t disableUsbCheckOnBoot : 1; + uint32_t enableLatencyTest : 1; + uint32_t reserved : 30; + } flags; +} radmoonduo_settings_t; +#pragma pack(pop) + +#ifdef __cplusplus + +static_assert(sizeof(RadMoonDuoConverterSettings) == 16, "RAD-Moon Duo converter settings size error"); +static_assert(sizeof(radmoonduo_settings_t) == 38, "RAD-Moon Duo settings size error"); + +#include + +class RADMoonDuoSettings : public IDeviceSettings { +public: + RADMoonDuoSettings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radmoonduo_settings_t)) {} +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radsupermoon/radsupermoon.h b/include/icsneo/device/tree/radsupermoon/radsupermoon.h index 5dc3713..c92dad6 100644 --- a/include/icsneo/device/tree/radsupermoon/radsupermoon.h +++ b/include/icsneo/device/tree/radsupermoon/radsupermoon.h @@ -5,35 +5,60 @@ #include "icsneo/device/device.h" #include "icsneo/device/devicetype.h" -#include "icsneo/platform/ftdi.h" +#include "icsneo/device/tree/radsupermoon/radsupermoonsettings.h" +#include "icsneo/platform/ftdi3.h" namespace icsneo { class RADSupermoon : public Device { public: - // RSM does not connect at all yet (needs FTDI D3xx driver, not the 2xx compatible one) static constexpr DeviceType::Enum DEVICE_TYPE = DeviceType::RADSupermoon; static constexpr const uint16_t PRODUCT_ID = 0x1201; + static constexpr const char* SERIAL_START = "SM"; + static std::vector> Find() { std::vector> found; - for(auto neodevice : FTDI::FindByProduct(PRODUCT_ID)) + for(auto neodevice : FTDI3::FindByProduct(PRODUCT_ID)) found.emplace_back(new RADSupermoon(neodevice)); return found; } + static const std::vector& GetSupportedNetworks() { + static std::vector supportedNetworks = { + Network::NetID::Ethernet, + Network::NetID::OP_Ethernet1, + Network::NetID::OP_Ethernet2 + }; + return supportedNetworks; + } + protected: - virtual void setupDecoder(Decoder& decoder) override { + RADSupermoon(neodevice_t neodevice) : Device(neodevice) { + initialize(); + productId = PRODUCT_ID; + getWritableNeoDevice().type = DEVICE_TYPE; + } + + void setupPacketizer(Packetizer& packetizer) override { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; + } + + void setupDecoder(Decoder& decoder) override { + Device::setupDecoder(decoder); decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns } -private: - RADSupermoon(neodevice_t neodevice) : Device(neodevice) { - initialize(); - getWritableNeoDevice().type = DEVICE_TYPE; - productId = PRODUCT_ID; + void setupSupportedRXNetworks(std::vector& rxNetworks) override { + for(auto& netid : GetSupportedNetworks()) + rxNetworks.emplace_back(netid); } + + // The supported TX networks are the same as the supported RX networks for this device + void setupSupportedTXNetworks(std::vector& txNetworks) override { setupSupportedRXNetworks(txNetworks); } }; } diff --git a/include/icsneo/device/tree/radsupermoon/radsupermoonsettings.h b/include/icsneo/device/tree/radsupermoon/radsupermoonsettings.h new file mode 100644 index 0000000..51691c1 --- /dev/null +++ b/include/icsneo/device/tree/radsupermoon/radsupermoonsettings.h @@ -0,0 +1,48 @@ +#ifndef __RADSUPERMOONSETTINGS_H_ +#define __RADSUPERMOONSETTINGS_H_ + +#include +#include "icsneo/device/idevicesettings.h" + +#ifdef __cplusplus + +namespace icsneo { + +#endif // __cplusplus + +#pragma pack(push, 2) +typedef struct { + uint16_t perf_en; + + OP_ETH_GENERAL_SETTINGS opEthGen; + OP_ETH_SETTINGS opEth1; + + uint16_t network_enables; + uint16_t network_enables_2; + uint16_t network_enabled_on_boot; + uint16_t network_enables_3; + + STextAPISettings text_api; + + uint16_t pc_com_mode; + TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings; + uint16_t hwComLatencyTestEn; + + ETHERNET_SETTINGS2 eth2; +} radsupermoon_settings_t; +#pragma pack(pop) + +#ifdef __cplusplus + +#include + +class RADSupermoonSettings : public IDeviceSettings { +public: + RADSupermoonSettings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radsupermoon_settings_t)) {} +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/platform/ftdi3.h b/include/icsneo/platform/ftdi3.h new file mode 100644 index 0000000..0e87c24 --- /dev/null +++ b/include/icsneo/platform/ftdi3.h @@ -0,0 +1,19 @@ +#ifndef __FTDI3_H_ +#define __FTDI3_H_ + +#define INTREPID_USB_VENDOR_ID (0x093c) + +// This is currently a stub for the FTDI3 driver, +// it uses the FTDI driver to find devices but will +// not allow them to connect! +#define FTDI3 FTDI + +#if defined _WIN32 +#include "icsneo/platform/windows/ftdi.h" +#elif defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) +#include "icsneo/platform/posix/ftdi.h" +#else +#warning "This platform is not supported by the FTDI driver" +#endif + +#endif \ No newline at end of file diff --git a/include/icsneo/platform/posix/devices.h b/include/icsneo/platform/posix/devices.h index f9b9d65..9891414 100644 --- a/include/icsneo/platform/posix/devices.h +++ b/include/icsneo/platform/posix/devices.h @@ -10,6 +10,12 @@ #include "icsneo/device/tree/plasion/neoviion.h" #include "icsneo/device/tree/plasion/neoviplasma.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" +#include "icsneo/device/tree/radgigalog/radgigalogeth.h" +#include "icsneo/device/tree/radgigalog/radgigalogusb.h" +#include "icsneo/device/tree/radgigastar/radgigastareth.h" +#include "icsneo/device/tree/radgigastar/radgigastarusb.h" +#include "icsneo/device/tree/radmoon2/radmoon2.h" +#include "icsneo/device/tree/radmoonduo/radmoonduo.h" #include "icsneo/device/tree/radpluto/radplutousb.h" #include "icsneo/device/tree/radstar2/radstar2eth.h" #include "icsneo/device/tree/radstar2/radstar2usb.h" diff --git a/include/icsneo/platform/windows/devices.h b/include/icsneo/platform/windows/devices.h index 1179f48..4a0bf2a 100644 --- a/include/icsneo/platform/windows/devices.h +++ b/include/icsneo/platform/windows/devices.h @@ -11,6 +11,11 @@ #include "icsneo/device/tree/plasion/neoviplasma.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" #include "icsneo/device/tree/radgigalog/radgigalogeth.h" +#include "icsneo/device/tree/radgigalog/radgigalogusb.h" +#include "icsneo/device/tree/radgigastar/radgigastareth.h" +#include "icsneo/device/tree/radgigastar/radgigastarusb.h" +#include "icsneo/device/tree/radmoon2/radmoon2.h" +#include "icsneo/device/tree/radmoonduo/radmoonduo.h" #include "icsneo/device/tree/radpluto/radplutousb.h" #include "icsneo/device/tree/radstar2/radstar2eth.h" #include "icsneo/device/tree/radstar2/radstar2usb.h"