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

设备自动更新机制

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

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

5v-3.3v电压转换模块

设备更新头文件(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)yesno
#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;
}

Copyright © 2016 www.91arm.com 【91创客学堂】