⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selebox.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
******************************************************************
*                  XIAMEN YAXON NETWORK CO.LTD.  
*                   XINXI BUILDING,HULI,XIAMEN
*      (c) Copyright 2002,XIAMEN YAXON NETWORK CO.LTD. ,XIAMEN
*                     All Rights Reserved
*
* FileName     :  SELEBOX.C
* Programmer(s):  YangLei
* Description  :  输入法改。有中英文及数字标点输入,汉字有联想功能
******************************************************************
*/

/*
*****************************************************************
*                  REVISION HISTORY
*                 
* Date:    2003-3-20
*****************************************************************
*/ 
#define  SELEBOX_GLOBALS
 
#include "includes.h"
#include "stdio.h"
#include "ctype.h"
#include "LCD.H"
#include "PINYIN.H"
#include "INFIELD.H"
#include "TOOLS.H"
#include "Timetask.h"
#include "UARTDrv.H"
#include "zprint.h"

static BOOLEAN SignFlag/*标点输入状态标记*/;
static INT8U  LineLen,LineSize,SelMode;
static INT8U  pinyin_string[200], chartemp[6];
static INT8U  usualword[16];//="的是有了不在一个";

/*
******************************************************************
  English Input Control
******************************************************************
*/
static INT8U  ENG_BD[]  = {",.?!:;'-@#$%^&*_+=~\\|`()<>/[]{}"};
static INT8U  ENG_ABC[] = {"abcABC"};
static INT8U  ENG_DEF[] = {"defDEF"};
static INT8U  ENG_GHI[] = {"ghiGHI"};
static INT8U  ENG_JKL[] = {"jklJKL"};
static INT8U  ENG_MNO[] = {"mnoMNO"};
static INT8U  ENG_PQRS[]= {"pqrsQPRS"};
static INT8U  ENG_TUV[] = {"tuvTUV"};
static INT8U  ENG_WXYZ[]= {"wxyzWXYZ"};
static INT8U* ENG_KEY[] = {ENG_BD,ENG_ABC,ENG_DEF,ENG_GHI,ENG_JKL,ENG_MNO,ENG_PQRS,ENG_TUV,ENG_WXYZ};

static INT8U  KeyValue;

static void ChangeFlag(void)
{
     DplyLetter();//将当前selebox光标内容显示到editbox,同时清空selebox
     StopTmr(KeyInTmr);
     KeyFlag = FirstKey;
     InFieldFocusChange();//焦点切换
}

static void LetterInit(void)
{
     KeyInTmr = CreateTimer(ChangeFlag, 0);
     KeyFlag = FirstKey;
}

static void  ReadSelectBoxPara(SELECTBOX *selectbox)
{
    LineSize = selectbox->box->numcol;
    SelMode  = selectbox->selmode;
    if (SelMode == CHINESESELECTMODE) {
        LineLen = LineSize - LineSize % 2;
     } else {
        LineLen = LineSize;
     }   
    if (selectbox->textlen > 0) {
       selectbox->totalline = (selectbox->textlen - 1)/ LineLen;
    } else {
       selectbox->totalline = 0;
    }    
}

static void UpdateSelectBoxArrow(SELECTBOX *selectbox)
{
    INT8U curline,totalline;
    
    curline = selectbox->line;
    totalline = selectbox->totalline;
   
    if (totalline == 0) {
        ShowLeftArrow(OFF);
        ShowRightArrow(OFF);
    } else {
       if (curline == 0) {
          ShowLeftArrow(OFF);
          ShowRightArrow(ON);
       } else if (curline == totalline ) {
          ShowLeftArrow(ON);
          ShowRightArrow(OFF);
       } else {
          ShowLeftArrow(ON);
          ShowRightArrow(ON);
       } 
    }        
}

static INT8U GetCurrentLineTextLen(SELECTBOX *selectbox)
{
     INT8U curline;
     
     curline = selectbox->line;
     if ((curline < selectbox->totalline) || (selectbox->textlen % LineLen == 0)) {
        return LineLen;
     } else {
        return selectbox->textlen % LineLen;
     }      
}

static void ReverseSelectBoxCursor(SELECTBOX *selectbox,BOOLEAN updatelcd)
{
     ReverseOutBox_ByChar(0,selectbox->cursor,SelMode);    
     if (updatelcd) UpdateOutBox_LCD();
}
//显示selebox中的seltext
static void ShowSelectBoxText(SELECTBOX *selectbox,BOOLEAN updatelcd)
{
     INT8U curline,textlen;
     INT8U *ptr;

     ClearOutBox();
     curline = selectbox->line;
     ptr = &selectbox->seltext[curline * LineLen];
     if (selectbox->textlen == 0) {
        textlen = 0;
     } else if (curline == selectbox->totalline) {
        textlen =selectbox->textlen - curline * LineLen;
     } else {
        textlen = LineLen;
     }    
     if (SelMode == CHINESESELECTMODE) {
        selectbox->cursor = 0;
        /*selectbox->cursor = (textlen - textlen % 4)/ 2; 
        if (selectbox->cursor > SelMode) {
           selectbox->cursor -= SelMode;
        }*/       
     } else {
        selectbox->cursor = 0;
     }   
     Print_Text(ptr,textlen);
     UpdateOutBox_MEM();
     UpdateSelectBoxArrow(selectbox);
     if (updatelcd) UpdateOutBox_LCD();
}

static BOOLEAN SeleLetter(SELECTBOX *selectbox, INT8U key)
{
     LockOutBox(selectbox->box);
     if(IsInRange(key, KEY_2,KEY_9)==FALSE) return FALSE;
     if(KeyFlag==FirstKey) {
         KeyFlag = RepeatKey;
         KeyValue = key;
	 StartTmr(KeyInTmr, SECOND, 2);
	 selectbox->cursor = 0;
	 memset(selectbox->seltext, 0x20,sizeof(selectbox->seltext));
	 AddDplyTextToSelectBox(selectbox,ENG_KEY[key-1],strlen((INT8S*)ENG_KEY[key-1]),selectbox->selmode);
	 ReadSelectBoxPara(selectbox);
     	 ShowSelectBoxText(selectbox,1);
	 ReverseSelectBoxCursor(selectbox,1);
     }else{
	 StopTmr(KeyInTmr);
         StartTmr(KeyInTmr, SECOND, 2);
	 if(KeyValue==key) {	
	     ReverseSelectBoxCursor(selectbox,1);
	     if(selectbox->cursor==(selectbox->textlen-1)) {
	         selectbox->cursor = 0;
	     }else{
	         selectbox->cursor++;
	     }
	     ReverseSelectBoxCursor(selectbox,1);
	 }else{
	     DplyLetter();
	     KeyValue = key;
	     selectbox->cursor = 0;
	     AddDplyTextToSelectBox(selectbox,ENG_KEY[key-1],strlen((INT8S*)ENG_KEY[key-1]),selectbox->selmode);
	     ShowSelectBoxText(selectbox,1);
	     ReverseSelectBoxCursor(selectbox,1);
	 }
     }
     return TRUE;
}

static void MovUpSelection(SELECTBOX *selectbox, BOOLEAN sign)//sign用来判断是否是标点状态
{
     INT8U curline, tempsign;

     LockOutBox(selectbox->box);
     ReadSelectBoxPara(selectbox);
     curline = selectbox->line;
     if(sign){
         tempsign = SelMode;
	 SelMode = 1;
     }
     if (selectbox->cursor == 0){
        if (curline == 0) {
           if(sign) SelMode = tempsign;
           return;
        } else {
           selectbox->line--;
	   selectbox->cursor += (LineLen - SelMode);
           ShowSelectBoxText(selectbox,0);
	   ReverseSelectBoxCursor(selectbox,1);
	}
     } else {
            ReverseOutBox_ByChar(0,selectbox->cursor,SelMode);
            selectbox->cursor -= SelMode;
            ReverseSelectBoxCursor(selectbox,1);
     }
     if(sign) SelMode = tempsign;
}

static void MovDownSelection(SELECTBOX *selectbox, BOOLEAN sign)
{
     INT8U len,curline,tempsign;

     LockOutBox(selectbox->box);
     ReadSelectBoxPara(selectbox);
     curline = selectbox->line;
     if(sign){
         tempsign = SelMode;
	 SelMode = 1;
     }
     len = GetCurrentLineTextLen(selectbox);
     if (selectbox->cursor >= len - SelMode) {
        if (curline >= selectbox->totalline) {
           if(sign) SelMode = tempsign;
           return;
        } else {   
           selectbox->line++;
           ShowSelectBoxText(selectbox,0);
           ReverseSelectBoxCursor(selectbox,1);
        } 
     } else {
        ReverseSelectBoxCursor(selectbox,0);
        selectbox->cursor += SelMode;
        ReverseSelectBoxCursor(selectbox,1);
     }
     if(sign) SelMode = tempsign;
}

static BOOLEAN InputAsciiChar(SELECTBOX *selectbox,INT8U keycode)
{
     INT8U  i,j;
     void   (*OptFunc)(void);
     INT8U *addrptr;

     LockOutBox(selectbox->box);
     j = 0;
     for(i=0;i<6;i++) {
        if (selectbox->asciichar[i]!=0)  j++;
     }
     if (IsInRange(keycode,KEY_2,KEY_9)==FALSE) return FALSE;
     if (j == 6) return TRUE;//asciichar已经有6位了,那么新的输入keycode就是无效的了
     
     addrptr = HZQuery(selectbox->asciichar,(keycode+0x30));//执行完此函数后,如果匹配,asciichar会改变
     if(addrptr==NULL) {
        return TRUE;
     } else {
        memset(selectbox->seltext, NULL, sizeof(selectbox->seltext));
        INPUTSTATE = PINYININPUTSTATE;
	for(i = 0;i < MatchNum;i++) {
	   pinyin_string[2*i] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]);
	   pinyin_string[2*i+1] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]+1);
	}
        AddDplyTextToSelectBox(selectbox,pinyin_string,2 * MatchNum,CHINESESELECTMODE);
        OptFunc = selectbox->optfunc;
        if (OptFunc != NULL) {
           (*OptFunc)();
        }
     }
     return TRUE;
}

static BOOLEAN DelAsciiChar(SELECTBOX *selectbox)
{
     INT8U  i,j;
     BOOLEAN returnflag;
     INT8U *addrptr;
     void (*EmptyFunc)(void),(*OptFunc)(void);
     
     returnflag = FALSE;
     LockOutBox(selectbox->box);
     j = 0;
     for(i = 0;i < 6; i++) {
        chartemp[i] = selectbox->asciichar[i];
        if (selectbox->asciichar[i]!=0) {
            returnflag = TRUE;
            j++;
        }
     }
     if (returnflag == FALSE) {
        INPUTSTATE = EDITINPUTSTATE;
        return FALSE;
     } else {
        selectbox->asciichar[j-1] = 0;
        chartemp[j-1] = 0;
        
	addrptr = HZQuery(chartemp, 0x31);//进入查找有无匹配的拼音
        if (addrptr==NULL) {  //一个匹配都没有,则清空
           INPUTSTATE = EDITINPUTSTATE;
           EmptyFunc = selectbox->emptyfunc;
           if (EmptyFunc != NULL) (*EmptyFunc)();
           return FALSE;
        } else { //有则显示相应的拼音集合
           memset(selectbox->seltext, NULL, sizeof(selectbox->seltext));
           INPUTSTATE = PINYININPUTSTATE;

	   for(i = 0;i < MatchNum;i++) {
	      pinyin_string[2*i] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]);
  	      pinyin_string[2*i+1] = *(INT8U*)(GBCODE_BASE + ((INT16U)(addrptr[2*i])<<8)+addrptr[2*i+1]+1);
	   }
           AddDplyTextToSelectBox(selectbox,pinyin_string,2 * MatchNum,CHINESESELECTMODE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -