📄 mcnmtst.c
字号:
#include <p18cxxx.h>
#include "includes.h"
extern OS_MEM *pMemSml;
extern OS_MEM *pMemLge;
extern OS_EVENT *rom peventDEBUG;
extern OS_EVENT *rom peventWICResp;
extern OS_EVENT *rom peventHardware;
extern OS_EVENT *rom peventDVS;
extern OS_EVENT *rom peventMCNM;
INT8U MCNMFrameProc(INT8U rom * ptrD, INT16U Len);
#pragma romdata EXTRAM
SYS_FILE SystemFile;
INT16U rom DomainOffset[64];
#pragma code MYCODE
void tskMCNM(void * data){
void rom * pMsg;
INT8U err;
//load eeprom data index here
Load_SysFile();
if(Test_SysFileValid == FALSE){//the domain length table is corrupted
MCNMStt = MS_DATA_CORRUPTED;
}
else{
Make_SysFileIndex();
MCNMStt = MS_OK;
}
for(;;){
pMsg = OSQPend(peventMCNM, 0, &err);
if(err == OS_NO_ERR){
if((INT24U)pMsg >= PTR_MAX){
switch ((INT24U)pMsg){
}
}
else{
switch (((MSG_HEAD *)pMsg)->Msg_ID){
case MSG_MCNM_RECEIVE:
if(MCNMFrameProc(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach) == 0){
}
break;
}
if(((MSG_HEAD *)pMsg)->Attached == TRUE){
OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
}
OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
}
}
}
}
INT16U GetMCNMFileLen(void){
return(0x200);
}
#pragma romdata EXTRAM
INT24U rom MF_Pos_Tbl[64];
INT16U rom DomainLen[64]; //The length table of domains. This parameters need to be download to the terminal
#pragma code MYCODE
void Make_MF_Index_Tbl(void){
MCNM_FILE * ptrM;
INT8U i;
INT24U Temp;
Temp = 0;
for(i=0;i<64;i++){
MF_Pos_Tbl[i] = Temp;
if(i != 39) Temp += DomainLen[i];
}
}
#pragma code MYCODE
INT8U rom * ProcessDomain(INT8U rom *ptr, INT8U domain, INT8U *err);
INT8U MCNMFrameProc(INT8U rom * ptrD, INT16U Len){ //return if the frame is currupted, "1" for error, "0" for OK
INT8U rom *ptrTemp;
INT8U err,i,j,k;
ptrD += 5;
ptrTemp = ptrD;
if(Len< 13) 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, &err);
if(err != 0) return (1);
}
k = k << 1;
}
}
return (0);
}
INT8U FileSave(INT8U FileID, INT16U Position, INT8U rom * ptrData, INT16U DataLen)
#pragma code MYCODE
INT8U rom * ProcessDomain(INT8U rom *ptr, INT8U domain, INT8U type, INT8U *err){
//if there is error, err = 0xff
*err = 0;
if(domain > 63){
* err = 1;
return (0xffffff); //local error but no frame err, just throw it away
}
if(domain == 63){ //the polling domain
domain = *ptr;
if(SystemFile.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(0xffffff);
}
else{
pInf = OSMemGet(pMemLge,&err);
pMem = pMemLge;
if(err != OS_NO_ERR) return(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 = SystemFile.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(SystemFile.DomainLen[domain] == 0) return (ptr);
if(Check_Authorization(type, domain) != 0) return (ptr+SystemFile.DomainLen[domain]);
else {
Save_Domain(domain,ptr);
return(ptr+SystemFile.DomainLen[domain]);
}
}
return (ptr);
}
INT8U Test_SysFileValid(void){
INT8U ChkSum,j,k;
INT8U rom * ptrD;
ChkSum = 0;
j=0;
k=0;
ptrD =(INT8U rom *)&SystemFile.DomainLen[0];
for(i=0; i<64*2+64; i++){
if(*ptrD == 0xff) j++;
if(*ptrD == 0) k++;
ChkSum ^= *ptrD++;
}
if(ChkSum != SystemFile.CheckSum) return(FALSE);
else return (TRUE);
}
void Make_SysFileIndex(void){
Offset = 0;
for(i=0; i<64; i++){
DomainOffset[i] = Offset;
Offset += SystemFile.DomainLen[i];
}
}
INT8U Check_Authorization(INT8U type, INT8U domain){
if(type>SystemFile.DomainAuth[domain]) return (1);
else return(0);
}
INT8U Save_Domain(INT8U domain, INT8U rom * ptrData){
Pos = DomainOffset[domain];
Len = SystemFile.DomainLen[domain];
OSSemPend(EepromSem, 0, &err);
if (err != OS_NO_ERR) return(1);
if(FileSave(SYS_FILE_ID, Pos, ptrData, Len)!=0){
OSSemPost(EepromSem);
return (2);
}
OSSemPost(EepromSem);
return (0);
}
INT8U Read_Domain(INT8U domain, INT8U rom * ptrData){
Pos = DomainOffset[domain];
Len = SystemFile.DomainLen[domain];
OSSemPend(EepromSem, 0, &err);
if (err != OS_NO_ERR) return(1);
if(FileRead(SYS_FILE_ID, Pos, ptrData, Len)!=0){
OSSemPost(EepromSem);
return (2);
}
OSSemPost(EepromSem);
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++ = BipMap[domain%8];
for(i=0; i<8-domain/8-1;i++){
*ptrBuf++ = 0;
}
return(0);
}
void Load_SysFile(void){
INT8U err;
OSSemPend(EepromSem, 0, &err);
if (err != OS_NO_ERR) return(1);
if(FileRead(SYS_FILE_ID, 0, &SystemFile,sizeof(SYS_FILE))!=0){
OSSemPost(EepromSem);
return;
}
OSSemPost(EepromSem);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -