MW22-02A/APP/Common/comm_cfginfo.c

1359 lines
45 KiB
C
Raw Normal View History

2025-05-21 01:55:40 +00:00
#include "comm_cfginfo.h"
#include "getcfg.h"
#include "bsp_ser.h"
#include "check.h"
#include "w25q128.h"
#include "Lan8720.h"
#include "stdlib.h"
#include "ptz_struct.h"
u_int8_t g_device_local_ip[21];
u_int8_t g_device_mac[21];
u_int8_t g_device_netmask[21];
u_int8_t g_device_gateway[21];
system_cfg_info system_info;
static int ipStrValid( const char * str_ip,u_int8_t *rvalue);
static int macStrValid( const char * str_ip,u_int8_t *rvalue);
/******************************************************************************
** config.c
**
**
******************************************************************************/
static u_int8_t config_buff[1500];
/******************************************************************************
** read_config_file
** flash中读ini文件
**
******************************************************************************/
static BOOL read_config_file(void)
{
if (!app_crc_OK(HY_PKG_TYPE_CFG_FILE)){//校验失败
memset(system_info.cmd_id, 0x30, sizeof(system_info.cmd_id));
pdebug(DEBUG_LEVEL_FATAL,"read config file failed\n\r");
return FALSE;
}
if (!pack_head_verify(HY_PKG_TYPE_CFG_FILE)){//检查包头数据有效性
pdebug(DEBUG_LEVEL_FATAL,"read config file failed\n\r");
return FALSE;
}
return TRUE;
}
/******************************************************************************
** get_system_config_from_file(void)
**
**
******************************************************************************/
BOOL get_system_config_from_file(void)
{
unsigned long ret =1;
// Flash_GPIO_Init();
Exit4ByteAddrMode();
//初次上电或擦除flash之后会获取失败导致自检初始化时无法判断。
// if (!read_config_file())
// return FALSE;
read_config_file();
// pdebug(DEBUG_LEVEL_INFO,"get hyt_config:\n\r");
//host_mk60_cfg
// pdebug(DEBUG_LEVEL_INFO,"[host_mk60_cfg]\n\r");
//硬件版本号
ret = GetConfigFromBuf("host_mk60_cfg",
"hardwarever",
"00000000000000",
(char *)system_info.hardware_version,
sizeof(system_info.hardware_version),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get hardwarever failed\n\r");
}else{
pdebug(DEBUG_LEVEL_INFO,"hardwarever: %s\n\r",system_info.hardware_version);
}
//公司出厂唯一CMDid号
ret = GetConfigFromBuf("host_mk60_cfg",
"cmd_id",
"HY_OLMS_000000000",
(char *)system_info.cmd_id,//终端id
sizeof(system_info.cmd_id),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get cmd_id failed\n\r");
}else{
pdebug(DEBUG_LEVEL_INFO,"cmd_id: %s\n\r",system_info.cmd_id);
}
//公司出厂唯一被监测设备id号
ret = GetConfigFromBuf("host_mk60_cfg",
"component_id",
"HY_OLMS_000000000",
(char *)system_info.component_id,
sizeof(system_info.component_id),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get component_id failed\n\r");
}else{
pdebug(DEBUG_LEVEL_INFO,"component_id: %s\n\r",system_info.component_id);
}
//local
pdebug(DEBUG_LEVEL_INFO,"[local]\n\r");
ret = GetConfigFromBuf("local",
"ip",
"192.168.8.200",
(char *)g_device_local_ip,
sizeof(g_device_local_ip),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get local_ip failed,default value: %s\n\r",g_device_local_ip);
ipStrValid((const char *)g_device_local_ip,g_local_ip);
}else{
pdebug(DEBUG_LEVEL_INFO,"local_ip: %s\n\r",g_device_local_ip);
ipStrValid((const char *)g_device_local_ip,g_local_ip);
}
//mac
ret = GetConfigFromBuf("local",
"mac",
"42:00:00:00:00:01",
(char *)g_device_mac,
sizeof(g_device_mac),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get mac failed,default value: %s\n\r",g_device_mac);
macStrValid((const char *)g_device_mac,gCfgLoca_MAC);
}else{
pdebug(DEBUG_LEVEL_INFO,"mac: %s\n\r",g_device_mac);
macStrValid((const char *)g_device_mac,gCfgLoca_MAC);
}
//netmask
ret = GetConfigFromBuf("local",
"netmask",
"255.255.255.0",
(char *)g_device_netmask,
sizeof(g_device_netmask),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get netmask failed,default value: %s\n\r",g_device_netmask);
ipStrValid((const char *)g_device_netmask,g_netmask);
}else{
pdebug(DEBUG_LEVEL_INFO,"netmask: %s\n\r",g_device_netmask);
ipStrValid((const char *)g_device_netmask,g_netmask);
}
//gateway
ret = GetConfigFromBuf("local",
"gateway",
"172.16.19.254",
(char *)g_device_gateway,
sizeof(g_device_gateway),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get gateway failed,default value: %s\n\r",g_device_gateway);
ipStrValid((const char *)g_device_gateway,g_gateway);
}else{
pdebug(DEBUG_LEVEL_INFO,"gateway: %s\n\r",g_device_gateway);
ipStrValid((const char *)g_device_gateway,g_gateway);
}
//function
pdebug(DEBUG_LEVEL_INFO,"[self_check]\n\r");
//simplify_self_check
#ifdef PTZ_LIGHT_GEAR_L6235D_AS5047D //直齿云台默认自检打开
ret = GetConfigFromBuf("self_check",
"simplify_check",
"both_enabled",
(char *)system_info.simplify_self_check,
sizeof(system_info.simplify_self_check),
(char *)config_buff
);
#else //其余蜗轮蜗杆默认简易自检关闭
ret = GetConfigFromBuf("self_check",
"simplify_check",
"both_disabled",
(char *)system_info.simplify_self_check,
sizeof(system_info.simplify_self_check),
(char *)config_buff
);
#endif
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get simplify_check failed,default value: %s\n\r",SIMPLIFY_SELF_CHECK_DEFAULT);
}else{
pdebug(DEBUG_LEVEL_INFO,"simplify_check: %s\n\r",system_info.simplify_self_check);
}
//complete_self_check
ret = GetConfigFromBuf("self_check",
"complete_check",
"enable",
(char *)system_info.complete_self_check,
sizeof(system_info.complete_self_check),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get complete_check failed,default value: %s\n\r",COMPLETE_SELF_CHECK_DEFAULT);
}else{
pdebug(DEBUG_LEVEL_INFO,"complete_check: %s\n\r",system_info.complete_self_check);
}
//uart_baud
pdebug(DEBUG_LEVEL_INFO,"[baud_and_add]\n\r");
//uart_422_baud
ret = GetConfigFromBuf("baud_and_add",
"uart_422_baud",
"9600",
(char *)system_info.uart_422_baud,
sizeof(system_info.uart_422_baud),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get uart_422_baud failed,default value: %s\n\r",UART_422_BAUD_DEFAULT);
g_ptz.uart_422_baud = 9600;//配置信息获取失败,使用默认值
}else{
pdebug(DEBUG_LEVEL_INFO,"uart_422_baud: %s\n\r",system_info.uart_422_baud);
system_info.uart_422baud = atoi((const char *)system_info.uart_422_baud);
g_ptz.uart_422_baud = atoi((const char *)system_info.uart_422_baud);//确定波特率,用于串口初始化
}
//uart_485_baud
ret = GetConfigFromBuf("baud_and_add",
"uart_485_baud",
"9600",
(char *)system_info.uart_485_baud,
sizeof(system_info.uart_485_baud),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get uart_485_baud failed,default value: %s\n\r",UART_485_BAUD_DEFAULT);
g_ptz.uart_485_baud = 9600;//配置信息获取失败,使用默认值
}else{
pdebug(DEBUG_LEVEL_INFO,"uart_485_baud: %s\n\r",system_info.uart_485_baud);
system_info.uart_485baud = atoi((const char *)system_info.uart_485_baud);
g_ptz.uart_485_baud = atoi((const char *)system_info.uart_485_baud);//确定波特率,用于串口初始化
}
//hyt_address
ret = GetConfigFromBuf("baud_and_add",
"hyt_address",
"1",
(char *)system_info.hyt_address,
sizeof(system_info.hyt_address),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get hyt_address failed,default value: %s\n\r",HYT_ADDRESS_DEFAULT);
g_ptz.address = 1;//配置信息获取失败,使用默认值
}else{
pdebug(DEBUG_LEVEL_INFO,"hyt_address: %s\n\r",system_info.hyt_address);
system_info.add = atoi((const char *)system_info.hyt_address);
g_ptz.address = atoi((const char *)system_info.hyt_address);
}
//error_compensation
ret = GetConfigFromBuf("baud_and_add",
"compensation_switch",
"on",
(char *)system_info.error_compensation,
sizeof(system_info.error_compensation),
(char *)config_buff
);
if (ret != 0){
pdebug(DEBUG_LEVEL_FATAL,"get compensation_switch failed,default value: %s\n\r",ERROR_compensation_switch);
}else{
pdebug(DEBUG_LEVEL_INFO,"compensation_switch: %s\n\r",system_info.error_compensation);
}
pdebug(DEBUG_LEVEL_INFO,"[end]\n\r");
return TRUE;
}
/******************************************************************************
** :check_sum
**
**
******************************************************************************/
static u_int8_t check_sum(u_int8_t *p, int len)
{
u_int8_t ret = 0;
int i = 0;
for(; i<len; i++)
{
ret += p[i];
}
return (~ret)+1;
}
/******************************************************************************
** :upgrade_pkg_head_checksum_OK
** checksum
**
******************************************************************************/
u_int8_t upgrade_pkg_head_checksum_OK(hy_release_file_head *pkg_head)
{
return check_sum((u_int8_t *)pkg_head, (u_int8_t *)(&pkg_head->head_checksum) - (u_int8_t *)pkg_head)
== pkg_head->head_checksum;
}
/******************************************************************************
** ext_flash_erase
** rom中的存储空间
**
******************************************************************************/
BOOL ext_flash_erase(hy_release_file_head *pkg_head)
{
u_int32_t total_len = pkg_head->data_len;
if(pkg_head->file_type == HY_PKG_TYPE_PUB_KEY){
if((pkg_head->addr + total_len) > KEY_ADDR_END)
return FALSE;
Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,KEY_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,KEY_SECTOR_BEGIN);
}else if(pkg_head->file_type == HY_PKG_TYPE_CERT){
if((pkg_head->addr + total_len) > CERT_ADDR_END)
return FALSE;
Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CERT_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CERT_SECTOR_BEGIN);
}else if(pkg_head->file_type == HY_PKG_TYPE_CFG_FILE){
if((pkg_head->addr + total_len) > CFG_FILE_ADDR_END)
return FALSE;
Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CFG_FILE_HEAD_SECTOR_BEGIN);
Flash_Erase_Sector(EXT_FLASH_BLOCK_NUM,CFG_FILE_SECTOR_BEGIN);
}
return TRUE;
}
/******************************************************************************
** : app_crc_OK
** rom的应用程序包 crc16方式校验
**
******************************************************************************/
BOOL app_crc_OK(u_int8_t file_type)
{
u_int16_t crc16;
hy_release_file_head h_read;
u_int8_t crc16_read2[2] = {0x00};
u_int32_t read_addr = 0;
u_int32_t read_len = 0;
if (file_type == HY_PKG_TYPE_CERT){
Flash_Read((u_int8_t *)&h_read, CERT_HEAD_BEGIN, sizeof(h_read)-1);
if(h_read.file_type != HY_PKG_TYPE_CERT)
return FALSE;
if (!upgrade_pkg_head_checksum_OK(&h_read))
return FALSE;
read_addr = CERT_ADDR_BEGIN;
}else if (file_type == HY_PKG_TYPE_PUB_KEY){
Flash_Read((u_int8_t *)&h_read, KEY_HEAD_BEGIN, sizeof(h_read)-1);
if(h_read.file_type != HY_PKG_TYPE_PUB_KEY)
return FALSE;
if (!upgrade_pkg_head_checksum_OK(&h_read))
return FALSE;
read_addr = KEY_ADDR_BEGIN;
}else if (file_type == HY_PKG_TYPE_CFG_FILE){
Flash_Read((u_int8_t *)&h_read,CFG_FILE_HEAD_BEGIN, sizeof(h_read)-1);
if(h_read.file_type != HY_PKG_TYPE_CFG_FILE)
return FALSE;
if (!upgrade_pkg_head_checksum_OK(&h_read))
return FALSE;
read_addr = CFG_FILE_ADDR_BEGIN;
}
CRC16_init(&crc16);
//先算包头crc
CRC16_update(&crc16,(u_int8_t *)&h_read, sizeof(h_read)-1);
read_len = h_read.data_len; //包括crc16内容
if(read_len > 1000)
return FALSE;
Flash_Read(config_buff, read_addr,read_len);
Flash_Read((u_int8_t *)crc16_read2, read_addr+read_len,sizeof(u_int16_t));
CRC16_update(&crc16,config_buff, read_len);
return crc16 == *(u_int16_t *)&crc16_read2;
}
/******************************************************************************
*: write_pack_head_to_ext_flash
* flash中
*
*
*
******************************************************************************/
BOOL write_pack_head_to_ext_flash(hy_release_file_head *pkg_head)
{
char test_buff[100] = {0x00};
if(pkg_head->file_type == HY_PKG_TYPE_PUB_KEY){
Flash_Write_MorePage((u_int8_t *)pkg_head,KEY_HEAD_BEGIN,sizeof(*pkg_head));
}else if(pkg_head->file_type == HY_PKG_TYPE_CERT){
Flash_Write_MorePage((u_int8_t *)pkg_head,CERT_HEAD_BEGIN,sizeof(*pkg_head));
}else if(pkg_head->file_type == HY_PKG_TYPE_CFG_FILE){
// FLASH_WP_ENABLE;
Flash_Write_MorePage((u_int8_t *)pkg_head,CFG_FILE_HEAD_BEGIN,sizeof(*pkg_head));
Flash_Read((u_int8_t *)test_buff,CFG_FILE_HEAD_BEGIN, 50);
Flash_Read((u_int8_t *)test_buff,CFG_FILE_HEAD_BEGIN, 50);
Flash_Read((u_int8_t *)test_buff,CFG_FILE_HEAD_BEGIN, 50);
}
return TRUE;
}
/******************************************************************************
*: write_file_to_ext_flash
* flash中
*
*
*
******************************************************************************/
BOOL write_file_to_ext_flash(hy_release_file_head *pkg_head)
{
u_int32_t len = pkg_head->data_len + sizeof(u_int16_t); //内容+crc16
u_int32_t write_addr = pkg_head->addr;
Flash_Write_MorePage(pkg_head->data,write_addr,len);
return TRUE;
}
/******************************************************************************
*: pack_head_verify
*
*
*
*
******************************************************************************/
BOOL pack_head_verify(u_int8_t file_type)
{
hy_release_file_head pkg_head = {0x00};
u_int32_t read_addr;
if (file_type == HY_PKG_TYPE_PUB_KEY){
read_addr = KEY_HEAD_BEGIN;
}else if (file_type == HY_PKG_TYPE_CERT){
read_addr = CERT_HEAD_BEGIN;
}else if (file_type == HY_PKG_TYPE_CFG_FILE){
read_addr = CFG_FILE_HEAD_BEGIN;
}
Flash_Read((u_int8_t *)&pkg_head,read_addr, sizeof(pkg_head)-1);
//数据长度限制
if((pkg_head.data_len) > (1024*2))
return FALSE;
//起始标志检查
if(pkg_head.flag != HY_RELEASE_FILE_FLAG)
return FALSE;
//头长度检验
if(pkg_head.head_len != (sizeof(pkg_head)-1))
return FALSE;
//文件类型检验 boot app cert key cfg_file
if((pkg_head.file_type != HY_PKG_TYPE_APP) && (pkg_head.file_type != HY_PKG_TYPE_BOOT_LOADER) && (pkg_head.file_type != HY_PKG_TYPE_CERT) && (pkg_head.file_type != HY_PKG_TYPE_PUB_KEY)&& (pkg_head.file_type != HY_PKG_TYPE_CFG_FILE))
return FALSE;
//文件格式版本
if(pkg_head.file_format_ver != 1)
return FALSE;
if(pkg_head.file_type == HY_PKG_TYPE_APP){ //App
//烧写地址检验
if(pkg_head.addr < APP_ADDR_BEGIN)
return FALSE;
//空间检验
if((pkg_head.addr + pkg_head.data_len) > APP_ADDR_END)
return FALSE;
}else if(pkg_head.file_type == HY_PKG_TYPE_BOOT_LOADER){ //Bootloader
//烧写地址检验
if(pkg_head.addr != 0) //bootloader必须以0为起始地址
return FALSE;
//空间检验
if((pkg_head.addr + pkg_head.data_len) > BOOTLOADER_ADDR_END)
return FALSE;
}else if(pkg_head.file_type == HY_PKG_TYPE_CERT){//CERT
//烧写地址
if(pkg_head.addr < CERT_ADDR_BEGIN)
return FALSE;
//空间检验
if((pkg_head.addr + pkg_head.data_len) > CERT_ADDR_END)
return FALSE;
}else if(pkg_head.file_type == HY_PKG_TYPE_PUB_KEY){//KEY
//烧写地址
if(pkg_head.addr < KEY_ADDR_BEGIN)
return FALSE;
//空间检验
if((pkg_head.addr + pkg_head.data_len) > KEY_ADDR_END)
return FALSE;
}else if(pkg_head.file_type == HY_PKG_TYPE_CFG_FILE){//CFG FILE
//烧写地址
if(pkg_head.addr < CFG_FILE_ADDR_BEGIN)
return FALSE;
//空间检验
if((pkg_head.addr + pkg_head.data_len) > CFG_FILE_ADDR_END)
return FALSE;
}
return TRUE;
}
//擦除片外flash缓存空间
void erase_ext_flash(u_int8_t block_begin,u_int32_t total_len)
{
int i = 0;
int block_count = total_len / Flash_BLOCKBYTE_LENGTH;
if(total_len % Flash_BLOCKBYTE_LENGTH)
block_count++;
for(i = 0; i<block_count; i++){
Flash_Erase_Block(block_begin + i);
BSP_OS_TimeDlyMs(10);
}
}
/******************************************************************************
**
** 192.168.8.1192 168 8 12
**
**
*******************************************************************************/
static int ipStrValid( const char * str_ip,u_int8_t *rvalue)
{
char p[20];
int n,i,dotnumber,j;
int num_len=0;
char k[4];
memset(p,0,sizeof(p));
if(str_ip==NULL)
return 0;
n=strlen(str_ip);
if(n==0)
return 0;
j=0;
dotnumber=0;
for(i=0;i<n;i++)
{
if(str_ip[i]=='.')
{
p[j]=0;
num_len = strlen(p);
if( num_len == 0 )
return 0;
k[dotnumber] = atoi(p);
//if(k[dotnumber]>252)
// return 0;
dotnumber++;
if(dotnumber>3)
return 0;
j=0;
continue;
}
else if( (str_ip[i]<='9') && (str_ip[i]>='0') )
{
p[j++]=str_ip[i];
}
else
{
return 0;
}
}
p[j]=0;
k[3]=atoi(p);
if(dotnumber!=3)
return 0;
if(k[3]>=255)//默认不能等于255 广播地址
return 0;
memcpy(rvalue,k,4);//拷贝到目标数组中
return 1;
}
/******************************************************************************
**
** 192.168.8.1192 168 8 12
**
**
*******************************************************************************/
static int macStrValid( const char * str_ip,u_int8_t *rvalue)
{
char p[20];
int n,i,dotnumber,j;
int num_len=0;
char k[6];
memset(p,0,sizeof(p));
if(str_ip==NULL)
return 0;
n=strlen(str_ip);
if(n==0)
return 0;
j=0;
dotnumber=0;
for(i=0;i<n;i++)
{
if(str_ip[i]==':')
{
p[j]=0;
num_len = strlen(p);
if( num_len == 0 )
return 0;
k[dotnumber] = atoi(p);
dotnumber++;
if(dotnumber>6)
return 0;
j=0;
continue;
}
else if( (str_ip[i]<='9') && (str_ip[i]>='0') )
{
p[j++]=str_ip[i];
}
else
{
return 0;
}
}
p[j]=0;
k[5]=atoi(p);
if(dotnumber!=5)
return 0;
memcpy(rvalue,k,6);//拷贝到目标数组中
return 1;
}
/********************00000000000000000000000000000000**********************/
/********************00000000000000000000000000000000**********************/
/********************00000000000000000000000000000000**********************/
u_int16_t cfg_crc16;//配置文件CRC效验
hy_release_file_head cfg_head;//文件头
u_int8_t cfg_buff[1500];
u_int8_t cfg_crc16_a[2] = {0x00};
//检查文件头,查看配置文件是否正确
//文件头错误返回0文件头正确返回1
static u_int16_t ptz_check_cfg_head(hy_release_file_head head)
{
//文件头校验码
if (!upgrade_pkg_head_checksum_OK(&head))
return FALSE;
//数据长度限制
if((head.data_len) > (1024*2))
return FALSE;
//起始标志检查
if(head.flag != HY_RELEASE_FILE_FLAG)
return FALSE;
//头长度检验
if(head.head_len != (sizeof(head)-1))
return FALSE;
//文件类型检验
if(head.file_type != HY_PKG_TYPE_CFG_FILE)
return FALSE;
//文件格式版本
if(head.file_format_ver != 1)
return FALSE;
//烧写地址
if(head.addr < CFG_FILE_ADDR_BEGIN)
return FALSE;
//空间检验
if((head.addr + head.data_len) > CFG_FILE_ADDR_END)
return FALSE;
return TRUE;
}
//判断IP地址是否合法并将字符串IP转化为数字
//并同时将字符型IP地址转化为对应的数字IP
static int ptz_check_ip_gateway_netmask_and_str_to_num( const char * str_ip,u_int8_t *rvalue)
{
char p[20];
int n,i,dotnumber,j;
int num_len=0;
unsigned char k[4];
memset(p,0,sizeof(p));
if(str_ip==NULL)
return 0;
n=strlen(str_ip);
if(n==0)
return 0;
j=0;
dotnumber=0;
for(i=0;i<n;i++)
{
if(str_ip[i]=='.')
{
p[j]=0;
num_len = strlen(p);
if( num_len == 0 )
return 0;
k[dotnumber] = atoi(p);
//if(k[dotnumber]>252)
// return 0;
dotnumber++;
if(dotnumber>3)
return 0;
j=0;
continue;
}
else if( (str_ip[i]<='9') && (str_ip[i]>='0') )
{
p[j++]=str_ip[i];
}
else
{
return 0;
}
}
p[j]=0;
k[3]=atoi(p);
if(dotnumber!=3)
return 0;
//默认不能等于255 广播地址
// if(k[0] <= 0 || k[0] >= 255)
// {
// return 0;
// }
// if(k[1] <= 0 || k[1] >= 255)
// {
// return 0;
// }
// if(k[2] <= 0 || k[2] >= 255)
// {
// return 0;
// }
// if(k[3] <= 0 || k[3] >= 255)
// {
// return 0;
// }
memcpy(rvalue,k,4);//拷贝到目标数组中
return 1;
}
//判断MAC地址是否合法
//并同时将字符型MAC地址转化为对应的数字MAC
static int ptz_check_mac_and_str_to_num( const char * str_mac,u_int8_t *rvalue)
{
char p[20];
int n,i,dotnumber,j;
int num_len=0;
char k[6];
memset(p,0,sizeof(p));
if(str_mac==NULL)
return 0;
n=strlen(str_mac);
if(n==0)
return 0;
j=0;
dotnumber=0;
for(i=0;i<n;i++)
{
if(str_mac[i]==':')
{
p[j]=0;
num_len = strlen(p);
if( num_len == 0 )
return 0;
k[dotnumber] = atoi(p);
dotnumber++;
if(dotnumber>6)
return 0;
j=0;
continue;
}
else if( (str_mac[i]<='9') && (str_mac[i]>='0') )
{
p[j++]=str_mac[i];
}
else
{
return 0;
}
}
p[j]=0;
k[5]=atoi(p);
if(dotnumber!=5)
return 0;
memcpy(rvalue,k,6);//拷贝到目标数组中
return 1;
}
//指令修改云台配置文件,str输入的字符串type修改的内容
BOOL ptz_set_cfg(char *str, char type)
{
char head_state = TRUE;//文件头状态
char data_state = TRUE;//数据状态
static char hardwarever[50] = HARDWAREVER;
static char cmd_id[50] = CMD_ID;
static char component_id[50] = COMPONENT_ID;
static char ip[50] = LOCAL_IP ;
static char mac[50] = LOCAL_MAC;
static char netmask[50] = LOCAL_NETMASK;
static char gateway[50] = LOCAL_GATEWAY;
//新增功能配置信息,可通过更改配置文件实现相关功能的使用-lqc-20220316
static char simplify_self_check[50] = SIMPLIFY_SELF_CHECK;
static char complete_self_check[50] = COMPLETE_SELF_CHECK;
static char uart_422_baud[50] = UART_422_BAUD;
static char uart_485_baud[50] = UART_485_BAUD;
static char hyt_address[50] = HYT_ADDRESS;
static char error_compensation[50] = ERROR_compensation;
static char data_buff[30];
static u_int8_t num_ip_gateway_netmask[4] = {0};
static u_int8_t num_mac[6] = {0};
static hy_release_file_head cfg_head_flash;
static u_int8_t cfg_buff_flash[1500];
u_int8_t* cfg_buff_p = cfg_buff;
char save_num = 0;
memset(&hardwarever, 0, sizeof(hardwarever));
memset(&cmd_id, 0, sizeof(cmd_id));
memset(&component_id, 0, sizeof(component_id));
memset(&ip, 0, sizeof(ip));
memset(&mac, 0, sizeof(mac));
memset(&netmask, 0, sizeof(netmask));
memset(&gateway, 0, sizeof(gateway));
memset(&simplify_self_check, 0, sizeof(simplify_self_check));
memset(&complete_self_check, 0, sizeof(complete_self_check));
memset(&uart_422_baud, 0, sizeof(uart_422_baud));
memset(&uart_485_baud, 0, sizeof(uart_485_baud));
memset(&hyt_address, 0, sizeof(hyt_address));
memset(&error_compensation, 0, sizeof(error_compensation));
memset(&data_buff, 0, sizeof(data_buff));
memset(&num_ip_gateway_netmask, 0, sizeof(num_ip_gateway_netmask));
memset(&num_mac, 0, sizeof(num_mac));
memset(&cfg_head_flash, 0, sizeof(cfg_head_flash));
memset(&cfg_buff_flash, 0, sizeof(cfg_buff_flash));
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
memcpy(hardwarever, HARDWAREVER, sizeof(HARDWAREVER));
memcpy(cmd_id, CMD_ID, sizeof(CMD_ID));
memcpy(component_id, COMPONENT_ID, sizeof(COMPONENT_ID));
memcpy(ip, LOCAL_IP, sizeof(LOCAL_IP));
memcpy(mac, LOCAL_MAC, sizeof(LOCAL_MAC));
memcpy(netmask, LOCAL_NETMASK, sizeof(LOCAL_NETMASK));
memcpy(gateway, LOCAL_GATEWAY, sizeof(LOCAL_GATEWAY));
memcpy(simplify_self_check, SIMPLIFY_SELF_CHECK, sizeof(SIMPLIFY_SELF_CHECK));
memcpy(complete_self_check, COMPLETE_SELF_CHECK, sizeof(COMPLETE_SELF_CHECK));
memcpy(uart_422_baud, UART_422_BAUD, sizeof(UART_422_BAUD));
memcpy(uart_485_baud, UART_485_BAUD, sizeof(UART_485_BAUD));
memcpy(hyt_address, HYT_ADDRESS, sizeof(HYT_ADDRESS));
memcpy(error_compensation, ERROR_compensation, sizeof(ERROR_compensation));
//查看FLASH有没有保存配置文件头以及配置文件头是否正确
//读取文件头
memset(&cfg_head, 0, sizeof(cfg_head));
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read((u_int8_t *)&cfg_head,CFG_FILE_HEAD_BEGIN, sizeof(cfg_head)-1);
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
//判断文件头
if(ptz_check_cfg_head(cfg_head) == FALSE)
{
head_state = FALSE;
data_state = FALSE;//文件头是坏的,那么数据肯定也是坏的
}
else
{//文件头是正确的,则判断后面的数据对不对
head_state = TRUE;
//如果文件头是好的则开始判断文件数据部分
memset(cfg_buff, 0, sizeof(cfg_buff));
//提取数据
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read(cfg_buff, CFG_FILE_ADDR_BEGIN, cfg_head.data_len);
//提取保存的CRC16效验码
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read((u_int8_t *)cfg_crc16_a, CFG_FILE_ADDR_BEGIN + cfg_head.data_len, sizeof(cfg_crc16_a));
CRC16_init(&cfg_crc16);
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
//先算包头crc16
CRC16_update(&cfg_crc16,(u_int8_t *)&cfg_head, sizeof(cfg_head)-1);
//再算数据部分CRC16
CRC16_update(&cfg_crc16,cfg_buff, cfg_head.data_len);
//判断CRC16是否正确
if(cfg_crc16 == *(u_int16_t *)&cfg_crc16_a)
{//如果CRC16正确
data_state = TRUE;
}
else//如果CRC16不正确
{
data_state = FALSE;
}
}
//如果文件头不正确,或者不存在,则从新封装文件头
if(head_state == FALSE)
{
memset(&cfg_head, 0, sizeof(cfg_head));
cfg_head.flag = HY_RELEASE_FILE_FLAG; //4byte 标志,必须为"HYPK",如果文件不是以此开头,则认为是非法文件
cfg_head.head_len = sizeof(cfg_head)-1; //4byte头长度文件头长度包含"标志"
cfg_head.file_type = HY_PKG_TYPE_CFG_FILE; //1byte文件类型1,1应用程序升级包 2:bootloader
cfg_head.file_format_ver = 1; //2byte 文件格式版本号1用于确定文件的处理方式
cfg_head.hardware_type[0] = 0; //2byte硬件类型,升级包适用的硬件类型
cfg_head.hardware_type[1] = 0; //2byte硬件类型,升级包适用的硬件类型
cfg_head.hardware_ver = 0; //2byte硬件版本,升级包适用的硬件版本
cfg_head.software_ver = 0; //4byte软件版本,本升级包的应用软件版本
cfg_head.data_len = 0; //4byte 数据长度,不包含2个字节的crc
cfg_head.addr = CFG_FILE_ADDR_BEGIN; //4byte 烧写地址
cfg_head.head_checksum = 0; //1byte头校验,以上内容的checksum包括"标志",单字节异或
cfg_head.data[1] = 0; //数据
}
//如果配置文件内部数据不正确
if(data_state == FALSE)
{//如果配置文件存储的数据是错的则要对数据从新封装
strcat(hardwarever, HARDWAREVER_DEFAULT);
strcat(cmd_id, CMD_ID_DEFAULT);
strcat(component_id, COMPONENT_ID_DEFAULT);
strcat(ip, LOCAL_IP_DEFAULT);
strcat(mac, LOCAL_MAC_DEFAULT);
strcat(netmask, LOCAL_NETMASK_DEFAULT);
strcat(gateway, LOCAL_GATEWAY_DEFAULT);
strcat(simplify_self_check, SIMPLIFY_SELF_CHECK_DEFAULT);
strcat(complete_self_check, COMPLETE_SELF_CHECK_DEFAULT);
strcat(uart_422_baud, UART_422_BAUD_DEFAULT);
strcat(uart_485_baud, UART_485_BAUD_DEFAULT);
strcat(hyt_address, HYT_ADDRESS_DEFAULT);
strcat(error_compensation, ERROR_compensation_switch);
}
else
{//如果配置文件是正确的直接读取配置文件内部数据
//获取hardwarever
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("host_mk60_cfg",
"hardwarever", HARDWAREVER_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(hardwarever, data_buff);
//获取cmd_id
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("host_mk60_cfg",
"cmd_id", CMD_ID_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(cmd_id, data_buff);
//获取component_id
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("host_mk60_cfg",
"component_id", COMPONENT_ID_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(component_id, data_buff);
//获取IP
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("local",
"ip", LOCAL_IP_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(ip, data_buff);
//获取MAC
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("local",
"mac", LOCAL_MAC_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(mac, data_buff);
//获取netmask
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("local",
"netmask", LOCAL_NETMASK_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(netmask, data_buff);
//获取gateway
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("local",
"gateway", LOCAL_GATEWAY_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(gateway, data_buff);
//获取简易自检参数
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("self_check",
"simplify_check", SIMPLIFY_SELF_CHECK_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(simplify_self_check, data_buff);
//获取全自检参数
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("self_check",
"complete_check", COMPLETE_SELF_CHECK_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(complete_self_check, data_buff);
//获取422串口波特率
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("baud_and_add",
"uart_422_baud", UART_422_BAUD_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(uart_422_baud, data_buff);
//获取485串口波特率
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("baud_and_add",
"uart_485_baud", UART_485_BAUD_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(uart_485_baud, data_buff);
//获取地址
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("baud_and_add",
"hyt_address", HYT_ADDRESS_DEFAULT,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(hyt_address, data_buff);
//误差补偿开关
memset(data_buff, 0, sizeof(data_buff));
GetConfigFromBuf("baud_and_add",
"error_compensation", ERROR_compensation_switch,
(char *)data_buff, sizeof(data_buff),
(char *)cfg_buff);
strcat(error_compensation, data_buff);
}
switch(type)//解析是需要修改配置文件的哪个部分
{
case SET_LOCAL_IP: //1设置IP
if(ptz_check_ip_gateway_netmask_and_str_to_num(str, num_ip_gateway_netmask) == 0)//说明IP地址不合法
{
return FALSE;
}
memset(ip, 0, sizeof(ip));
strcpy(ip, LOCAL_IP);
strcat(ip, str);
break;
case SET_LOCAL_MAC: //2设置MAC
if(ptz_check_mac_and_str_to_num(str, num_mac) == 0)//判断MAC地址是否合法
{
return FALSE;
}
memset(mac, 0, sizeof(mac));
strcpy(mac, LOCAL_MAC);
strcat(mac, str);
break;
case SET_LOCAL_NETMASK: //3设置NETMASK
if(ptz_check_ip_gateway_netmask_and_str_to_num(str, num_ip_gateway_netmask) == 0)//说明IP地址不合法
{
return FALSE;
}
memset(netmask, 0, sizeof(netmask));
strcpy(netmask, LOCAL_NETMASK);
strcat(netmask, str);
break;
case SET_LOCAL_GATEWAY: //4设置GATEWAY
if(ptz_check_ip_gateway_netmask_and_str_to_num(str, num_ip_gateway_netmask) == 0)//说明IP地址不合法
{
return FALSE;
}
memset(gateway, 0, sizeof(gateway));
strcpy(gateway, LOCAL_GATEWAY);
strcat(gateway, str);
break;
case SET_HARDWAREVER: //0X08
memset(hardwarever, 0, sizeof(hardwarever));
strcpy(hardwarever, HARDWAREVER);
strcat(hardwarever, str);
break;
case SET_CMD_ID: //0X09
memset(cmd_id, 0, sizeof(cmd_id));
strcpy(cmd_id, CMD_ID);
strcat(cmd_id, str);
break;
case SET_COMPONENT_ID: //0X0A
memset(component_id, 0, sizeof(component_id));
strcpy(component_id, COMPONENT_ID);
strcat(component_id, str);
break;
// case SET_TERM_IP:
case SET_SIMPLIFY_SELF_CHECK: //0X0B
memset(simplify_self_check, 0, sizeof(simplify_self_check));
strcpy(simplify_self_check, SIMPLIFY_SELF_CHECK);
strcat(simplify_self_check, str);
break;
// case SET_WEB_IP:
case SET_COMPLETE_SELF_CHECK: //0X0C
memset(complete_self_check, 0, sizeof(complete_self_check));
strcpy(complete_self_check, COMPLETE_SELF_CHECK);
strcat(complete_self_check, str);
break;
// case SET_WEB_IP:
case SET_UART_422_BAUD: //0X0E
memset(uart_422_baud, 0, sizeof(uart_422_baud));
strcpy(uart_422_baud, UART_422_BAUD);
strcat(uart_422_baud, str);
break;
// case SET_A9_IP:
case SET_UART_485_BAUD: //0X0F
memset(uart_485_baud, 0, sizeof(uart_485_baud));
strcpy(uart_485_baud, UART_485_BAUD);
strcat(uart_485_baud, str);
break;
case SET_HYT_ADDRESS: //0X10
memset(hyt_address, 0, sizeof(hyt_address));
strcpy(hyt_address, HYT_ADDRESS);
strcat(hyt_address, str);
break;
case SET_ERROR_compensation://0x11
memset(error_compensation, 0, sizeof(error_compensation));
strcpy(error_compensation, ERROR_compensation);
strcat(error_compensation, str);
break;
default:
return FALSE;
break;
}
//开始组装配置文件内容数据
memset(cfg_buff, 0, sizeof(cfg_buff));
/**/
memcpy(cfg_buff_p, HOST_MK60_CFG, strlen(HOST_MK60_CFG));
cfg_buff_p = cfg_buff_p + strlen(HOST_MK60_CFG);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, hardwarever, strlen(hardwarever));
cfg_buff_p = cfg_buff_p + strlen(hardwarever);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, cmd_id, strlen(cmd_id));
cfg_buff_p = cfg_buff_p + strlen(cmd_id);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, component_id, strlen(component_id));
cfg_buff_p = cfg_buff_p + strlen(component_id);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
/**/
memcpy(cfg_buff_p, LOCAL, strlen(LOCAL));
cfg_buff_p = cfg_buff_p + strlen(LOCAL);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, ip, strlen(ip));
cfg_buff_p = cfg_buff_p + strlen(ip);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, mac, strlen(mac));
cfg_buff_p = cfg_buff_p + strlen(mac);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, netmask, strlen(netmask));
cfg_buff_p = cfg_buff_p + strlen(netmask);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, gateway, strlen(gateway));
cfg_buff_p = cfg_buff_p + strlen(gateway);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, FUNCTION, strlen(FUNCTION));
cfg_buff_p = cfg_buff_p + strlen(FUNCTION);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, simplify_self_check, strlen(simplify_self_check));
cfg_buff_p = cfg_buff_p + strlen(simplify_self_check);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, complete_self_check, strlen(complete_self_check));
cfg_buff_p = cfg_buff_p + strlen(complete_self_check);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, BAUD_AND_ADD, strlen(BAUD_AND_ADD));
cfg_buff_p = cfg_buff_p + strlen(BAUD_AND_ADD);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, uart_422_baud, strlen(uart_422_baud));
cfg_buff_p = cfg_buff_p + strlen(uart_422_baud);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, uart_485_baud, strlen(uart_485_baud));
cfg_buff_p = cfg_buff_p + strlen(uart_485_baud);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, hyt_address, strlen(hyt_address));
cfg_buff_p = cfg_buff_p + strlen(hyt_address);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
memcpy(cfg_buff_p, error_compensation, strlen(error_compensation));
cfg_buff_p = cfg_buff_p + strlen(error_compensation);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
/**/
memcpy(cfg_buff_p, END, strlen(END));
cfg_buff_p = cfg_buff_p + strlen(END);
memcpy(cfg_buff_p, ENTER, strlen(ENTER));
cfg_buff_p = cfg_buff_p + strlen(ENTER);
/**/
//计算文件头中的数据长度
cfg_head.data_len = strlen((char *)cfg_buff) + 1;
//计算文件头校验码
cfg_head.head_checksum =
check_sum((u_int8_t *)(&cfg_head), (u_int8_t *)(&(cfg_head.head_checksum)) - (u_int8_t *)(&cfg_head));
//计算文件CRC16效验码
CRC16_init(&cfg_crc16);
CRC16_update(&cfg_crc16,(u_int8_t *)&cfg_head, (sizeof(cfg_head) - 1));
CRC16_update(&cfg_crc16,cfg_buff, cfg_head.data_len);
*((u_int16_t *)(&cfg_buff[cfg_head.data_len])) = cfg_crc16;
for(save_num = 0; save_num < CFG_SAVE_FLASH_NUM; save_num++)
{//超过保存次数退出
//擦除原先的配置文件
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Erase_Sector(CFG_HEAD_BLOCK_NUM, CFG_HEAD_SECTOR_NUM);
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Erase_Sector(CFG_DATA_BLOCK_NUM, CFG_DATA_SECTOR_NUM);
//保存文件头
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Write_MorePage((u_int8_t *)(&cfg_head),
FLASH_SECTOR_ADD(CFG_HEAD_BLOCK_NUM, CFG_HEAD_SECTOR_NUM),
sizeof(cfg_head));
//保存文件数据
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Write_MorePage(cfg_buff,
FLASH_SECTOR_ADD(CFG_DATA_BLOCK_NUM, CFG_DATA_SECTOR_NUM),
(cfg_head.data_len + sizeof(u_int16_t)));
//将写入FLASH的文件读出来判断是否写入正确
memset(&cfg_head_flash, 0, sizeof(cfg_head_flash));
memset(cfg_buff_flash, 0, sizeof(cfg_buff_flash));
//读出数据并判断
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read((u_int8_t *)&cfg_head_flash,CFG_FILE_HEAD_BEGIN, sizeof(cfg_head_flash)-1);
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read(cfg_buff_flash, CFG_FILE_ADDR_BEGIN, (cfg_head.data_len + sizeof(u_int16_t)));
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
if(memcmp(&cfg_head, &cfg_head_flash, (sizeof(cfg_head)-1)) == 0 &&
memcmp(&cfg_buff, &cfg_buff_flash, (cfg_head.data_len + sizeof(u_int16_t))) == 0)//判断写入数据是否正确
{//数据相同,保存成功
return TRUE;
}
}
return FALSE;
}
//读取并判断配置文件数据并将数据保存到buff中同时返回数据总长度如果数据错误返回0
unsigned short int ptz_read_cfg_data(char* buff)
{
//查看FLASH有没有保存配置文件头以及配置文件头是否正确
//读取文件头
memset(&cfg_head, 0, sizeof(cfg_head));
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read((u_int8_t *)&cfg_head,CFG_FILE_HEAD_BEGIN, sizeof(cfg_head)-1);
if(ptz_check_cfg_head(cfg_head) == FALSE)
{
return 0;
}
//如果文件头是好的则开始判断文件数据部分
memset(cfg_buff, 0, sizeof(cfg_buff));
//提取数据
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read(cfg_buff, CFG_FILE_ADDR_BEGIN, cfg_head.data_len);
//提取保存的CRC16效验码
OSTimeDlyHMSM(0u, 0u, 0u, 2u);
Flash_Read((u_int8_t *)cfg_crc16_a, CFG_FILE_ADDR_BEGIN + cfg_head.data_len, sizeof(cfg_crc16_a));
CRC16_init(&cfg_crc16);
//先算包头crc16
CRC16_update(&cfg_crc16,(u_int8_t *)&cfg_head, sizeof(cfg_head)-1);
//再算数据部分CRC16
CRC16_update(&cfg_crc16,cfg_buff, cfg_head.data_len);
//判断CRC16是否正确
if(cfg_crc16 == *(u_int16_t *)&cfg_crc16_a)
{//如果CRC16正确
memcpy(buff, cfg_buff, cfg_head.data_len);
return ((unsigned short int)cfg_head.data_len);
}
else//如果CRC16不正确
{
return 0;
}
}
/********************00000000000000000000000000000000**********************/
/********************00000000000000000000000000000000**********************/
/********************00000000000000000000000000000000**********************/