基於ARM的智能燈光控制系統(11)狀態更新

基於ARM的智能燈光控制系統(11)狀態更新

項目中硬件模塊的開關狀態,由獨立的狀態線程進行控制管理。

Created with Raphaël 2.1.0sw_pro線程初始化數據有傳感器?讀傳感器數據設置綁定設備狀態 web設置區域?區域設備狀態更新area_sw_update 線程循環間隔 sleep(1) 設備開關狀態更新dev_sw_update最終開關硬件在這裏yesnoyesno

設備狀態更新頭文件 (sw_pro.h)

#ifndef _SL2000_SW_IPC_H
#define _SL2000_SW_IPC_H

void* sw_pro(void* arg);//狀態更新線程
void area_sw_update(void);//更新區域狀態
int dev_sw_update(struct sys_dev *head);//更新設備開關狀態

#endif

設備狀態更新實現文件 (sw_pro.c)

#include "config.h"
#include "sw_pro.h"

extern struct sys_all g_dev[1]; //系統配置結構體全局變量
extern struct sys_dev *head_node; // 系統設備動態鏈表頭指針
extern struct dev_fd g_dev_fd;//系統設備文件

extern int area_update_flag;
extern unsigned char net_cmd;

void* sw_pro(void* arg)
{
    char light_da[2];
    struct sys_dev* new_dev;
    struct sys_dev* find_dev;
    light_da[0] = 0;
    new_dev = (struct sys_dev *)malloc(sizeof(struct sys_dev));

    while(1){
        //光感 處理
        if(find_id(DEV_T_RAY,head_node,new_dev)==1){
            if(g_dev_fd.light_fd>0){
                read(g_dev_fd.light_fd,light_da,1);
            }

            if(new_dev->bind_dev>0 && new_dev->bind_dev<10)
                if((find_dev = get_dev_id(new_dev->bind_dev,head_node)) != NULL)
                    find_dev->sw_sta=light_da[0];
        }

        if(area_update_flag ==1)
            area_sw_update();

        dev_sw_update(head_node);//燈光開關切換

        sleep(1);
    }
}

int dev_sw_update(struct sys_dev *head)
{
    struct sys_dev * p;
    p=head;
    char da[8];

    if(NULL==head){
        printf("列表爲空!\n");
        return -1;
    }

    while(p!=NULL){
        switch(p->node.type)
        {

            case DEV_T_LIGHT1:
                if(p->sw_sta == 1){         
                    da[0] = J1_ON;
                }else{
                    da[0] = J1_OFF;
                }
                write(g_dev_fd.relay1_fd,da,1);
                break;
            case DEV_T_LIGHT2:
                if(p->sw_sta == 1){         
                    da[0] = J2_ON;
                }else{
                    da[0] = J2_OFF;
                }
                write(g_dev_fd.relay2_fd,da,1);
                break;  
            case DEV_T_LIG_NET:
                if(p->sw_sta == 1){         
                    net_cmd =0x31;
                }else{
                    net_cmd = 0x32;
                }
                break;              
            default:
                break;
        }   
    p=p->next;
    }
    return 0;
}


//區域處理,可以使用信號
void area_sw_update(void)
{
    int area_loop,dev_loop;
    struct sys_area area_val;
    struct sys_dev* find_dev;

    for(area_loop=0;area_loop<MAX_DEV;area_loop++){
        memcpy(&area_val,&(g_dev->sys_area[area_loop]),sizeof(struct sys_area));
        if(area_val.enable_flag == 1)
            if(area_val.sw_sta == 1){
                for(dev_loop=0;dev_loop<MAX_DEV;dev_loop++){
                    if((find_dev = get_dev_id(area_val.dev_id[dev_loop],
                        head_node)) != NULL)
                        find_dev->sw_sta=ON;                        
                }

            }else{

                for(dev_loop=0;dev_loop<MAX_DEV;dev_loop++){
                    if((find_dev = get_dev_id(area_val.dev_id[dev_loop],
                        head_node)) != NULL)
                        find_dev->sw_sta=OFF;                       
                }               

            }

    }
    area_update_flag = 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章