MW22-01A_origin_project/APP/Agent/DLC-AEZT030W.c

954 lines
28 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "DLC-AEZT030W.h"
#include "agent_hyt.h"
#include "includes.h"
#include "gd32f4xx.h"
#include "enet_to_udp.h"
#include "ptz_struct.h"
#include "Usart.h"
#include "device_dac_out.h"
#include "ptz_header_file.h"
#include "device_wdog.h"
#include "service_autoreturn.h"
#include "device_heatresistor.h"
#include "full_bridge.h"
#include "cJSON.h"
#include "mb85rc64.h"
/* tcp自动回传 */
//云台自动回传
typedef struct _PtzTcpAutoReturn_ {
char swtich; //自动回传开关
unsigned short int time; //自动回传间隔时间
unsigned int timer; //自动回传间隔计时器
}PtzTcpAutoReturn;
PtzTcpAutoReturn m_tcp_auto_return = {
.swtich = PTZ_AUTO_RETURN_OFF,
.time = 1000,
.timer = 0,
};
/* 解析情况 */
enum {
wait = 0,
packHead,
packDataLen,
deviceType,
dataType,
messageContent,
success
};
/* 消息类型 */
enum {
switchType = 0x00,
parameterType = 0x0A,
};
/* 设备类型 */
enum {
all = 0x0A,
rotattable = 0x0D,
};
/* 工作状态 */
enum {
standby = 0,
startWork = 1,
restart = 2,
};
/* 工作状态 */
static uint8_t workStatus = standby;
// static uint8_t workStatus = startWork;
static uint8_t infoType = switchType;
static BSP_OS_SEM tcp_send_data_mutex;
static BSP_OS_SEM tcp_data_mutex;
static int tcp_sock_fd;
// static volatile int tcp_accept_fd;
int ptz_tcp_communicaton = PTZ_CONNECT_STATE_DEAD;
struct sockaddr_in tcp_from; //IP和端口
struct sockaddr_in tcp_local; //本地IP和端口
cJSON *replyRoot;
// cJSON *replySwitch;
cJSON *SystemInfo;
cJSON *commondInfo;
cJSON *equipmentBase;
// cJSON *equipmentBase2;
//连接的服务器的端口号和ip地址
#define TCP_PORT 8020
#define TCP_IP "20.20.20.20"
//tcp的客户端使用端口号
#define TCP_CLIENT_PORT 6667
static unsigned char pack_head[4] = {0xAA, 0xBB, 0xCC, 0xDD};
static unsigned char pack_tail[4] = {0xCC, 0xDD, 0xEE, 0xFF};
static char tcp_send_buff[1500];
static char tcp_rece_buff[1500] = {0x00};
static int tcp_recvData_len = 0;
/* */
static uint16_t Equipment_ID;
static uint8_t nodeNo;
#define TASK_PTZ_TCP_SERVER_PRIO 51u //云台通过tcp接收指令分析如果为38会干扰转动
#define TASK_PTZ_TCP_SERVER_STK_SIZE 2000u
static OS_STK task_ptz_tcp_server_stk[TASK_PTZ_TCP_SERVER_STK_SIZE];
#define TASK_PTZ_TCP_AUTORETURN_PRIO 50u
#define TASK_PTZ_TCP_AUTORETURN_STK_SIZE 800u
static OS_STK task_ptz_tcp_autoreturn_stk[TASK_PTZ_TCP_AUTORETURN_STK_SIZE];
void ptz_tcp_returnDataTask(void);
void send_tcp_data(char *data, int len);
// static int workState = standby;
static void sendJsonInit(void);
/**
* @brief 设置云台的Equipment_ID
* @param
* @retval
*/
void setEquipmentID(uint16_t address)
{
if (address = 1) {
Equipment_ID = 1011;
nodeNo = 1;
}
else if (address = 2) {
Equipment_ID = 1012;
nodeNo = 2;
}
else if (address = 3) {
Equipment_ID = 1013;
nodeNo = 3;
}
else if (address = 4) {
Equipment_ID = 1014;
nodeNo = 4;
}
else if (address = 5) {
Equipment_ID = 1015;
nodeNo = 5;
}
else if (address = 6) {
Equipment_ID = 1016;
nodeNo = 6;
}
else if (address = 7) {
Equipment_ID = 1017;
nodeNo = 7;
}
else if (address = 8) {
Equipment_ID = 1018;
nodeNo = 8;
}
else if (address = 9) {
Equipment_ID = 1019;
nodeNo = 9;
}
else {
Equipment_ID = 1011;
nodeNo = 1;
}
}
/**
* @brief crc32校验,除去CRC外报文所有内容的byte值相加
* @param
* @retval 1 验证成功
* 0 验证失败
*/
uint8_t checkCrc32(char *data, uint count)
{
uint crc = 0x00000000;
uint8_t dataCrc[4];
for (size_t i = 0; i < count; i++) {
crc += data[i];
}
// pdebug(DEBUG_LEVEL_DEBUG, "crc32 %d\n", crc);
#if 1
crc -= data[count - 5];
crc -= data[count - 6];
crc -= data[count - 7];
crc -= data[count - 8];
#endif
for (size_t i = 0; i < 4; i++) {
dataCrc[i] = (crc >> (8 * i)) & 0xFF;
}
// if (dataCrc[0] == data[count + 3]
// && dataCrc[1] == data[count + 2]
// && dataCrc[2] == data[count + 1]
// && dataCrc[3] == data[count + 0]) {
// return 1;
// }
if (dataCrc[0] == data[count - 5]
&& dataCrc[1] == data[count - 6]
&& dataCrc[2] == data[count - 7]
&& dataCrc[3] == data[count - 8]) {
return 1;
}
// pdebug(DEBUG_LEVEL_DEBUG, "dataCrc %x %x %x %x\n", dataCrc[0], dataCrc[1], dataCrc[2], dataCrc[3]);
// pdebug(DEBUG_LEVEL_DEBUG, "data %x %x %x %x\n", data[count - 5], data[count - 6], data[count - 7], data[count - 8]);
// pdebug(DEBUG_LEVEL_DEBUG, "dataUint %d\n", crc);
return 0;
}
uint8_t *checkCrc32_1(char *data, uint count)
{
uint crc = 0x00000000;
uint8_t dataCrc[4];
for (size_t i = 0; i < count; i++) {
crc += data[i];
}
// pdebug(DEBUG_LEVEL_DEBUG, "crc32 %d\n", crc);
#if 1
crc -= data[count - 5];
crc -= data[count - 6];
crc -= data[count - 7];
crc -= data[count - 8];
#endif
for (size_t i = 0; i < 4; i++) {
dataCrc[i] = (crc >> (8 * i)) & 0xFF;
}
return dataCrc;
}
/**
* @brief 解析json数据包
* @param
* @retval
*/
void ptz_tcp_json_process()
{
memcpy(tcp_rece_buff, &tcp_rece_buff[10], sizeof(tcp_rece_buff));
cJSON *jsonObj = cJSON_Parse(tcp_rece_buff);
if (jsonObj == NULL) {
pdebug(DEBUG_LEVEL_DEBUG, "Error parsing JSON\n");
return;
}
BSP_OS_SemWait(&tcp_data_mutex, 0u);
cJSON* item = cJSON_GetObjectItem(commondInfo, "ctrlID");
item->valuestring = cJSON_GetObjectItem(jsonObj, "ctrlID")->valuestring;
// pdebug(DEBUG_LEVEL_DEBUG, "down ctrlID %s\n", item->valuestring);
// pdebug(DEBUG_LEVEL_DEBUG, "up ctrlID %s\n", cJSON_GetObjectItem(jsonObj, "ctrlID")->valuestring);
// item = cJSON_GetObjectItem(commondInfo, "ctrlLog");
// item->valuestring = "";
uint16_t tempU16;
tempU16 = cJSON_GetObjectItem(jsonObj, "equipmentType")->valueint;
if (tempU16 != all
&& tempU16 != rotattable) {
item = cJSON_GetObjectItem(commondInfo, "ctrlState");
// item->valueint = 0;
cJSON_SetNumberValue(item, 0);
goto err;
}
tempU16 = cJSON_GetObjectItem(jsonObj, "equipmentID")->valueint;
if (tempU16 != Equipment_ID) {
item = cJSON_GetObjectItem(commondInfo, "ctrlState");
// item->valueint = 0;
cJSON_SetNumberValue(item, 0);
goto err;
}
item = cJSON_GetObjectItemCaseSensitive(jsonObj, "workState");
if (item) {
int workState = cJSON_GetObjectItem(jsonObj, "workState")->valueint;
if (workState == restart) {
// pdebug(DEBUG_LEVEL_DEBUG, "restart\n");
workStatus = restart;
}
else if (workState == startWork) {
// pdebug(DEBUG_LEVEL_DEBUG, "startWork\n");
workStatus = startWork;
}
else if (workState == standby) {
// pdebug(DEBUG_LEVEL_DEBUG, "standby\n");
workStatus = standby;
}
else {
item = cJSON_GetObjectItem(commondInfo, "ctrlState");
cJSON_SetNumberValue(item, 0);
// item->valueint = 0;
goto err;
}
item = cJSON_GetObjectItem(commondInfo, "ctrlState");
// item->valueint = 1;
cJSON_SetNumberValue(item, 1);
}
else {
if (workStatus != startWork) {
item = cJSON_GetObjectItem(commondInfo, "ctrlState");
// item->valueint = 0;
cJSON_SetNumberValue(item, 0);
// pdebug(DEBUG_LEVEL_DEBUG, "ctrlState : %d\n", cJSON_GetObjectItem(commondInfo, "ctrlState")->valueint);
goto err;
}
float tempFloat = cJSON_GetObjectItem(jsonObj, "curHorSpeed")->valuedouble;
g_ptz.hori_speed_control = tempFloat;
tempFloat = cJSON_GetObjectItem(jsonObj, "curHorAngle")->valuedouble;
g_ptz.hori_angle_control = tempFloat;
// pdebug(DEBUG_LEVEL_DEBUG, "hori speed:%f, angle:%f \n", g_ptz.hori_speed_control, g_ptz.hori_angle_actual);
ptz_hori_rotate_plan(PTZ_VERT_ANGLE);
g_ptz.hori_rotate_monitor_switch = PTZ_VERT_ANGLE;
tempFloat = cJSON_GetObjectItem(jsonObj, "curVerSpeed")->valuedouble;
// g_ptz.vert_speed_control = tempFloat / 60.0f;
g_ptz.vert_speed_control = tempFloat;
tempFloat = cJSON_GetObjectItem(jsonObj, "curVerAngle")->valuedouble;
g_ptz.vert_angle_control = tempFloat;
// pdebug(DEBUG_LEVEL_DEBUG, "vert speed:%f, angle:%f \n", g_ptz.vert_speed_control, g_ptz.vert_angle_control);
ptz_vert_rotate_plan(PTZ_VERT_ANGLE);
g_ptz.vert_rotate_monitor_switch = PTZ_VERT_ANGLE;
item = cJSON_GetObjectItem(commondInfo, "ctrlState");
// item->valueint = 1;
cJSON_SetNumberValue(item, 1);
}
err:
item = cJSON_GetObjectItem(equipmentBase, "spoofState");
if (workStatus == restart) {
item->valuestring = "初始化";
}
else if (workStatus == startWork) {
item->valuestring = "工作中";
}
else if (workStatus == standby) {
item->valuestring = "待机";
}
// pdebug(DEBUG_LEVEL_DEBUG, "ctrlState : %d\n", cJSON_GetObjectItem(commondInfo, "ctrlState")->valueint);
// item = cJSON_GetObjectItem(replySwitch, "commondInfo");
// pdebug(DEBUG_LEVEL_DEBUG, "ctrlState : %d\n", cJSON_GetObjectItem(item, "ctrlState")->valueint);
char *json = cJSON_PrintUnformatted(replyRoot);
// char *json = cJSON_PrintUnformatted(replyRoot);
// char *json = cJSON_PrintUnformatted(commondInfo);
// pdebug(DEBUG_LEVEL_DEBUG,"%s,%d\r\n", json, strlen(json));
// sprintf(tcp_send_buff, "%s%s%s", pack_head, json, pack_tail);
//包头
int len = 0;
// memcpy(tcp_send_buff + len, pack_head, 4);
tcp_send_buff[0] = pack_head[0];
tcp_send_buff[1] = pack_head[1];
tcp_send_buff[2] = pack_head[2];
tcp_send_buff[3] = pack_head[3];
//信息长度
len += 4;
int datalen = strlen(json) + 18;
tcp_send_buff[len] = (datalen >> 24) & 0xff;
tcp_send_buff[len + 1] = (datalen >> 16) & 0xff;
tcp_send_buff[len + 2] = (datalen >> 8) & 0xff;
tcp_send_buff[len + 3] = (datalen >> 0) & 0xff;
//设备类型
len += 4;
tcp_send_buff[len] = rotattable;
//设备类型
len += 1;
tcp_send_buff[len] = infoType;
//报文内容
len += 1;
memcpy(tcp_send_buff + len, json, strlen(json));
//报文尾
len += strlen(json);
len += 4;
// memcpy(tcp_send_buff + len, pack_tail, 4);
tcp_send_buff[len + 0] = pack_tail[0];
tcp_send_buff[len + 1] = pack_tail[1];
tcp_send_buff[len + 2] = pack_tail[2];
tcp_send_buff[len + 3] = pack_tail[3];
//crc校验
// len -= 4;
uint8_t *crcData;
crcData = checkCrc32_1(tcp_send_buff, len + 4);
// memcpy(tcp_send_buff + len, crcData, 4);
// tcp_send_buff[len + 0] = crcData[3];
// tcp_send_buff[len + 1] = crcData[2];
// tcp_send_buff[len + 2] = crcData[1];
// tcp_send_buff[len + 3] = crcData[0];
tcp_send_buff[len - 4] = crcData[3];
tcp_send_buff[len - 3] = crcData[2];
tcp_send_buff[len - 2] = crcData[1];
tcp_send_buff[len - 1] = crcData[0];
// len += 4;
// tcp_send_buff[len] = '\r';
len += 4;
tcp_send_buff[len] = '\n';
send_tcp_data(tcp_send_buff, len + 1);
// tcp_send_buff[len] = '\n';
// send_tcp_data(tcp_send_buff, len + 2);
// pdebug(DEBUG_LEVEL_DEBUG,"%s\r\n", tcp_send_buff);
cJSON_free(json);
cJSON_Delete(jsonObj);
BSP_OS_SemPost(&tcp_data_mutex);
if (workStatus == restart) {
OSTimeDlyHMSM(0u, 0u, 1u, 200u);
NVIC_SystemReset();
while(1);
}
}
/**
* @brief 通过该函数完成数据包解析
* @param
* @retval
*/
void ptz_tcp_data_pack_process(void)
{
static uint8_t flag = wait;
static int frameLength = 0;
if (flag == wait) {
if (tcp_recvData_len < 4) {
return;
}
if (tcp_rece_buff[0] == pack_head[0]
&& tcp_rece_buff[1] == pack_head[1]
&& tcp_rece_buff[2] == pack_head[2]
&& tcp_rece_buff[3] == pack_head[3]) {
flag = packHead;
}
else {
tcp_recvData_len = 0;
return;
}
}
if (flag == packHead) {
if (tcp_recvData_len < 8) {
return;
}
frameLength = (tcp_rece_buff[4] << 24) | (tcp_rece_buff[5] << 16)
| (tcp_rece_buff[6] << 8) | tcp_rece_buff[7];
flag = packDataLen;
}
if (flag == packDataLen) {
if (tcp_recvData_len < 9) {
flag = wait;
return;
}
if (tcp_rece_buff[8] == all
|| tcp_rece_buff[8] == rotattable) {
flag = deviceType;
}
else {
pdebug(DEBUG_LEVEL_INFO, "deviceType error 0x%x\n", tcp_rece_buff[8]);
flag = wait;
tcp_recvData_len = 0;
return;
}
}
if (flag == deviceType) {
if (tcp_recvData_len < 10) {
flag = wait;
return;
}
if (tcp_rece_buff[9] == parameterType
|| tcp_rece_buff[9] == switchType) {
infoType = tcp_rece_buff[9];
flag = dataType;
}
else {
pdebug(DEBUG_LEVEL_INFO, "dataType error 0x%x\n", tcp_rece_buff[9]);
flag = wait;
tcp_recvData_len = 0;
return;
}
}
if (flag == dataType) {
if (tcp_recvData_len < frameLength - 8) {
flag = wait;
return;
}
flag = messageContent;
}
if (flag == messageContent) {
if (tcp_recvData_len < frameLength) {
flag = wait;
return;
}
if (tcp_rece_buff[frameLength - 4] != pack_tail[0]
|| tcp_rece_buff[frameLength - 3] != pack_tail[1]
|| tcp_rece_buff[frameLength - 2] != pack_tail[2]
|| tcp_rece_buff[frameLength - 1] != pack_tail[3]) {
flag = wait;
tcp_recvData_len = 0;
return;
}
if (!checkCrc32(tcp_rece_buff, frameLength)) {
tcp_recvData_len = 0;
flag = wait;
return;
}
flag = success;
}
if (flag == success) {
// tcp_recvData_len -= frameLength;
ptz_tcp_json_process();
}
flag = wait;
}
void task_ptz_tcp_client(void)
{
int ret_len;
while (1) {
if (ptz_tcp_communicaton == PTZ_CONNECT_STATE_DEAD) {
tcp_sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (tcp_sock_fd == -1) {
OSTimeDlyHMSM(0u, 0u, 0u, 50u);
continue;
}
// // 设置为非阻塞
// int flags = fcntl(tcp_sock_fd, F_GETFL, 0);
// fcntl(tcp_sock_fd, F_SETFL, flags | O_NONBLOCK);
// struct sockaddr_in client_addr;
// memset(&client_addr, 0, sizeof(struct sockaddr_in));
// client_addr.sin_family = AF_INET;
// client_addr.sin_port = htons(TCP_CLIENT_PORT); // 指定端口号
// client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// if (bind(tcp_sock_fd, (struct sockaddr *)&client_addr, sizeof(client_addr)) == -1) {
// OSTimeDlyHMSM(0u, 0u, 0u, 50u);
// close(tcp_sock_fd);
// continue;
// }
struct sockaddr_in saddr;
memset(&saddr, 0, sizeof(struct sockaddr_in));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(TCP_PORT);
saddr.sin_addr.s_addr = inet_addr(TCP_IP);
if (connect(tcp_sock_fd, (struct sockaddr*)&saddr, sizeof(saddr)) == -1) {
OSTimeDlyHMSM(0u, 0u, 0u, 50u);
close(tcp_sock_fd);
continue;
}
m_tcp_auto_return.swtich = PTZ_AUTO_RETURN_ON;
ptz_tcp_communicaton = PTZ_CONNECT_STATE_SUCCESS;
// pdebug(DEBUG_LEVEL_DEBUG, "tcp connect success \n");
}
else if (ptz_tcp_communicaton == PTZ_CONNECT_STATE_SUCCESS) {
// // memset(tcp_rece_buff, 0x00, sizeof(tcp_rece_buff));//'\0'
ret_len = recv(tcp_sock_fd, tcp_rece_buff, sizeof(tcp_rece_buff), 0);
if (ret_len <= 0) {
close(tcp_sock_fd);
m_tcp_auto_return.swtich = PTZ_AUTO_RETURN_OFF;
ptz_tcp_communicaton = PTZ_CONNECT_STATE_DEAD;
}
if (ret_len > 0) {
tcp_recvData_len = ret_len;
ptz_tcp_data_pack_process();
// send_tcp_data(tcp_rece_buff, ret_len);
ret_len = 0;
}
}
OSTimeDlyHMSM(0u, 0u, 0u, 50u);
}
}
/**
* @brief 通过该函数完成tcp数据发送
* @param
* @retval
*/
void send_tcp_data(char *data, int len)
{
BSP_OS_SemWait(&tcp_send_data_mutex, 0u);
if(ptz_tcp_communicaton == PTZ_CONNECT_STATE_SUCCESS){
int ret = send(tcp_sock_fd, data, len, 0);
if (ret == -1) {
ptz_tcp_communicaton = PTZ_CONNECT_STATE_FAILED;
close(tcp_sock_fd);
}
}
BSP_OS_SemPost(&tcp_send_data_mutex);
}
static void task_ptz_tcp_server()
{
#if 0
ptz_tcp_communicaton == PTZ_CONNECT_STATE_DEAD;
/* 初始化套接字 */
while (1) {
// ptz_sock_fd = CreateTCPClientSock();
tcp_sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (tcp_sock_fd == -1) {
// ptz_communicaton = PTZ_CONNECT_STATE_FAILED;
// close(tcp_sock_fd);
OSTimeDlyHMSM(0u, 0u, 0u, 50u);
continue;
}
// // 设置为非阻塞
// int flags = fcntl(tcp_sock_fd, F_GETFL, 0);
// fcntl(tcp_sock_fd, F_SETFL, flags | O_NONBLOCK);
// 设置服务器端ip和端口号
memset(&tcp_local, 0, sizeof(struct sockaddr_in));
tcp_local.sin_family = AF_INET;
tcp_local.sin_port = htons(TCP_PORT);
tcp_local.sin_addr.s_addr = INADDR_ANY;
// 绑定本地信息
if (-1 == bind(tcp_sock_fd, (struct sockaddr*)&tcp_local, sizeof(struct sockaddr_in))) {
close(tcp_sock_fd);
OSTimeDlyHMSM(0u, 0u, 0u, 50u);
continue;
}
// 监听端口
if (-1 == listen(tcp_sock_fd, 1)) {
close(tcp_sock_fd);
OSTimeDlyHMSM(0u, 0u, 0u, 50u);
continue;
}
break;
}
while(1) {
if (ptz_tcp_communicaton == PTZ_CONNECT_STATE_DEAD) {
pdebug(DEBUG_LEVEL_INFO,"accept start\r\n");
size_t client_len = sizeof(tcp_from);
tcp_accept_fd = accept(tcp_sock_fd, (struct sockaddr*)&tcp_from, &client_len);
if (tcp_accept_fd == -1) {
pdebug(DEBUG_LEVEL_ERROR,"accept error\r\n");
continue;
}
pdebug(DEBUG_LEVEL_INFO,"accept success\r\n");
ptz_tcp_communicaton = PTZ_CONNECT_STATE_SUCCESS;
m_tcp_auto_return.swtich = PTZ_AUTO_RETURN_ON;
}
else {
memset(tcp_rece_buff, 0x00, sizeof(tcp_rece_buff));//'\0'
int ret_len = read(tcp_accept_fd, tcp_rece_buff, sizeof(tcp_rece_buff));
}
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
}
#endif
}
void tcpInit(void)
{
setEquipmentID(g_ptz.address);
sendJsonInit();
BSP_OS_SemCreate(&tcp_send_data_mutex, 1u, "tcp_send_data_mutex");
BSP_OS_SemCreate(&tcp_data_mutex, 1u, "tcp_data_mutex");
CPU_INT08U task_err;
CPU_INT08U name_err;
task_err = OSTaskCreateExt((void (*)(void *)) task_ptz_tcp_client,
(void *) 0,
(OS_STK *)&task_ptz_tcp_server_stk[TASK_PTZ_TCP_SERVER_STK_SIZE - 1],
(INT8U ) TASK_PTZ_TCP_SERVER_PRIO,
(INT16U ) TASK_PTZ_TCP_SERVER_PRIO,
(OS_STK *)&task_ptz_tcp_server_stk[0],
(INT32U ) TASK_PTZ_TCP_SERVER_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_PTZ_TCP_SERVER_PRIO, "task_ptz_tcp_server", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create task_ptz_tcp_server success\r\n");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create task_ptz_tcp_server failed\r\n");
}
task_err = OSTaskCreateExt((void (*)(void *)) ptz_tcp_returnDataTask,
(void *) 0,
(OS_STK *)&task_ptz_tcp_autoreturn_stk[TASK_PTZ_TCP_AUTORETURN_STK_SIZE - 1],
(INT8U ) TASK_PTZ_TCP_AUTORETURN_PRIO,
(INT16U ) TASK_PTZ_TCP_AUTORETURN_PRIO,
(OS_STK *)&task_ptz_tcp_autoreturn_stk[0],
(INT32U ) TASK_PTZ_TCP_AUTORETURN_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_EN > 0)
OSTaskNameSet(TASK_PTZ_TCP_AUTORETURN_PRIO, "task_ptz_tcp_autoReturn", &name_err);
#endif
if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) {
pdebug(DEBUG_LEVEL_INFO,"create task_ptz_tcp_autoReturn success\r\n");
} else {
pdebug(DEBUG_LEVEL_FATAL,"create task_ptz_tcp_autoReturn failed\r\n");
}
}
/**
* @brief 初始化发送json
* @param
* @retval
*/
void sendJsonInit(void)
{
replyRoot = cJSON_CreateObject();
// replySwitch = cJSON_CreateObject();
equipmentBase = cJSON_CreateObject();
// equipmentBase2 = cJSON_CreateObject();
commondInfo = cJSON_CreateObject();
SystemInfo = cJSON_CreateObject();
// cJSON_AddNumberToObject(equipmentBase1, "equipmentType", rotattable);
// cJSON_AddNumberToObject(equipmentBase1, "equipmentID", Equipment_ID);
// cJSON_AddNumberToObject(equipmentBase1, "nodeNo", nodeNo);
// cJSON_AddStringToObject(equipmentBase1, "spoofState", "工作中");
// cJSON_AddStringToObject(equipmentBase1, "errLog", "");
cJSON_AddNumberToObject(equipmentBase, "equipmentType", rotattable);
cJSON_AddNumberToObject(equipmentBase, "equipmentID", Equipment_ID);
cJSON_AddNumberToObject(equipmentBase, "nodeNo", nodeNo);
cJSON_AddStringToObject(equipmentBase, "spoofState", "工作中");
cJSON_AddStringToObject(equipmentBase, "errLog", "");
cJSON_AddStringToObject(commondInfo, "ctrlID", "xxxxxxxxxx");
cJSON_AddNumberToObject(commondInfo, "ctrlState", 0x01);
cJSON_AddStringToObject(commondInfo, "ctrlLog", "");
// cJSON_AddNumberToObject(SystemInfo, "curHorAngle", g_ptz.hori_angle_actual);
// cJSON_AddNumberToObject(SystemInfo, "curHorSpeed", g_ptz.hori_speed_actual);
// cJSON_AddNumberToObject(SystemInfo, "curVerAngle", g_ptz.vert_angle_actual);
// cJSON_AddNumberToObject(SystemInfo, "curVerSpeed", g_ptz.vert_speed_actual);
cJSON_AddNumberToObject(SystemInfo, "curHorAngle", 0.0f);
cJSON_AddNumberToObject(SystemInfo, "curHorSpeed", 0.0f);
cJSON_AddNumberToObject(SystemInfo, "curVerAngle", 0.0f);
cJSON_AddNumberToObject(SystemInfo, "curVerSpeed", 0.0f);
cJSON_AddItemToObject(replyRoot, "equipmentBase", equipmentBase);
cJSON_AddItemToObject(replyRoot, "SystemInfo", SystemInfo);
cJSON_AddItemToObject(replyRoot, "commondInfo", commondInfo);
// cJSON_AddItemToObject(replySwitch, "equipmentBase", equipmentBase2);
// cJSON_AddItemToObject(replySwitch, "commondInfo", commondInfo);
}
/**
* @brief 处理需要tcp返回的数据
* @param
* @retval
*/
static void ptz_tcp_returnData()
{
#if 0
cJSON* item = cJSON_GetObjectItem(root, "level_curAngle");
if (item != NULL && cJSON_IsNumber(item)) {
item->valuedouble = g_ptz.hori_angle_actual;
}
item = cJSON_GetObjectItem(root, "level_curSpeed");
if (item != NULL && cJSON_IsNumber(item)) {
item->valuedouble = g_ptz.hori_direction_actual;
}
item = cJSON_GetObjectItem(root, "pitch_curAngle");
if (item != NULL && cJSON_IsNumber(item)) {
item->valuedouble = g_ptz.vert_angle_actual;
}
item = cJSON_GetObjectItem(root, "level_curSpeed");
if (item != NULL && cJSON_IsNumber(item)) {
item->valuedouble = g_ptz.vert_speed_actual;
}
#endif
BSP_OS_SemWait(&tcp_data_mutex, 0u);
#if 1
cJSON* item = cJSON_GetObjectItem(SystemInfo, "curHorAngle");
item->valuedouble = g_ptz.hori_angle_actual;
item = cJSON_GetObjectItem(SystemInfo, "curHorSpeed");
item->valuedouble = g_ptz.hori_speed_actual * 6.0f;
item = cJSON_GetObjectItem(SystemInfo, "curVerAngle");
item->valuedouble = g_ptz.vert_angle_actual;
item = cJSON_GetObjectItem(SystemInfo, "curVerSpeed");
item->valuedouble = g_ptz.vert_speed_actual * 6.0f;
#endif
char *json = cJSON_PrintUnformatted(replyRoot);
// char *json = cJSON_PrintUnformatted(SystemInfo);
pdebug(DEBUG_LEVEL_DEBUG,"\n%s,%d\n", json, strlen(json));
// sprintf(tcp_send_buff, "%s%s%s", pack_head, json, pack_tail);
//包头
int len = 0;
// memcpy(tcp_send_buff + len, pack_head, 4);
tcp_send_buff[0] = pack_head[0];
tcp_send_buff[1] = pack_head[1];
tcp_send_buff[2] = pack_head[2];
tcp_send_buff[3] = pack_head[3];
//信息长度
len += 4;
int datalen = strlen(json) + 18;
tcp_send_buff[len] = (datalen >> 24) & 0xff;
tcp_send_buff[len + 1] = (datalen >> 16) & 0xff;
tcp_send_buff[len + 2] = (datalen >> 8) & 0xff;
tcp_send_buff[len + 3] = (datalen >> 0) & 0xff;
//设备类型
len += 4;
tcp_send_buff[len] = rotattable;
//设备类型
len += 1;
tcp_send_buff[len] = infoType;
//报文内容
len += 1;
memcpy(tcp_send_buff + len, json, strlen(json));
//报文尾
len += strlen(json);
len += 4;
// memcpy(tcp_send_buff + len, pack_tail, 4);
tcp_send_buff[len + 0] = pack_tail[0];
tcp_send_buff[len + 1] = pack_tail[1];
tcp_send_buff[len + 2] = pack_tail[2];
tcp_send_buff[len + 3] = pack_tail[3];
//crc校验
// len -= 4;
uint8_t *crcData;
crcData = checkCrc32_1(tcp_send_buff, len + 4);
// memcpy(tcp_send_buff + len, crcData, 4);
// tcp_send_buff[len + 0] = crcData[3];
// tcp_send_buff[len + 1] = crcData[2];
// tcp_send_buff[len + 2] = crcData[1];
// tcp_send_buff[len + 3] = crcData[0];
tcp_send_buff[len - 4] = crcData[3];
tcp_send_buff[len - 3] = crcData[2];
tcp_send_buff[len - 2] = crcData[1];
tcp_send_buff[len - 1] = crcData[0];
len += 4;
// tcp_send_buff[len + 4] = '\r';
tcp_send_buff[len] = '\n';
// send_tcp_data(tcp_send_buff, len + 1);
// pdebug(DEBUG_LEVEL_DEBUG,"%s\r\n", tcp_send_buff);
cJSON_free(json);
BSP_OS_SemPost(&tcp_data_mutex);
}
/**
* @brief 通过tcp将数据自动返回
* @param
* @retval
*/
void ptz_tcp_autoReturn(void)
{
if (m_tcp_auto_return.swtich == PTZ_AUTO_RETURN_ON) {
m_tcp_auto_return.timer += PTZ_AUTO_RETURN_TASK_TIME;
if (m_tcp_auto_return.timer >= m_tcp_auto_return.time &&
m_tcp_auto_return.timer >= PTZ_CURRENT_AUTO_RETURN_TIME_MIN) {
m_tcp_auto_return.timer = 0;
// ptz_current_auto_return(PTZ_UDP);
ptz_tcp_returnData();
OSTimeDlyHMSM(0u, 0u, 0u, 1u);
}
}
}
void ptz_tcp_returnDataTask(void)
{
while (1) {
// ptz_tcp_autoReturn();
if (m_tcp_auto_return.swtich == PTZ_AUTO_RETURN_ON) {
if (workStatus != startWork) {
OSTimeDlyHMSM(0u, 0u, 0u, PTZ_AUTO_RETURN_TASK_TIME);
continue;
}
m_tcp_auto_return.timer += PTZ_AUTO_RETURN_TASK_TIME;
if (m_tcp_auto_return.timer >= m_tcp_auto_return.time &&
m_tcp_auto_return.timer >= PTZ_CURRENT_AUTO_RETURN_TIME_MIN) {
m_tcp_auto_return.timer = 0;
ptz_tcp_returnData();
}
}
OSTimeDlyHMSM(0u, 0u, 0u, PTZ_AUTO_RETURN_TASK_TIME);
}
}