📄 f_sm.c
字号:
#include "includes.h"
#include "picture.h"
#include "file.h"
#include "filesys.h"
#include "funcfontlib.h"
#include "funclcd.h"
#include "event.h"
#include "tskmenu.h"
extern OS_MEM *pMemSml;
extern OS_MEM *pMemLge;
extern INT8U rom usrpri_file[];
extern INT16U rom TextNoRecord[];
extern INT16U rom TextSmsOver[];
extern rom INT8U CurPhoneNum[24]; //电话号码(ASCII代码)
extern INT8U CurPhoneNumLen; //电话号码长度
extern rom INT16U *CurText; //文本字符串或姓名字符串指针(必须指向RAM的变量,因为可能要修改其中的内容)
extern INT8U CurTextLen; //文本字符串或姓名字符串的长度
extern rom INT16U tmpCurText[160]; //临时的全局变量,仅用于调试(分配一块内存,用于文本编辑)
extern INT8U CurMenu;
extern INT8U PrevMenu; //used when exit from MENU_BOOK_END
extern INT8U MFunc_EditSMS(INT8U type);
extern INT8U EnterTextEdit(void);
extern INT8U EnterPhoneEdit(void);
extern void MFunc_Set_Focus(INT8U line);
extern void Func_DisplayNumAndTime(INT8U rom * ptrNum, INT8U Len, NM_TIME * ptrTime);
extern void Func_DisplaySmallIndex (INT8U Index);
extern INT8U MFunc_WaitForInput(INT8U val);
extern void MFunc_DirectCall(INT8U rom * ptrData, INT8U Len);
extern INT8U MFunc_InsertPhoneBookItem(INT16U rom * pName, INT8U NameLen, INT8U rom * pNum, INT8U NumLen, INT8U Group);
extern void MFunc_WaitSendResult(void);
INT8U MFunc_OperateSM(INT16U rom *pItems, INT8U Num);
INT8U MFunc_DisplayString(INT8U X, INT8U coding, INT8U len, INT8U rom * ptr);
INT8U MFunc_ReadSM(INT8U item,INT8U type);
#pragma romdata EXTRAM
INT8U rom LenSave[10];
INT8U rom LenPtr;
INT8U rom SM_AutoDel;
INT16U rom * ItemSave[10];
#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
#pragma code MYCODE
INT8U MFunc_SaveSM(INT8U rom * psm, INT8U type){
SM_TBL * psmt;
INT8U rom * pt;
INT8U fhdl,idxp,idxn,idx,len,i;
fhdl = file_open(usrpri_file, (INT8U rom **)&psmt);
if(type > 1) type = 1;
psmt = &(((F_UserPrivate *)psmt)->SMTbl[type]);
for(i=0; i<SMTBLLEN; i++){
if(psmt->index[i].peernum[0] == 0xff) break;
}
if((i>=SMTBLLEN) && SM_AutoDel){
i = psmt->tail;
i = psmt->index[i].previous;
idxp = psmt->index[i].previous;
idxn = psmt->index[i].next;
psmt->index[idxp].next = idxn;
psmt->index[idxn].previous = idxp;
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[idxp].next),
sizeof(psmt->index[idxp].next));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[idxn].previous),
sizeof(psmt->index[idxn].previous));
psmt->numofSM--;
}
if(i<SMTBLLEN){
idx = i;
//copy the SM info to file buffer
len = *psm++;
i = (len>16)? 16:len;
if(i == 0) {
psmt->index[idx].peernum[0] = 0x0f;
}
else{
app_a2c(psm, i, psmt->index[idx].peernum);
psm+=len;
}
pt = (INT8U rom *)(&(psmt->index[idx].time));
for(i=0; i<6; i++){
*pt = *psm;
pt++;
psm++;
}
psmt->index[idx].property = *psm++;
len = *psm++;
psmt->data[idx].len = len;
pt = psmt->data[idx].data;
for(i=0;i<len;i++){
*pt = *psm;
pt++;
psm++;
}
//
idxp = psmt->head;
idxn = psmt->index[idxp].next;
psmt->index[idxp].next = idx;
psmt->index[idxn].previous = idx;
psmt->index[idx].previous = idxp;
psmt->index[idx].next = idxn;
psmt->numofSM++;
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[idx]),
sizeof(psmt->index[idx]));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[idxp].next),
sizeof(psmt->index[idxp].next));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[idxn].previous),
sizeof(psmt->index[idxn].previous));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].data[idx]),
len+sizeof(psmt->data[idx].len));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].numofSM),
len+sizeof(psmt->numofSM));
return(len);
}
return(0xff);
}
/**********************************************************************
* The information structure of the input Sm is: *
* INT8U len_of_number *
* INT8U number[] //ASCII code *
* *
* INT8U year //All time domains are HEX value *
* INT8U month *
* INT8U date *
* INT8U hour *
* INT8U minute *
* INT8U second *
* *
* INT8U coding //2-ASCII, 4-UNICODE *
* INT8U len_of_data //in bytes *
* INT8U data[] *
* And the "type" parameter denotes the SM shall be stored as TXSM or *
* RXSM. *
**********************************************************************/
INT8U MFunc_CheckSM(INT8U type){
INT8U CurItem,err,i,chrTemp,Ctr;
INT8U rom * pSml;
INT8U rom * pLge;
INT8U fhdl, empty,idxn,idxp;
SM_TBL * psmt;
fhdl = file_open(usrpri_file, (INT8U rom **)&psmt);
psmt = &(((F_UserPrivate *)psmt)->SMTbl[type]);
Display_SM(0); //clear the new SM prompt
Display_Menu_Icon(0,&PIC_READ);
Display_Menu_Icon(1,&PIC_RETURN);
Do_Clear_Screen(6,32,7,95); //clear the menu index field
empty = FALSE;
CurItem = psmt->head;//SystemFile.SMTblHead;
if(psmt->index[psmt->index[CurItem].previous].previous == CurItem){
app_printf(TextNoRecord,3,2,0);//MenuDisplayName(2,3,TextNoRecord);
empty = TRUE;
}
Ctr=0;
for(;;){
for(i = 0;i<3;i++){
if(psmt->index[CurItem].peernum[0] == 0xff) {
CurItem = psmt->index[CurItem].next;
Ctr = 0;
}
else{
break;
}
}
if(empty == FALSE){
Do_Clear_Screen(6,32,7,95);
Do_Clear_Screen(2,0,5,127);
Func_DisplayNumAndTime(&(psmt->index[CurItem].peernum[0]), 8, &(psmt->index[CurItem].time));
Func_DisplaySmallIndex (Ctr+1);
}
switch(MFunc_WaitForInput(0)){
case 0xff:
return(1);
case KEY_FUNC1: //Enter
if(CurItem >= SMTBLLEN) break;
chrTemp = MFunc_ReadSM(CurItem,type);
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
psmt->index[CurItem].peernum[0] = 0xff;
idxp = psmt->index[CurItem].previous;
idxn = psmt->index[CurItem].next;
psmt->index[idxp].next = idxn;
psmt->index[idxn].previous = idxp;
psmt->numofSM--;
CurItem = idxn;
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[CurItem].peernum[0]),
sizeof(INT8U));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[idxp].next),
sizeof(psmt->index[idxp].next));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].index[idxn].previous),
sizeof(psmt->index[idxn].previous));
file_save( fhdl,
offsetof(F_UserPrivate, SMTbl[type].numofSM),
sizeof(psmt->numofSM));
break;
case 1: //edit
CurText=tmpCurText;
CurTextLen = 0;
if(psmt->index[CurItem].property == SM_UNICODE){//SystemFile.SMTbl[CurItem].chrProperty==SM_UNICODE){
CurTextLen=(psmt->data[CurItem].len)>>1;//SystemFile.SMTbl[CurItem].SMLength)>>1; // word_len=char_len/2
for(i=0;i<CurTextLen; i++){
CurText[i]=psmt->data[CurItem].data[i<<1]; //High-byte first
CurText[i]=(CurText[i]<<8)+psmt->data[CurItem].data[(i<<1)+1];
}
}
else{
CurTextLen=psmt->data[CurItem].len;//SystemFile.SMTbl[CurItem].SMLength;
for(i=0;i<CurTextLen; i++){
CurText[i]=psmt->data[CurItem].data[i];//SystemFile.SMTbl[CurItem].SMContent[i];
}
}
CurPhoneNumLen = app_c2a(psmt->index[CurItem].peernum,12,CurPhoneNum);
return(MFunc_EditSMS(type));
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]; // (INT8U)((CurPhoneNum[i])&0xFF);
if(i>32) break;
}
//copy the SM contents
for(i=0; i<psmt->data[CurItem].len; i++){
//for(i=0; i<SystemFile.SMTbl[CurItem].SMLength; i++){
*pLge++ = psmt->data[CurItem].data[i];//SystemFile.SMTbl[CurItem].SMContent[i];
if(i>142) break;
}
((MSG_HEAD *)pSml)->LenOfAttach = 1+CurPhoneNumLen + (psmt->data[CurItem].len & 0xfffe); //if the length is odd, convert it to even
OSQPost(peventWICCmd, pSml);
MFunc_WaitSendResult();
}
else OSMemPut(pMemSml,pSml);
}
}
else{//exit because of MSG_MENU_CANCEL message
//CurMenu=MENU_ROOT;
//MenuDisplayKey(CurMenu);
//Do_Clear_Screen(6,32,7,95); //clear the menu index field
return(1);
}
break;
case 3: //text answer
CurText=tmpCurText;
CurTextLen = 0;
CurPhoneNumLen = app_c2a(psmt->index[CurItem].peernum,12,CurPhoneNum);
//CurPhoneNumLen = app_c2a(&SystemFile.SMTbl[CurItem].chrOtherSideNum[0],12,CurPhoneNum);
return(MFunc_EditSMS(type));
break;
case 4: //call back
MFunc_DirectCall(psmt->index[CurItem].peernum,12);
//MFunc_DirectCall(SystemFile.SMTbl[CurItem].chrOtherSideNum,12);
//CurMenu=MENU_ROOT;
//MenuDisplayKey(CurMenu);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -