📄 tskdebug.c
字号:
#include <p18cxxx.h>
#include "includes.h"
#include "event.h"
extern OS_MEM *pMemSml;
extern OS_MEM *pMemLge;
extern unsigned char DebugContent[48];
void Process_DBG_RData(INT8U rom * ptrData, INT16U Len);
void Process_DBG_TData(INT8U rom * ptrData, INT16U Len);
typedef struct Pack_Result{
INT16U PacLen; //the length of packet
INT16U RemLem; //how many byte remain unpacked
INT8U rom * ptrCur; //unpacked data start address
}PACKRESULT;
#define DBGWORKBUFLEN 512
#define F_ESC 0x7d
#define F_FLAG 0x7e
#define F_START 2
#define F_END 3
#pragma romdata EXTRAM
INT8U rom chrDBGWorkBuf[DBGWORKBUFLEN];
INT16U rom DBGWorkBufPtr;
INT8U rom FrameStt;
INT8U rom ESC_Found;
INT8U rom LinkStt; //the state of the link, waiting answer or idle
void tskDebug(void * data){
void rom * pMsg;
INT8U err;
INT8U rom * pSml;
INT8U rom * pLge;
INT8U chrTemp,i;
INT8U rom * pTemp1;
INT8U rom * pTemp2;
DBGWorkBufPtr = 0;
FrameStt = F_END;
ESC_Found = FALSE;
for(;;){
pMsg = OSQPend(peventDEBUG, 0, &err);
if(err == OS_NO_ERR){
if((INT24U)pMsg >= PTR_MAX){
switch ((INT24U)pMsg){
}
}
else{
switch (((MSG_HEAD *)pMsg)->Msg_ID){
case MSG_DEBUG_RECEIVE:
Process_DBG_RData(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
break;
default:
//case MSG_MCNM_TRANSMIT:
Process_DBG_TData(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
// break;
//case MSG_PROT_TRANSMIT:
// Process_DBG_TData(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
break;
}
Func_Clear_Msg(pMsg);
//if(((MSG_HEAD *)pMsg)->Attached == TRUE){
// OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
//}
//OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
}
}
}
}
/***************************************************************************************************/
void Process_DBG_RData(INT8U rom * ptrData, INT16U Len){
INT8U chrTemp,err;
INT16U i,j;
INT8U rom * pSml;
INT8U rom * pLge;
for(i=0; i<Len; i++){
if(DBGWorkBufPtr >= DBGWORKBUFLEN-2) DBGWorkBufPtr = 0;
chrTemp = *ptrData++;
switch(chrTemp){
case F_FLAG: //flag 0x7e
if(FrameStt == F_START){ //a frame has began
if(DBGWorkBufPtr != 0){
FrameStt = F_END;
if(DBGWorkBufPtr >256){
DBGWorkBufPtr = 0; //too long a frame received, throw away
break;
}
if(chrDBGWorkBuf[0] != DBGWorkBufPtr){
DBGWorkBufPtr = 0; //the frame length is not correct
break;
}
if(chrDBGWorkBuf[3] == FT_DEBUG && DBGWorkBufPtr >= 4){
//if it's a DEBUG frame
//add process code here
DBGWorkBufPtr = 0;
break;
}
//if((chrDBGWorkBuf[3] != FT_MCNM && DBGWorkBufPtr < 14){
if(DBGWorkBufPtr < 5){
//if it's not a MCNM frame or the length is illegal
DBGWorkBufPtr = 0;
break;
}
//send data to MCNM
pSml = OSMemGet( pMemSml, &err);
if(err == OS_NO_ERR){
pLge = OSMemGet( pMemLge, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pSml)->Msg_ID = MSG_PROT_RECEIVE;
((MSG_HEAD *)pSml)->Origin = peventDEBUG;
((MSG_HEAD *)pSml)->pmemME = pMemSml;
((MSG_HEAD *)pSml)->Attached = TRUE;
((MSG_HEAD *)pSml)->LenOfAttach = DBGWorkBufPtr;
((MSG_HEAD *)pSml)->pMem = pLge;
((MSG_HEAD *)pSml)->pmemATT = pMemLge;
((MSG_HEAD *)pSml)->LenOfBody = 0;
//((MSG_PROTOCOL *)pSml)->Port = PT_HDLC;
//((MSG_PROTOCOL *)pSml)->Type = chrDBGWorkBuf[3]&0x07;
//((MSG_PROTOCOL *)pSml)->SubType = chrDBGWorkBuf[3]&0x
for(j=0; j<DBGWorkBufPtr; j++){
*pLge++ = chrDBGWorkBuf[j];
//DebugContent[j] = chrDBGWorkBuf[j];
}
if((chrDBGWorkBuf[3]&0xf0) == 0x10){//an ACK
OSQPost(peventTxProtocol, pSml);
}
else{
OSQPost(peventRxProtocol, pSml);
}
}
}
DBGWorkBufPtr = 0;
}
}
else{ //this flag start the frame
FrameStt = F_START;
DBGWorkBufPtr = 0;
}
break;
case F_ESC: //escape symbol 0x7d
if(FrameStt != F_START) break;
ESC_Found = TRUE;
break;
default: //other bytes
if(FrameStt != F_START) break;
if(ESC_Found == TRUE){//an escape symbol has been found
ESC_Found = FALSE;
chrTemp ^= 0x20;
chrDBGWorkBuf[DBGWorkBufPtr]= chrTemp;
}
else{
chrDBGWorkBuf[DBGWorkBufPtr]= chrTemp;
}
DBGWorkBufPtr++;
break;
}
}
}
void Process_DBG_TData(INT8U rom * ptrData, INT16U Len){//packet the MCNM data
INT8U rom * pSml;
INT8U rom * pLge;
INT8U err,chrTemp;
INT16U i,j;
pSml = OSMemGet(pMemSml,&err);
if(err == OS_NO_ERR){
pLge = OSMemGet( pMemLge, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pSml)->Msg_ID = MSG_COM0_TRANSMIT;
((MSG_HEAD *)pSml)->Origin = peventDEBUG;
((MSG_HEAD *)pSml)->pmemME = pMemSml;
((MSG_HEAD *)pSml)->Attached = TRUE;
((MSG_HEAD *)pSml)->pMem = pLge;
((MSG_HEAD *)pSml)->pmemATT = pMemLge;
((MSG_HEAD *)pSml)->LenOfBody = 0;
j=0;
*pLge++ = F_FLAG;
j++;
for(i=0;i<Len;i++){
chrTemp = *ptrData++;
switch(chrTemp){
case F_FLAG:
*pLge++ = F_ESC;
*pLge++ = chrTemp ^ 0x20;
j +=2;
break;
case F_ESC:
*pLge++ = F_ESC;
*pLge++ = chrTemp ^ 0x20;
j +=2;
break;
default:
*pLge++ = chrTemp;
j++;
break;
}
if(j>250){//too long a data packet
OSMemPut(pMemSml, pSml);
OSMemPut(pMemLge, pLge);
}
}
*pLge++ = F_FLAG;
j++;
((MSG_HEAD *)pSml)->LenOfAttach = j;
OSQPost(peventHardware, pSml);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -