设备自动更新机制
本地模块:通过电压模块的3.3v输出连接主控的GPIO,如是低电平说明模块没有接入主控,高电平说明模块接入主控。
网络模块:通过网络命令定时查询,模块是否接入主控。
#ifndef _SL2000_DEV_PRO_H
#define _SL2000_DEV_PRO_H
int dev_update(int* fd,char dev_type,char flag,char* dev_file);
void* dev_pro(void *arg);
#endif
#include "config.h"
#include "dev_pro.h"
extern struct sys_all g_dev[1]; //系统配置结构体全局变量
extern struct sys_dev *head_node; // 系统设备动态链表头指针
extern struct dev_fd g_dev_fd;//系统设备文件
extern unsigned char net_flag;
//自动更新设备线程
void* dev_pro(void *arg)
{
int fd=-1;int i;
int old_count=0;
char da[4];//da[0]光感 da[1]声音 da[2]继电器1 da[3]继电器2
fd = open(SEARCH_DEV,O_RDWR);
if(fd<0){
printf("open %s device err\n",SEARCH_DEV);
return 0;
}
old_count = g_dev->count_dev;
g_dev_fd.relay1_fd=-1;
g_dev_fd.relay2_fd=-1;
g_dev_fd.pir_fd=-1;
g_dev_fd.mic_fd=-1;
g_dev_fd.light_fd=-1;
while(1){
read(fd,da,2);//读取设备的状态
// printf("da=%d,%d\n",da[0],da[1]);
//设备如果连接,就设置文件描述符
dev_update(&g_dev_fd.light_fd,DEV_T_RAY,da[0],LIGHT_DEV);//光感
dev_update(&g_dev_fd.mic_fd,DEV_T_MIC,da[1],MIC_DEV);//声感
dev_update(&g_dev_fd.relay1_fd,DEV_T_LIGHT1,ON,RELAY1_DEV);//继电器1
dev_update(&g_dev_fd.relay2_fd,DEV_T_LIGHT2,ON,RELAY2_DEV);//继电器2
dev_update(&g_dev_fd.net_fd[0], DEV_T_LIG_NET, net_flag, NULL);
// printf("light_fd=%d,mic_fd=%d,relay_fd=%d\n",
// g_dev_fd.light_fd,g_dev_fd.mic_fd,g_dev_fd.relay_fd);
// dev_print(head_node);
//如果设备有变动,保存数据
if(old_count != g_dev->count_dev){
link_to_stu(head_node);
save_dev(g_dev);
old_count = g_dev->count_dev;
}
sleep(2);
}
}
int dev_update(int* fd,char dev_type,char flag,char* dev_file)
{
int index;
struct sys_dev new_dev;
if(flag == ON){
//如果设备文件没有打开
if(*fd <= 0 && dev_type != DEV_T_LIG_NET){
*fd = open(dev_file,O_RDWR);
if(*fd<0){
printf("open %s device err\n",dev_file);
return -1;
}
}
//如果设备列表中没有设备,添加设备
if( !(find_id(dev_type,head_node,NULL)) ){
printf("found new dev...\n");
new_dev.connect_sta = ON;//设备设置连接
strcpy(new_dev.name,"新增设备");
new_dev.join_sta = OFF;
new_dev.sw_sta = OFF;
new_dev.bind_dev = 0;
new_dev.delay = 0;
new_dev.node.type = dev_type;
new_dev.node.id = dev_type;
head_node = Insert(head_node,new_dev);
//系统结构,增加该设备
g_dev->count_dev++;
printf("count++ = %d\n",g_dev->count_dev);
}
}else{
if( find_id(dev_type,head_node,NULL)){
head_node = Delete(head_node,dev_type);
g_dev->count_dev--;
printf("count-- = %d\n",g_dev->count_dev);
}
//有设备文件时的处理
if(*fd>=3 && dev_type != DEV_T_LIG_NET){
close(*fd);//关闭设备文件
*fd = -1;
}
}
return 0;
}