嵌入式项目实践–多路温度采集控制系统(4)菜单界面
菜单界面
菜单显示
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': ... }
消息队列
获取队列ID
id = msgget((key_t)4455,0666|IPC_CREAT);
向队列发送消息
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;
消息类型处理
#define TEMP_SMG_INDEX_BASE 10#define UPDATE_TIME_SMG_INDEX 4msg_type = TEMP_SMG_INDEX_BASE+channel;menu_send_update(msg_type,g_dev->temp_max[channel]);
消息队列相关命令
#ipcs -q //显示消息队列#ipcrm -q//删除指定id队列
菜单界面代码
菜单程序头文件
#ifndef _TC9000_SYS_IPC_H#define _TC9000_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 4struct st_msg{ long int index; int dat;};struct st_msg_dev{ long int index; struct st_sys dev;};#endif
菜单界面程序
#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=4455int 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; } }}