📄 tskmcnmbak.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 + -