#pragma once
#include <stdint.h>
#define RDXUSB_ARB_ID_FLAG_EXT 0x80000000
#define RDXUSB_ARB_ID_FLAG_RTR 0x40000000
#define RDXUSB_ARB_ID_FLAG_DEVICE 0x20000000
#define RDXUSB_ERR_EVENT_LOOP_CRASHED -100
#define RDXUSB_ERR_CANNOT_LIST_DEVICES -101
#define RDXUSB_ERR_DEVICE_ITER_INVALID -102
#define ERR_DEVICE_ITER_IDX_OUT_OF_RANGE -103
#define RDXUSB_ERR_NULL_PTR -104
#define RDXUSB_ERR_DEVICE_NOT_OPENED -200
#define RDXUSB_ERR_DEVICE_NOT_CONNECTED -201
#define RDXUSB_ERR_CHANNEL_OUT_OF_RANGE -202
#ifdef _MSC_VER
#pragma pack(push, 4)
struct rdxusb_packet {
#else
struct __attribute__((packed, aligned(4))) rdxusb_packet {
#endif
uint64_t timestamp_ns;
uint32_t arb_id;
uint8_t dlc;
uint8_t channel;
uint16_t flags;
uint8_t data[64];
};
#ifdef _MSC_VER
#pragma pack(pop)
#endif
struct rdxusb_device_entry {
char serial[256];
char manufacturer[256];
char product_string[256];
uint16_t vid;
uint16_t pid;
uint8_t bus_number;
uint8_t device_address;
};
typedef uint64_t rdxusb_iter_id;
#ifdef __cplusplus
extern "C" {
#endif
int32_t rdxusb_open_device(uint16_t vid, uint16_t pid, const char* serial_number, bool close_on_dc, uint64_t buf_size);
int32_t rdxusb_force_scan_devices(void);
int32_t rdxusb_read_packets(int32_t handle_id, uint8_t channel,
struct rdxusb_packet* packets,
uint64_t max_packets, uint64_t* packets_read);
int32_t rdxusb_write_packets(int32_t handle_id, struct rdxusb_packet* packets,
uint64_t packets_len, uint64_t* packets_written);
int32_t rdxusb_close_device(int32_t handle_id);
int32_t rdxusb_close_all_devices();
int32_t rdxusb_new_device_iterator(rdxusb_iter_id* iter_id, uint64_t* n_devices);
int32_t rdxusb_get_device_in_iterator(rdxusb_iter_id iter_id, uint64_t device_idx,
struct rdxusb_device_entry* device_entry);
int32_t rdxusb_free_device_iterator(rdxusb_iter_id iter_id);
#ifdef __cplusplus
}
#endif