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

📄 f_sm.c

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