嵌入式项目|基于ARM的智能灯光控制系统(7)设备更新

基于ARM的智能灯光控制系统(7)设备更新

设备自动更新机制 【嵌入式项目|基于ARM的智能灯光控制系统(7)设备更新】本地模块:通过电压模块的3.3v输出连接主控的GPIO,如是低电平说明模块没有接入主控,高电平说明模块接入主控。
网络模块:通过网络命令定时查询,模块是否接入主控。
5v-3.3v电压转换模块 嵌入式项目|基于ARM的智能灯光控制系统(7)设备更新
文章图片

设备更新头文件(dev_pro.h)
#ifndef _SL2000_DEV_PRO_H #define _SL2000_DEV_PRO_Hint dev_update(int* fd,char dev_type,char flag,char* dev_file); void* dev_pro(void *arg); #endif

设备更新实现文件(dev_por.c) Created with Rapha?l 2.1.0 打开电压模块设备文件 设备文件描述符初始化 读取电压模块状态 根据状态,更新设备链表, 设备数量,文件描述符 设备数量变化 更新结构体,保存文件 sleep(2) yes no
#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]继电器1da[3]继电器2fd = 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); //继电器2dev_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; }

    推荐阅读