299 lines
7.0 KiB
C
299 lines
7.0 KiB
C
|
||
#include "hostMcuDataParse.h"
|
||
#include "hostMcuComm.h"
|
||
|
||
|
||
static void stateMachine(void);
|
||
|
||
/* 状态机函数 */
|
||
static uint8_t analysisWait(void);
|
||
static uint8_t analysisStartFlagSL(void);
|
||
static uint8_t analysisPortSL(void);
|
||
static uint8_t analysisLengthSL(void);
|
||
static uint8_t analysisEndFlagSL(void);
|
||
|
||
/**
|
||
* @brief 状态机函数
|
||
* @param
|
||
* @retval
|
||
*/
|
||
void stateMachine(void)
|
||
{
|
||
if (state == wait) {
|
||
if (analysisWait() == TRUE) {
|
||
su806UartRxTime = xTaskGetTickCount();
|
||
}
|
||
}
|
||
|
||
else if (state == startFlagSL) {
|
||
analysisStartFlagSL();
|
||
}
|
||
|
||
else if (state == portSL) {
|
||
analysisPortSL();
|
||
}
|
||
|
||
else if (state == lengthSL) {
|
||
analysisLengthSL();
|
||
}
|
||
|
||
else if (state == endFlagSL) {
|
||
analysisEndFlagSL();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 状态 wait
|
||
* @param
|
||
* @retval 0:解析失败
|
||
1:解析成功
|
||
*/
|
||
#define waitMaxLen 2
|
||
uint8_t analysisWait(void)
|
||
{
|
||
if (su806RxBufferIndex >= 2) {
|
||
/* 透传数据帧包头 */
|
||
if (su806RxBuffer[0] == 'S' && su806RxBuffer[1] == 'L') {
|
||
// log_info("startFlagSL\n");
|
||
state = startFlagSL;
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
if (su806RxBufferIndex < waitMaxLen) {
|
||
return FALSE;
|
||
}
|
||
|
||
state = wait;
|
||
su806RxBufferIndex--;
|
||
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
/**
|
||
* @brief 状态 startFlagSL
|
||
* @param
|
||
* @retval 0:解析失败
|
||
1:解析成功
|
||
*/
|
||
uint8_t analysisStartFlagSL(void)
|
||
{
|
||
/* 校验端口号 */
|
||
if (su806RxBuffer[2] < 13) {
|
||
// log_info("portSL\n");
|
||
state = portSL;
|
||
return TRUE;
|
||
}
|
||
|
||
// log_error("portSL %d \n", gw485RxBuffer[2]);
|
||
state = wait;
|
||
su806RxBufferIndex--;
|
||
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
|
||
return FALSE;
|
||
}
|
||
|
||
/**
|
||
* @brief 状态 portSL
|
||
* @param
|
||
* @retval 0:解析失败
|
||
1:解析成功
|
||
*/
|
||
#define PortSLMaxLen 5
|
||
uint8_t analysisPortSL(void)
|
||
{
|
||
/* 解析数据包的度 */
|
||
if (su806RxBufferIndex >= PortSLMaxLen) {
|
||
uint32_t tempLen = 0;
|
||
tempLen = (su806RxBuffer[3] << 8) | su806RxBuffer[4];
|
||
|
||
if (tempLen <= 1024) {
|
||
// log_info("lengthSL\n");
|
||
state = lengthSL;
|
||
frameLength = 6 + tempLen;
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
if (su806RxBufferIndex < PortSLMaxLen) {
|
||
return FALSE;
|
||
}
|
||
|
||
// log_error("lengthSL %d \n", (gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
|
||
|
||
state = wait;
|
||
su806RxBufferIndex--;
|
||
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
|
||
return FALSE;
|
||
}
|
||
|
||
/**
|
||
* @brief 状态 lengthSL
|
||
* @param
|
||
* @retval 0:解析失败
|
||
1:解析成功
|
||
*/
|
||
#define LengthSLMaxLen frameLength
|
||
uint8_t analysisLengthSL(void)
|
||
{
|
||
/* 解析帧尾 */
|
||
if (su806RxBufferIndex >= LengthSLMaxLen) {
|
||
if (su806RxBuffer[LengthSLMaxLen - 1] == 0x17) {
|
||
// log_info("endFlagSL\n");
|
||
state = endFlagSL;
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
if (su806RxBufferIndex < LengthSLMaxLen) {
|
||
return FALSE;
|
||
}
|
||
// log_info("endFlagSL %d\n", gw485RxBuffer[LengthSLMaxLen - 1]);
|
||
|
||
state = wait;
|
||
su806RxBufferIndex--;
|
||
memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 状态 endFlagSL
|
||
* @param
|
||
* @retval 0:解析失败
|
||
1:解析成功
|
||
*/
|
||
uint8_t analysisEndFlagSL(void)
|
||
{
|
||
uint32_t tempLen = 0;
|
||
tempLen = (su806RxBuffer[3] << 8) | su806RxBuffer[4];
|
||
|
||
if (su806RxBuffer[2] == HostMcu) {
|
||
hostFrameDataAnalyze(su806RxBuffer, su806RxBufferIndex);
|
||
su806RxBufferIndex = 0;
|
||
state = wait;
|
||
return 1;
|
||
}
|
||
|
||
//系统内存不足,丢去当前包
|
||
if (xPortGetFreeHeapSize() < tempLen + 1024) {
|
||
goto err;
|
||
}
|
||
uint8_t *Buff;
|
||
|
||
/* 对于从mcu处理的数据,原封不动的发送到从mcu上 */
|
||
if (su806RxBuffer[2] == J1
|
||
|| su806RxBuffer[2] == J3
|
||
|| su806RxBuffer[2] == J5
|
||
|| su806RxBuffer[2] == J7
|
||
|| su806RxBuffer[2] == J8
|
||
|| su806RxBuffer[2] == J9
|
||
|| su806RxBuffer[2] == SlaveMcu) {
|
||
|
||
Buff = (uint8_t *)pvPortMalloc(tempLen + hostQueueUartSendInfoSize + 6);
|
||
hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
|
||
sendBuff->length = tempLen + 6;
|
||
sendBuff->data = Buff + hostQueueUartSendInfoSize;
|
||
memcpy((char *)sendBuff->data, (char *)su806RxBuffer, tempLen + 6);
|
||
|
||
if (uxQueueSpacesAvailable(hostMcu_uart_Queue)) {
|
||
xQueueSend(hostMcu_uart_Queue, &Buff, 10);
|
||
}
|
||
/* 队列中无空间,释放内存,退出 */
|
||
else {
|
||
vPortFree(Buff);
|
||
}
|
||
}
|
||
|
||
Buff = (uint8_t *)pvPortMalloc(tempLen + hostQueueUartSendInfoSize);
|
||
hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
|
||
sendBuff->length = tempLen;
|
||
sendBuff->data = Buff + hostQueueUartSendInfoSize;
|
||
memcpy((char *)sendBuff->data, (char *)&su806RxBuffer[5], tempLen);
|
||
|
||
|
||
/* 通过不同的端口将数据发送到不同的地方 */
|
||
if (su806RxBuffer[2] == J0) {
|
||
if (uxQueueSpacesAvailable(J0_485_Queue)) {
|
||
xQueueSend(J0_485_Queue, &Buff, 10);
|
||
}
|
||
/* 队列中无空间,释放内存,退出 */
|
||
else {
|
||
vPortFree(Buff);
|
||
}
|
||
}
|
||
else if (su806RxBuffer[2] == J2) {
|
||
if (uxQueueSpacesAvailable(J2_485_Queue)) {
|
||
xQueueSend(J2_485_Queue, &Buff, 10);
|
||
}
|
||
/* 队列中无空间,释放内存,退出 */
|
||
else {
|
||
vPortFree(Buff);
|
||
}
|
||
}
|
||
else if (su806RxBuffer[2] == J4) {
|
||
if (uxQueueSpacesAvailable(J4_485_Queue)) {
|
||
xQueueSend(J4_485_Queue, &Buff, 10);
|
||
}
|
||
/* 队列中无空间,释放内存,退出 */
|
||
else {
|
||
vPortFree(Buff);
|
||
}
|
||
}
|
||
else if (su806RxBuffer[2] == J6) {
|
||
if (uxQueueSpacesAvailable(J6_485_Queue)) {
|
||
xQueueSend(J6_485_Queue, &Buff, 10);
|
||
}
|
||
/* 队列中无空间,释放内存,退出 */
|
||
else {
|
||
vPortFree(Buff);
|
||
}
|
||
}
|
||
else if (su806RxBuffer[2] == Lora) {
|
||
if (uxQueueSpacesAvailable(lora_uart_Queue)) {
|
||
xQueueSend(lora_uart_Queue, &Buff, 10);
|
||
}
|
||
/* 队列中无空间,释放内存,退出 */
|
||
else {
|
||
vPortFree(Buff);
|
||
}
|
||
}
|
||
|
||
err:
|
||
//清零buff
|
||
state = wait;
|
||
su806RxBufferIndex = 0;
|
||
return 1;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 解析智能模块发送来的数据
|
||
* @param device 用于接收智能模块发送来的数据的串口设备
|
||
* @retval
|
||
*/
|
||
void hostMcuUartDataAnalysis(device_handle device)
|
||
{
|
||
/* 每次函数最多执行10ms */
|
||
static uint32_t tickstart = 0U;
|
||
tickstart = xTaskGetTickCount();
|
||
|
||
/* 2S未解析出来一帧数据,将数据清零 */
|
||
if (getTickDiff(su806UartRxTime) >= tick_2S) {
|
||
su806UartRxTime = xTaskGetTickCount();
|
||
su806RxBufferIndex = 0;
|
||
state = wait;
|
||
}
|
||
|
||
while (uart_dev_char_present(device) == 1 && ((xTaskGetTickCount() - tickstart) < 5)) {
|
||
su806RxBuffer[su806RxBufferIndex++] = uart_dev_in_char(device);
|
||
stateMachine();
|
||
}
|
||
|
||
if (uart_dev_char_present(device) != 1 && state != wait) {
|
||
stateMachine();
|
||
}
|
||
}
|
||
|
||
|