#ifndef _UART_MONITOR_H_ #define _UART_MONITOR_H_ #ifdef _UART_MONITOR_C_ #define _UART_MONITOR_EXT #else #define _UART_MONITOR_EXT extern #endif #include "typedefine.h" typedef _Bool BOOL; #define CRC_CCITT /* ========================================================================== */ /* ========================== Definitions & Macros ========================== */ /* ========================================================================== */ #define UART_DEF_TIMEOUT_MS 1000 #define UART_DEF_CMD_LEN 0 #define INSERT_BUFFER_SIZE 16 #define INSERT_BUFFER_HEADER_LEN 7 #define UART_CMD_LENGTH 22 #define TX_BUFFER_SIZE 150 #define RX_BUFFER_SIZE 24 #define MSG_QUEUE_SIZE 10 #define PARA_TABLE_SIZE 22 #define PARA_BUFFER_SIZE 40 #define LOW_WORD(var) ((UWORD *)(&var)) /* little-endian on arm */ #define HIGH_WORD(var) ((UWORD *)(&var) + 1) /* ------------------------ data monitor application ------------------------ */ #define CHANNEL_NUM 6 /* 使用的通道数 */ #define CHANNEL_1 2 /* 每通道占2字节 */ #define CHANNEL_2 4 #define CHANNEL_3 6 #define CHANNEL_4 8 #define CHANNEL_5 10 #define CHANNEL_6 12 #define TEMP_BUFFER_LEN CHANNEL_6 #if TEMP_BUFFER_LEN == CHANNEL_6 #define S_FRAME_SIZE 124 #elif TEMP_BUFFER_LEN == CHANNEL_5 #define S_FRAME_SIZE 104 #elif TEMP_BUFFER_LEN == CHANNEL_4 #define S_FRAME_SIZE 84 #elif TEMP_BUFFER_LEN == CHANNEL_3 #define S_FRAME_SIZE 64 #else #error Must Specify Channel Num #endif /* ---------------- Define USART Driver configuration objects --------------- */ #define UART_APPL_CONFIG_DEFAULT \ { \ UART_MODE_LEN, 1000, UART_CMD_LENGTH, NULL \ } #define UART_MsgQ_CONFIG_DEFAULT \ { \ UART_stMsgQueue, UART_stMsgQueue, FALSE, FALSE \ } #define UART_DRIVER_CONFIG_DEFAULT \ { \ UART_MODE_LEN, UART_DEF_TIMEOUT_MS, UART_DEF_CMD_LEN, NULL \ } /* ========================================================================== */ /* ====================== TypeDefs & Structure Defines ====================== */ /* ========================================================================== */ /* ---------------------------- USART error type ---------------------------- */ typedef enum UART_ERR { UART_ERR_OK, /* No error */ // UART_ERR_BUSY, /* Read or Write process is in busy. */ UART_ERR_NO_BUFFER, /* No buffer room for data received */ UART_ERR_TIMEOUT, /* Timeout when read */ UART_ERR_UNKNOWN_CMD, /* Not in use */ // UART_ERR_INVALID_CMD, /* Not in use */ // UART_ERR_CANCEL, /* Not in use */ // UART_ERR_PARA /* Provide function with invalid argument */ } UART_ERR_Type; /* -------------------------- USART work mode type -------------------------- */ typedef enum UART_WorkMode { UART_MODE_TIME, /* Time interval framing mode */ UART_MODE_LEN, /* Fixed length framing mode */ UART_MODE_CHAR /* Fixed chars framing mode */ } UART_WorkMode_Type; /* ------------------- Callback function type definitions ------------------- */ typedef void (*CB_ERROR)(UART_ERR_Type); typedef void (*CB_DONE_READ)(UART_ERR_Type, ULONG); typedef void (*CB_DONE_WRITE)(UART_ERR_Type); /* ------------------------- HAL configuration type ------------------------- */ typedef struct UART_CONFIG { UART_WorkMode_Type enWorkMode; UWORD uwTimeout; // unit:count UBYTE ubLength; // unit:bytes UBYTE *pChar; } UART_CONFIG_Type; /*1. When enWorkMode=USART_MODE_TIME, uwTimeout indicates time-interval between frames. 2. When enWorkMode=USART_MODE_LEN, uwTimeout indicates timeout value, ubLength indicates command frame length, pChar is NULL. 3. When enWorkMode=USART_MODE_CHAR,uwTimeout indicates timeout value, ubLength indicates valid length in char-array pointed by pChar. */ typedef enum MsgType { UART_NULL = 0, // NULL message will not be processed UART_SEND_STATUS = 1, // send out Application status UART_SEND_PARA = 2 // send out Parameter value } UART_MsgType; typedef struct Msg { UART_MsgType enType; UBYTE *pBuf; UWORD uwNumBytes; } UART_MSG; typedef struct MsgQNode { UART_MSG stMsg; struct MsgQNode *pNext; } UART_MsgQNodeType; typedef struct MsgQType { UART_MsgQNodeType *pSave; UART_MsgQNodeType *pUse; BOOL bValid; BOOL bHandling; } UART_MsgQType; typedef struct ParaData { BOOL bParaStart; BOOL bWriteBusy; } UART_ParaData_Flag; typedef struct DataBuff { UBYTE *pBuf; ULONG NumBytes; } DataBuff_Type; /* data structure used for Read */ typedef struct READ { BOOL m_ReadBusy; ULONG m_BuffSize; DataBuff_Type m_DataBuff; CB_DONE_READ m_fpDone; } READ_Type; static READ_Type USART_Read = {FALSE, 0, {NULL, 0}, NULL}; typedef struct WRITE { BOOL m_WriteBusy; DataBuff_Type m_DataBuff; CB_DONE_WRITE m_fpDone; } WRITE_Type; static WRITE_Type USART_Write = {FALSE, {NULL, 0}, NULL}; /************************************************************************ Exported Variables: *************************************************************************/ #ifdef _UART_MONITOR_C_ _UART_MONITOR_EXT UWORD placeholder[4] = {0xFFFF}; _UART_MONITOR_EXT ULONG dummy32 = 0x00000000; _UART_MONITOR_EXT UBYTE UART_ubParaBuffer[PARA_BUFFER_SIZE] = {0}; _UART_MONITOR_EXT UBYTE UART_ubReadBuffer[RX_BUFFER_SIZE]; _UART_MONITOR_EXT UBYTE *uart_pReadBuffer = UART_ubReadBuffer; _UART_MONITOR_EXT UBYTE UART_ubWriteBuffer1[TX_BUFFER_SIZE] = {0x55, 0xAA, 0x55, 0xAA}; _UART_MONITOR_EXT UBYTE UART_ubWriteBuffer2[TX_BUFFER_SIZE] = {0x55, 0xAA, 0x55, 0xAA}; _UART_MONITOR_EXT UBYTE *UART_pWriteBuffer = UART_ubWriteBuffer1; _UART_MONITOR_EXT UWORD UART_uwWriteIndex = 4; _UART_MONITOR_EXT UWORD volatile UART_uwRxNum = 0; _UART_MONITOR_EXT UART_CONFIG_Type UART_stConfigLEN = UART_APPL_CONFIG_DEFAULT; _UART_MONITOR_EXT BOOL UART_bMonSwitch = FALSE; // control monitor function whether of not write data out. _UART_MONITOR_EXT UWORD *UART_pMonAddr[6]; // the address of the variable which user want to monitor. _UART_MONITOR_EXT UBYTE UART_ubInsertBuf[INSERT_BUFFER_SIZE] = {0x55, 0xAA, 0x55, 0xFF}; // the data in insertBuffer will be inserted into writeBuffer when enabled _UART_MONITOR_EXT volatile BOOL UART_bInsertPendTx = FALSE; // flag indicate whether insert buffer is pending to be transmitted. _UART_MONITOR_EXT UART_ParaData_Flag UART_stParaStatus = {FALSE}; _UART_MONITOR_EXT UART_MsgQNodeType UART_stMsgQueue[MSG_QUEUE_SIZE]; // message queue _UART_MONITOR_EXT UART_MsgQType UART_stMsgQ = UART_MsgQ_CONFIG_DEFAULT; _UART_MONITOR_EXT volatile UART_CONFIG_Type UART_Config = UART_DRIVER_CONFIG_DEFAULT; // define configure object and assign default value. _UART_MONITOR_EXT UWORD UART_uwTimeoutCtr = 0; _UART_MONITOR_EXT volatile CB_ERROR UART_fpError = NULL; UBYTE uart_ReadBuffer2[RX_BUFFER_SIZE]; // cancel static just for debug static UBYTE *uart_pReadBuffer2 = uart_ReadBuffer2; UWORD volatile uart_DataNum2 = 0; UWORD dummy = 0; BOOL uart_frameStartFlag = FALSE; BOOL UART_blCommErrFlag = FALSE; UBYTE uart_frameType = 0x00; UBYTE uart_frameLength = 0; UWORD uart_receivedNum = 0; _UART_MONITOR_EXT SWORD uart_slSpdRefRpm = 0; _UART_MONITOR_EXT SWORD uart_swTorqRefNm = 0; #else _UART_MONITOR_EXT UBYTE *UART_pWriteBuffer; _UART_MONITOR_EXT volatile BOOL UART_bInsertPendTx; _UART_MONITOR_EXT BOOL UART_bMonSwitch ; _UART_MONITOR_EXT UART_ParaData_Flag UART_stParaStatus; _UART_MONITOR_EXT SWORD uart_slSpdRefRpm; _UART_MONITOR_EXT SWORD uart_swTorqRefNm; #endif /************************************************************************ Local Variables: *************************************************************************/ /************************************************************************ Ram Allocation: *************************************************************************/ /************************************************************************ Exported Function Call Prototypes: *************************************************************************/ _UART_MONITOR_EXT void uart_voMonitorInit(void); _UART_MONITOR_EXT void uart_voMainDec(void); // used in main.c for checking RxData and insertQueue _UART_MONITOR_EXT void uart_voAppMonitor(void); // used to send monitor data out _UART_MONITOR_EXT void uart_voApplTimer(void); _UART_MONITOR_EXT UART_MSG UART_stMsgFetched; _UART_MONITOR_EXT void uart_voDriTimer(void); _UART_MONITOR_EXT void ReadFrame_Poll2(); _UART_MONITOR_EXT void uart_voSwanInit(void); _UART_MONITOR_EXT void uart_voApplMain(void); void uart_TxCompleteCallback(); void uart_TxErrorCallback(); _UART_MONITOR_EXT UWORD uart_uwCRCCcitt(UBYTE *ptubBuf, UWORD length); /************************************************************************ Local Function Call Prototypes: *************************************************************************/ void uart_voHandleParaCmd(void); void uart_voDecode(void); void CBError_monitor(UART_ERR_Type _err); void uart_voCBDoneRead(UART_ERR_Type _err, ULONG _NumBytes); UBYTE uart_ubCheckXOR(UBYTE *Buf, UBYTE CNT); void uart_voPostMsg(UART_MSG _msg); void uart_Read_Poll2(ULONG _NumBytes, UBYTE *_Buffer, CB_DONE_READ _fpCBDone); void CBDoneRead2(UART_ERR_Type _err, ULONG _NumBytes); void CBError_Swan(UART_ERR_Type _err); void uart_Write_Poll2(ULONG _NumBytes, const UBYTE *_Buffer); void HAL_CancelRead_Poll2(void); BOOL SwanDecoder(UBYTE *ptubBuffer, UWORD Num, UBYTE **ptptubACKbuffer, UWORD *ACKnum); #endif /************************************************************************ Copyright (c) 2019 Welling Motor Technology(Shanghai) Co. Ltd. All rights reserved. ************************************************************************* End of this File (EOF)! Do not put anything after this part! *************************************************************************/