954 lines
28 KiB
C
954 lines
28 KiB
C
|
#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);
|
|||
|
}
|
|||
|
}
|