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

📄 funcsm.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
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 + -