基於ARM的智能燈光控制系統(4)數據結構

基於ARM的智能燈光控制系統(4)數據結構

嵌入式開發培訓(階段2)底層系統開發 視頻地址
智能燈光控制系統 視頻地址

主控後臺服務程序

daemon.c

程序功能模塊

#include <pthread.h>  

#include "config.h"
#include "sys_ipc.h" 
#include "link_pro.h"
#include "dev_pro.h"
#include "net_pro.h"
#include "sw_pro.h"

全局數據的使用


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

int area_update_flag =0;

系統初始化函數

Created with Raphaël 2.1.0加載配置文件 初始化設備鏈表打印設備列表信息
int init_sys(void)
{   
    int i;  

    printf("init system ...\n");
    load_dev(g_dev);//初始化g_dev
    head_node = stu_to_link(head_node); 
    dev_print(head_node);
    return 0;
}

main函數

int main(int argc,char* argv[])
{
    pthread_t pth_ipc,pth_dev,pth_sw,pth_net;

    init_sys();

    pthread_create(&pth_dev,NULL,dev_pro,NULL);
    pthread_create(&pth_ipc,NULL,ipcs_pro,NULL);
    pthread_create(&pth_sw,NULL,sw_pro,NULL);
    pthread_create(&pth_net,NULL,net_pro,NULL);

    pthread_join(pth_dev,NULL);
    pthread_join(pth_ipc,NULL);
    pthread_join(pth_sw,NULL);
    pthread_join(pth_net,NULL); 
    return 0;
}

系統數據結構頭文件(config.h)

數據結構 說明
sys_all 全局使用,配置文件存儲
sys_dev 保存設備節點信息
sys_area 保存系統設備的區域設備
dev_fd 全局使用,保存對應設備文件描述符
#ifndef __SL2000_H_
#define __SL2000_H_

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

#define CONFIG_FILE "sl2000.cfg"
#define ON          1
#define OFF         0

//消息隊列接收時索引值
#define TEMP_SMG_INDEX_BASE 10
#define WEB_SMG_INDEX 2
#define WEB_UPDATE_SMG_INDEX 3
#define UPDATE_TIME_SMG_INDEX 4

//系統設置類型定義
#define DEV_T_MAIN 1 //主控
#define DEV_T_SUB 2 //分控
#define DEV_T_RAY 3 //光線感應
#define DEV_T_PIR 4 //人體感應
#define DEV_T_MIC 5 //聲音感應
#define DEV_T_LIGHT1 6 //燈光(繼電器)
#define DEV_T_LIGHT2 7 //燈光(繼電器)
#define DEV_T_LIG_NET 8 

#define MAX_DEV 8 //系統最大設備容量
#define MAX_NET 2

#define J1_OFF  0x00
#define J1_ON   0x01
#define J2_OFF  0x10
#define J2_ON   0x11

#define LIGHT_DEV "/dev/2451_light"
#define MIC_DEV "/dev/2451_mic"
#define PIR_DEV "/dev/2451_pir"
#define RELAY1_DEV "/dev/2451_relay1"
#define RELAY2_DEV "/dev/2451_relay2"
#define SEARCH_DEV "/dev/2451_search"

#define ID_BASE 1;

struct node_info{
    int id;          //設備編號
    char ip[16];     //設備IP 
    char type;       //設備類型
};

struct dev_fd{
    int relay1_fd;
    int relay2_fd;
    int pir_fd;
    int mic_fd;
    int light_fd;
    int net_fd[MAX_NET];
};

struct sys_dev{
    char name[16];               //設備名
    struct node_info node;       //節點信息
    char connect_sta;            //連接狀態
    char join_sta;               //是否加入系統
    char sw_sta;                 //開關狀態
    int  delay;                 
    char bind_dev;
    struct sys_dev* next;
};

struct sys_area{
    char name[16];
    char dev_id[MAX_DEV];
    char sw_sta;
    char enable_flag;
};

struct sys_all{
    struct sys_dev sys_dev[MAX_DEV];//系統設備存儲列表
    struct sys_area sys_area[MAX_DEV];//區域列表
    int net_user[MAX_NET];//網絡節點
    int count_dev;//連接設備計數
}; 

struct st_sys_time{
     int yaer;
     char month;
     char day;
     char hour;
     char minute;
     char second;
};

struct st_msg_req{
    long int index;
    char req;       
};

int make_default_config(struct sys_all * dev);
int save_dev(struct sys_all * dev);
int load_dev(struct sys_all * dev);

#endif

配置文件實現程序(config.c)

#include <string.h>
#include <stdio.h>
#include "config.h"

int make_default_config(struct sys_all * dev)
{
    int i;
    printf("Make default configuration.\n");    
    memset(dev,0,sizeof(struct sys_all));
    dev->count_dev=1;//系統初始化時只有一個主控設備

    for(i=0;i<MAX_DEV;i++)
    {
        strcpy(dev->sys_dev[i].name,"未知設備-");       
        dev->sys_dev[i].node.id = 0;
        dev->sys_dev[i].node.type = 0;  
        dev->sys_dev[i].connect_sta=OFF;//系統全部設備設置沒有連接
        dev->sys_dev[i].sw_sta=OFF;//系統全部設備關閉
        dev->sys_dev[i].bind_dev=0;
        dev->sys_dev[i].delay=0;
        dev->sys_dev[i].next=NULL;

        dev->sys_area[i].enable_flag=0;
    }
    dev->sys_dev[0].connect_sta = ON;//主控設備設置連接
    strcpy(dev->sys_dev[0].name,"主控制器");
    dev->sys_dev[0].join_sta = ON;
    dev->sys_dev[0].node.id = ID_BASE;
    dev->sys_dev[0].node.type = DEV_T_MAIN; 
    return save_dev(dev);   
}

void print_all(struct sys_all * dev)
{
    int i;
    for(i=0;i<dev->count_dev;i++)
    {
        printf("#%d#name=%s,id=%d,type=%d,connect_sta=%d,sw_sta=%d,bind_dev=%d,
        delya=%d\n",i+1,dev->sys_dev[i].name,dev->sys_dev[i].node.id,dev->sys_dev[i].node.type,
        dev->sys_dev[i].connect_sta,dev->sys_dev[i].sw_sta,
        dev->sys_dev[i].bind_dev,dev->sys_dev[i].delay);
    }
    for(i=0;i<MAX_DEV;i++)
    {
        printf("#%d#name=%s,flag=%d,sw_sta=%d,dev_id=%d\n",i+1,dev->sys_area[i].name,
        dev->sys_area[i].enable_flag,dev->sys_area[i].sw_sta,dev->sys_area[i].dev_id[0]);
    }

}


int save_dev(struct sys_all * dev)
{
    FILE * fp;
    if (NULL == (fp=fopen(CONFIG_FILE, "wb"))){
        printf("Config file open null...\n");
        return -1;
    }
    printf("\nSave system data!\n");
    fwrite(dev, sizeof(*dev),1,fp); //write file
    fclose(fp); 
    print_all(dev);
    return 0;       
}


int load_dev(struct sys_all * dev)
{
    FILE *      fp;
    memset(dev, 0, sizeof(*dev));

    if (NULL == (fp=fopen(CONFIG_FILE, "rb"))){
        printf("[load_dev]fopen null....\n");
        return make_default_config(dev);
    }

    if ( sizeof(*dev) != fread(dev,1,sizeof(*dev),fp) ){
        printf("[load_dev+]sizeof error...\n");
        fclose(fp);
        return -1;
    }
    fclose(fp);
    return 0;   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章