1、配置文件
config.h
#ifndef _DTH9000_H
#define _DH90000_H
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/ioctl.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<sys/time.h>
#include<errno.h>
#define CONFIG_FILE "gp9002.cfg" //系统配置文件名称
#define ON 1
#define OFF 0
#define MAX_RECORD 200 //温湿度最大的记录条数N (N+1)
#define LOG_TIME 5 //日志记录间隔(分)
#define DEF_T_UPP 50 //默认温度上限(C)
#define DEF_T_LOW 5 //默认温度下限 (C)
#define DEF_H_UPP 80 //默认湿度上限 (%)
#define DEF_H_LOW 30 //默认湿度下限 (%)
#define DEF_T_SET 5 //默认温度回差 (%)
#define DEF_H_SET 5 //默认湿度回差 (%)
#define DEF_M_TIME 5 //默认检测间隔时间(s)
//报警参数设置
struct st_alarm_set{
char temp_upper; //温度上限
char temp_lower; //温度下限
char humi_upper; //湿度上限
char humi_lower; //湿度下限
char temp_change_set; //温度回差
char humi_change_set; //湿度回差
char monitor_time; //检测间隔时间
char temp_proof; //温度校正
char humi_proof; //湿度校正
};
//时间
struct st_sys_time{
int year;
char month;
char day;
char hour;
char minute;
char second;
};
//记录内容:序号 日期 时间 温度 湿度 :2019/2/23 21:01 23 65
struct st_log_data{
int id; //序号
float log_temp; //温度
float log_humi; //湿度
char state: //记录报警状态
struct st_sys_time log_time;//数据日志
};
//系统总体数据结构
struct st_sys_dev{
struct st_alarm_set alarm_set; //湿温度报警
struct st_sys_time curr_time; //记录时间
struct st_log_data logd[MAX_RECORD]; //数据日志
int rt_show; //实时显示数据
int outdev_s; //继电器启用开关状态
int log_time; //记录间隔时长
int log_index; //记录下标
int log_count; //有效记录总数
};
int make_default_config(struct st_sys_dev *dev);
int save_dev(struct st_sys_dev *dev);
int load_dev(struct st_sys_dev *dev);
void sys_time(struct st_sys_time *stime);
#endif
config.c
#include <string.h>
#include <stdio.h>
#include "config.h"
/*============================================
函数名称:make_default_config
功能:创建系统的配置文件,第一次运行或配置文件不存在
参数:struct st_sys * dev
返回值:0 成功 -1失败
============================================*/
int make_default_config(struct st_sys * dev)
{
printf("Make default configuration.\n");
memset(dev,0,sizeof(struct st_sys));
dev->alarm_set.temp_upper = DEF_T_UPP;
dev->alarm_set.temp_lower = DEF_T_LOW;
dev->alarm_set.humi_upper = DEF_H_UPP;
dev->alarm_set.humi_lower = DEF_H_LOW;
dev->alarm_set.temp_change = DEF_T_SET;
dev->alarm_set.humi_change = DEF_H_SET;
dev->alarm_set.monitor_time = DEF_M_TIME;
dev->alarm_set.humi_proof = 0;
dev->alarm_set.temp+proof = 0;
dev->rt_show = ON;
dev->outdev_s = ON;
dev->log_time = LOG_TIME;
dev->log_count = 0;
return save_dev(dev);
}
/*============================================
函数名称:save_dev
功能:保存系统的配置文件
参数:struct st_sys * dev
返回值:0 成功 -1失败
============================================*/
int save_dev(struct st_sys * dev)
{
FILE * fp;
if (NULL == (fp=fopen(CONFIG_FILE, "wb"))){
printf("Config file open null...\n");
return -1;
}
printf("\nSave system data!");
fwrite(dev, sizeof(*dev),1,fp); //write file
fclose(fp);
return 0;
}
/*============================================
函数名称:load_dev
功能:创建系统的配置文件
参数:struct st_sys * dev
返回值:0 成功 -1失败
============================================*/
int load_dev(struct st_sys * 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;
}
/*============================================
函数名称:sys_time
功能:系统时间功能
参数:struct st_sys_time *stime
返回值:1 计时一秒 0不到一秒
============================================*/
void sys_time(struct st_sys_time *stime)
{
time_t timep;
struct tm *p;
time(&timep);
stime->yera = (1900+p->tm_year);
stime->month = (1+p->tm_mon);
stime->day = p->tm_mday;
stime->hour = p->tm_hour;
stime->minute = p->tm_min;
stime->second = p->tm_sec;
}