嵌入式项目实践–多路温度采集控制系统(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;        }    }}