📄 sys_set.c
字号:
//*******************************************************************************
//File : sys_set.c
//Function: application system parameter set
//*******************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <api.h>
#include "ExEH0218.h"
#include <database.h>
#include "db.h"
#include "hd_DT_wl.h"
#include "common.h"
extern unsigned short g_connect;
extern unsigned short g_rec_size[5];
extern char g_blocknum[5];
extern unsigned int ac_time;
extern unsigned char g_desk_NO[4+1];
extern unsigned char g_person_num;
extern unsigned char g_waiter_NO[4+1];
extern unsigned char g_waiter_PWD[4+1];
extern unsigned int ac_time;
extern unsigned char g_id_self;
extern unsigned char g_id_server;
extern short g_com_port;
extern unsigned char g_info_path_array[16];
extern int g_info_path_array_len;
extern int flag_ask_info_path; //0:没有核对信道 1:已经核对信道
extern int g_curr_floor;
extern short g_LCD_contrast; //lcd contranst
extern unsigned int el_time;
extern unsigned char g_curr_info_path;
extern unsigned char g_menu_set_float_percent;
int set_info_path_doing(unsigned char path);
//无线测试的发送函数
int hac_send()
{
typ_UART_stat_word Usw;
char viewstr2[20];
long i,n,okcount,errcount;
short ret;
int re_send_count;
int flag;
okcount=0;
errcount=0;
i=0;
re_send_count = 0;
DispStr_CE(0,3,"开始发送",DISP_CENTER|DISP_CLRSCR);
DispStr_CE(0,6,"按ENTER",DISP_CENTER);
delay_and_wait_key(0,EXIT_KEY_ENTER,0);
dt_init(PORT_UART_MODEM,9600);
while(UART_get_char()!=-1);
DispStr_CE(0,0,"发出 收到",DISP_CENTER|DISP_CLRSCR);
flag = 0;
while(1)
{
UART_send_char(i); //发送数据
do{
Usw.l_word = UART_stat();
} while (Usw.bits.out_busy);
SPT_set(32);
while(SPT_read()) //接收返回字符
{
n=0;
ret=UART_get_char();
if(ret!=-1)
{
if(ret == i)
{
okcount++; //收到CHK=2错误信息
}else {
errcount++; //收到CHK=1正确信息
}
sprintf(viewstr2,"=>:%d <=:%d",i,ret);
DispStr_CE(0,2,viewstr2,DISP_POSITION|DISP_CLRLINE);
sprintf(viewstr2,"OK:%d Err:%d",okcount,errcount);
DispStr_CE(0,4,viewstr2,DISP_POSITION|DISP_CLRLINE);
sprintf(viewstr2,"Total:%d",okcount+errcount);
DispStr_CE(0,6,viewstr2,DISP_POSITION|DISP_CLRLINE);
re_send_count = 0;
break;
}
if (KEY_read()==KEY_F1)
{
UART_init(UART_OFF);
return ;
}
}
i++;
if(i>255) i=0;
if (KEY_read()==KEY_F1)
{
UART_init(UART_OFF);
return ;
}
}
}
//无线测试的接收函数
int hac_receive()
{
short ret;
typ_UART_stat_word Usw;
unsigned char ch;
int i;
unsigned char viewstr[100];
clr_scr();
dt_init(PORT_UART_MODEM,9600);
while(UART_get_char()!=-1);
i=0;
while(1)
{
if (KEY_read()==KEY_F1) break;
ret = UART_get_char();
if(ret==-1) continue;
ch = ret;
UART_send_char(ch);
do{
Usw.l_word = UART_stat();
} while (Usw.bits.out_busy);
sprintf(viewstr,"收到:%d",i++);
DispStr_CE(0,2,viewstr,DISP_CENTER);
}
UART_init(UART_OFF);
return ;
}
//无线测试菜单
void test_wireless()
{
int ret;
BROWINFO bi;
const char mmenu[2*12+2] = "1.发送 2.接收 ";
bi.lPtr = bi.cPtr = 0;
while(1){
clr_scr(); // 清屏幕
bi.iStr = (char*)mmenu;
bi.mInt = 2;
bi.lineMax = 12;
bi.sFont = 0;
bi.startLine = 0;
bi.dispLines = 2;
bi.numEnable = 1; // 允许键盘‘2’‘8’代替拨轮上下
bi.qEvent = EXIT_KEY_POWER|EXIT_KEY_F1|EXIT_AUTO_QUIT|EXIT_KEY_COMM;//按[F3]和[电源]键退出
bi.autoexit = 300; // 30秒无操作自动关机
ret = brow_select( &bi ); // 显示主菜单
switch( ret )
{
case 0:
hac_send();
break;
case 1:
hac_receive();
break;
default:
if (bi.qEvent==EXIT_KEY_POWER||bi.qEvent==EXIT_AUTO_QUIT)
{
Halt_EH0218(POWER_DELAY); // 关机
}
if (bi.qEvent==EXIT_KEY_F1) return;
if (bi.qEvent==EXIT_KEY_COMM) return;
break;
}
}
}
//选择通讯口
int set_com_port()
{
short ret;
const char cmenu[3*16+2] = "1.无线 2.232串口 3.红外接口 \0";
BROWINFO bi;
int lPtr;
clr_scr();
DispStr_CE(0,0,"请选择通讯端口:",DISP_CENTER|DISP_CLRSCR);
if(g_com_port == PORT_UART_MODEM)
lPtr = 0;
else if(g_com_port == PORT_UART_232)
lPtr = 1;
else if(g_com_port == PORT_UART_IRDA)
lPtr = 2;
else
lPtr = 0;
bi.lPtr = lPtr;
bi.cPtr = 0;
bi.startLine = 1; //在画面中显示的起始地址,第一行为0
bi.dispLines = 3;
bi.iStr = (char*)cmenu;
bi.mInt = strlen(cmenu)/16;
bi.lineMax = 16;
bi.sFont = 0;
bi.numEnable = 0; // 允许键盘‘2’‘8’代替拨轮上下
bi.qEvent = EXIT_AUTO_QUIT|EXIT_KEY_F1|EXIT_KEY_POWER; // 按[F3]和[电源]键退出
bi.autoexit = ac_time; // 30秒无操作自动关机
ret = brow_select( &bi ); // 显示主菜单
if(ret<0)
{
return ret;
} else {
if(ret==0) g_com_port = PORT_UART_MODEM;
else if(ret==1) g_com_port = PORT_UART_232;
else if(ret == 2) g_com_port = PORT_UART_IRDA;
return SUCCESSFUL;
}
}
//从flash上读取无线通讯地址 g_id_self
int read_self_id()
{
int ret;
if(g_id_self != 0xff) //如果没有
{
return SUCCESSFUL;
}else {
}
read_addr_com( &g_id_self);
if(g_id_self == 0 || g_id_self == 0xff)
{
DispStr_CE(0,1,"通讯地址设置有误",DISP_CENTER|DISP_CLRSCR);
ret = sure(1,5,"设置","取消");
if(ret == 0)
{
set_self_id();
}
}
return SUCCESSFUL;
}
//设置手持机的无线通讯地址 g_id_self ,存放在flash上
int set_self_id()
{
GETSTR_PARAM gs;
char retstr[20];
short ret;
unsigned char str_dsp[100];
DispStr_CE(0,0,"请输入无线ID号:",DISP_CENTER|DISP_CLRSCR);
sprintf(retstr,"%d",g_id_self);
gs.qx = 0;
gs.qy = 2;
gs.alpha = 0;
gs.nullEnable = 0;
gs.sFont = 0; // 7x9大字体
gs.pPrompt = ""; // 提示语句
gs.csChar = '_'; // 光标字符'_'
gs.pwChar = 0;
gs.spChar = 0; // 不允许分隔字符
gs.pStr = retstr; // 输入字符串放在retstr中
gs.maxNum = 3; // 最多允许3个字符
gs.minNum = 1; // 最少必须3个字符
gs.minValue = 1; // 最小值1000
gs.maxValue = 254; // 最大值50000
gs.retNum = strlen(retstr); // 初始值4位(1024)
gs.autoexit = 30; // 30秒无按键自动退出
gs.qEvent = EXIT_KEY_F1|EXIT_AUTO_QUIT; // 默认按[F1]及无按键自动退出
ret = huGetStr_E(&gs);
if(ret) return ret;
else {
if(modify_addr_com(gs.retValue)!=SUCCESSFUL)
{
DispStr_CE(0,2,"修改Flash失败",DISP_CENTER|DISP_CLRSCR);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
return FAILURE;
}
DispStr_CE(0,0,"ID号被设置为:",DISP_CENTER|DISP_CLRSCR);
g_id_self = gs.retValue;
sprintf(str_dsp,"%d",g_id_self);
DispStr_CE(0,2,str_dsp,DISP_CENTER);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
return 0;
}
}
//扫描楼层的所有信道是否能成功通讯,用于现场测试
int scan_floor_info_path()
{
int num_floor;
unsigned char str_dsp[100];
num_floor = *(short*)(ADDR_HANDSET_INFO+2);
if(num_floor>100||num_floor<=0) //有没有通过服务器设定通道号,或不对,在新机器中是0xffff
{//没有设置,提示后,选择退出
DispStr_CE(0,2,"需要查询信道号",DISP_CENTER|DISP_CLRSCR);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
return FAILURE;
}
//楼层大扫描
//初始化串口
select_floor_set();
dt_init(PORT_UART_MODEM,9600);
sprintf(str_dsp,"Search floor ... %d",g_curr_floor);
DispStr_CE( 0, 0,str_dsp, DISP_POSITION|DISP_5x7|DISP_CLRSCR);
dt_scan_floor_info_path(g_info_path_array,g_info_path_array_len,g_id_self);
//dump_memory(g_info_path_array,g_info_path_array_len,0);
//dump_memory(&g_info_path_array_len,4,1);
//delay_and_wait_key(0,EXIT_KEY_ALL,0);
delay_and_wait_key(0,EXIT_KEY_ALL,0);
set_info_path_doing(g_curr_info_path); //恢复原来的设置
dt_exit();
}
//设置无线信道函数,1.开无线模块 2.设置信道号 3.关闭无线模块
#define TIME_WAIT_SET_PATH 3000
int set_info_path_doing(unsigned char path)
{
//set CTS
int ii;
int k;
int ret = FAILURE;
__asm__ volatile("bset #7, (0xFFFFF420).w"); // 设置PE7为输出
__asm__ volatile("bset #7, (0xFFFFF422).w"); // 允许PE7上拉电阻
__asm__ volatile("bset #7, (0xFFFFF423).w"); // PE7为IO口
__asm__ volatile("bset #7, (0xFFFFF421).w"); // PE7为高电平
for(ii=0;ii<TIME_WAIT_SET_PATH;ii++);
//open Uart
UART_init(UART_ON|UART_MODEM_ON|UART_8_DATA_BITS|UART_BAUD_9600);
UART_fcntl(UART_fcntl(UART_F_INQ)|UART_F_NO_CTS);
for(ii=0;ii<TIME_WAIT_SET_PATH;ii++);
//set path
for(ii=0;ii<3;ii++)
{
ret = dt_set_wl_info_path(path);
if(ret == SUCCESSFUL) break;
for(k=0;k<50;k++) delay_1ms();
}
//close UART
if(ret == SUCCESSFUL) g_curr_info_path = path;
UART_init(UART_OFF);
return ret;
}
/*读取无线模块的通讯信道,由于我们的UART_init打开的时间太长,没有办法在100ms内读取到
无线模块返回的通讯信道字符串,这里采用Modem Vcc关掉无线模块的电源.可能是上面有很大的
电容导致无线模块放电的时间太长,使用modem Vcc关闭电源需要延时20秒的时间.导致该函数不
好用.在这儿采用全局变量保存的方法在设置的画面中显示手持机的当前无线信道的编号.
梅海华 2004/12/28 乌鲁木齐
__asm__ volatile("bset #7, (0xFFFFF420).w"); // 设置PE7为输出
__asm__ volatile("bset #7, (0xFFFFF422).w"); // 允许PE7上拉电阻
__asm__ volatile("bset #7, (0xFFFFF423).w"); // PE7为IO口
__asm__ volatile("bclr #7, (0xFFFFF421).w"); // PE7为低电平
__asm__ volatile("bset #7, (0xFFFFF421).w"); // PE7为高电平
PE7即为CTS */
//读取无线模块的执行函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -