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

📄 tskmcnm.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#include <p18cxxx.h>
#include "includes.h"
#include "filesys.h"
#include "file.h"
#include "event.h"
#include "device.h"


#define SYS_INT_CTL		0x00
#define DOMAIN_LEN_LOAD	0x0a
#define PDU_HEAD_LOAD	0x09

#define SM 0
#define DIAL 1

extern OS_MEM			*pMemSml;
extern OS_MEM			*pMemLge;
extern OS_MEM			*pMemHug;


void mkdft_LocalPara(F_LocalPara *pf);
void mkdft_UserPrivate(F_UserPrivate *pf);
void mkdft_CallCtl(F_CallCtl *pf);

#pragma romdata CCODE
INT8U rom localpara_file[] = "LCL_P";
INT8U rom usrpri_file[] = "U_P";
INT8U rom callctl_file[] = "CAL_C";

//#pragma code MYCODE
void tskMCNM(void * data){
	void rom * pMsg;
	INT8U err;
	INT16U i;
	INT8U rom * ptrT0;
	INT8U rom * ptrT1;
	// If the fike system is not vilade, this task have to make several default
	// files to make the system keep running with simplest function. These file
	// includes:
	//   _file_localPara;
	//   _file_UserPrivate;
	//   _file_CallCtl;
	if(filesys_init() != FS_OK){
		filesys_format();
	}
	i = file_open(localpara_file, &ptrT0);
	if(i == 0xff){
		file_create(localpara_file, sizeof(F_LocalPara));
		i = file_open(localpara_file, &ptrT0);
		mkdft_LocalPara((F_LocalPara *)ptrT0);
		file_save(i, 0, sizeof(F_LocalPara));
	}

	i = file_open(usrpri_file, &ptrT0);
	if(i == 0xff){
		file_create(usrpri_file, sizeof(F_UserPrivate));
		i = file_open(usrpri_file, &ptrT0);
		mkdft_UserPrivate((F_UserPrivate *)ptrT0);
		file_save(i, 0, sizeof(F_UserPrivate));
	}

	i = file_open(callctl_file, &ptrT0);
	if(i == 0xff){
		file_create(callctl_file, sizeof(F_CallCtl));
		i = file_open(callctl_file, &ptrT0);
		if(i != 0xff){
			mkdft_CallCtl((F_CallCtl *)ptrT0);
			file_save(i, 0, sizeof(F_CallCtl));
		}
	}
	//
	i = file_open(localpara_file, &ptrT0);
	err = sysdev_open(DEV_ID_KBD);
	sysdev_ioctl(err, 0, ((F_LocalPara *)ptrT0)->BackLED);
	//
	for(;;){
		pMsg = OSQPend(peventMCNM, 0, &err);
		if(err == OS_NO_ERR){
			if((INT24U)pMsg >= PTR_MAX){
				//switch ((INT24U)pMsg){
				//	case MSG_MCNM_CLEARSYSFILE:
						//Make_DefaultSysFile();
				//		break;
				//}
			}
			else{
				switch (((MSG_HEAD *)pMsg)->Msg_ID){
					case MSG_MCNM_RECEIVE:
						if(((MSG_PROTOCOL *)pMsg)->Type == SYS_INT_CTL){
							if(((MSG_PROTOCOL *)pMsg)->SubType == PDU_HEAD_LOAD){//download the PDU head
						  		if(((MSG_HEAD *)pMsg)->LenOfAttach != sizeof(PDU_HEAD)) break; //length error
						  		//if(CheckCRC(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach)== TRUE){
						  			//FileSave();
						  			//refresh WIC' GCB
						  		//}
							}
						}
						else{
							//MCNMFrameProc(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach, ((MSG_PROTOCOL *)pMsg)->Type);
						}
						break;
				}
				Func_Clear_Msg(pMsg);
			}
		}
	}
} 


void mkdft_LocalPara(F_LocalPara *pf){
	pf->CtlWord = 0;
	pf->PINCode[0] = 0xff;
	pf->SelfNum[0] = 0xff;
	pf->SpeakerVolume = 3;
	pf->LockPassword[0] = 0xff;
	pf->BackLED = 0;
	pf->RingType = 1;
	pf->ChgStartM = 0;
	pf->ChgArg = 0;
}

void mkdft_UserPrivate(F_UserPrivate *pf){
	INT8U i,j;
	pf->UnAcceptCall.head = 0;
	pf->UnAcceptCall.len = 0;
	pf->RecentRxCall.head = 0;
	pf->RecentRxCall.len = 0;
	pf->RecentTxCall.head = 0;
	pf->RecentTxCall.len = 0;
	
	for(i=0; i<2; i++){
		pf->SMTbl[i].head = SMTBLINDEXLEN - 2;
		pf->SMTbl[i].tail = SMTBLINDEXLEN - 1;
		pf->SMTbl[i].index[SMTBLINDEXLEN-2].previous = SMTBLINDEXLEN-1;
		pf->SMTbl[i].index[SMTBLINDEXLEN-2].next     = SMTBLINDEXLEN-1;
		pf->SMTbl[i].index[SMTBLINDEXLEN-1].previous = SMTBLINDEXLEN-2;
		pf->SMTbl[i].index[SMTBLINDEXLEN-1].next     = SMTBLINDEXLEN-2;
		pf->SMTbl[i].numofSM = 0;
		for(j = 0; j<SMTBLINDEXLEN; j++){
			pf->SMTbl[i].index[j].peernum[0] = 0xff;
		}
	}

	pf->PhoneBook.head = PHONEBOOKLEN;
	pf->PhoneBook.tail = PHONEBOOKLEN+1;
	pf->PhoneBook.item[PHONEBOOKLEN].previous   = PHONEBOOKLEN+1;
	pf->PhoneBook.item[PHONEBOOKLEN].next       = PHONEBOOKLEN+1;
	pf->PhoneBook.item[PHONEBOOKLEN+1].previous = PHONEBOOKLEN;
	pf->PhoneBook.item[PHONEBOOKLEN+1].next     = PHONEBOOKLEN;
	pf->PhoneBook.item[PHONEBOOKLEN].name[0]    = 0x0000;
	pf->PhoneBook.item[PHONEBOOKLEN+1].name[0]  = 0xfffe;
	   
	for(i=0;i<PHONEBOOKLEN;i++){
		pf->PhoneBook.item[i].name[0] = 0xffff;
	}
}

void mkdft_CallCtl(F_CallCtl *pf){
}


/*
INT8U rom * ProcessDomain(INT8U rom *ptr, INT8U domain, INT8U type, INT8U *erri);
INT8U MCNMFrameProc(INT8U rom * ptrD, INT16U Len, INT8U type){ //return if the frame is currupted, "1" for error, "0" for OK
	INT8U rom *ptrTemp;
	INT8U err,i,j,k;
	INT8U rom *ptrT0;
	
	ptrTemp = ptrD+8;
	if(Len< 8) return (1);
	for(i = 0; i<8; i++){
		k = 0b00000001;
		for(j = 0; j<8; j++){
			if((k & *ptrD) != 0){
				ptrTemp = ProcessDomain(ptrTemp,i*8+j, type,&err);
				if(err != 0) return (1);
			}
			k = k << 1;
		}
		ptrD++;
	}
	return (0);
}

INT8U Make_BitMap(INT8U domain, INT8U rom * ptrBuf);
INT8U rom * ProcessDomain(INT8U rom *ptr, INT8U domain, INT8U type, INT8U *erri){
	INT8U rom *pSml;
	INT8U rom *pInf;
	OS_MEM * pMem;
	INT8U err;
	
	//if there is error, err = 0xff
	*erri = 0;
	if(domain > 63){
		* erri = 1;
		return ((INT8U rom *)0xffffff); //local error but no frame err, just throw it away
	}
	if(domain == 63){	//the polling domain
		domain = *ptr;
		domain &= 0x7f;
		if(DomainLen[domain] == 0) return(ptr+1);
		pSml = OSMemGet(pMemSml, &err);
		if(err == OS_NO_ERR){
			if(DomainLen[domain]>(255-13)){
				pInf = OSMemGet(pMemHug,&err);
				pMem = pMemHug;
				if(err != OS_NO_ERR) return((INT8U rom *)0xffffff);
			}
			else{
				pInf = OSMemGet(pMemLge,&err);
				pMem = pMemLge;
				if(err != OS_NO_ERR) return((INT8U rom *)0xffffff);
			}
		}
		((MSG_HEAD *)pSml)->Msg_ID = MSG_MCNM_TRANSMIT;
		((MSG_HEAD *)pSml)->Origin = peventMCNM;
		((MSG_HEAD *)pSml)->pmemME = pMemSml;
		((MSG_HEAD *)pSml)->Attached = TRUE;
		((MSG_HEAD *)pSml)->LenOfAttach = DomainLen[domain]+8;
		((MSG_HEAD *)pSml)->pMem = pInf;
		((MSG_HEAD *)pSml)->pmemATT = pMem;
		((MSG_HEAD *)pSml)->LenOfBody = 0;

		Make_BitMap(domain, pInf);
		pInf +=8;
		//Read_Domain(domain, pInf);
		OSQPost(peventTxProtocol, pSml);
		return(ptr+1);
	}
	else{ //save the frame
		if(DomainLen[domain] == 0) return (ptr);
		else {
			//Save_Domain(domain,ptr);
			return(ptr+DomainLen[domain]);
		}
	}
	return (ptr);
}

void Make_SysFileIndex(void){
	INT8U i;
	INT16U Offset;
	Offset = 0;
	for(i=0; i<128; i++){
		DomainOffset[i] = Offset;
		Offset += DomainLen[i];
	}
}

INT8U Make_BitMap(INT8U domain, INT8U rom * ptrBuf){
	INT8U i;
	if(domain>63) return(1);
	for(i=0; i<domain/8; i++){
		*ptrBuf = 0;
		ptrBuf++;
	}
	*ptrBuf++ = BipMap[domain%8];
	for(i=0; i<8-domain/8-1;i++){
		*ptrBuf = 0;
		ptrBuf++;
	}
	return(0);
}
*/

⌨️ 快捷键说明

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