MW22-02A/APP/Device/Device_angle/angle_zerooffset.c

383 lines
13 KiB
C
Raw Permalink 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 "ptz_header_file.h"
#include "angle_zerooffset.h"
///计算角度偏移量的效验码
unsigned int ptz_zero_offset_angle_crc(PtzZeroOffsetAngle offset)
{
float crc = 0;
unsigned int crc1 = 0;
crc = crc + offset.hori_zero_offset_angle;
crc = crc + offset.vert_zero_offset_angle;
crc = crc + offset.hori_offset_switch;
crc = crc + offset.vert_offset_switch;
crc1 = (unsigned int)crc;
return crc1;
}
///存储角度偏移量
char ptz_zero_offset_angle_save()
{
PtzZeroOffsetAngle zero_offset_angle;
PtzZeroOffsetAngle zero_offset_angle_a;
char i,j;
//复制数据
memcpy(&zero_offset_angle, &g_ptz.offset_angle, sizeof(zero_offset_angle));
if(g_ptz.offset_angle.hori_offset_switch == 2)
{
zero_offset_angle.hori_offset_switch = 1;
}
if(g_ptz.offset_angle.vert_offset_switch == 2)
{
zero_offset_angle.vert_offset_switch = 1;
}
//计算效验码
zero_offset_angle.crc = ptz_zero_offset_angle_crc(zero_offset_angle);
//写入主存储区
for(i = 0; i < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM; i++)
{
memset(&zero_offset_angle_a, 0, sizeof(zero_offset_angle_a));
write_many_data(sizeof(zero_offset_angle),(unsigned char *)(&zero_offset_angle),ZERO_OFFSET_ANGLE_FLASH_ADD);
asm("nop");
asm("nop");
Flash_Read((unsigned char *)(&zero_offset_angle_a),ZERO_OFFSET_ANGLE_FLASH_ADD,sizeof(zero_offset_angle_a));
if(memcmp(&zero_offset_angle, &zero_offset_angle_a, sizeof(zero_offset_angle)) == 0)//判断写入数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
//写入备份存储区
for(j = 0; j < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM; j++)
{
memset(&zero_offset_angle_a, 0, sizeof(zero_offset_angle_a));
write_many_data(sizeof(zero_offset_angle),(unsigned char *)(&zero_offset_angle),ZERO_OFFSET_ANGLE_BACKUP_FLASH_ADD);
asm("nop");
asm("nop");
Flash_Read((unsigned char *)(&zero_offset_angle_a),ZERO_OFFSET_ANGLE_BACKUP_FLASH_ADD,sizeof(zero_offset_angle_a));
if(memcmp(&zero_offset_angle, &zero_offset_angle_a, sizeof(zero_offset_angle)) == 0)//判断写入数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
if(i < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM || j < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM)//判断写入数据是否成功
{
//写入成功
return 1;
}
//写入失败
return 0;
}
///读取角度偏移量***初始化在get_angle.c中
char ptz_zero_offset_angle_read()
{
PtzZeroOffsetAngle zero_offset_angle;
char i,j;
//首先从主存储区读取数据
for(i = 0; i < ZERO_OFFSET_ANGLE_READ_FLASH_NUM; i++)
{
memset(&zero_offset_angle, 0, sizeof(zero_offset_angle));
Flash_Read((unsigned char *)(&zero_offset_angle),ZERO_OFFSET_ANGLE_FLASH_ADD,sizeof(zero_offset_angle));
if(zero_offset_angle.crc == ptz_zero_offset_angle_crc(zero_offset_angle))
{
g_ptz.offset_angle.hori_zero_offset_angle = zero_offset_angle.hori_zero_offset_angle;
g_ptz.offset_angle.vert_zero_offset_angle = zero_offset_angle.vert_zero_offset_angle;
g_ptz.offset_angle.hori_offset_switch = zero_offset_angle.hori_offset_switch;
g_ptz.offset_angle.vert_offset_switch = zero_offset_angle.vert_offset_switch;
if(g_ptz.offset_angle.hori_offset_switch == 1)
{
g_ptz.offset_angle.hori_offset_switch = 2;
}
else
{
g_ptz.offset_angle.hori_offset_switch = 0;
}
if(g_ptz.offset_angle.vert_offset_switch == 1)
{
g_ptz.offset_angle.vert_offset_switch = 2;
}
else
{
g_ptz.offset_angle.vert_offset_switch = 0;
}
return 1;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
//如果主存储区读取的数据是错误的,则从备份存储区读取数据
for(j = 0; j < ZERO_OFFSET_ANGLE_READ_FLASH_NUM; j++)
{
memset(&zero_offset_angle, 0, sizeof(zero_offset_angle));
Flash_Read((unsigned char *)(&zero_offset_angle),ZERO_OFFSET_ANGLE_BACKUP_FLASH_ADD,sizeof(zero_offset_angle));
if(zero_offset_angle.crc == ptz_zero_offset_angle_crc(zero_offset_angle))
{
g_ptz.offset_angle.hori_zero_offset_angle = zero_offset_angle.hori_zero_offset_angle;
g_ptz.offset_angle.vert_zero_offset_angle = zero_offset_angle.vert_zero_offset_angle;
g_ptz.offset_angle.hori_offset_switch = zero_offset_angle.hori_offset_switch;
g_ptz.offset_angle.vert_offset_switch = zero_offset_angle.vert_offset_switch;
if(g_ptz.offset_angle.hori_offset_switch == 1)
{
g_ptz.offset_angle.hori_offset_switch = 2;
}
else
{
g_ptz.offset_angle.hori_offset_switch = 0;
}
if(g_ptz.offset_angle.vert_offset_switch == 1)
{
g_ptz.offset_angle.vert_offset_switch = 2;
}
else
{
g_ptz.offset_angle.vert_offset_switch = 0;
}
return 1;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
return 0;
}
//擦除角度偏移量
char ptz_zero_offset_angle_erase()
{
char i, j;
PtzZeroOffsetAngle zero_offset_angle;
PtzZeroOffsetAngle zero_offset_angle_a;
memset(&zero_offset_angle_a, 0, sizeof(zero_offset_angle_a));
memset(&zero_offset_angle, 0, sizeof(zero_offset_angle));
//擦除主存储区
for(i = 0; i < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM; i++)
{
memset(&zero_offset_angle_a, 0, sizeof(zero_offset_angle_a));
write_many_data(sizeof(zero_offset_angle),(unsigned char *)(&zero_offset_angle),ZERO_OFFSET_ANGLE_FLASH_ADD);
asm("nop");
asm("nop");
Flash_Read((unsigned char *)(&zero_offset_angle_a),ZERO_OFFSET_ANGLE_FLASH_ADD,sizeof(zero_offset_angle_a));
if(memcmp(&zero_offset_angle, &zero_offset_angle_a, sizeof(zero_offset_angle)) == 0)//判断擦除数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
//擦除备份存储区
for(j = 0; j < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM; j++)
{
memset(&zero_offset_angle_a, 0, sizeof(zero_offset_angle_a));
write_many_data(sizeof(zero_offset_angle),(unsigned char *)(&zero_offset_angle),ZERO_OFFSET_ANGLE_BACKUP_FLASH_ADD);
asm("nop");
asm("nop");
Flash_Read((unsigned char *)(&zero_offset_angle_a),ZERO_OFFSET_ANGLE_BACKUP_FLASH_ADD,sizeof(zero_offset_angle_a));
if(memcmp(&zero_offset_angle, &zero_offset_angle_a, sizeof(zero_offset_angle)) == 0)//判断擦除数据是否正确
{
break;
}
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
}
if(i < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM || j < ZERO_OFFSET_ANGLE_SAVE_FLASH_NUM)//判断擦除数据是否成功
{
//擦除成功
return 1;
}
//擦除失败
return 0;
}
//偏移角度数据回传
void ptz_zero_offset_angle_return(char dev)
{
unsigned short int uint16_angle;
unsigned char data[7];
//读取保存的偏移量
ptz_zero_offset_angle_read();
uint16_angle = (unsigned short int)(g_ptz.offset_angle.hori_zero_offset_angle * 100 + 0.5);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x3e;
data[3] = PTZ_HORI;//0x07;//PTZ_HORI;//水平偏移角度
data[4] = (u_int16_t)(uint16_angle >> 8);
data[5] = (u_int16_t)(uint16_angle & 0x00ff);
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
OSTimeDlyHMSM(0u, 0u, 0u, 10u);
uint16_angle = (unsigned short int)(g_ptz.offset_angle.vert_zero_offset_angle * 100 + 0.5);
data[0] = 0xff;
data[1] = g_ptz.address;
data[2] = 0x3e;
data[3] = PTZ_VERT;//0x08;//PTZ_VERT;//垂直偏移角度
data[4] = (u_int16_t)(uint16_angle >> 8);
data[5] = (u_int16_t)(uint16_angle & 0x00ff);
data[6] = MotorCalPelcoDSUM(data,sizeof(data));
ptz_send_data(dev, data, sizeof(data));
}
//设置零位偏移
void ptz_zero_offset_angle_set(char dev, PTZ_DATA_PACK *pack)
{
int16_t int16_angle;
switch(pack->command[1])
{
case 1://视频设置水平0位
g_ptz.offset_angle.hori_zero_offset_angle = g_ptz.hori_angle_actual_a;
g_ptz.offset_angle.hori_offset_switch = 1;
g_ptz.offset_angle.crc = ptz_zero_offset_angle_crc(g_ptz.offset_angle);
if(ptz_zero_offset_angle_save() == 1)
{
ptz_reply(dev, CMD_RIGHT);
g_ptz.offset_angle.hori_offset_switch = 2;
}
else
{
ptz_reply(dev, CMD_FAIL);
}
break;
case 2://视频设置垂直0位
g_ptz.offset_angle.vert_zero_offset_angle = g_ptz.vert_angle_actual_a;
g_ptz.offset_angle.vert_offset_switch = 1;
g_ptz.offset_angle.crc = ptz_zero_offset_angle_crc(g_ptz.offset_angle);
if(ptz_zero_offset_angle_save() == 1)
{
ptz_reply(dev, CMD_RIGHT);
g_ptz.offset_angle.vert_offset_switch = 2;
}
else
{
ptz_reply(dev, CMD_FAIL);
}
if(g_ptz.offset_angle.vert_offset_switch == 2)
{
g_ptz.vert_angleP.angle_allow_min = g_ptz.vert_angleP.angle_range / 2.0 * (-1);
g_ptz.vert_angleP.angle_allow_max = g_ptz.vert_angleP.angle_range / 2.0;
g_ptz.vert_angleP.angle_allow_min =
g_ptz.vert_angleP.angle_allow_min - g_ptz.offset_angle.vert_zero_offset_angle;
g_ptz.vert_angleP.angle_allow_max =
g_ptz.vert_angleP.angle_allow_max - g_ptz.offset_angle.vert_zero_offset_angle;
}
break;
case 3://视频同时设置水平0位和垂直0位
g_ptz.offset_angle.hori_zero_offset_angle = g_ptz.hori_angle_actual_a;
g_ptz.offset_angle.hori_offset_switch = 1;
g_ptz.offset_angle.vert_zero_offset_angle = g_ptz.vert_angle_actual_a;
g_ptz.offset_angle.vert_offset_switch = 1;
g_ptz.offset_angle.crc = ptz_zero_offset_angle_crc(g_ptz.offset_angle);
if(ptz_zero_offset_angle_save() == 1)
{
ptz_reply(dev, CMD_RIGHT);
g_ptz.offset_angle.hori_offset_switch = 2;
g_ptz.offset_angle.vert_offset_switch = 2;
}
else
{
ptz_reply(dev, CMD_FAIL);
}
if(g_ptz.offset_angle.vert_offset_switch == 2)
{
g_ptz.vert_angleP.angle_allow_min = g_ptz.vert_angleP.angle_range / 2.0 * (-1);
g_ptz.vert_angleP.angle_allow_max = g_ptz.vert_angleP.angle_range / 2.0;
g_ptz.vert_angleP.angle_allow_min =
g_ptz.vert_angleP.angle_allow_min - g_ptz.offset_angle.vert_zero_offset_angle;
g_ptz.vert_angleP.angle_allow_max =
g_ptz.vert_angleP.angle_allow_max - g_ptz.offset_angle.vert_zero_offset_angle;
}
break;
case 4://通过发送水平角度设置水平0位
g_ptz.offset_angle.hori_zero_offset_angle =
((pack->data[0] << 8) | pack->data[1]) / 100.0;
g_ptz.offset_angle.hori_offset_switch = 1;
g_ptz.offset_angle.crc = ptz_zero_offset_angle_crc(g_ptz.offset_angle);
if(ptz_zero_offset_angle_save() == 1)
{
ptz_reply(dev, CMD_RIGHT);
g_ptz.offset_angle.hori_offset_switch = 2;
}
else
{
ptz_reply(dev, CMD_FAIL);
}
break;
case 5://通过发送垂直角度设置垂直0位
int16_angle = (pack->data[0] << 8) | pack->data[1];
g_ptz.offset_angle.vert_zero_offset_angle = int16_angle / 100.0;
g_ptz.offset_angle.vert_offset_switch = 1;
g_ptz.offset_angle.crc = ptz_zero_offset_angle_crc(g_ptz.offset_angle);
if(ptz_zero_offset_angle_save() == 1)
{
ptz_reply(dev, CMD_RIGHT);
g_ptz.offset_angle.vert_offset_switch = 2;
}
else
{
ptz_reply(dev, CMD_FAIL);
}
if(g_ptz.offset_angle.vert_offset_switch == 2)
{
g_ptz.vert_angleP.angle_allow_min = g_ptz.vert_angleP.angle_range / 2.0 * (-1);
g_ptz.vert_angleP.angle_allow_max = g_ptz.vert_angleP.angle_range / 2.0;
g_ptz.vert_angleP.angle_allow_min =
g_ptz.vert_angleP.angle_allow_min - g_ptz.offset_angle.vert_zero_offset_angle;
g_ptz.vert_angleP.angle_allow_max =
g_ptz.vert_angleP.angle_allow_max - g_ptz.offset_angle.vert_zero_offset_angle;
}
break;
case 6://删除基准0位偏移量恢复初始0位
if(ptz_zero_offset_angle_erase() == 1)
{
g_ptz.offset_angle.hori_offset_switch = 0;
g_ptz.offset_angle.vert_offset_switch = 0;
g_ptz.offset_angle.crc = ptz_zero_offset_angle_crc(g_ptz.offset_angle);
ptz_reply(dev, CMD_RIGHT);
}
else
{
ptz_reply(dev, CMD_FAIL);
}
g_ptz.vert_angleP.angle_allow_min =
g_ptz.vert_angleP.angle_range / 2.0 * (-1);
g_ptz.vert_angleP.angle_allow_max =
g_ptz.vert_angleP.angle_range / 2.0;
break;
}
}
//查询偏移