嵌入式项目|基于ARM的智能灯光控制系统(7)设备更新
基于ARM的智能灯光控制系统(7)设备更新
设备自动更新机制 【嵌入式项目|基于ARM的智能灯光控制系统(7)设备更新】本地模块:通过电压模块的3.3v输出连接主控的GPIO,如是低电平说明模块没有接入主控,高电平说明模块接入主控。5v-3.3v电压转换模块
网络模块:通过网络命令定时查询,模块是否接入主控。
文章图片
设备更新头文件(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;
}
推荐阅读
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- 基于爱,才会有“愿望”当“要求”。2017.8.12
- 17|17 关山松 第二课作业#公众号项目# D20
- RxJava|RxJava 在Android项目中的使用(一)
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- 靠QQ月入上万灰色暴利偏门的项目
- spring|spring boot项目启动websocket
- vuex|vuex 基础结构
- 区块链开发平台(以太坊)