实现效果:
主要的文件:1、config.h && config.c 配置文件
2、 sys_ipc.h && sys_ipc.c 菜单文件
3、 Makefile
执行 trace@trace-virtual-machine: make 即可形成可执行文件
1、配置文件
#ifndef CONFIG_H
#define CONFIG_H
#define CONFIG_FILE "tc9000.cfg" //配置文件名
#define ON 1
#define OFF 0
#define DEF_T_UP 70 //默认温度上限(C)
#define DEF_T_LOW 5 //默认温度下限(C)
#define DEF_U_TIME 5 //默认检测间隔时间(s)
#define DEF_MAX_CHANNEL 4 //采集的路数
//系统总体数据结构
struct st_sys{
int temp_max[DEF_MAX_CHANNEL]; //设置每路温度报警最大值
float temp_data[DEF_MAX_CHANNEL]; //每路温度
char status[DEF_MAX_CHANNEL]; //每路状态
char update_time; //网页刷新秒数
};
int make_default_config(struct st_sys * dev);
int save_dev(struct st_sys * dev);
int load_dev(struct st_sys * dev);
#endif
#include
#include
#include "config.h"
/*============================================
函数名称:make_default_config
功能:创建系统的配置文件,第一次运行或配置文件不存在
参数:struct st_sys * dev
返回值:0 成功 -1失败
============================================*/
int make_default_config(struct st_sys * dev)
{
int i;
printf("Make default configuration.\n");
memset(dev,0,sizeof(struct st_sys));
for(i=0;itemp_max[i] = DEF_T_UP;
dev->temp_data[i] = 0;
dev->status[i] = 0;
}
dev->update_time = DEF_U_TIME;
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_ipc.h */
#ifndef SYS_IPC_H
#define SYS_IPC_H
#include "config.h"
//消息队列接收时索引值
#define TEMP_SMG_INDEX_BASE 10
#define WEB_SMG_INDEX 2
#define WEB_UPDATE_SMG_INDEX 3
#define UPDATE_TIME_SMG_INDEX 4
struct st_msg{
long int index;
int dat;
};
struct st_msg_dev{
long int index;
struct st_sys dev;
};
#endif
/* sys_ipc.c */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "sys_ipc.h"
#include "config.h"
int menu_alarm(char * cmd);//报警功能菜单
int get_line(char *cmd);//获取命令行输入
struct st_sys g_dev[1];//全局变量
char shell_s[]="\nG9000 shell>$: ";//命令行提示符号
//同菜单进程通信的队列,key=4455
int get_msgid_menu(void)
{
int id = -1;
id = msgget((key_t)4455,0666|IPC_CREAT);
if(id == -1){
printf("msgget error\n");
exit(1);
}
return id;
}
//向主控程序发送设置的数据
/*============================================
函数名称:menu_send_update
功能:向主控程序发送设置的数据
参数:long int 消息类型 int 消息数据
返回值:return 0 返回主菜单
============================================*/
int menu_send_update(long int index,int dat)
{
int msgid;
struct st_msg cmd;
cmd.index = index;
cmd.dat = dat;
if((msgid=get_msgid_menu()) < 0)
return -1;
if(msgsnd(msgid,(void*)&cmd,sizeof(int),0)==-1)
return -1;
return 0;
}
/*============================================
函数名称:menu_alarm
功能:温湿度报警设置菜单
参数:char* cmd 用户输入的命令
返回值:return 0 返回主菜单
============================================*/
int menu_alarm(char* cmd)
{
int channel;
long int msg_type;
while(1){
printf("\n [1] 检测间隔时间(5-300s)");
printf("\n [2] 温度上限报警值(40-90℃)");
printf("\n [3] 温度下限报警值(-20-5℃)");
printf("\n [4] 温度报警回差设置(1-10℃)");
printf("\n [x] 返回主菜单");
printf(shell_s);
fflush(stdout);
get_line(cmd);
switch(cmd[0]){
case '1':
printf("当前检测间隔时间:%d\n",g_dev->update_time);
printf("请输入新值:");
fflush(stdout);
get_line(cmd);
g_dev->update_time= atoi(cmd);
msg_type = UPDATE_TIME_SMG_INDEX;
menu_send_update(msg_type,g_dev->update_time);
break;
case '2':
printf("\n 请选择传感器编号[1] [2] [3] [4] :");
fflush(stdout);
get_line(cmd);
channel = atoi(cmd)-1;
printf("当前温度上限报警值:%d\n",g_dev->temp_max[channel]);
printf("请输入新值:");
fflush(stdout);
get_line(cmd);
g_dev->temp_max[channel]= atoi(cmd);
msg_type = TEMP_SMG_INDEX_BASE+channel;
menu_send_update(msg_type,g_dev->temp_max[channel]);
break;
case 'x':
return 0;
break;
default:
printf("输入选项错误!\n");
break;
}
}
return 1;
}
//命令行输入处理
int get_line(char *cmd)
{
int i=0;
char temp;
memset(cmd,0,sizeof(cmd));
while (1) {
temp = getchar();
cmd[i]=temp;
if(cmd[i]==13 || cmd[i] == 10){
cmd[i]=0;
break;
}
fflush(stdout);
i++;
}
return 0;
}
/*============================================
函数名称:main
功能:系统命令行处理菜单主程序,通过队列同后台程序通信
参数:void * arg
返回值:int
============================================*/
int main(void)
{
char cmd[16];//命令数据缓冲区
load_dev(g_dev);
while(1){
system("clear");
printf("\nTC9000 湿温度控制系统V1.0");
printf("\n [1] 报警设置");
printf("\n [2] 输出控制设置");
printf("\n [3] 湿度/温度查询");
printf("\n [4] 系统设置");
printf("\n [x] 退出系统");
printf(shell_s);
fflush(stdout);
get_line(cmd);
switch(cmd[0]){
case '1':
menu_alarm(cmd);
break;
case '2':
//menu_out_set(cmd);
break;
case '3':
//menu_data_show(cmd);
break;
case '4':
//menu_sys_set(cmd);
break;
case 'x':
exit(0);
break;
default:
printf("输入选项错误\n");
break;
}
}
}
# by zzf 2019/02/25
mymake:config.o sys_ipc.o
gcc config.o sys_ipc.o -o mymake
config.o:config.c
gcc -c config.c -o config.o
sys_ipc.o:sys_ipc.c
gcc -c sys_ipc.c -o sys_ipc.o
clean:
rm -f *.o