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

📄 tskmcnmbak.c

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

extern INT8U FileSave(INT8U FileID, INT16U Position, INT8U rom * ptrData, INT16U DataLen);
extern INT8U FileRead(INT8U FileID, INT16U Position, INT8U rom * ptrData, INT16U DataLen);

extern unsigned char DebugContent[48];

INT8U MCNMFrameProc(INT8U rom * ptrD, INT16U Len, INT8U type);
INT8U Test_SysFileValid(void);
INT8U Load_SysFile(void);
INT8U Save_Domain(INT8U domain, INT8U rom * ptrData);
void Make_SysFileIndex(void);
INT8U rom * ProcessDomain(INT8U rom *ptr, INT8U domain, INT8U type, INT8U *erri);
INT8U Check_Authorization(INT8U type, INT8U domain);
INT8U Read_Domain(INT8U domain, INT8U rom * ptrData);
INT8U Make_BitMap(INT8U domain, INT8U rom * ptrBuf);
INT8U CheckCRC(INT8U rom * ptr, INT16U len);
void Make_DefaultSysFile(void);


#pragma romdata EXTRAM
MCNM_FILE	SystemFile;	//The management data
INT16U rom DomainOffset[128];
INT8U rom MCNMStt;

#pragma romdata CCODE
INT8U rom localpara_file[] = "LCL_P";

#pragma code MYCODE

void tskMCNM(void * data){
	void rom * pMsg;
	INT8U err;
	INT16U i;
	INT8U rom * ptrT0;
	INT8U rom * ptrT1;
	//for test
	INT8U rom * ptrT2;
	
	//test file system
	if(filesys_init() != FS_OK){
		filesys_format();
	}
	i = file_open(localpara_file, ptrT0);
	if(i != 0xff){
		if(((rom struct _file_localPara *)ptrT0)->RingType == 6) i = 0;
		else {
			((rom struct _file_localPara *)ptrT0)->RingType =6;
			file_save(i, offsetof(struct _file_localPara , RingType), 1);
		}
	}
	else{
		file_create(localpara_file, sizeof(struct _file_localPara));
		i = file_open(localpara_file, ptrT0);
		((rom struct _file_localPara *)ptrT0)->RingType = 6;
		file_save(i, offsetof(struct _file_localPara , RingType), 1);
	}
	//end of test

	//load eeprom data index here
	//if(Load_SysFile() != 0){
	//	for(;;){
	//		Nop();
	//	}
	//}
	//Make_SysFileIndex();
	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){
							//here the info field is the domain lenght table
						  	if(((MSG_PROTOCOL *)pMsg)->SubType == DOMAIN_LEN_LOAD){//down load the domain length table
						  		//if(((MSG_HEAD *)pMsg)->LenOfAttach != sizeof(SYS_FILE)) break; //length error
						  		if(CheckCRC(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach)== TRUE){
						  			ptrT0 = (INT8U rom *)&SystemFile;
						  			ptrT1 = ((MSG_HEAD *)pMsg)->pMem;
						  			for(i=0; i<((MSG_HEAD *)pMsg)->LenOfAttach; i++){
						  				*ptrT0 = *ptrT1;
						  				ptrT0++;
						  				ptrT1++;
						  			}
						  			//for test
						  			ptrT0 = OSMemGet(pMemSml,&err);
						  			ptrT1 = OSMemGet(pMemLge,&err);
						  			ptrT2 = ((MSG_HEAD *)pMsg)->pMem;
									((MSG_HEAD *)ptrT0)->Msg_ID = MSG_MCNM_TRANSMIT;
									((MSG_HEAD *)ptrT0)->Origin = peventMCNM;
									((MSG_HEAD *)ptrT0)->pmemME = pMemSml;
									((MSG_HEAD *)ptrT0)->Attached = TRUE;
									((MSG_HEAD *)ptrT0)->LenOfAttach = ((MSG_HEAD *)pMsg)->LenOfAttach;
									((MSG_HEAD *)ptrT0)->pMem = ptrT1;
									((MSG_HEAD *)ptrT0)->pmemATT = pMemLge;
									((MSG_HEAD *)ptrT0)->LenOfBody = 0;
									for(i=0; i<((MSG_HEAD *)pMsg)->LenOfAttach; i++){
										*ptrT1 = *ptrT2;
										//DebugContent[i]=*ptrT2;
										ptrT1++;
										ptrT2++;
									}
									OSQPost(peventTxProtocol, ptrT0);
						  			//test end
						  			//FileSave(); //save it
						  		}
							}
							//here the info field is the PDU head
							else 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);
			}
		}
	}
} 

INT16U GetMCNMFileLen(void){
	return(0x200);
}


//#pragma romdata EXTRAM
//INT24U rom MF_Pos_Tbl[128];
#pragma romdata CCODE
rom INT16U rom DomainLen[]={
	sizeof_DOMAIN0,		sizeof_DOMAIN1,		sizeof_DOMAIN2,		sizeof_DOMAIN3,		sizeof_DOMAIN4,
	sizeof_DOMAIN5,		sizeof_DOMAIN6,		sizeof_DOMAIN7,		sizeof_DOMAIN8,		sizeof_DOMAIN9,
	sizeof_DOMAIN10,	sizeof_DOMAIN11,	sizeof_DOMAIN12,	sizeof_DOMAIN13,	sizeof_DOMAIN14,
	sizeof_DOMAIN15,	sizeof_DOMAIN16,	sizeof_DOMAIN17,	sizeof_DOMAIN18,	sizeof_DOMAIN19,
	sizeof_DOMAIN20,	sizeof_DOMAIN21,	sizeof_DOMAIN22,	sizeof_DOMAIN23,	sizeof_DOMAIN24,
	sizeof_DOMAIN25,	sizeof_DOMAIN26,	sizeof_DOMAIN27,	sizeof_DOMAIN28,	sizeof_DOMAIN29,
	sizeof_DOMAIN30,	sizeof_DOMAIN31,	sizeof_DOMAIN32,	sizeof_DOMAIN33,	sizeof_DOMAIN34,
	sizeof_DOMAIN35,	sizeof_DOMAIN36,	sizeof_DOMAIN37,	sizeof_DOMAIN38,	sizeof_DOMAIN39,
	sizeof_DOMAIN40,	sizeof_DOMAIN41,	sizeof_DOMAIN42,	sizeof_DOMAIN43,	sizeof_DOMAIN44,
	sizeof_DOMAIN45,	sizeof_DOMAIN46,	sizeof_DOMAIN47,	sizeof_DOMAIN48,	sizeof_DOMAIN49,
	sizeof_DOMAIN50,	sizeof_DOMAIN51,	sizeof_DOMAIN52,	sizeof_DOMAIN53,	sizeof_DOMAIN54,
	sizeof_DOMAIN55,	sizeof_DOMAIN56,	sizeof_DOMAIN57,	sizeof_DOMAIN58,	sizeof_DOMAIN59,
	sizeof_DOMAIN60,	sizeof_DOMAIN61,	sizeof_DOMAIN62,	sizeof_DOMAIN63,	sizeof_DOMAIN64,
	sizeof_DOMAIN65,	sizeof_DOMAIN66,	sizeof_DOMAIN67,	sizeof_DOMAIN68,	sizeof_DOMAIN69,
	sizeof_DOMAIN70,	sizeof_DOMAIN71,	sizeof_DOMAIN72,	sizeof_DOMAIN73,	sizeof_DOMAIN74,
	sizeof_DOMAIN75,	sizeof_DOMAIN76,	sizeof_DOMAIN77,	sizeof_DOMAIN78,	sizeof_DOMAIN79,
	sizeof_DOMAIN80,	sizeof_DOMAIN81,	sizeof_DOMAIN82,	sizeof_DOMAIN83,	sizeof_DOMAIN84,
	sizeof_DOMAIN85
};
#pragma code MYCODE
/*void Make_MF_Index_Tbl(void){
	MCNM_FILE * ptrM;
	INT8U i;
	INT24U Temp;
	Temp = 0;
	for(i=0;i<128;i++){
		MF_Pos_Tbl[i] = Temp;
		Temp += DomainLen[i];
	}
}
*/



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;
	//for test
	ptrT0 = ptrD;
	for(i=0;i<30;i++){
		DebugContent[i] = *ptrT0;
		ptrT0++;
	}
	//
	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 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 Save_Domain(INT8U domain, INT8U rom * ptrData){
	INT8U err;
	INT16U Pos,Len;
	INT8U rom * pInf;
	
	Pos = DomainOffset[domain];
	Len = DomainLen[domain];
	if(FileSave(SYS_FILE_ID, Pos, ptrData, Len)!=0){
		return (2);
	}
	pInf = (INT8U rom *)&SystemFile;
	//pInf +=MF_Pos_Tbl[domain];
	pInf +=DomainOffset[domain];
	Read_Domain(domain, pInf);
	return (0);
}

INT8U Read_Domain(INT8U domain, INT8U rom * ptrData){
	INT16U Pos,Len;
	INT8U err;
	
	Pos = DomainOffset[domain];
	Len = DomainLen[domain];
	if(FileRead(SYS_FILE_ID, Pos, ptrData, Len)!=0){
		return (2);
	}
	return (0);
}

#pragma romdata CCODE
INT8U rom BipMap[]={0b00000001,0b00000010,0b00000100,0b00001000,
					0b00010000,0b00100000,0b01000000,0b10000000};
#pragma code MYCODE
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);
}

INT8U Load_SysFile(void){
	INT8U err;
	if(FileRead(SYS_FILE_ID, 0, &SystemFile, sizeof(MCNM_FILE))!=0){
		return(2);
	}
	return(0);
}


//check the CRC of input data , return the result, TRUE for correct and FALSE for error
INT8U CheckCRC(INT8U rom * ptr, INT16U len){
	return(TRUE);
}

//calculate the CRC word and attach it to the end of input data, return the new length
INT16U MakeCRC(INT8U rom * ptr, INT16U len){
	return (len+2);
}


/*
#pragma romdata EXTRAM
//control functions, derived from domain0
INT8U rom		LACLockEn;
INT8U rom		CallInForbiden;
INT8U rom		PhoneLock;
INT8U rom		FeeUploadActively;
INT8U rom		L_IPAutoInsertEn;
INT8U rom		MCNMWithSMEn;
INT8U rom		LM_IPAutoInsertEn;
INT8U rom		S_IPAutoInsertEn;
INT8U rom		DataCallInForbiden;
INT8U rom		LocalSecCodeInsertEn;
INT8U rom		SM_IPAutoInsertEn;
//IP numbers, includes domain1~4, ASCII format, terminated with 0xff
INT8U rom IP[4][12];
//PIN code, ASCII format
INT8U rom PIN[6];
//Local LAC code table
INT8U rom LACTable[128][4];

INT8U rom LACLimit[20][4];

#pragma code MYCODE
//
INT8U Load_Domains(void){
	INT8U rom * ptrTemp;
	INT8U rom * ptrTemp1;
	INT8U err,chrTemp;
	INT8U j,i;
	INT8U domain;
	
	//get the work buffer	
	ptrTemp = OSMemGet(pMemLge,&err);
	if(err != OS_NO_ERR) return (1); //serious error!
	ptrTemp1 = ptrTemp;
	domain = 0;
	//load domain 0 -- the control word
	if(Read_Domain(domain, ptrTemp)== 0){
		LACLockEn 					= ((*ptrTemp & 0b00000001) != 0)? TRUE:FALSE;
		CallInForbiden 				= ((*ptrTemp & 0b00000010) != 0)? TRUE:FALSE;
		PhoneLock 					= ((*ptrTemp & 0b00000100) != 0)? TRUE:FALSE;
		FeeUploadActively 			= ((*ptrTemp & 0b00001000) != 0)? TRUE:FALSE;
		L_IPAutoInsertEn			= ((*ptrTemp & 0b00010000) != 0)? TRUE:FALSE;
		MCNMWithSMEn				= ((*ptrTemp & 0b00100000) != 0)? TRUE:FALSE;
		LM_IPAutoInsertEn			= ((*ptrTemp & 0b01000000) != 0)? TRUE:FALSE;
		S_IPAutoInsertEn			= ((*ptrTemp & 0b10000000) != 0)? TRUE:FALSE;
		ptrTemp++;
		DataCallInForbiden			= ((*ptrTemp & 0b00000001) != 0)? TRUE:FALSE;
		LocalSecCodeInsertEn		= ((*ptrTemp & 0b00000010) != 0)? TRUE:FALSE;
		SM_IPAutoInsertEn 			= ((*ptrTemp & 0b00000100) != 0)? TRUE:FALSE;
	}
	else{ //if can not load data
		err = 1;
		LACLockEn 					= FALSE;
		CallInForbiden 				= FALSE;
		PhoneLock 					= FALSE;
		FeeUploadActively 			= FALSE;
		L_IPAutoInsertEn			= FALSE;
		MCNMWithSMEn				= TRUE;
		LM_IPAutoInsertEn			= FALSE;
		S_IPAutoInsertEn			= FALSE;
		DataCallInForbiden			= TRUE;
		LocalSecCodeInsertEn		= FALSE;
		SM_IPAutoInsertEn 			= FALSE;
	}
	ptrTemp = ptrTemp1;
	//load domain 1,2,3,4 -- the IP1 number, compressed BCD
	domain++;
	for(j=0; j<4; j++){
	  for(i=0; i< 12; i++) IP[j][i] = 0xff;
	  if(Read_Domain(domain, ptrTemp)== 0){
		for(i=0; i<6; i++){
			chrTemp = (*ptrTemp & 0xf0) >>4;
			if((chrTemp <= '9') && (chrTemp >='0')){
				IP[j][i*2] = chrTemp | 0x30;
			}
			else break;
			chrTemp = *ptrTemp & 0x0f;
			if(chrTemp <= '9' && chrTemp >='0'){
				IP[j][i*2+1] = chrTemp | 0x30;
			}
			else break;
		}
	  }
	  domain++;
	  ptrTemp = ptrTemp1;
	}
	//load domain 5 ---- PIN code
	for(i=0; i< 6; i++) PIN[i] = 0xff;
	if(Read_Domain(domain, ptrTemp)== 0){
		for(i=0; i<3; i++){
			chrTemp = (*ptrTemp & 0xf0) >>4;
			if(chrTemp <= '9' && chrTemp >='0'){
				IP[j][i*2] = chrTemp | 0x30;
			}
			else break;
			chrTemp = *ptrTemp & 0x0f;
			if(chrTemp <= '9' && chrTemp >='0'){
				IP[j][i*2+1] = chrTemp | 0x30;
			}
			else break;
		}
	}
	domain++;
	ptrTemp = ptrTemp1;
	//load domain 6
	if(Read_Domain(domain, &SerProLimit)!= 0){
		SerProLimit = FALSE;
	}
	domain++;
	
	//load domain 7,8,9 is not applied now
	domain +=3;
	//load domain 10~15 ---- local LOC code table
	for(j=0; j<128; j++){
		for(i=0; i<4; i++){
			LACTable[j][i] = 0xff;
		}
	}
	domain += 6;
	//load domain 16~21 --- Limit LAC tbl
	
	//load domain 22~31 --- HCODE table
	
	//load domain 32 -- local section number
	
	//
}
*/



//exacute this function when key input super command
void Make_DefaultSysFile(void){
	INT8U i;
	INT8U rom * ptrTest;
	
	SystemFile.intCtlWord = 0b0000000100100000;
	
	for(i=0;i<6;i++){
		SystemFile.chrIP1Num[i] = 0xff;
	}
	
	for(i=0;i<6;i++){
		SystemFile.chrIP2Num[i] = 0xff;
	}
	
	for(i=0;i<6;i++){
		SystemFile.chrDefaultIP[i] = 0xff;
	}
	
	for(i=0;i<6;i++){
		SystemFile.chrReserveIP[i] = 0xff;
	}
	
	SystemFile.chrPINCode[0] = 0xff;
	SystemFile.chrPINCode[1] = 0xff;
	SystemFile.chrPINCode[2] = 0xff;
	
	Save_Domain(0, &SystemFile.intCtlWord);
	Save_Domain(1, &SystemFile.chrIP1Num[0]);
	Save_Domain(2, &SystemFile.chrIP2Num[0]);
	Save_Domain(3, &SystemFile.chrDefaultIP[0]);
	Save_Domain(4, &SystemFile.chrReserveIP[0]);
	Save_Domain(5, &SystemFile.chrPINCode[0]);
	
	//Load_SysFile();
	//for test
	/*if(Load_SysFile() != 0){
		for(;;){
			Nop();
		}
	}
	ptrTest = (INT8U rom *)&SystemFile;
	for(i=0;i<30;i++){
		DebugContent[i] = *ptrTest;
		ptrTest++;
	}
	Nop();*/
}

⌨️ 快捷键说明

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