📄 input.c
字号:
}
else{
i += 1;
}
//
if(i > ginput_para.editseat){ //落在一个字中间
ginput_para.editseat --;
i -= 2;
break;
}
}while(1);
ginput_para.cursorline = (i-strtbl[row])*6; //光标的列
//下面开始实际显示
for(i = ginput_para.startline; i <= ginput_para.endline; i ++){ //把行清空
LcdClearRowRam(i);
}
row = 0;
for(i = ginput_para.startline; i <= ginput_para.endline; i ++){
if(strtbl[row+1] == 0xff){ //最后一行了
LcdFillRowRam(i, 0, &ginput_para.str[strtbl[row]], FDISP);
break;
}
len = strtbl[row+1]-strtbl[row];
memcpy(dispbuf, &ginput_para.str[strtbl[row]], len);
dispbuf[len] = 0;
LcdFillRowRam(i, 0, dispbuf, FDISP);
row ++;
}
LcdBrushScreen();
}
/*******************************************************************
函数名称: tpi_input_cursor
函数功能: 处理光标闪烁消息
相关调用:
入口参数:
返 回 值:
备 注:
创建信息: YZM 2006-11-17
修改信息:
********************************************************************/
void input_cursor_opentime(void)
{
gTpiTimePwdPadCb.MsgPriority = MSG_NORMAL; //一般消息
gTpiTimePwdPadCb.Status = MSG_SERVICE; //服务
gTpiTimePwdPadCb.MsgDest = TPI; //至TPI层
gTpiTimePwdPadCb.Msg = TPI_INPUT_CURSOR; //光标闪烁
gTpiTimePwdPadCb.WParam = 0;
gTpiTimePwdPadCb.LParam = 0;
OpenTimer(TIMER_CURSOR,10,(u32)&gTpiTimePwdPadCb); //打开光标定时器
}
u8 tpi_input_cursortime(MSG *msg)
{
addkey[0] = CURSOR_SHINE; //加一个闪烁的键值
input_cursor_opentime();
return MSG_OUT;
}
void input_cursor_shine(u8 row, u8 line) //闪烁函数
{
u8 start, end;
start = line;
end = start+1;
LcdRowNodispRamAt(row, start, end);
LcdBrushScreen();
}
/*******************************************************************
函数名称: tpi_set_paypwd
函数功能: 输入字符主函数
相关调用:
入口参数: WParam回调消息;LParam限制长度;
返 回 值: cbmsg.WParam(ENTER,ESC);cbmsg.LParam=*inputstr;
备 注:
创建信息: YZM 2006-11-24
修改信息:
********************************************************************/
u8 tpi_input(MSG *msg)
{
u8 key, inputlen;
u16 i;
char outtemp[5];
if(msg->Status == MSG_TERMINAL) //该消息被终止
{
CloseTimer(TIMER_ZIMULAST); //停止字母确定时间
CloseTimer(TIMER_CURSOR); //停止光标闪烁
return MSG_OUT;
}
if(msg->Status == MSG_INITIAL){
msg->Status = MSG_SERVICE;
addkey[0] = SHIFTKEY;
input_cursor_opentime(); //打开光标定时器
tpi_input_disp();
}
//判断时间和键值
if(addkey[0]+addkey[1]){
if(addkey[0]){
key = addkey[0];
addkey[0] = 0;
}
else{
key = addkey[1];
addkey[1] = 0;
}
}
else{
key = GetKey(gKeyPadTab);
}
if(key != 0){
memset(outtemp, 0, 5);
switch(ginput_para.modetbl[ginput_para.curmode]){
case 1:
key = t9main(key, outtemp, &ginput_para.t9pyatt);
break;
case 2:
key = zimumain(key, 2, outtemp, &ginput_para.zimuatt);
break;
case 3:
key = zimumain(key, 3, outtemp, &ginput_para.zimuatt);
break;
case 4:
key = shuzimain(key, outtemp);
break;
case 5:
key = fuhaomain(key, outtemp, &ginput_para.fuhaopage);
break;
}
//对输入法返回的值解析
switch(key){
case 0:
inputlen = strlen(outtemp);
if(inputlen == 0){ //无输入
break;
}
if((ginput_para.edittail-ginput_para.edithead+inputlen) > ginput_para.limitlen){
break; //超过限定
}
//
for(i = ginput_para.edittail+inputlen; i > ginput_para.editseat; i --){
ginput_para.str[i] = ginput_para.str[i-inputlen]; //依次后移
if((i-inputlen) == 0){
break;
}
}
memcpy(&ginput_para.str[ginput_para.editseat], outtemp, inputlen);
ginput_para.editseat += inputlen;
memset(outtemp, 0, 5); //使用后清空
tpi_input_disp();
case CURSOR_SHINE:
input_cursor_shine(ginput_para.cursorrow, ginput_para.cursorline);
break;
case CLEAR:
if(ginput_para.editseat == ginput_para.edithead){
break;
}
key = 1;
if(ginput_para.editseat > ginput_para.edithead+1){
if(ginput_para.str[ginput_para.editseat-2] > 0x80){
key = 2;
}
}
ginput_para.editseat -= key;
for(i = ginput_para.editseat; i <= ginput_para.edittail-key; i ++){
ginput_para.str[i] = ginput_para.str[i+key];
}
tpi_input_disp();
break;
case ENTER:
CloseTimer(TIMER_CURSOR); //停止光标闪烁
tpi_input_disp(); //重新刷新显示
//
if(ginput_para.edittail-ginput_para.edithead > ginput_para.minlen){ //达到最小值
ginput_para.cbmsg.WParam = ENTER;
ginput_para.cbmsg.LParam = (u32)&ginput_para.str[ginput_para.edithead];
SendMessage(&ginput_para.cbmsg);
return MSG_OUT;
}
break;
case ESC:
CloseTimer(TIMER_CURSOR); //停止光标闪烁
ginput_para.cbmsg.WParam = ESC;
SendMessage(&ginput_para.cbmsg);
return MSG_OUT;
break;
case LEFT:
if(ginput_para.editseat-ginput_para.edithead > 0){
key = 1;
if(ginput_para.editseat-ginput_para.edithead > 1){
if(ginput_para.str[ginput_para.editseat-2] > 0x80){
key = 2;
}
}
ginput_para.editseat -= key;
tpi_input_disp();
}
break;
case RIGHT:
if(ginput_para.editseat < ginput_para.edittail){
if(ginput_para.str[ginput_para.editseat] > 0x80){
key = 2;
}
else{
key = 1;
}
ginput_para.editseat += key;
tpi_input_disp();
}
break;
case UP:
if(ginput_para.editseat-ginput_para.edithead >= 20){
ginput_para.editseat -= 20;
tpi_input_disp();
}
break;
case DOWN:
if((ginput_para.edittail-ginput_para.editseat) >= 20){
ginput_para.editseat += 20;
tpi_input_disp();
}
break;
case SHIFTKEY:
if(ginput_para.modetbl[ginput_para.curmode+1] == 0){
if(ginput_para.curmode == 0){
break;
}
else{
ginput_para.curmode = 0;
}
}
else{
ginput_para.curmode ++;
}
//
LcdClearRowRam(LINE4);
LcdClearRowRam(LINE5);
switch(ginput_para.modetbl[ginput_para.curmode]){
case 1:
LcdFillRowRam(LINE4, 0, "T9:", FDISP|INCOL);
memset(&ginput_para.t9pyatt, 0, sizeof(_T9PYATT));
break;
case 2:
LcdFillRowRam(LINE4, 0, "大写字母:", FDISP|INCOL);
memset(&ginput_para.zimuatt, 0, sizeof(ZIMUATT));
break;
case 3:
LcdFillRowRam(LINE4, 0, "小写字母:", FDISP|INCOL);
memset(&ginput_para.zimuatt, 0, sizeof(ZIMUATT));
break;
case 4:
LcdFillRowRam(LINE4, 0, "输入数字", FDISP|INCOL);
break;
case 5:
LcdFillRowRam(LINE4, 0, "输入符号:", FDISP|INCOL);
ginput_para.fuhaopage = 0;
fuhaomain(UP, outtemp, &ginput_para.fuhaopage);
break;
}
LcdBrushScreen();
break;
}
}
return MSG_KEEP;
}
/*******************************************************************
函数名称: PostInput
函数功能: 调用输入字符消息
相关调用:
入口参数: msgCbId回调消息;limitlen限制长度;inputbuf标记内存;
返 回 值:
备 注:
创建信息: YZM 2006-11-24
修改信息:
********************************************************************/
void PostInput(_INPUTPOSTFMT *inputpostfmt)
{
u8 i;
u32 mode;
MSG msg;
memset((u8*)&ginput_para, 0, sizeof(_INPUT_PARA));
//
ginput_para.cbmsg = inputpostfmt->cbmsg;
mode = inputpostfmt->mode;
for(i = 0; i < 8; i ++){
ginput_para.modetbl[i] = mode>>28;
mode <<= 4;
}
ginput_para.minlen = inputpostfmt->minlen;
ginput_para.limitlen = inputpostfmt->limitlen;
ginput_para.startline = inputpostfmt->startline;
ginput_para.endline = inputpostfmt->endline;
strcpy(ginput_para.str, inputpostfmt->title); //把标题和正文都集合到一起
strcat(ginput_para.str, inputpostfmt->str);
// strcat(ginput_para.str, " "); //编辑的时候多加一个空格;
//
ginput_para.curmode = 0xff; //下一个就是0,用来首次刷新
ginput_para.edithead = strlen(inputpostfmt->title); //标题长度,也是编辑的前截止位置
ginput_para.edittail = strlen(ginput_para.str);
ginput_para.editseat = ginput_para.edittail;
ginput_para.dispstartline = 0; //从0行开始显示
//
msg.MsgPriority = MSG_NORMAL; //普通消息
msg.Status = MSG_INITIAL; //初始化消息
msg.MsgDest = TPI; //至MMI
msg.Msg = TPI_INPUT; //INPUT消息
msg.WParam = 0;
msg.LParam = 0;
SendMessage(&msg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -