📄 com_app.c
字号:
//*******************************************************************************
//File : com_app.c
//Function: communication application layer
//*******************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <api.h>
#include <database.h>
#include "ExEH0218.h"
#include "db.h"
#include "common.h"
#include "hd_DT_wl.h"
extern unsigned char g_id_self;
extern unsigned char g_id_server;
#define WAIT_TIME_ONLINE_CONNECT 2 //150 次数 大约 3 * 5.000 = 15秒
extern short g_com_port;
extern unsigned char g_curr_info_path;
extern unsigned char g_info_path_array[16];
extern int g_info_path_array_len;
extern int flag_ask_info_path; //0:没有核对信道 1:已经核对信道
short dt_online_request_wl(unsigned char *pDes,unsigned char id_myself);
void dt_delay(short n)
{
int i;
for(i=0;i<n;i++) delay_1ms();
}
//-----------------------------------------------------------------------------------
//显示数据上传结果!
short disp_com_result(const unsigned char *p_data,int datalen,unsigned char *str_title)
{
unsigned char str_dsp[MAX_NUMBER_DT_DATA+30];
short ret;
if(p_data[0] == 0)
{
sprintf(str_dsp,"%s%s",str_title,"成功");
DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
ret = SUCCESSFUL;
} else {
sprintf(str_dsp,"%s%s",str_title,"结果:");
DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
ret = FAILURE;
}
memset(str_dsp,' ',sizeof(str_dsp));
if(datalen<=1)
{
DispStr_CE(0,2,"没有返回字符串",DISP_CENTER);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
} else {
memcpy(str_dsp,p_data+1,datalen-1);
if((datalen-1)%16)
{
memset(str_dsp+datalen-1,' ',16-(datalen-1)%16);
datalen = (datalen-1)/16*16+16;
} else {
datalen--;
}
*(str_dsp+datalen) = 0;
{
BROWINFO bi;
bi.iStr = str_dsp;
bi.mInt = datalen/16;
bi.lineMax = 16;
bi.sFont = 0;
bi.startLine = 1;
bi.dispLines = 3;
bi.numEnable = 1; // 允许键盘‘2’‘8’代替拨轮上下
bi.qEvent = EXIT_AUTO_QUIT|EXIT_KEY_F1;
bi.autoexit = 30; // 30秒无操作自动关机
brow_info(&bi);
}
}
return ret;
}
//-----------------------------------------------------------------------------------
//disp_com_result函数的复制!如果不明确数据长度请调用disp_com_result
short disp_com_result_copy(const unsigned char *p_data,int datalen,unsigned char *str_title)
{
unsigned char str_dsp[MAX_NUMBER_DT_DATA+30];
short ret;
if(p_data[0] == 0)
{
sprintf(str_dsp,"%s%s",str_title,"成功");
DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
ret = SUCCESSFUL;
} else {
sprintf(str_dsp,"%s%s",str_title,"结果:");
DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
ret = SUCCESSFUL;
}
memset(str_dsp,' ',sizeof(str_dsp));
if(datalen<=1)
{
DispStr_CE(0,2,"没有返回字符串",DISP_CENTER);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
} else {
memcpy(str_dsp,p_data+1,datalen-1);
if((datalen-1)%16)
{
memset(str_dsp+datalen-1,' ',16-(datalen-1)%16);
datalen = (datalen-1)/16*16+16;
} else {
datalen--;
}
*(str_dsp+datalen) = 0;
DispStr_CE(0,2,str_dsp,DISP_CENTER|DISP_CLRLINE);
DispStr_CE(0,6,"任意键查看估清",DISP_CENTER|DISP_CLRLINE);
delay_and_wait_key(2,EXIT_AUTO_QUIT,0);
}
return ret;
}
//------------------------------------------------------------------------
//查询菜品显示-------disp_com_result函数的复制!如果不明确它功能请使用disp_com_result
short disp_lack_see(const unsigned char *p_data,int datalen,unsigned char *strs_title)
{
unsigned char str_dsp[MAX_NUMBER_DT_DATA+30];
short ret;
clr_scr();
if(p_data[0] == 0)
{
sprintf(str_dsp,"%s%s",strs_title,"完毕");
DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
DispStr_CE(0,2,"没有点菜菜!",DISP_CENTER|DISP_CLRSCR);
ret = SUCCESSFUL;
} else {
sprintf(str_dsp,"%s%s",strs_title,"查询");
DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
ret = FAILURE;
}
memset(str_dsp,' ',sizeof(str_dsp));
if(datalen<=1)
{
DispStr_CE(0,2,"没有返回字符串",DISP_CENTER);
DispStr_CE(0,3,"请再次查询!",DISP_CENTER);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
} else {
memcpy(str_dsp,p_data+1,datalen-1);
if((datalen-1)%16)
{
memset(str_dsp+datalen-1,' ',16-(datalen-1)%16);
datalen = (datalen-1)/16*16+16;
} else {
datalen--;
}
*(str_dsp+datalen) = 0;
{
BROWINFO bi;
bi.iStr = str_dsp;
bi.mInt = datalen/16;
bi.lineMax = 16;
bi.sFont = 0;
bi.startLine = 1;
bi.dispLines = 3;
bi.numEnable = 1; // 允许键盘‘2’‘8’代替拨轮上下
bi.autoexit = 30; // 30秒无操作自动关机
bi.qEvent = EXIT_KEY_F1|EXIT_AUTO_QUIT;
brow_info(&bi);
}
}
return ret;
}
//-----------------------------------------------------------------------
//Function: app_connect
//Input : src -- this handset id
//Output : pIDServer -- server id
//Return : SUCCESSFUL
// FAILURE
//-----------------------------------------------------------------------
short app_connect(unsigned char *pIDServer,unsigned char src)
{
//申请上线
unsigned char src_recv;
int err_counter;
unsigned char str_dsp[100];
DispStr_CE(0,0,"正在连接...",DISP_CENTER|DISP_CLRSCR);
//建立连接
err_counter = 0;
while(1)
{
if(dt_online_request_wl(pIDServer,src)!=SUCCESSFUL) //5*3 = 15s 每次
{
//DispStr_CE(0,2,"上线申请失败!",DISP_POSITION|DISP_CLRSCR);
TRACE(str_dsp,"dt_ol_req err");
//delay_and_wait_key(0,EXIT_KEY_ALL,0);
return FAILURE;
}
DispStr_CE(0,2,"上线成功",DISP_POSITION);
if(dt_connect_recv(&src_recv,src)==SUCCESSFUL)
{
if(src_recv==*pIDServer) break;
}
if(err_counter++>=WAIT_TIME_ONLINE_CONNECT)
{
DispStr_CE(0,4,"连接失败!",DISP_POSITION);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
return FAILURE;
}else {
sprintf(str_dsp,"app con err:%d",err_counter);
TRACE(str_dsp);
}
}
DispStr_CE(0,4,"连接成功",DISP_POSITION);
return SUCCESSFUL;
}
short app_comm_route(unsigned char cmd,unsigned char type,unsigned char *p_data_send,int len_send,unsigned char *p_data_recv,int *p_len_recv)
{
unsigned char data[MAX_NUMBER_DT_DATA+30];
unsigned short Acknowledge,Acknowledge1;
unsigned char des,src=g_id_self,des_recv,src_recv;
unsigned char id_server;
unsigned char str_dsp[50];
short ret;
int datalen;
unsigned char cmd_op, cmd_type;
int len_recv;
int err_counter = 0;
int step=0;//目前根据实际的需要:只有一个CMD_RTD,CMD_RTC,故采用step计算方法防止服务器重发
int seq = 0;
//初始化串口
dt_init(PORT_UART_MODEM,9600);
g_com_port = PORT_UART_MODEM;
ret = app_connect(&id_server,src);
if(ret != SUCCESSFUL)
{
dt_exit();
return FAILURE;
}
//进行数据通讯
src = g_id_self;
des = id_server;
data[0] = CMD_REQ;
data[1] = cmd;
data[2] = type;
memcpy(data+3,p_data_send,len_send);
datalen = 3+len_send;
if ((dt_send(des,src,data, datalen) != SUCCESSFUL))
{
TRACE("app_c_r:dt_send err");
dt_exit();
return FAILURE;
}
len_recv = 0;
err_counter = 0;
step = 0;
while(1)
{
if((dt_recv(&des_recv,&src_recv,data, &datalen,&Acknowledge) == SUCCESSFUL))
{
if((des_recv!=src)||(src_recv!=des))
{
TRACE("App:s&d err");
sprintf(str_dsp,"%d:%d:%d:%d",des_recv,src,src_recv,des);
TRACE(str_dsp);
//ret = FAILURE;
//break;
}else if(datalen>=2){
cmd_type = data[0];
cmd_op = data[1];
if((cmd_op==cmd)&&(cmd_type==CMD_RTD))
{
if(datalen>3)
{
if(len_recv==0)
{
Acknowledge1=Acknowledge;
memcpy(p_data_recv+len_recv,data+3,datalen-3);
len_recv += datalen-3;
}else {
if(Acknowledge == Acknowledge1+1)
{
Acknowledge1=Acknowledge;
memcpy(p_data_recv+len_recv,data+3,datalen-3);
len_recv += datalen-3;
}
}
TRACE("NUM:%d %d %d",seq++,len_recv,Acknowledge);
}
}
if((cmd_op==cmd)&&(cmd_type==CMD_RTC))
{
if(datalen>3)
{
memcpy(p_data_recv+len_recv,data+3,datalen-3);
len_recv += datalen-3;
}
*p_len_recv = len_recv;
TRACE("app_c_r OK");
// getch();
// dump_memory(p_data_recv+len_recv-24,8,0);
// dump_memory(p_data_recv+len_recv-24+8,8,1);
// dump_memory(p_data_recv+len_recv-24+16,8,2);
// dump_memory(&len_recv,4,3);
// getch();
//delay_and_wait_key(0,EXIT_KEY_ALL,0);
ret = SUCCESSFUL;
break;
}
}
}
err_counter++;
if(err_counter>48) //20次 20*0.125 =
{
TRACE("app_c_r:dt_recv err");
ret = FAILURE;
break;
}
}
dt_exit();
return ret;
}
//上传客户已点菜品
short comm_upld_client_dish()
{
unsigned char src=g_id_self;
unsigned char id_server;
short ret;
//初始化串口
DispStr_CE(0,0,"上传已点菜...",DISP_POSITION|DISP_CLRSCR);
dt_init(PORT_UART_MODEM,9600);
g_com_port = PORT_UART_MODEM;
ret = app_connect(&id_server,src);
if(ret == SUCCESSFUL)
{
//进行数据通讯
ret = dt_send_tab_data(id_server,g_id_self,ID_TAB_CLIENT_MENU);
}else {
DispStr_CE(0,4,"连接失败!",DISP_POSITION);
delay_and_wait_key(5,EXIT_KEY_ALL,0);
}
dt_exit();
return ret;
}
//--------------------------------------------------------------------------------------------
//梅海华 2004/12/29 乌市
//这个函数涉及道扫描的时间的长短
//dt_online_request:用于扫描当前的缺省的信道号,这里假设当前的信道号是上次通讯中被手持机选中
// 的有效信号,给一个较长的扫描时间给缺省信道.循环3次
//在扫描楼层的信道的时候采用随机数选中当前楼层的一个信道而开始循环搜索,循环两次.
//缺省信道的3次循环,大循环的2次循环的时间单位都以dt_online_request_doing中消耗的时间为标准
//在当前的搜索中该函数的标准时间为:
// WAIT_TIME_ONE_BYTE = 8;
// TIMES_CNNCT_RECV_OL_RETRY = 8;
// 8/64 = 0.125秒 ==>每次dt_online_request_doing即dt_connect_recv_online 1秒
//---------------------------------------------------------------------------------------------
//该函数同dt_online_request,由于无线存在多通道切换问题,另外提供一个函数
//Input: id_myself手持机自己的通讯地址
//Output: pDes 返回通讯成功时候的服务器的通讯地址
//Return: SUCCESSFUL
// FAILURE
//---------------------------------------------------------------------------------------------
short dt_online_request_wl(unsigned char *pDes,unsigned char id_myself)
{
int i,j,ii;
short ret;
unsigned char str_dsp[100];
int pos;
unsigned char info_path_tmp;
if(dt_online_request(pDes,id_myself)==SUCCESSFUL) //第一次缺省取上次通道号
return SUCCESSFUL;
else {
//如果没有成功则循环查询
srand(RTC_read_time()); //随机确定信道号
if(g_info_path_array_len <= 0) return FAILURE;
if(g_info_path_array_len == 1)
pos = 0;
else
pos = rand()%(g_info_path_array_len-1); //设置随机次数(0 -- g_info_path_array_len)
for(ii=0;ii<3;ii++)
{
for(i=0;i<g_info_path_array_len;i++)
{
// msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
// if (msg_buffer.bits.key_available)
// {
// if(KEY_read()==KEY_F1)
// {
// dt_exit();
// return FAILURE;
// }
// }
info_path_tmp = g_info_path_array[pos];
sprintf(str_dsp,"搜索信道...%2d",info_path_tmp);
DispStr_CE( 0, 2, str_dsp, DISP_POSITION);
for(j=0;j<3;j++)
{
//sprintf(str_dsp,"Set info path:%d",g_info_path_array[i]);
//TRACE(str_dsp);
ret = dt_set_wl_info_path(info_path_tmp);
if(ret == SUCCESSFUL)
{
g_curr_info_path = info_path_tmp;
break;
}
//for(k=0;k<50;k++) delay_1ms();
}
if(j>=3) //3次错误退出
{
//TRACE("set wl path err");
DispStr_CE( 0, 2, "信道设置出错", DISP_POSITION);
dt_delay(300);
return -2;
}
//取随机数
//sprintf(str_dsp,"brd cnnct err:%d,%d",i,ii);
//TRACE(str_dsp);
//srand(RTC_read_time());
//seq = rand()%RAM_SEQ_BASE; //设置随机次数(0 -- RAM_SEQ_BASE)
ret = dt_online_request_doing(pDes,id_myself,0);
if(ret==SUCCESSFUL) {
return SUCCESSFUL;
}
pos++;
if(pos>=g_info_path_array_len) pos = 0;
}
}
TRACE("Search end");
return FAILURE;
}
}
//------------------------------------------------------------------------------------
//功能:查询
/*short query_data()
{
unsigned char src=g_id_self;
unsigned char id_server;
unsigned char fsid;
short ret;
ret = app_connect(&id_server,src);
if(ret == SUCCESSFUL)
{
//进行数据通讯
ret
}else {
DispStr_CE(0,4,"连接失败!",DISP_POSITION);
delay_and_wait_key(5,EXIT_KEY_ALL,0);
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -