主程序包含了全局数据结构定义、系统配置文件生成或加载、建立四个独立线程并运行。

一、全局数据结构类型

封装每个设备的属性形成设备结构体类型(包含了:设备名、设备号、连接状态、开关状态、指向的下一个设备指针等)

封装每个区域的属性形成区域结构体类型(包含了:区域名、组成区域的设备号数组、区域开关状态等)

总数据结构类型:将上面两个类型数组化,从而开辟了可包含多个设备及区域的内存空间

同时将各个硬件设备及网络设备的文件描述符(网络设备为accept后的套接字)集合起来形成设备描述符结构类型

定义数据结构类型的config.h文件如下:

#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_AREA    4//系统最大区域容量
#define MAX_NET     2//系统最大连接的网络客户端#define J1_OFF   0x00
#define J1_ON   0X01
#define J2_OFF  0X00
#define J2_ON   0X01#define LIGHT_DEV   "/dev/4418_light"  //光线感应设备
#define MIC_DEV     "/dev/4418_mic"        //声音感应设备
#define PIR_DEV     "/dev/4418_hongwai"      //红外感应设备
#define RELAY1_DEV  "/dev/4418_relay1"     //延迟开关1
#define RELAY2_DEV  "/dev/4418_relay2"
#define SEARCH_DEV  "/dev/4418_search"   //5-3.3v电压转换设备#define ID_BASE        1struct 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];//存储accept后的套接字
};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_AREA];//区域列表int net_user[MAX_NET];//网络节点int count_dev;//连接设备计数
};//消息队列用到的消息结构体类型
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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.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,"Non named device");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,"Main device");//初始化主控设备连接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,connect_sta=%d,sw_sta=%d,bind_dev=%d,delay=%d",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);fclose(fp);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;
}

三、主程序(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;//系统初始化函数
int init_sys(void)
{int i;printf("init system...\n");load_dev(g_dev);//初始化g_devhead_node=stu_to_link(head_node);//创建设备结构链表头结点dev_print(head_node);//打印设备链表中的设备属性return 0;
}//main 函数
int main()
{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;}

基于ARM的智能灯光控制系统总结(3-主程序及全局数据结构)相关推荐

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

    基于ARM的智能灯光控制系统(4)数据结构 嵌入式开发培训(阶段2)底层系统开发 视频地址 智能灯光控制系统 视频地址 主控后台服务程序 daemon.c 程序功能模块 #include <pt ...

  2. 基于ARM的智能灯光控制系统-----需求分析

    基于ARM的智能灯光控制系统-----需求分析 项目实践流程: 1.设计项目需求文档 说明项目设计目的,项目功能,项目模块,实现技术. 2.项目编码设计 程序要求模块结构化(函数),编码风格良好,多文 ...

  3. 基于ARM的智能灯光控制系统(1)项目介绍

    基于ARM的智能灯光控制系统(1)项目介绍 项目实践说明: 本实践项目是嵌入式开发培训(阶段2)底层系统开发视频课程的综合实践项目. 项目开发使用的技术知识点包括:C语言编程,文件编程,串口编程,网络 ...

  4. 毕业/课程设计——基于STM32的智能灯光控制系统(物联网、智能家居、手机APP控制、语音控制)

    文章首先介绍本系统所包含的功能,主要包含六方面功能,之后逐步分享开发过程,其流程如下:点亮灯带(三极管)→调节灯光亮度(PWM)→为系统添加远程控制功能→为系统添加语音识别功能→添加超声波姿态监测功能 ...

  5. 基于arduino的校园灯光控制_基于51单片机智能灯光控制系统(人体感应)

    硬件组成: 由51单片机最小系统.红外热释电模块.光强度检测模块.继电器灯光控制模块和电源模块组成. 功能介绍: 1.单片机AT89S51.AT89S52.AT89C51.AT89C52.STC89C ...

  6. 基于单片机的智能路灯控制系统人体感应灯光控制系统的设计与实现

    功能介绍 以51单片机作为主控系统: LCD1602液晶显示当前时间.年月日.时分秒: 按键看看有设置自动手动模式: 3路红外探头用来感应当前3个区域是否有人: 按键可以设置当前时间.开启和关闭教室灯 ...

  7. 基于微信的智能家居控制系统的设计与实现

    基于微信的智能家居控制系统的设计与实现 目 录 1 绪论 6 1.1 课题研究的背景 6 1.2 智能家居系统的研究现状和发展前景 6 1.3 课题研究的意义 7 1.4 设计的研究内容 8 2 相关 ...

  8. 基于单片机的智能教室控制系统的设计

     word完整版可点击如下下载>>>>>>>> 基于单片机的智能教室控制系统的设计_c++课程设计题目汇总-硬件开发文档类资源-CSDN下载内容包括详细 ...

  9. 基于云计算的智能楼宇控制系统

    基于云计算的智能楼宇控制系统 本人原创文章,知网可见,转载表明原处 摘要:针对目前楼宇系统只有简单控制功能,不能对用户行为数据进行深入挖掘的普遍状况,提出了基于云计算的智能楼宇控制系统.该系统利用云服 ...

最新文章

  1. 加拿大两院院士裴健:搜索皆智能​,智能皆搜索
  2. Nginx配置文档具体解释
  3. javascript篇-console.log()打印object却显示为字符串[object object]
  4. 树莓派无法安装mariadb_RaspberryPi(树莓派)如何安装 MariaDB / MySQL 数据库
  5. Linux配置环境变量source时报错:export `=‘ not a valid identifier的一般原因
  6. php连接mysql数据库的连接类
  7. 从零打造在线版H5页面生成器
  8. [转载] Spring面试题整理
  9. 信息学奥赛一本通 1848:【07NOIP提高组】字符串的展开 | OpenJudge NOI 1.7 35:字符串的展开 | 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
  10. python3cookbook_python3-cookbook读书笔记(四)
  11. dhcp 服务器发出了 dhcpnack 消息,跪求DHCP报文分析
  12. C++ STL中Map的按Key排序和按Value排序
  13. 设计模式之单例模式8种实现方式,其六:双重检查
  14. 临床试验中lm是什么职位_据说!这是离临床试验成功最近的职位之一
  15. vue 项目初始化、mock数据以及安装less
  16. emacs python_将Emacs打造成强大的Python代码编辑工具
  17. h5计时器(requestAnimationFrame)
  18. 手机号微信号绑定微信号_相关计算机,新手机号被绑定过微信号怎么办?这是个“二次”放号的号码...
  19. 大数据分析案例-基于决策树算法构建员工离职预测模型
  20. JAVA图形化打字小游戏

热门文章

  1. IOS目标检测(翻译)
  2. Magento Meigee-Glam 主题的用法
  3. Dubbo—— 一个服务既是消费者又是提供者
  4. Android Camera摄像头预览黑屏原因(二)
  5. Android Studio 内部字体大小修改
  6. 【第67期】2021上半年朋友圈都在传的10本书都在这了
  7. 纪念日或者悼念日 网站改为灰白模式
  8. 使用HiPrint批量打印条码,二维码
  9. 人类为什么不再登月了?
  10. swiper的使用教程