From 64d02b3a71d29c86c37a4297b19e4c41a6fffb84 Mon Sep 17 00:00:00 2001 From: Gatsby Van Date: Fri, 19 Jan 2024 11:49:48 +0800 Subject: [PATCH] adapted to new protocol specification. --- df_datalink/src/system_monitor.h | 2 +- df_datalink/src/systembus/systembus.c | 138 ++++++++++++++++++++++---- 2 files changed, 120 insertions(+), 20 deletions(-) diff --git a/df_datalink/src/system_monitor.h b/df_datalink/src/system_monitor.h index bc05ea2..c4b97ba 100644 --- a/df_datalink/src/system_monitor.h +++ b/df_datalink/src/system_monitor.h @@ -5,7 +5,7 @@ #include #define PAYLOAD_FLJ 78 -#define PAYLOAD_LJ 156 +#define PAYLOAD_LJ 168 typedef struct { diff --git a/df_datalink/src/systembus/systembus.c b/df_datalink/src/systembus/systembus.c index 77c940d..37cc448 100644 --- a/df_datalink/src/systembus/systembus.c +++ b/df_datalink/src/systembus/systembus.c @@ -8,7 +8,7 @@ * Revisions: Rev 0.0 * History: * [2023-05-06]: Initial version. - * [2023-09-13]: Update to 485 portocol-20220816 + * [2023-09-13]: Update to 485 protocol-20220816 * * Copyright(c) 2021 Beijing Institute of Technology. * Lab of Communication and Network @@ -105,6 +105,7 @@ // System info update #define CMD_SYS_INFO 0x33 +#define SYS_INFO_OFFSET 2 // -- Request // -- -- 54 byte system info // -- Response @@ -112,6 +113,7 @@ // Data Send Test Command #define CMD_FLJ_SEND 0xE4 +#define FLJ_DATA_OFFSET 2 // -- Request // -- -- 78 byte payload // -- Response @@ -119,6 +121,7 @@ // Data Send Test Command #define CMD_LJ_SEND 0xF4 +#define LJ_DATA_OFFSET 2 // -- Request // -- -- 156 byte payload // -- Response @@ -139,16 +142,25 @@ #define WD_LJ_POLL 0x02 #define LJ_POLL_CODE 0x77 // -- Response -#define LJ_POLL_RESP_LEN 156 +#define LJ_POLL_RESP_LEN 168 // -- -- received 156 byte payload -// Remote Test -#define CMD_RM_TEST 0xE6 +// Remote Test FLJ +#define CMD_FLJ_RM_TEST 0xE6 // -- Request -// -- -- none, response with roll call (after roll call resp) +#define WD_FLJ_RM_TEST 0x02 +#define FLJ_RM_TEST_CODE 0x99 // -- Response -#define RM_TEST_LEN 210 -// -- -- received 208 byte Remote Test infomation +#define FLJ_RM_TEST_RESP_LEN 158 + +// Remote Test LJ +#define CMD_LJ_RM_TEST 0xF6 +// -- Request +#define WD_LJ_RM_TEST 0x02 +#define LJ_RM_TEST_CODE 0x99 +// -- Response +#define LJ_RM_TEST_RESP_LEN 158 + // My Production Type #define MY_PRD_ID PRD_DL_K @@ -262,6 +274,11 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) case CMD_SELF_TEST: { sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + if (sysbusRsp == NULL) { + DBG_ERROR("Failed to allocate memory for SELF TEST Response!\n"); + Status = ENOMEM; + break; + } sysbusRsp->len = ST_RSP_LEN; memset(sysbusRsp->data, 0x00, ST_RSP_LEN); sysbusRsp->data[WD_CMD] = CMD_SELF_TEST; @@ -271,7 +288,8 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) sysbusRsp->data[WD_ST_RET] = ST_RET_OK; if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) { - DBG_WARNING("SystemBus::TX Queue overflowed!\n"); + free(sysbusRsp); + DBG_ERROR("SystemBus::TX Queue overflowed!\n"); Status = EQUEUE; break; } @@ -281,11 +299,17 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) case CMD_DATA_TEST_A: { sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + if (sysbusRsp == NULL) { + DBG_ERROR("Failed to allocate memory for DATA TEST A Response!\n"); + Status = ENOMEM; + break; + } sysbusRsp->len = DATA_TEST_RSP_A_LEN; memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_A_LEN); if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) { - DBG_WARNING("SystemBus::TX Queue overflowed!\n"); + free(sysbusRsp); + DBG_ERROR("SystemBus::TX Queue overflowed!\n"); Status = EQUEUE; break; } @@ -295,11 +319,17 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) case CMD_DATA_TEST_B: { sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + if (sysbusRsp == NULL) { + DBG_ERROR("Failed to allocate memory for DATA TEST B Response!\n"); + Status = ENOMEM; + break; + } sysbusRsp->len = DATA_TEST_RSP_B_LEN; memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_B_LEN); if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) { - DBG_WARNING("SystemBus::TX Queue overflowed!\n"); + free(sysbusRsp); + DBG_ERROR("SystemBus::TX Queue overflowed!\n"); Status = EQUEUE; break; } @@ -317,36 +347,42 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) } case CMD_SYS_INFO: { - SysMonitor_UpdateSysinfoRaw(data + 2); + SysMonitor_UpdateSysinfoRaw(data + SYS_INFO_OFFSET); Status = SUCCESS; break; } // TODO case CMD_FLJ_SEND: { - SysMonitor_UpdateSendPayloadFLJRaw(data + 2); // ommit 2 bytes control info + SysMonitor_UpdateSendPayloadFLJRaw(data + FLJ_DATA_OFFSET); // omit control info break; } case CMD_LJ_SEND: { - SysMonitor_UpdateSendPayloadLJRaw(data + 2); // ommit 2 bytes control info + SysMonitor_UpdateSendPayloadLJRaw(data + LJ_DATA_OFFSET); // omit control info break; } case CMD_FLJ_POLL: { if (data[WD_FLJ_POLL] != FLJ_POLL_CODE) { - DBG_WARNING("SystemBus::Invalid roll call code!\n"); + DBG_ERROR("SystemBus::Invalid roll call code!\n"); Status = EIGNORE; break; } sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + if (sysbusRsp == NULL) { + DBG_ERROR("Failed to allocate memory for FLJ POLL Response!\n"); + Status = ENOMEM; + break; + } sysbusRsp->len = FLJ_POLL_RESP_LEN; sysbusRsp->data[WD_CMD] = WD_FLJ_POLL; sysbusRsp->data[WD_PRD] = MY_PRD_ID; - SysMonitor_GetRecvPayloadFLJRaw(sysbusRsp->data + 2); // ommit 2 bytes control info + SysMonitor_GetRecvPayloadFLJRaw(sysbusRsp->data + FLJ_DATA_OFFSET); // omit control info if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) { + free(sysbusRsp); DBG_WARNING("SystemBus::TX Queue overflowed!\n"); Status = EQUEUE; break; @@ -357,7 +393,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) // sysbusRsp->len = RM_TEST_LEN; // sysbusRsp->data[WD_CMD] = CMD_RM_TEST; // sysbusRsp->data[WD_PRD] = MY_PRD_ID; - // SysMonitor_GetSyslogRaw(sysbusRsp->data + 2); //ommit 2 bytes control info + // SysMonitor_GetSyslogRaw(sysbusRsp->data + 2); //omit control info // if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){ // DBG_WARNING("SystemBus::TX Queue overflowed!\n"); // Status = EQUEUE; @@ -375,12 +411,18 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) break; } sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + if (sysbusRsp == NULL) { + DBG_ERROR("Failed to allocate memory for LJ POLL Response!\n"); + Status = ENOMEM; + break; + } sysbusRsp->len = LJ_POLL_RESP_LEN; sysbusRsp->data[WD_CMD] = WD_LJ_POLL; sysbusRsp->data[WD_PRD] = MY_PRD_ID; - SysMonitor_GetRecvPayloadLJRaw(sysbusRsp->data + 2); // ommit 2 bytes control info + SysMonitor_GetRecvPayloadLJRaw(sysbusRsp->data + 2); // omit control info if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) { + free(sysbusRsp); DBG_WARNING("SystemBus::TX Queue overflowed!\n"); Status = EQUEUE; break; @@ -391,7 +433,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) // sysbusRsp->len = RM_TEST_LEN; // sysbusRsp->data[WD_CMD] = CMD_RM_TEST; // sysbusRsp->data[WD_PRD] = MY_PRD_ID; - // SysMonitor_GetSyslogRaw(sysbusRsp->data + 2); //ommit 2 bytes control info + // SysMonitor_GetSyslogRaw(sysbusRsp->data + 2); //omit control info // if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){ // DBG_WARNING("SystemBus::TX Queue overflowed!\n"); // Status = EQUEUE; @@ -400,6 +442,64 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr) Status = SUCCESS; break; } + case CMD_FLJ_RM_TEST: + { + if (data[WD_FLJ_RM_TEST] != FLJ_RM_TEST_CODE) + { + DBG_WARNING("SystemBus::Invalid remote test code!\n"); + Status = EIGNORE; + break; + } + sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + if (sysbusRsp == NULL) { + DBG_ERROR("Failed to allocate memory for FLJ REMOTE TEST Response!\n"); + Status = ENOMEM; + break; + } + sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + sysbusRsp->len = FLJ_RM_TEST_RESP_LEN; + memset(sysbusRsp->data, FLJ_RM_TEST_RESP_LEN); + sysbusRsp->data[WD_CMD] = CMD_FLJ_RM_TEST; + sysbusRsp->data[WD_PRD] = MY_PRD_ID; + + if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){ + free(sysbusRsp); + DBG_WARNING("SystemBus::TX Queue overflowed!\n"); + Status = EQUEUE; + break; + } + Status = SUCCESS; + break; + } + case CMD_LJ_RM_TEST: + { + if (data[WD_LJ_RM_TEST] != LJ_RM_TEST_CODE) + { + DBG_WARNING("SystemBus::Invalid remote test code!\n"); + Status = EIGNORE; + break; + } + sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + if (sysbusRsp == NULL) { + DBG_ERROR("Failed to allocate memory for LJ REMOTE TEST Response!\n"); + Status = ENOMEM; + break; + } + sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); + sysbusRsp->len = LJ_RM_TEST_RESP_LEN; + memset(sysbusRsp->data, LJ_RM_TEST_RESP_LEN); + sysbusRsp->data[WD_CMD] = CMD_LJ_RM_TEST; + sysbusRsp->data[WD_PRD] = MY_PRD_ID; + + if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){ + free(sysbusRsp); + DBG_WARNING("SystemBus::TX Queue overflowed!\n"); + Status = EQUEUE; + break; + } + Status = SUCCESS; + break; + } default: { DBG_ERROR("SystemBus::Unknown command code!\n"); @@ -491,7 +591,7 @@ int32_t SystemBus_RxIntrHandler(SYSBUS *instPtr) } if (CircQueuePush(instPtr->rxQueue, (void *)sysbusReq) == false) { - DBG_WARNING("SystemBus::RX Queue overflowed!\n"); + DBG_ERROR("SystemBus::RX Queue overflowed!\n"); Status = EQUEUE; goto recv_error; }