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 4 msg_type = TEMP_SMG_INDEX_BASE+channel; menu_send_update(msg_type,g_dev->temp_max[channel]);
#ipcs -q //顯示消息隊列 #ipcrm -q <ID> //刪除指定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 4
struct st_msg{
long int index;
int dat;
};
struct st_msg_dev{
long int index;
struct st_sys dev;
};
#endif菜單界面程序
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#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;
}
}
}免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。