基于ARM的智能灯光控制系统(4)数据结构

主控后台服务程序

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;   
}

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