📄 funcframe.c
字号:
//This file containing
#include "includes.h"
#define MAX_TX_FRAME_LEN 138
#define MAX_RX_FRAME_LEN 256
#define F_FLAG 0x7e
#define F_ESC 0x7d
#define FR_END 0x00
#define FR_START 0x01
#define NULL_PTR (INT8U rom *) 0xffffff
//port
#define PT_NONE 0x00
#define PT_HDLC 0x01
#define PT_SM 0x02
//Service type word in frame
#define FT_PAYPHONE 0x04
#define FT_SYS 0x00
//Subtype
#define FC_DATA 0x00
#define FC_ACK 0x01
#define FC_MON 0x02
#define BIT_SYN 0b01000000
#define BIT_TOBECONTINUE 0b10000000
//link status
#define LS_IDLE 0 //idle state
#define LS_WAITANS 1 //waiting answer
#define LS_WAITFOLLOW 2 //waiting following frames
#pragma romdata EXTRAM
INT8U rom CurNT;
INT8U rom CurNR;
#pragma code MYCODE
void tskRxProtocol(void * data){
void rom * pMsg;
INT8U err;
CurNT = 0;
CurNR = 0;
for(;;){
pMsg = OSQPend(peventRxProtocol, 0, &err); //Wait for the messages
if(err == OS_NO_ERR){
if((INT24U)pMsg >= PTR_MAX){ //If is a direct message--just a value
switch ((INT24U)pMsg){
}
}
else{ //If it's a undirect message--a pointer
switch (((MSG_HEAD *)pMsg)->Msg_ID){
case MSG_PROT_RECEIVE:
Data_Rx_Proc(((MSG_HEAD *)pMsg)->pMem,((MSG_PROTOCOL *)pMsg)->Port);
break;
}
if(((MSG_HEAD *)pMsg)->Attached == TRUE){
OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
}
OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
}
}
}
}
void tskTxProtocol(void * data){
void rom * pMsg; //The pointer of message, it has to be a pointer point to the "rom: region
INT8U err; //Used to return the error value. It must be a variable in data region
for(;;){ //The main loop
pMsg = OSQPend(peventTxProtocol, 0, &err); //Wait for the messages
if(err == OS_NO_ERR){
if((INT24U)pMsg >= PTR_MAX){ //If is a direct message--just a value
switch ((INT24U)pMsg){
}
}
else{ //If it's a undirect message--a pointer
switch (((MSG_HEAD *)pMsg)->Msg_ID){
case MSG_MCNM_TRANSMIT:
Data_Tx_Proc(((MSG_HEAD *)pMsg)->pMem, ((MSG_HEAD *)pMsg)->LenOfAttach);
break;
}
if(((MSG_HEAD *)pMsg)->Attached == TRUE){
OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
}
OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
}
}
}
}
//This level deal with frame
void Data_Tx_Proc(INT8U rom * ptrF, INT16U Len){
for(;;){
if(Len>=MAX_TXFRAME_LEN){
SendData(ptrF,MAX_TXFRAME_LEN,ActivePort);
}
else{
SendData(ptrF,Len, port);
}
pMsg = OSQPend(peventTxProtocol, TimeOut, &err);
if(err == OS_TIMEOUT){
Err_Cnt++;
if(Err_Cnt >= 3){
OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXFAIL);
return;
}
}
else if(err == OS_NO_ERR){
if((INT24U)pMsg<PTR_MAX && ((MSG_HEAD *)pMsg)->Msg_ID == MSG_MCNM_TRANSMIT){
OSQPost(peventMCNM,(OS_EVENT *)MSG_MCNM_TXBUSY);
}
else if ((INT24U)pMsg<PTR_MAX && ((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){
if(TestACK(ptrF) == TRUE){
if(Len>=MAX_TXFRAME_LEN){
Len = Len - MAX_TXFRAME_LEN;
ptrF = ptrF+MAX_TXFRAME_LEN;
}
else Len=0;
}
}
if(((MSG_HEAD *)pMsg)->Attached == TRUE){
OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
}
OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
}
if(Len == 0){
OSQPost(peventMCNM, (OS_EVENT *) MSG_MCNM_TXSUCCESS);
return;
}
}
}
void Data_Rx_Proc(INT8U rom * ptrF, INT8U port){
INT8U rom * pRxSav;
INT8U rom * pRx;
INT8U rom * pSml;
INT8U len,err;
INT8U rom * pMem;
pRx = NULL_PTR;
len = 0;
for(;;){
if(TestToBeContinue(ptrF)==TRUE){
pRx=OSMemGet(pmemHug,&err);
if(err != OS_NO_ERR) break;
pRxSav = pRx;
pMem = pmemHug;
len = *ptrF;
ptrF +=5;
for(i=0; i<len-5; i++){
*pRx++ = *ptrF++;
}
SendACK();
OSMemPut(pMem,ptrF);
pMsg = OSQPend(peventRxProtocol, TimeOut, &err);
if(err == OS_TIMEOUT){
OSMemPut(pMem,pRx);
break;
}
else{
if ((INT24U)pMsg<PTR_MAX && ((MSG_HEAD *)pMsg)->Msg_ID == MSG_PROT_RECEIVE){
ptrF = ((MSG_HEAD *)pMsg)->pMem;
if(TestNR(ptrF) == TRUE){
len = len + *ptrF;
}
}
if(((MSG_HEAD *)pMsg)->Attached == TRUE){
OSMemPut(((MSG_HEAD *)pMsg)->pmemATT, ((MSG_HEAD *)pMsg)->pMem);
}
OSMemPut(((MSG_HEAD *)pMsg)->pmemME, pMsg);
}
}
else{
if(pRx == NULL_PTR){
pRx=OSMemGet(pmemLge,&err);
if(err != OS_NO_ERR) break;
pSml = OSMemGet(pMemSml,&err);
if(err != OS_NO_ERR) break;
pMem = pMemLge;
pRxSav = pRx;
}
len = len + *ptrF;
ptrF +=5;
pSml = OSMemGet(pMemSml,&err);
if(err != OS_NO_ERR) {
OSMemPut(pMem, pRx);
break;
}
for(i=0; i<len-5; i++){
*pRx++ = *ptrF++;
}
((MSG_HEAD *)pSml)->Msg_ID = MSG_MCNM_RECEIVE;
((MSG_HEAD *)pSml)->Origin = peventRxProtocol;
((MSG_HEAD *)pSml)->pmemME = pMemSml;
((MSG_HEAD *)pSml)->Attached = TRUE;
((MSG_HEAD *)pSml)->LenOfAttach = len-5;
((MSG_HEAD *)pSml)->pMem = pRxSav;
((MSG_HEAD *)pSml)->pmemATT = pMem;
((MSG_HEAD *)pSml)->LenOfBody = 0;
SendACK();
OSQPost(peventMCNM, pSml);
}
}
}
INT8U TestNR(INT8U rom *ptrF){
}
INT8U TestACK(INT8U rom *ptrF){
}
INT8U TestToBeContinue(INT8U rom *ptrF){
}
void SendACK(INT8U NT, INT8U NR, INT8U Type, INT8U SubNet, INT8U port){
INT8U rom * pT0;
INT8U rom * pT1;
INT8U err;
err = FC_ACK;
err = err<<4;
Type |= err;
if(port == PT_HDLC) Type |= 0x08;
pT0 = OSMemGet( pMemSml, &err);
if(err == OS_NO_ERR){
pT1 = OSMemGet( pMemLge, &err);
if(err == OS_NO_ERR){
((MSG_HEAD *)pT0)->Msg_ID = MSG_PROT_TRANSMIT;
((MSG_HEAD *)pT0)->Origin = peventProtocol;
((MSG_HEAD *)pT0)->pmemME = pMemSml;
((MSG_HEAD *)pT0)->Attached = TRUE;
((MSG_HEAD *)pT0)->LenOfAttach = 5;
((MSG_HEAD *)pT0)->pMem = pT1;
((MSG_HEAD *)pT0)->pmemATT = pMemSml;
((MSG_HEAD *)pT0)->LenOfBody = 0;
((FRAME_STRUCT *)pT1)->Len = 5;
((FRAME_STRUCT *)pT1)->NT = NT;
((FRAME_STRUCT *)pT1)->NR = NR;
((FRAME_STRUCT *)pT1)->Type = Type;
((FRAME_STRUCT *)pT1)->SubNet = SubNet;
OSQPost(peventDEBUG, pSml);
}
}
}
void SendFrame(INT8U port, INT8U rom * ptrD, INT16U len){
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -