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

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

设备自动更新机制

本地模块:通过电压模块的3.3v输出连接主控的GPIO,如是低电平说明模块没有接入主控,高电平说明模块接入主控。

网络模块:通过网络命令定时查询,模块是否接入主控。

5v-3.3v电压转换模块

基于ARM的智能灯光控制系统(7)设备更新_第1张图片

设备更新头文件(dev_pro.h)

#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

设备更新实现文件(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]继电器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;
}

你可能感兴趣的:(嵌入式项目,Linux应用)