// // Created by cfif on 16.03.2024. // #ifndef CAN_MODULE_CAN_FRAME_XCP_H #define CAN_MODULE_CAN_FRAME_XCP_H #include "SerialPortFrameIO.h" #include "CanSerialPortFrame.h" #include "LoggerToSerialPort.h" #include "CmsisRtosThreadUtils.h" #include "SystemMutexCmsis.h" #define MAX_CTO 8 #define MAX_DTO 8 typedef enum { XCP_ERR_CMD_SYNCH = 0x00, XCP_ERR_CMD_BUSY = 0x10, XCP_ERR_DAQ_ACTIVE = 0x11, XCP_ERR_PGM_ACTIVE = 0x12, XCP_ERR_CMD_UNKNOWN = 0x20, XCP_ERR_CMD_SYNTAX = 0x21, XCP_ERR_OUT_OF_RANGE = 0x22, XCP_ERR_WRITE_PROTECTED = 0x23, XCP_ERR_ACCESS_DENIED = 0x24, XCP_ERR_ACCESS_LOCKED = 0x25, XCP_ERR_PAGE_NOT_VALID = 0x26, XCP_ERR_MODE_NOT_VALID = 0x27, XCP_ERR_SEGMENT_NOT_VALID = 0x28, XCP_ERR_SEQUENCE = 0x29, XCP_ERR_DAQ_CONFIG = 0x2A, XCP_ERR_MEMORY_OVERFLOW = 0x30, XCP_ERR_GENERIC = 0x31, XCP_ERR_VERIFY = 0x32, XCP_ERR_RESOURCE_TEMPORARY_NOT_ACCESSIBLE = 0x33, XCP_ERR_SUBCMD_UNKNOWN = 0x34 } eXcpError; typedef enum { XCP_COMMAND_CONNECT = 0xFF, XCP_COMMAND_DISCONNECT = 0xFE, XCP_COMMAND_GET_STATUS = 0xFD, XCP_COMMAND_SYNCH = 0xFC, XCP_COMMAND_UPLOAD = 0xF5, XCP_COMMAND_SHORT_UPLOAD = 0xF4, XCP_COMMAND_SET_MTA = 0xF6, XCP_COMMAND_DOWNLOAD = 0xF0, XCP_COMMAND_DOWNLOAD_NEXT = 0xEF } eXcpTypeCommand; typedef enum { XCP_STANDBY = 0 } eXcpResult; typedef struct __attribute__ ((packed)) { eXcpTypeCommand COM; uint8_t CAL_PAG: 1; // CALibration and PAGing uint8_t reserve1: 1; uint8_t DAQ: 1; // DAQ lists supported uint8_t STIM: 1; // STIMulation uint8_t PGM: 1; // Flash programming uint8_t reserve2: 1; uint8_t reserve3: 1; uint8_t reserve4: 1; uint8_t BYTE__ORDER: 1; // 0 - Intel uint8_t ADDRESS_GRANULARITY_0: 1; uint8_t ADDRESS_GRANULARITY_1: 1; uint8_t reserve5: 1; uint8_t reserve6: 1; uint8_t reserve7: 1; uint8_t SLAVE_BLOCK_MODE: 1; uint8_t OPTIONAL: 1; uint8_t MAX_CTO_; uint16_t MAX_DTO_; uint8_t XCP_PROTOCOL_VER; uint8_t XCP_TRANSPORT_VER; } eXcpCommand_CONNECT; typedef struct __attribute__ ((packed)) { eXcpTypeCommand COM; uint8_t STORE_CAL_REQ: 1; uint8_t reserve1: 1; uint8_t STORE_DAQ_REQ: 1; uint8_t CLEAR_DAQ_REQ: 1; uint8_t reserve2: 1; uint8_t reserve3: 1; uint8_t DAQ_RUNNING: 1; uint8_t RESUME: 1; uint8_t CAL_PAG: 1; uint8_t reserve5: 1; uint8_t DAQ: 1; uint8_t STIM: 1; uint8_t PGM: 1; uint8_t reserve6: 1; uint8_t reserve7: 1; uint8_t reserve8: 1; uint8_t STATE_NUMBER; uint32_t SESSION_CONFIGURATION_ID; } eXcpCommand_GET_STATUS; typedef struct __attribute__ ((packed)) { eXcpTypeCommand COM; uint8_t COUNT; } eXcpCommand_Upload; typedef struct __attribute__ ((packed)) { eXcpTypeCommand COM; uint8_t COUNT; uint8_t RESERVED; uint8_t ADR_EX; uint32_t ADR; } eXcpCommand_SHORT_UPLOAD; typedef struct __attribute__ ((packed)) { eXcpTypeCommand COM; uint16_t RESERVED; uint8_t ADR_EX; uint32_t ADR; } eXcpCommand_SET_MTA; typedef struct __attribute__ ((packed)) { eXcpTypeCommand COM; uint8_t COUNT; } eXcpCommand_Download; typedef struct { tSerialPortFrameIO *ioCanFrame; tLoggerToSerialPort *slog; SystemMutexCmsis txAccessQueue; uint8_t ADR_EXT; uint32_t ADR_MTA; can_rx_message_type canFrame; bool isTransmitResponse; bool isTransmitResponseError; uint8_t downloadSize; uint8_t response[8]; uint8_t responseSize; tStaticThreadBlock(1024) T_can_Listener_XCP; } tCanSerialPortFrameXCP; void CanSerialPortFrameXcpInit( tCanSerialPortFrameXCP *env, SystemMutexCmsis txAccessQueue, tSerialPortFrameIO *ioCanFrame, tLoggerToSerialPort *slog ); #endif //CAN_MODULE_CAN_FRAME_XCP_H