📄 funcsm.c
字号:
/**************************************************************************
This part of code includes Short Message operation functions. They are:
INT8U MFunc_CheckSM(INT8U hSM)
INT8U MFunc_ReadSM(INT8U * item)
INT8U MFunc_OperateSM(INT16U rom *pItems, INT8U Num)
***************************************************************************/
#include "includes.h"
#include "picture.h"
extern MCNM_FILE SystemFile;
extern OS_EVENT *rom DisplaySem;
INT8U MFunc_CheckSM(INT8U hSM){
INT8U CurItem,err,i,chrTemp,Ctr,domainH;
//INT8U rom * pMsg;
INT8U rom * pSml;
INT8U rom * pLge;
INT8U rom * pH;
SM_TABLE_ITEM * pSMTbl;
SM_TABLE_ITEM * pSM;
if(hSM == SM_RX){
pH = &SystemFile.SMTblHead;
pSMTbl = &SystemFile.SMTbl[0];
domainH = 79;
}
else{
pH = &SystemFile.SMLTblHead;
pSMTbl = &SystemFile.SMLTbl[0];
domainH = 83;
}
Display_SM(0); //Clear the unread SM icon
Display_Menu_Icon(0,&PIC_READ);
Display_Menu_Icon(1,&PIC_RETURN);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
CurItem = *pH;
if(CurItem >= SMTBLLEN){
app_printf(TextNoRecord,3,2,0);//MenuDisplayName(2,3,TextNoRecord);
}
Ctr=0;
for(;;){
if(CurItem < SMTBLLEN){
Func_DisplayNumAndTime(&(pSM->chrOtherSideNum[0]), 8, &(pSM->Time));
Func_DisplaySmallIndex (Ctr+1);
}
switch(MFunc_WaitForInput(0)){
case 0xff:
return(1);
case KEY_FUNC1: //Enter
if(CurItem >= SMTBLLEN) break;
chrTemp = MFunc_ReadSM(pSM);
if(chrTemp == 1){//exit due to MSG_MENU_CANCEL
return(1);
}
else {
Display_Menu_Icon(0,&PIC_READ);
Display_Menu_Icon(1,&PIC_RETURN);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
if(chrTemp == 0){//cancel key
}
else if((chrTemp & 0xf0) == 0xf0){
switch(chrTemp & 0x0f){
case 0: //delete
CurItem = SM_Delete(pSM,hSM,&Ctr);
break;
case 1: //send to other/edit and send
CurText=tmpCurText;
CurTextLen = 0;
if(pSMTbl[CurItem].chrProperty==SM_UNICODE){
CurTextLen=(pSMTbl[CurItem].SMLength)>>1; // word_len=char_len/2
for(i=0;i<CurTextLen; i++){
CurText[i]=(pSMTbl[CurItem].SMContent[i<<1]); //High-byte ahead
CurText[i]=(CurText[i]<<8)+pSMTbl[CurItem].SMContent[(i<<1)+1];
}
}
else{
CurTextLen=pSMTbl[CurItem].SMLength;
for(i=0;i<CurTextLen; i++){
CurText[i]=pSMTbl[CurItem].SMContent[i];
}
}
CurPhoneNumLen=0;
for(i=0;i<12;i++){
err=pSMTbl[CurItem].chrOtherSideNum[i];
if((err>>4)>9)
break;
else
CurPhoneNum[CurPhoneNumLen++]=(err>>4)+0x30;
if((err & 0x0F)>9)
break;
else
CurPhoneNum[CurPhoneNumLen++]=(err & 0x0F)+0x30;
}
return(MFunc_EditSMS());
break;
case 2: //send
CurPhoneNumLen = 0;
chrTemp=EnterPhoneEdit();
if(chrTemp == 0){//exit because of cancel
}
else if (chrTemp == 2){//exit because of enter
pSml = OSMemGet(pMemSml, &err);
if(err == OS_NO_ERR){
pLge = OSMemGet(pMemLge, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pSml)->Msg_ID = MSG_SM_SEND;
((MSG_HEAD *)pSml)->Origin = peventMenu;
((MSG_HEAD *)pSml)->pmemME = pMemSml;
((MSG_HEAD *)pSml)->Attached = TRUE;
((MSG_HEAD *)pSml)->pMem = pLge;
((MSG_HEAD *)pSml)->pmemATT = pMemLge;
*pLge++ = CurPhoneNumLen;
//copy the number of destination
for(i = 0; i< CurPhoneNumLen; i++){
*pLge++ = CurPhoneNum[i];
if(i>32) break;
}
//copy the SM contents
for(i=0; i<pSMTbl[CurItem].SMLength; i++){
*pLge++ = pSMTbl[CurItem].SMContent[i];
if(i>142) break;
}
((MSG_HEAD *)pSml)->LenOfAttach = 1+CurPhoneNumLen + (pSMTbl[CurItem].SMLength & 0xfffe); //if the length is odd, convert it to even
OSQPost(peventWICCmd, pSml);
}
else OSMemPut(pMemSml,pSml);
}
}
else{//exit because of MSG_MENU_CANCEL message
CurMenu=MENU_ROOT;
OSSemPend(DisplaySem, 0, &err);
if(err == OS_NO_ERR){
MenuDisplayKey(CurMenu);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
}
OSSemPost(DisplaySem);
return(1);
}
break;
case 3: //text answer
CurText=tmpCurText;
CurTextLen = 0;
CurPhoneNumLen=0;
for(i=0;i<12;i++){
err=pSMTbl[CurItem].chrOtherSideNum[i];
if((err>>4)>9)
break;
else
CurPhoneNum[CurPhoneNumLen++]=(err>>4)+0x30;
if((err & 0x0F)>9)
break;
else
CurPhoneNum[CurPhoneNumLen++]=(err & 0x0F)+0x30;
}
return(MFunc_EditSMS());
break;
case 4: //call back
MFunc_DirectCall(pSMTbl[CurItem].chrOtherSideNum,12);
//
CurMenu=MENU_ROOT;
OSSemPend(DisplaySem, 0, &err);
if(err == OS_NO_ERR){
MenuDisplayKey(CurMenu);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
}
OSSemPost(DisplaySem);
break;
case 5: //cut number
break;
}
}
}
if(CurItem >= SMTBLLEN){
OSSemPend(DisplaySem,0,&err);
if(err == OS_NO_ERR) Do_Clear_Screen(2,0,5,127);
OSSemPost(DisplaySem);
app_printf(TextNoRecord,3,2,0);
}
break;
case KEY_FUNC2: //Cancel
return(0);
case KEY_C: //delete last number
return(0);
case KEY_UP:
if(CurItem < SMTBLLEN){
chrTemp = *pH;
if(CurItem != *pH){
for(i=0; i<SMTBLLEN; i++){
if(pSMTbl[chrTemp].Next == CurItem){
Ctr = i;
CurItem = chrTemp;
break;
}
chrTemp = pSMTbl[chrTemp].Next;
}
}
else{
for(i=0; i<SMTBLLEN; i++){
if(pSMTbl[chrTemp].Next >= SMTBLLEN){//reach the end nod
Ctr = i;
CurItem = chrTemp;
break;
}
chrTemp = pSMTbl[chrTemp].Next;
}
}
}
break;
case KEY_DOWN:
if(CurItem < SMTBLLEN){
CurItem = pSMTbl[CurItem].Next;
Ctr++;
if(CurItem >= SMTBLLEN){
CurItem = *pH;
Ctr = 0;
}
}
break;
}
}
}
INT8U MFunc_OperateSM(INT16U rom *pItems, INT8U Num);
INT8U MFunc_DisplayString(INT8U X, INT8U coding, INT8U len, INT8U rom * ptr);
#pragma romdata EXTRAM
INT8U rom LenSave[10];
INT8U rom LenPtr;
#pragma romdata CCODE
INT16U rom OperSMItem1[] = {0x5220,0x9664,0x0000}; //delete
INT16U rom OperSMItem2[] = {0x7F16,0x8F91,0x0000}; //Edit SMS,zwm added
INT16U rom OperSMItem3[] = {0x53d1,0x9001,0x0000}; //send
INT16U rom OperSMItem4[] = {0x6587,0x672c,0x56de,0x7b54,0x0000}; //text answer
INT16U rom OperSMItem5[] = {0x56de,0x53eb,0x0000}; //call back
INT16U rom OperSMItem6[] = {0x526a,0x5207,0x53f7,0x7801,0x0000}; //cut number
INT16U rom OperPBItem1[] = {0x7f16,0x8f91,0x0000}; //edit
INT16U rom OperPBItem2[] = {0x5220,0x9664,0x0000}; //delete
#pragma code MYCODE
INT8U MFunc_ReadSM(INT8U * item){
INT8U cur,line,pos,len,i,FinishShowed,err,godown;
INT8U rom *ptr;
//INT8U rom *pMsg;
cur = *item;
ptr = &SystemFile.SMTbl[cur].SMContent[0];
line = 2;
pos = 0;
len = SystemFile.SMTbl[cur].SMLength;
LenPtr = 0;
FinishShowed = FALSE;
godown = TRUE;
OSSemPend(DisplaySem,0,&err);
if(err == OS_NO_ERR){
Display_Menu_Icon(0,&PIC_SELECTION);
Display_Menu_Icon(1,&PIC_RETURN);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
}
OSSemPost(DisplaySem);
for(;;){
if(godown == TRUE){
if(len == 0 ){
if(FinishShowed == FALSE){
OSSemPend(DisplaySem,0,&err);
if(err == OS_NO_ERR){
Do_Clear_Screen(line,0,5,127);
MenuDisplayName(line,6,TextSmsOver);
}
LenSave[LenPtr] = 0; //save the num of word in corrent screen
LenPtr++;
OSSemPost(DisplaySem);
FinishShowed = TRUE;
if(line == 2) line = 4;
else line = 2;
}
}
else{
OSSemPend(DisplaySem,0,&err);
if(err == OS_NO_ERR){
Do_Clear_Screen(line,0,line+1,127);
i = MFunc_DisplayString(line, SystemFile.SMTbl[cur].chrProperty, len, ptr);
}
OSSemPost(DisplaySem);
LenSave[LenPtr] = i; //save the num of word in corrent screen
LenPtr++;
len -= i;
ptr += i;
if(line == 2) line = 4;
else line = 2;
}
}
if(line == 2 || FinishShowed == TRUE){
switch(MFunc_WaitForInput(0)){
case 0xff:
return(1);
case KEY_FUNC1: //Enter
i = MFunc_OperateSM(OperSMItem1, 6);
OSSemPend(DisplaySem,0,&err);
if(err == OS_NO_ERR){
Display_Menu_Icon(0,&PIC_SELECTION);
Display_Menu_Icon(1,&PIC_RETURN);
}
OSSemPost(DisplaySem);
if(i == 0xff){ //due to message MSG_MENU_CANCEL
CurMenu=MENU_ROOT;
OSSemPend(DisplaySem, 0, &err);
if(err == OS_NO_ERR){
MenuDisplayKey(CurMenu);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
}
OSSemPost(DisplaySem);
return (1);
}
else if(i == 0xfe){ //doe to cancel
if(line == 2){
LenPtr --;
len += LenSave[LenPtr];
ptr -= LenSave[LenPtr];
LenPtr --;
len += LenSave[LenPtr];
ptr -= LenSave[LenPtr];
}
else{
LenPtr --;
len += LenSave[LenPtr];
ptr -= LenSave[LenPtr];
}
FinishShowed = FALSE;
godown = TRUE;
line = 2;
}
else if (i < 6){ //zwm changed
return (0xf0+i);
}
break;
case KEY_FUNC2: //Cancel
return(0);
case KEY_C: //Cancel
return(0);
case KEY_UP:
if(LenPtr >=3){
if(line == 2){
for(i=0; i<4; i++){
LenPtr --;
len += LenSave[LenPtr];
ptr -= LenSave[LenPtr];
}
}
else{
for(i=0; i<3; i++){
LenPtr --;
len += LenSave[LenPtr];
ptr -= LenSave[LenPtr];
}
}
FinishShowed = FALSE;
godown = TRUE;
line = 2;
}
else godown = FALSE;
break;
case KEY_DOWN:
if(FinishShowed == FALSE){
line = 2;
godown = TRUE;
}
break;
}
}
}
}
#pragma romdata EXTRAM
INT16U rom * ItemSave[10];
#pragma code MYCODE
INT8U MFunc_OperateSM(INT16U rom *pItems, INT8U Num){
INT8U changecontent,Focus,err,CurItem,pos,i,retval;
INT8U rom *pMsg;
//display the button name
OSSemPend(DisplaySem, 0, &err);
if(err == OS_NO_ERR){
Display_Menu_Icon(0,&PIC_ACKNOWLEDGE);
Display_Menu_Icon(1,&PIC_RETURN);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
Do_Clear_Screen(2,0,5,127);
}
OSSemPost(DisplaySem);
for(i=0; i<Num; i++){
ItemSave[i] = pItems;
do{
pItems++;
}while(*pItems != 0);
pItems++;
}
Focus = 0;
CurItem = 0;
changecontent = TRUE;
i = 0;
for(;;){
if(changecontent == TRUE){
pos = 32;
OSSemPend(DisplaySem, 0, &err);
if(err == OS_NO_ERR){
Do_Clear_Screen(2,32,5,95); //clear the menu
pItems = ItemSave[i];
do{
Disp_Word(2,pos,*pItems,0x02);
pItems++;
pos += 16;
}while(*pItems != 0);
pItems++;
pItems = ItemSave[i+1];
pos = 32;
do{
Disp_Word(4,pos,*pItems,0x02);
pItems++;
pos += 16;
}while(*pItems != 0);
pItems++;
}
OSSemPost(DisplaySem);
}
MFunc_Set_Focus(Focus);
pMsg = OSQPend(peventMenu,0,&err);
if((INT24U)pMsg > PTR_MAX){
if((INT24U)pMsg == MSG_MENU_CANCEL){
return(0xff);
}
}
else{
retval = 0xff;
switch(((MSG_KEYPRESS *)pMsg)->Key){
case KEY_FUNC1: //Enter
retval = CurItem;
//return(CurItem);
break;
case KEY_FUNC2: //Cancel
retval = 0xfe;
//return(0xfe);
break;
case KEY_C: //Cancel
retval = 0xfe;
//return(0xfe);
break;
case KEY_UP:
if(CurItem != 0){
CurItem--;
if(Focus == 1){
Focus = 0;
changecontent = FALSE;
}
else{ //Fucus == 0
changecontent = TRUE;
i = i-1;
}
}
else changecontent = FALSE;
break;
case KEY_DOWN:
if(CurItem < Num-1){
CurItem++;
if(Focus == 0){
Focus = 1;
changecontent = FALSE;
}
else{ //Fucus == 1
i++;
changecontent = TRUE;
}
}
else changecontent = FALSE;
break;
}
Func_Clear_Msg(pMsg);
if(retval != 0xff) return(retval);
}
}
}
INT8U SM_Delete(INT8U item, INT8U hSM, INT8U * ctr){
INT8U rom *pH;
SM_TABLE_ITEM * pSMTbl;
INT8U domainH;
if(hSM == SM_RX){
pH = &SystemFile.SMTblHead;
pSMTbl = &SystemFile.SMTbl[0];
domainH = 79;
}
else{
pH = &SystemFile.SMLTblHead;
pSMTbl = &SystemFile.SMLTbl[0];
domainH = 83;
}
if(item == *pH){//the first one
pSMTbl[item].chrOtherSideNum[0] = 0xff; //mark the SM "empty"
FileSave(SYS_FILE_ID,
(INT16U)((INT24U)&(pSMTbl[item].chrOtherSideNum[0]) - (INT24U)&SystemFile),
&(pSMTbl[item].chrOtherSideNum[0]),
1);
*pH = pSMTbl[item].Next;
Save_Domain(domainH,pH);
return(*pH); //the ctr don't change
}
else{
it = *pH;
for(i=0; i<SMTBLLEN; i++){
if(pSMTbl[it].Next == item){
*ctr = i;
break;
}
it = pSMTbl[it].Next;
}
pSMTbl[it].Next = pSMTbl[item].Next;
pSMTbl[item].chrOtherSideNum[0] = 0xff; //mark the SM "empty"
FileSave(SYS_FILE_ID,
(INT16U)((INT24U)&(pSMTbl[item].chrOtherSideNum[0]) - (INT24U)&SystemFile),
&(pSMTbl[item].chrOtherSideNum[0]),
1);
FileSave(SYS_FILE_ID,
(INT16U)((INT24U)&(pSMTbl[it].Next) - (INT24U)&SystemFile),
&(pSMTbl[it].Next),
1);
if(pSMTbl[it].Next >= SMTBLLEN) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -