SXXXXXXX_PyBusMonitor1553/cpp/GrifoScope/AvbDdcLegacy/avb_driver.h
2025-12-17 07:59:30 +01:00

297 lines
6.7 KiB
C++

#ifndef AVB_DRIVER_H_
#define AVB_DRIVER_H_
#include <stdint.h>
class QSettings;
typedef uint16_t avb_1553_word_t;
typedef int avb_microseconds_t;
typedef enum {
avb_bus_default=0,
avb_bus_A=1,
avb_bus_B=2
} avb_1553_bus_t;
typedef struct {
unsigned int wc: 5;
unsigned int sa: 5;
unsigned int tr: 1;
unsigned int rt: 5;
} avb_1553_cw_structure_t;
typedef union {
avb_1553_word_t raw;
avb_1553_cw_structure_t str;
} avb_1553_cmd_word_t;
typedef struct {
unsigned int tf: 1;
unsigned int bca: 1;
unsigned int sf: 1;
unsigned int busy: 1;
unsigned int brcs: 1;
unsigned int reserved: 3;
unsigned int sr: 1;
unsigned int instr: 1;
unsigned int me: 1;
unsigned int rt: 5;
} avb_1553_sw_structure_t;
typedef union {
avb_1553_word_t raw;
avb_1553_sw_structure_t str;
} avb_1553_sts_word_t;
typedef struct {
avb_1553_word_t data[32];
} avb_1553_data_buffer_t;
typedef enum {
avb_term_real=0,
avb_term_simulated,
avb_term_disabled
} avb_1553_terminal_mode_t;
typedef struct {
const char* nickName;
const char* longName;
unsigned int adr;
avb_1553_terminal_mode_t mode;
} avb_1553_terminal_t;
typedef enum {
avb_mc_synch_with_data_word=17
} avb_1553_rx_mode_codes_t;
typedef enum {
avb_mc_synch_without_data_word=1
} avb_1553_tx_mode_codes_t;
typedef enum {
avb_t_auto,
avb_t_nop,
avb_t_nop_skip_next,
avb_t_rt,
avb_t_rt_rt
} avb_msg_type_t;
typedef enum {
avb_rx=0,
avb_tx=1
} avb_rxtx_t;
//struct avb_reserved_msg_t;
typedef int avb_reserved_msg_t;
struct avb_1553_message_t;
class IAvbDriver;
typedef void (*avb_1553_major_frame_handler_t)(IAvbDriver* const drv, unsigned int frame_counter, avb_microseconds_t tt);
typedef avb_1553_major_frame_handler_t avb_1553_minor_frame_handler_t;
typedef avb_1553_major_frame_handler_t avb_1553_eof_of_frame_handler_t;
typedef void (*avb_1553_message_handler_t)(IAvbDriver* const drv, bool ok, avb_1553_message_t* const msg, avb_microseconds_t tt);
struct avb_1553_message_t {
const char* nickName;
const char* longName;
avb_msg_type_t type;
avb_1553_terminal_t* target; //src==0 -> from BC
avb_1553_terminal_t* target_rtrt_tx; //dst==0 -> to BC, if both src and dst == 0 -> broadcast
avb_rxtx_t tr;
unsigned int sa;
unsigned int wc;
unsigned int moninal_frequency; //-1: async
avb_1553_message_handler_t msgHandler;
avb_1553_data_buffer_t* buffer;
avb_reserved_msg_t avbReserved_;
avb_reserved_msg_t avbReserved_BcPos;
unsigned int avbReservedBc_;
};
//struct avb_reserved_frame_t;
typedef int avb_reserved_frame_t;
typedef enum {
avb_bc_no_interrupt=0,
avb_bc_interrupt=1
} avb_1553_bc_intr_t;
typedef struct avb_1553_bc_message_tag_t {
avb_1553_message_t* msg;
avb_1553_bc_intr_t interrupt;
bool conditional;
avb_microseconds_t time_to_next;
avb_1553_bus_t bus;
unsigned int retry;
avb_reserved_frame_t avbReserved_;
avb_reserved_frame_t avbReserved_BcPos;
} avb_1553_bc_message_t;
//extern const avb_1553_message_t avb_frame_end_of_minor__;
//extern const avb_1553_message_t avb_frame_end_of_major__;
//extern const avb_1553_message_t avb_frame_skip_next_message__;
#define avb_frame_end_of_minor reinterpret_cast<avb_1553_message_t*>(0)
#define avb_frame_end_of_major reinterpret_cast<avb_1553_message_t*>(1)
#define avb_frame_skip_next_message reinterpret_cast<avb_1553_message_t*>(2)
typedef struct {
int num_of_message;
avb_1553_bc_message_t** msg; //the message table
avb_1553_bc_message_t** oob_msg; //out-of-band messages
avb_microseconds_t minor_frame_time;
} avb_1553_bc_frame_t;
typedef struct {
unsigned int major_frames;
unsigned int major_frame_tt;
unsigned int raised;
unsigned int served;
} avb_1553_intr_status_t;
typedef struct {
int rt;
int sa;
int tr;
int error;
avb_1553_data_buffer_t data;
} avb_1553_message_info_t;
typedef void (*avb_1553_isr_t)(avb_1553_message_info_t*);
typedef struct {
unsigned int total_message;
unsigned int processed_message;
unsigned int size;
avb_1553_word_t* buffer;
} avb_1553_monitor_info_t;
typedef struct {
bool err;
bool invalid;
bool no_response;
bool bit_in_status_err;
bool broadcast;
bool modecode;
unsigned int internal_eror_code;
bool tx_sts_received;
bool rx_sts_received;
bool tr;
unsigned int bus;
unsigned int rt;
unsigned int sa;
avb_1553_cmd_word_t cmd;
avb_1553_sts_word_t sts;
avb_1553_cmd_word_t rtrt_tx_cmd;
avb_1553_sts_word_t rtrt_tx_sts;
unsigned long timetag;
unsigned int wc;
//avb_1553_word_t* data;
avb_1553_word_t data[32];
void* next;
} avb_1553_mon_decoded_t;
typedef void (*avb_1553_monitor_isr_t)(avb_1553_monitor_info_t*);
extern avb_1553_bc_message_t avb_1553_end_of_minor_frame;
extern avb_1553_bc_message_t avb_1553_nop_message;
class IAvbDriver
{
public:
virtual ~IAvbDriver() {}
virtual bool initialize()=0;
virtual bool shutdown()=0;
//virtual bool setUpMessages(unsigned int num_of_message, const avb_1553_message_t* const msg_table)=0;
virtual void set_begin_of_major_frame_handler(avb_1553_major_frame_handler_t handler)=0;
virtual void set_minor_frame_handler(avb_1553_major_frame_handler_t handler)=0;
virtual void set_end_of_frame_handler(avb_1553_major_frame_handler_t handler)=0;
virtual const char* getDeviceName()=0;
virtual bool setUpBcFrame(avb_1553_bc_frame_t& frame)=0;
virtual void set_isr(avb_1553_isr_t)=0;
enum { mode_mon=1, mode_bc=2, mode_rt=4};
virtual bool go(int times)=0;
virtual bool stop()=0;
virtual bool go_mon()=0;
virtual bool halt_mon()=0;
enum run_status_t { sts_halt=0, sts_bc_run=1, sts_mon_run=2, sts_bc_mon_run };
virtual run_status_t getRunState()=0;
virtual void niceInterrupt(bool enable)=0;
virtual void enableMonitorIsr(bool enable=true)=0;
virtual void set_mon_isr(avb_1553_monitor_isr_t)=0;
virtual bool getMonitorRawBuffer(avb_1553_monitor_info_t* const buffer)=0;
virtual int getLastDriverError()=0;
virtual const char* getDriverErrrorMessage(int error_code)=0;
virtual bool readDataBuffer(avb_1553_message_t* const, void* const dst, unsigned int wc=0)=0;
virtual bool writeDataBuffer(const avb_1553_message_t* const, void* const src, unsigned int wc=0)=0;
virtual void writeSyncWord(avb_1553_word_t)=0;
virtual bool enableSkipMessage(bool enable=true)=0;
//virtual bool adjustMinorFrameTimer();
virtual avb_1553_intr_status_t getIntrStatus()=0;
virtual bool mon_decode_msg(avb_1553_mon_decoded_t* const decoded, void* const buffer)=0;
virtual avb_microseconds_t getTimetag()=0;
virtual void simulateBcTick()=0;
virtual bool isSimulator(void) const =0;
virtual bool insertMessage(const avb_1553_bc_message_t* const)=0;
};
extern "C" {
extern IAvbDriver* Avb_DriverCreate(QSettings* settings=0);
}
#endif /*AVB_DRIVER_H_*/