adapted to new protocol specification.

This commit is contained in:
Gatsby Van
2024-01-19 11:49:48 +08:00
parent 286787f01c
commit 64d02b3a71
2 changed files with 120 additions and 20 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
#include <stdbool.h> #include <stdbool.h>
#define PAYLOAD_FLJ 78 #define PAYLOAD_FLJ 78
#define PAYLOAD_LJ 156 #define PAYLOAD_LJ 168
typedef struct typedef struct
{ {
+119 -19
View File
@@ -8,7 +8,7 @@
* Revisions: Rev 0.0 * Revisions: Rev 0.0
* History: * History:
* [2023-05-06]: Initial version. * [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. * Copyright(c) 2021 Beijing Institute of Technology.
* Lab of Communication and Network * Lab of Communication and Network
@@ -105,6 +105,7 @@
// System info update // System info update
#define CMD_SYS_INFO 0x33 #define CMD_SYS_INFO 0x33
#define SYS_INFO_OFFSET 2
// -- Request // -- Request
// -- -- 54 byte system info // -- -- 54 byte system info
// -- Response // -- Response
@@ -112,6 +113,7 @@
// Data Send Test Command // Data Send Test Command
#define CMD_FLJ_SEND 0xE4 #define CMD_FLJ_SEND 0xE4
#define FLJ_DATA_OFFSET 2
// -- Request // -- Request
// -- -- 78 byte payload // -- -- 78 byte payload
// -- Response // -- Response
@@ -119,6 +121,7 @@
// Data Send Test Command // Data Send Test Command
#define CMD_LJ_SEND 0xF4 #define CMD_LJ_SEND 0xF4
#define LJ_DATA_OFFSET 2
// -- Request // -- Request
// -- -- 156 byte payload // -- -- 156 byte payload
// -- Response // -- Response
@@ -139,16 +142,25 @@
#define WD_LJ_POLL 0x02 #define WD_LJ_POLL 0x02
#define LJ_POLL_CODE 0x77 #define LJ_POLL_CODE 0x77
// -- Response // -- Response
#define LJ_POLL_RESP_LEN 156 #define LJ_POLL_RESP_LEN 168
// -- -- received 156 byte payload // -- -- received 156 byte payload
// Remote Test // Remote Test FLJ
#define CMD_RM_TEST 0xE6 #define CMD_FLJ_RM_TEST 0xE6
// -- Request // -- Request
// -- -- none, response with roll call (after roll call resp) #define WD_FLJ_RM_TEST 0x02
#define FLJ_RM_TEST_CODE 0x99
// -- Response // -- Response
#define RM_TEST_LEN 210 #define FLJ_RM_TEST_RESP_LEN 158
// -- -- received 208 byte Remote Test infomation
// 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 // My Production Type
#define MY_PRD_ID PRD_DL_K #define MY_PRD_ID PRD_DL_K
@@ -262,6 +274,11 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
case CMD_SELF_TEST: case CMD_SELF_TEST:
{ {
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); 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; sysbusRsp->len = ST_RSP_LEN;
memset(sysbusRsp->data, 0x00, ST_RSP_LEN); memset(sysbusRsp->data, 0x00, ST_RSP_LEN);
sysbusRsp->data[WD_CMD] = CMD_SELF_TEST; 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; sysbusRsp->data[WD_ST_RET] = ST_RET_OK;
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) 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; Status = EQUEUE;
break; break;
} }
@@ -281,11 +299,17 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
case CMD_DATA_TEST_A: case CMD_DATA_TEST_A:
{ {
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); 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; sysbusRsp->len = DATA_TEST_RSP_A_LEN;
memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_A_LEN); memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_A_LEN);
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) 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; Status = EQUEUE;
break; break;
} }
@@ -295,11 +319,17 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
case CMD_DATA_TEST_B: case CMD_DATA_TEST_B:
{ {
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); 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; sysbusRsp->len = DATA_TEST_RSP_B_LEN;
memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_B_LEN); memcpy(sysbusRsp->data, sysbusReq->data, DATA_TEST_RSP_B_LEN);
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false) 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; Status = EQUEUE;
break; break;
} }
@@ -317,36 +347,42 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
} }
case CMD_SYS_INFO: case CMD_SYS_INFO:
{ {
SysMonitor_UpdateSysinfoRaw(data + 2); SysMonitor_UpdateSysinfoRaw(data + SYS_INFO_OFFSET);
Status = SUCCESS; Status = SUCCESS;
break; break;
} }
// TODO // TODO
case CMD_FLJ_SEND: case CMD_FLJ_SEND:
{ {
SysMonitor_UpdateSendPayloadFLJRaw(data + 2); // ommit 2 bytes control info SysMonitor_UpdateSendPayloadFLJRaw(data + FLJ_DATA_OFFSET); // omit control info
break; break;
} }
case CMD_LJ_SEND: case CMD_LJ_SEND:
{ {
SysMonitor_UpdateSendPayloadLJRaw(data + 2); // ommit 2 bytes control info SysMonitor_UpdateSendPayloadLJRaw(data + LJ_DATA_OFFSET); // omit control info
break; break;
} }
case CMD_FLJ_POLL: case CMD_FLJ_POLL:
{ {
if (data[WD_FLJ_POLL] != FLJ_POLL_CODE) 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; Status = EIGNORE;
break; break;
} }
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); 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->len = FLJ_POLL_RESP_LEN;
sysbusRsp->data[WD_CMD] = WD_FLJ_POLL; sysbusRsp->data[WD_CMD] = WD_FLJ_POLL;
sysbusRsp->data[WD_PRD] = MY_PRD_ID; 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) if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
{ {
free(sysbusRsp);
DBG_WARNING("SystemBus::TX Queue overflowed!\n"); DBG_WARNING("SystemBus::TX Queue overflowed!\n");
Status = EQUEUE; Status = EQUEUE;
break; break;
@@ -357,7 +393,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
// sysbusRsp->len = RM_TEST_LEN; // sysbusRsp->len = RM_TEST_LEN;
// sysbusRsp->data[WD_CMD] = CMD_RM_TEST; // sysbusRsp->data[WD_CMD] = CMD_RM_TEST;
// sysbusRsp->data[WD_PRD] = MY_PRD_ID; // 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){ // if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
// DBG_WARNING("SystemBus::TX Queue overflowed!\n"); // DBG_WARNING("SystemBus::TX Queue overflowed!\n");
// Status = EQUEUE; // Status = EQUEUE;
@@ -375,12 +411,18 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
break; break;
} }
sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME)); 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->len = LJ_POLL_RESP_LEN;
sysbusRsp->data[WD_CMD] = WD_LJ_POLL; sysbusRsp->data[WD_CMD] = WD_LJ_POLL;
sysbusRsp->data[WD_PRD] = MY_PRD_ID; 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) if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
{ {
free(sysbusRsp);
DBG_WARNING("SystemBus::TX Queue overflowed!\n"); DBG_WARNING("SystemBus::TX Queue overflowed!\n");
Status = EQUEUE; Status = EQUEUE;
break; break;
@@ -391,7 +433,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
// sysbusRsp->len = RM_TEST_LEN; // sysbusRsp->len = RM_TEST_LEN;
// sysbusRsp->data[WD_CMD] = CMD_RM_TEST; // sysbusRsp->data[WD_CMD] = CMD_RM_TEST;
// sysbusRsp->data[WD_PRD] = MY_PRD_ID; // 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){ // if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false){
// DBG_WARNING("SystemBus::TX Queue overflowed!\n"); // DBG_WARNING("SystemBus::TX Queue overflowed!\n");
// Status = EQUEUE; // Status = EQUEUE;
@@ -400,6 +442,64 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
Status = SUCCESS; Status = SUCCESS;
break; 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: default:
{ {
DBG_ERROR("SystemBus::Unknown command code!\n"); DBG_ERROR("SystemBus::Unknown command code!\n");
@@ -491,7 +591,7 @@ int32_t SystemBus_RxIntrHandler(SYSBUS *instPtr)
} }
if (CircQueuePush(instPtr->rxQueue, (void *)sysbusReq) == false) if (CircQueuePush(instPtr->rxQueue, (void *)sysbusReq) == false)
{ {
DBG_WARNING("SystemBus::RX Queue overflowed!\n"); DBG_ERROR("SystemBus::RX Queue overflowed!\n");
Status = EQUEUE; Status = EQUEUE;
goto recv_error; goto recv_error;
} }