568 lines
26 KiB
C
568 lines
26 KiB
C
#include "UpcCommTask.h"
|
||
#include "WatchdogTask.h"
|
||
#include "DpcCommTask.h"
|
||
#include "McuBspUart.h"
|
||
#include "FileSysTask.h"
|
||
#include "RunEnvTask.h"
|
||
#include "OutPutGpioTask.h"
|
||
#include "ToolDelay.h"
|
||
|
||
#include "RtcTask.h"
|
||
|
||
#include "RtcDrv.h"
|
||
|
||
#include "ToolCheck.h"
|
||
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
|
||
//#define DEVICE_YX
|
||
#define DEVICE_YS
|
||
|
||
/*******************************宏定义部分************************************/
|
||
#define TASK_UPC_COMM_HANDLE_DATA_BUFLEN 2100 // 数据处理存放缓存
|
||
#define TASK_UPC_COMM_HANDLE_DATA_COUNT 10 // 数据缓存条数
|
||
|
||
#define TASK_UPC_COMM_SEND_DATA_BUFLEN 2100
|
||
|
||
#define TASK_UPC_COMM_DATA_IDLING 0 // 空闲态
|
||
#define TASK_UPC_COMM_DATA_SORTING 1 // 分拣态
|
||
#define TASK_UPC_COMM_DATA_HANDLING 2 // 处理态
|
||
|
||
#define TASK_UPC_COMM_UART_ID MCU_BSP_UART6
|
||
#define TASK_UPC_COMM_UART_BANDRATE MCU_BSP_UART_BANDRATE_115200
|
||
#define TASK_UPC_COMM_UART_DATABIT MCU_BSP_UART_DATABIT_8
|
||
#define TASK_UPC_COMM_UART_STOPBIT MCU_BSP_UART_STOPBIT_ONE
|
||
#define TASK_UPC_COMM_UART_CHECKBIT MCU_BSP_UART_CHECKBIT_NONE
|
||
/********************************类型定义************************************/
|
||
typedef struct{
|
||
unsigned char HandleDataBuf[TASK_UPC_COMM_HANDLE_DATA_BUFLEN];
|
||
unsigned char HandleFlag;
|
||
unsigned short HandleCount;
|
||
} TASK_UPC_COMM_HANDLE;
|
||
/***************************设备类型与设备ID**********************************/
|
||
static unsigned int gDeviceType = 201; // 设备类型
|
||
#ifdef DEVICE_YS
|
||
static unsigned int gDeviceId = 1; // 设备ID
|
||
#endif
|
||
|
||
#ifdef DEVICE_YX
|
||
static unsigned int gDeviceId = 3; // 设备ID
|
||
#endif
|
||
|
||
/********************************** 接收缓存 *********************************/
|
||
static TASK_UPC_COMM_HANDLE gTaskCommHandleDataBuf[TASK_UPC_COMM_HANDLE_DATA_COUNT] = {{0}};
|
||
/********************************** 发送缓存 *********************************/
|
||
static unsigned char gTaskUpcCommSendDataBuf[TASK_UPC_COMM_SEND_DATA_BUFLEN] = {0};
|
||
static unsigned char gSendBufTmp[1050] = {0}; // 临时发送数据保存
|
||
/********************************** 看门狗定义 *******************************/
|
||
static int8_t gTaskUpcCommWatchDogId = -1; // 看门狗任务
|
||
|
||
static void TaskUpcCommUartCallback(uint8_t Data);
|
||
static void TaskUpcCommClearDataStatus(uint8_t CountId);
|
||
static void TaskUpcCommNormalAck(uint16_t PlatNum, uint16_t PlatId, uint8_t Result);
|
||
|
||
void TaskUpcCommInit(void)
|
||
{
|
||
McuBspUartInit(TASK_UPC_COMM_UART_ID, TASK_UPC_COMM_UART_BANDRATE, TASK_UPC_COMM_UART_DATABIT,
|
||
TASK_UPC_COMM_UART_STOPBIT, TASK_UPC_COMM_UART_CHECKBIT);
|
||
McuBspUartStartRecv(TASK_UPC_COMM_UART_ID, TaskUpcCommUartCallback);
|
||
gTaskUpcCommWatchDogId = TaskWatchdogRegEvent("TaskUpcComm");
|
||
}
|
||
|
||
void TaskUpcComm(void* arg)
|
||
{
|
||
unsigned int RealWbyte;
|
||
unsigned char i;
|
||
int k;
|
||
int j;
|
||
unsigned char crc = 0;
|
||
unsigned int TmpId;
|
||
unsigned int TmpType;
|
||
unsigned short MessageId;
|
||
unsigned short MessageNum;
|
||
unsigned short MessageLen;
|
||
/* 将解析数据任务开启写入日志 */
|
||
TaskFileLogWrite("TaskUpcComm: Join in!!\n", strlen("TaskUpcComm: Join in!!\n"), &RealWbyte);
|
||
while (1) {
|
||
OSTimeDly(5);
|
||
k = 0;
|
||
TaskWatchdogFreed(gTaskUpcCommWatchDogId);
|
||
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
|
||
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_HANDLING) {
|
||
break;
|
||
}
|
||
}
|
||
if (i >= TASK_UPC_COMM_HANDLE_DATA_COUNT) {
|
||
continue;
|
||
}
|
||
/* 进行数据包解析 */
|
||
for (j = 1; j < gTaskCommHandleDataBuf[i].HandleCount - 1; j++) {
|
||
if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x7f) {
|
||
TaskUpcCommClearDataStatus(i);
|
||
break;
|
||
} else if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x7e) {
|
||
j++;
|
||
if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x01) {
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[k] = 0x7e;
|
||
} else if (gTaskCommHandleDataBuf[i].HandleDataBuf[j] == 0x02) {
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[k] = 0x7f;
|
||
} else {
|
||
TaskUpcCommClearDataStatus(i);
|
||
break;
|
||
}
|
||
} else {
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[k] = gTaskCommHandleDataBuf[i].HandleDataBuf[j];
|
||
}
|
||
k++;
|
||
}
|
||
if (j < gTaskCommHandleDataBuf[i].HandleCount - 1) {
|
||
TaskFileLogWrite("TaskUpcComm: CMD illegal char!!\n", strlen("TaskUpcComm: CMD illegal char!!\n"), &RealWbyte);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
/* 提取消息中的终端消息ID */
|
||
MessageId = (unsigned short)((gTaskCommHandleDataBuf[i].HandleDataBuf[0] << 8) |
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[1]);
|
||
/* 提取消息中的终端类型 */
|
||
TmpType = (((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[2]) << 24) |
|
||
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[3]) << 16) |
|
||
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[4]) << 8) |
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[5];
|
||
/* 提取消息中的终端ID */
|
||
TmpId = (((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[6]) << 24) |
|
||
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[7]) << 16) |
|
||
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[8]) << 8) |
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[9];
|
||
/* 提取消息中的终端消息流水号 */
|
||
MessageNum = (unsigned short)((gTaskCommHandleDataBuf[i].HandleDataBuf[14] << 8) |
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[15]);
|
||
/* 提取消息的消息体长度 */
|
||
MessageLen = (unsigned short)((((unsigned short)(gTaskCommHandleDataBuf[i].HandleDataBuf[10] & 0x03)) << 8) |
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[11]);
|
||
crc = 0;
|
||
/* 比对终端类型与终端ID和测试软件是不是一致 */
|
||
if ((TmpType != gDeviceType) || (TmpId != gDeviceId)) {
|
||
TaskFileLogWrite("TaskUpcComm: Type or ID ERR!!\n", strlen("TaskUpcComm: Type or ID ERR!!\n"), &RealWbyte);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
/* 判断使用的校验方式,并进行校验,目前只支持Crc0x131的校验方式 */
|
||
if ((gTaskCommHandleDataBuf[i].HandleDataBuf[10] & 0x0c) == 0x0c) {
|
||
ToolCheckCrc8_0x31(gTaskCommHandleDataBuf[i].HandleDataBuf, k - 1, &crc);
|
||
if (crc != gTaskCommHandleDataBuf[i].HandleDataBuf[k - 1]) {
|
||
TaskFileLogWrite("TaskUpcComm: CRC ERR!!\n", strlen("TaskUpcComm: CRC ERR!!\n"), &RealWbyte);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
} else {
|
||
TaskFileLogWrite("TaskUpcComm: CRC TYPE ERR!!\n", strlen("TaskUpcComm: CRC TYPE ERR!!\n"), &RealWbyte);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
if ((gTaskCommHandleDataBuf[i].HandleDataBuf[10] & 0x20) == 0x20) {
|
||
if (MessageLen != (k - 19)) {
|
||
TaskFileLogWrite("TaskUpcComm: Message Len ERR!!\n", strlen("TaskUpcComm: Message Len ERR!!\n"), &RealWbyte);
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
} else {
|
||
j = 18;
|
||
}
|
||
} else {
|
||
if (MessageLen != (k - 17)) {
|
||
TaskFileLogWrite("TaskUpcComm: Message Len ERR!!\n", strlen("TaskUpcComm: Message Len ERR!!\n"), &RealWbyte);
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
} else {
|
||
j = 16;
|
||
}
|
||
}
|
||
if (MessageId == PLAT_ACK_MESSAGE_ID) {
|
||
/* 下面是对平台ACK的处理 */
|
||
TaskUpcCommClearDataStatus(i); // 不对ACK进行处理
|
||
} else if (MessageId == PLAT_CONF_TERMINAL_TIME_MESSAGE_ID) {
|
||
uint64_t Time;
|
||
DRV_RTC_TIME RtcTime;
|
||
// if (TaskFileMutexState()) {
|
||
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
// TaskUpcCommClearDataStatus(i);
|
||
// continue;
|
||
// }
|
||
TaskFileLogWrite("TaskUpcComm: CMD TIME SYNC!!\n", strlen("TaskUpcComm: CMD TIME SYNC!!\n"), &RealWbyte);
|
||
if (MessageLen != 8) {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
Time = (((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j]) << 56) |
|
||
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]) << 48) |
|
||
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2]) << 40) |
|
||
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 3]) << 32) |
|
||
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 4]) << 24) |
|
||
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 5]) << 16) |
|
||
(((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
|
||
((uint64_t)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]);
|
||
RtcTime.year = Time / 10000000000;
|
||
RtcTime.month = (Time / 100000000) % 100;
|
||
RtcTime.date = (Time / 1000000) % 100;
|
||
RtcTime.hour = (Time / 10000) % 100;
|
||
RtcTime.minute = (Time / 100) % 100;
|
||
RtcTime.second = Time % 100;
|
||
if (0 > TaskRtcSyncSet(&RtcTime)) {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
}
|
||
TaskUpcCommClearDataStatus(i);
|
||
} else if (MessageId == PLAT_ASK_TERMINAL_DATA_MESSAGE_ID) {
|
||
/* 平台请求数据 */
|
||
unsigned short ConfMessage;
|
||
unsigned char Num;
|
||
// if (TaskFileMutexState()) {
|
||
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
// TaskUpcCommClearDataStatus(i);
|
||
// continue;
|
||
// }
|
||
TaskFileLogWrite("TaskUpcComm: CMD ASK DATA!!\n", strlen("TaskUpcComm: CMD ASK DATA!!\n"), &RealWbyte);
|
||
ConfMessage = (((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j]) << 8) |
|
||
((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]);
|
||
Num = gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2];
|
||
if (ConfMessage == TASK_RUN_ENV_MESSGAE_ID) {
|
||
if (Num == 0x01) {
|
||
TaskRunEnvEnable();
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
|
||
}
|
||
} else if (ConfMessage == TASK_OUTPUT_GPIO_MESSGAE_ID) {
|
||
if (Num == 0x01) {
|
||
TaskOutPutGpioEnable();
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
|
||
}
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
|
||
}
|
||
TaskUpcCommClearDataStatus(i);
|
||
} else if (MessageId == PLAT_ASK_TERMINAL_FILE_MESSAGE_ID) {
|
||
/* 平台请求终端文件 */
|
||
int rt;
|
||
unsigned char FileType;
|
||
unsigned char FileOperation;
|
||
unsigned int time;
|
||
unsigned short Year;
|
||
unsigned char Mon;
|
||
unsigned char Day;
|
||
// if (TaskFileMutexState()) {
|
||
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
// TaskUpcCommClearDataStatus(i);
|
||
// continue;
|
||
// }
|
||
TaskFileLogWrite("TaskUpcComm: CMD ASK FILE!!\n", strlen("TaskUpcComm: CMD ASK FILE!!\n"), &RealWbyte);
|
||
if (0 == gTaskCommHandleDataBuf[i].HandleDataBuf[j]) {
|
||
FileType = FILE_LOG_TYPE;
|
||
} else if (5 == gTaskCommHandleDataBuf[i].HandleDataBuf[j]) {
|
||
FileType = FILE_DATA_TYPE;
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
if (0 == gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]) {
|
||
FileOperation = FILE_UPLOAD;
|
||
} else if (1 == gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]) {
|
||
FileOperation = FILE_DELETE;
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
time = (((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2]) << 24) |
|
||
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 3]) << 16) |
|
||
(((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 4]) << 8) |
|
||
((unsigned int)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 5]);
|
||
Year = time / 10000;
|
||
Mon = (time % 10000) / 100;
|
||
Day = time % 100;
|
||
if (FileType == FILE_DATA_TYPE) {
|
||
if (TASK_RUN_ENV_MESSGAE_ID == ((((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
|
||
((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]))) {
|
||
while (1) {
|
||
rt = TaskFileEnableSend(FILE_DATA_TYPE, Year, Mon, Day, FileOperation, TASK_RUN_FILE_TYPE);
|
||
if (rt == 0) {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
break;
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
break;
|
||
}
|
||
}
|
||
} else if (TASK_OUTPUT_GPIO_MESSGAE_ID == ((((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]) << 8) |
|
||
((unsigned short)gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]))) {
|
||
while (1) {
|
||
rt = TaskFileEnableSend(FILE_DATA_TYPE, Year, Mon, Day, FileOperation, TASK_OUTPUT_GPIO_FILE_TYPE);
|
||
if (rt == 0) {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
break;
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
break;
|
||
}
|
||
}
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_NO_SUP);
|
||
TaskUpcCommClearDataStatus(i);
|
||
continue;
|
||
}
|
||
} else if (FileType == FILE_LOG_TYPE) {
|
||
while (1) {
|
||
rt = TaskFileEnableSend(FILE_LOG_TYPE, Year, Mon, Day, FileOperation, NULL);
|
||
if (rt == 0) {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
break;
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
break;
|
||
}
|
||
}
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
}
|
||
TaskUpcCommClearDataStatus(i);
|
||
} else if (MessageId == PLAT_ASK_TERMINAL_RESTART_MESSAGE_ID) {
|
||
TaskFileLogWrite("TaskUpcComm: CMD ASK RESTART!!\n", strlen("TaskUpcComm: CMD ASK RESTART!!\n"), &RealWbyte);
|
||
/* 平台请求重启设备 */
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
TaskUpcCommClearDataStatus(i);
|
||
while (1) {
|
||
OSTimeDly(100);
|
||
TaskWatchdogFreed(gTaskUpcCommWatchDogId);
|
||
if (0 == TaskDpcCommSetAskEnable(RESTART_CMD_ID)) {
|
||
TaskDpcCommClearSendEndSta();
|
||
while (1 != TaskDpcCommGetSendEndSta()) {
|
||
OSTimeDly(100);
|
||
TaskWatchdogFreed(gTaskUpcCommWatchDogId);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
ToolDelayMs(1000);
|
||
SysCtlReset();
|
||
} else if (MessageId == PLAT_CONF_RELAY_CONTROL_MESSAGE_ID) {
|
||
// if (TaskFileMutexState()) {
|
||
// TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
// TaskUpcCommClearDataStatus(i);
|
||
// continue;
|
||
// }
|
||
TaskFileLogWrite("TaskUpcComm: CMD CTRL GPIO!!\n", strlen("TaskUpcComm: CMD CTRL GPIO!!\n"), &RealWbyte);
|
||
TaskOutPutGpioSet(CTD_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j]);
|
||
TaskOutPutGpioSet(MANYPARA_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 1]);
|
||
TaskOutPutGpioSet(CO2_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 2]);
|
||
TaskOutPutGpioSet(ADCP_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 3]);
|
||
TaskOutPutGpioSet(UV1_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 4]);
|
||
TaskOutPutGpioSet(UV2_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 5]);
|
||
TaskOutPutGpioSet(UV3_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 6]);
|
||
TaskOutPutGpioSet(UV4_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 7]);
|
||
TaskOutPutGpioSet(RESERVED_12V_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 10]);
|
||
TaskOutPutGpioSet(RESERVED_24V_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 9]);
|
||
TaskOutPutGpioSet(RESERVED_48V_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 8]);
|
||
TaskOutPutGpioSet(LAMP_CHANNEL_ID, gTaskCommHandleDataBuf[i].HandleDataBuf[j + 11]);
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_OK);
|
||
TaskUpcCommClearDataStatus(i);
|
||
} else {
|
||
TaskUpcCommNormalAck(MessageNum, MessageId, TASK_ACK_ERR);
|
||
TaskUpcCommClearDataStatus(i);
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 发送函数 */
|
||
uint32_t TaskUpcCommSendMessage(uint16_t MessageId, uint16_t *Serial, uint8_t *SendBuf, uint32_t SendBufLen)
|
||
{
|
||
uint32_t i = 0;
|
||
uint32_t j = 0;
|
||
uint32_t k = 0;
|
||
uint32_t e =0;
|
||
uint32_t RealSendLen = 0;
|
||
uint16_t SendPiece = 0; // 发送条数,用来记录是否具有分包
|
||
uint16_t MessageProperties = 0; // 消息属性
|
||
|
||
if (Serial == NULL) {
|
||
return 0;
|
||
}
|
||
SendPiece = (SendBufLen / 1023) + 1; //计算总共需要发几条信息
|
||
for (i = 0; i < SendPiece; i++) {
|
||
if (SendPiece != 1) {
|
||
if (i != (SendPiece - 1)) {
|
||
MessageProperties = 0x2000 | 0x0c00 | 1023;
|
||
} else {
|
||
MessageProperties = 0x2000 | 0x0c00 | (SendBufLen % 1023);
|
||
}
|
||
} else {
|
||
MessageProperties = 0x0000 | 0x0c00 | SendBufLen;
|
||
}
|
||
j = 0;
|
||
/* 消息ID */
|
||
gSendBufTmp[j] = (uint8_t)((MessageId & 0xff00) >> 8);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)(MessageId & 0x00ff);
|
||
j++;
|
||
/* 设备类型 */
|
||
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0xff000000) >> 24);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0x00ff0000) >> 16);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)((gDeviceType & 0x0000ff00) >> 8);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)(gDeviceType & 0x000000ff);
|
||
j++;
|
||
/* 设备ID号 */
|
||
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0xff000000) >> 24);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0x00ff0000) >> 16);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)((gDeviceId & 0x0000ff00) >> 8);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)(gDeviceId & 0x000000ff);
|
||
j++;
|
||
/* 消息体属性 */
|
||
gSendBufTmp[j] = (uint8_t)((MessageProperties & 0xff00) >> 8);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)(MessageProperties & 0x00ff);
|
||
j++;
|
||
/* 协议版本号 */
|
||
gSendBufTmp[j] = 0x00;
|
||
j++;
|
||
gSendBufTmp[j] = 0x01;
|
||
j++;
|
||
/* 消息流水号 */
|
||
gSendBufTmp[j] = (uint8_t)(((*Serial) & 0xff00) >> 8);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)((*Serial) & 0x00ff);
|
||
j++;
|
||
/* 消息包装项 + 消息内容 */
|
||
if (SendPiece != 1) {
|
||
/* 消息总包数 */
|
||
gSendBufTmp[j] = (uint8_t)((SendPiece & 0xff00) >> 8);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)(SendPiece & 0x00ff);
|
||
j++;
|
||
/* 包序号 */
|
||
gSendBufTmp[j] = (uint8_t)(((i + 1) & 0xff00) >> 8);
|
||
j++;
|
||
gSendBufTmp[j] = (uint8_t)((i + 1) & 0x00ff);
|
||
j++;
|
||
if (i != (SendPiece - 1)) {
|
||
memcpy(&gSendBufTmp[j], &(SendBuf[1023 * i]), 1023);
|
||
j += 1023;
|
||
} else {
|
||
memcpy(&gSendBufTmp[j], &(SendBuf[1023 * i]), SendBufLen % 1023);
|
||
j += (SendBufLen % 1023);
|
||
}
|
||
} else {
|
||
if ((SendBuf != NULL) && (SendBufLen != 0)) {
|
||
memcpy(&gSendBufTmp[j], SendBuf, SendBufLen);
|
||
j += SendBufLen;
|
||
}
|
||
}
|
||
/* 进行校验 */
|
||
gSendBufTmp[j] = 0;
|
||
ToolCheckCrc8_0x31(gSendBufTmp, j, &gSendBufTmp[j]);
|
||
j++;
|
||
/* 进行转义 */
|
||
e = 0;
|
||
gTaskUpcCommSendDataBuf[e] = 0x7f; // 标志位
|
||
e++;
|
||
for (k = 0; k < j; k++) {
|
||
if (gSendBufTmp[k] == 0x7e) {
|
||
gTaskUpcCommSendDataBuf[e] = 0x7e;
|
||
e++;
|
||
gTaskUpcCommSendDataBuf[e] = 0x01;
|
||
e++;
|
||
} else if (gSendBufTmp[k] == 0x7f) {
|
||
gTaskUpcCommSendDataBuf[e] = 0x7e;
|
||
e++;
|
||
gTaskUpcCommSendDataBuf[e] = 0x02;
|
||
e++;
|
||
} else {
|
||
gTaskUpcCommSendDataBuf[e] = gSendBufTmp[k];
|
||
e++;
|
||
}
|
||
}
|
||
gTaskUpcCommSendDataBuf[e] = 0x7f; // 标志位
|
||
e++;
|
||
/* 发送数据 */
|
||
McuBspUartSendData(TASK_UPC_COMM_UART_ID, gTaskUpcCommSendDataBuf, e);
|
||
RealSendLen += e;
|
||
}
|
||
return RealSendLen;
|
||
}
|
||
|
||
static void TaskUpcCommUartCallback(uint8_t Data)
|
||
{
|
||
if (Data == 0x7f) {
|
||
int i;
|
||
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
|
||
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_SORTING) {
|
||
if (gTaskCommHandleDataBuf[i].HandleCount < 18) { // 18为数据包最小单位长度
|
||
/* 该帧数据错误,将该帧数据变成空闲态,并清空内部长度 */
|
||
gTaskCommHandleDataBuf[i].HandleFlag = TASK_UPC_COMM_DATA_IDLING;
|
||
gTaskCommHandleDataBuf[i].HandleCount = 0;
|
||
break;
|
||
} else {
|
||
/* 将数据保存在帧数据中,表示一帧数据的完成 */
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[gTaskCommHandleDataBuf[i].HandleCount] = Data;
|
||
gTaskCommHandleDataBuf[i].HandleCount++;
|
||
gTaskCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskCommHandleDataBuf[i].HandleCount % TASK_UPC_COMM_HANDLE_DATA_BUFLEN);
|
||
gTaskCommHandleDataBuf[i].HandleFlag = TASK_UPC_COMM_DATA_HANDLING;
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
|
||
/* 上面的逻辑排除了接收态,所以只剩空闲态 */
|
||
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_IDLING) {
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[gTaskCommHandleDataBuf[i].HandleCount] = Data;
|
||
gTaskCommHandleDataBuf[i].HandleCount++;
|
||
gTaskCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskCommHandleDataBuf[i].HandleCount % TASK_UPC_COMM_HANDLE_DATA_BUFLEN);
|
||
gTaskCommHandleDataBuf[i].HandleFlag = TASK_UPC_COMM_DATA_SORTING;
|
||
break;
|
||
}
|
||
}
|
||
} else {
|
||
int i;
|
||
for (i = 0; i < TASK_UPC_COMM_HANDLE_DATA_COUNT; i++) {
|
||
if (gTaskCommHandleDataBuf[i].HandleFlag == TASK_UPC_COMM_DATA_SORTING) {
|
||
gTaskCommHandleDataBuf[i].HandleDataBuf[gTaskCommHandleDataBuf[i].HandleCount] = Data;
|
||
gTaskCommHandleDataBuf[i].HandleCount++;
|
||
gTaskCommHandleDataBuf[i].HandleCount = (unsigned short)(gTaskCommHandleDataBuf[i].HandleCount % TASK_UPC_COMM_HANDLE_DATA_BUFLEN);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
static void TaskUpcCommNormalAck(uint16_t PlatNum, uint16_t PlatId, uint8_t Result)
|
||
{
|
||
uint8_t Ack[5] = {0};
|
||
static uint16_t Serial = 0;
|
||
Ack[0] = (uint8_t)((PlatNum & 0xff00) >> 8);
|
||
Ack[1] = (uint8_t)(PlatNum & 0x00ff);
|
||
Ack[2] = (uint8_t)((PlatId & 0xff00) >> 8);
|
||
Ack[3] = (uint8_t)(PlatId & 0x00ff);
|
||
Ack[4] = Result;
|
||
TaskUpcCommSendMessage(0x0000, &Serial, Ack, sizeof(Ack));
|
||
Serial++;
|
||
}
|
||
|
||
/* 清除接收buf */
|
||
static void TaskUpcCommClearDataStatus(uint8_t CountId)
|
||
{
|
||
gTaskCommHandleDataBuf[CountId].HandleFlag = TASK_UPC_COMM_DATA_IDLING;
|
||
gTaskCommHandleDataBuf[CountId].HandleCount = 0;
|
||
}
|