📄 framerm.nc
字号:
TxResult = FAIL;
gTxState = TXSTATE_IDLE;
}
}
if (gTxProto == PROTO_ACK) {
atomic gFlags ^= FLAGS_TOKENPEND;
}
else{
atomic gFlags ^= FLAGS_DATAPEND;
signal BareSendMsg.sendDone((TOS_MsgPtr)gpTxMsg,TxResult);
atomic gpTxMsg = NULL;
}
// Trigger transmission in case something else is pending
StartTx();
}
void HDLCInitialize() {
int i;
atomic {
for (i = 0;i < HDLC_QUEUESIZE; i++) {
gMsgRcvTbl[i].pMsg = &gMsgRcvBuf[i];
gMsgRcvTbl[i].Length = 0;
gMsgRcvTbl[i].Token = 0;
}
gTxState = TXSTATE_IDLE;
gTxByteCnt = 0;
gTxLength = 0;
gTxRunningCRC = 0;
gpTxMsg = NULL;
gRxState = RXSTATE_NOSYNC;
gRxHeadIndex = 0;
gRxTailIndex = 0;
gRxByteCnt = 0;
gRxRunningCRC = 0;
gpRxBuf = (uint8_t *)gMsgRcvTbl[gRxHeadIndex].pMsg;
}
}
command result_t StdControl.init() {
HDLCInitialize();
return call ByteControl.init();
}
command result_t StdControl.start() {
HDLCInitialize();
return call ByteControl.start();
}
command result_t StdControl.stop() {
return call ByteControl.stop();
}
command result_t BareSendMsg.send(TOS_MsgPtr pMsg) {
result_t Result = SUCCESS;
atomic {
if (!(gFlags & FLAGS_DATAPEND)) {
gFlags |= FLAGS_DATAPEND;
gpTxMsg = pMsg;
//gTxLength = pMsg->length + (MSG_DATA_SIZE - DATA_LENGTH - 2);
//gTxProto = PROTO_PACKET_NOACK;
}
else {
Result = FAIL;
}
}
if (Result == SUCCESS) {
Result = StartTx();
}
return Result;
}
/************************************************************************/
/************************************************************************/
/************************************************************************/
command result_t BareSendMsg.Mysend(MyTOS_MsgPtr pMsg) {
result_t Result = SUCCESS;
atomic {
if (!(gFlags & FLAGS_DATAPEND)) {
gFlags |= FLAGS_DATAPEND;
MygpTxMsg = pMsg;
//gTxLength = pMsg->length + (MSG_DATA_SIZE - DATA_LENGTH - 2);
//gTxProto = PROTO_PACKET_NOACK;
}
else {
Result = FAIL;
}
}
if (Result == SUCCESS) {
Result = StartTx();
}
return Result;
}
command result_t TokenReceiveMsg.ReflectToken(uint8_t Token) {
result_t Result = SUCCESS;
atomic {
if (!(gFlags & FLAGS_TOKENPEND)) {
gFlags |= FLAGS_TOKENPEND;
gTxTokenBuf = Token;
}
else {
Result = FAIL;
}
}
if (Result == SUCCESS) {
Result = StartTx();
}
return Result;
}
async event result_t ByteComm.rxByteReady(uint8_t data, bool error, uint16_t strength) {
switch (gRxState) {
case RXSTATE_NOSYNC:
if ((data == HDLC_FLAG_BYTE) && (gMsgRcvTbl[gRxHeadIndex].Length == 0)) {
gMsgRcvTbl[gRxHeadIndex].Token = 0;
gRxByteCnt = gRxRunningCRC = 0;
gpRxBuf = (uint8_t *)gMsgRcvTbl[gRxHeadIndex].pMsg;
gRxState = RXSTATE_PROTO;
}
break;
case RXSTATE_PROTO:
if (data == HDLC_FLAG_BYTE) {
break;
}
gMsgRcvTbl[gRxHeadIndex].Proto = data;
gRxRunningCRC = crcByte(gRxRunningCRC,data);
switch (data) {
case PROTO_PACKET_ACK:
gRxState = RXSTATE_TOKEN;
break;
case PROTO_PACKET_NOACK:
gRxState = RXSTATE_INFO;
break;
default: // PROTO_ACK packets are not handled
gRxState = RXSTATE_NOSYNC;
break;
}//case data
break;
case RXSTATE_TOKEN:
if (data == HDLC_FLAG_BYTE) {
gRxState = RXSTATE_NOSYNC;
}
else if (data == HDLC_CTLESC_BYTE) {
gMsgRcvTbl[gRxHeadIndex].Token = 0x20;
}
else {
gMsgRcvTbl[gRxHeadIndex].Token ^= data;
gRxRunningCRC = crcByte(gRxRunningCRC,gMsgRcvTbl[gRxHeadIndex].Token);
gRxState = RXSTATE_INFO;
}
break;
case RXSTATE_INFO:
if (gRxByteCnt > HDLC_MTU) {
gRxByteCnt = gRxRunningCRC = 0;
gMsgRcvTbl[gRxHeadIndex].Length = 0;
gMsgRcvTbl[gRxHeadIndex].Token = 0;
gRxState = RXSTATE_NOSYNC;
}
else if (data == HDLC_CTLESC_BYTE) {
gRxState = RXSTATE_ESC;
}
else if (data == HDLC_FLAG_BYTE) {
if (gRxByteCnt >= 2) {
//fetch the received CRC
uint16_t usRcvdCRC = (gpRxBuf[fRemapRxPos(gRxByteCnt-1)] & 0xff);
usRcvdCRC = (usRcvdCRC << 8) | fRemapRxPos(gpRxBuf[(gRxByteCnt-2)] & 0xff);
//DEBUG - FORCE CRC OK
gRxRunningCRC= usRcvdCRC;
if (usRcvdCRC == gRxRunningCRC) {
gMsgRcvTbl[gRxHeadIndex].Length = gRxByteCnt - 2;
post PacketRcvd();
gRxHeadIndex++; gRxHeadIndex %= HDLC_QUEUESIZE;
}
else {
gMsgRcvTbl[gRxHeadIndex].Length = 0;
gMsgRcvTbl[gRxHeadIndex].Token = 0;
}
if (gMsgRcvTbl[gRxHeadIndex].Length == 0) {
gpRxBuf = (uint8_t *)gMsgRcvTbl[gRxHeadIndex].pMsg;
gRxState = RXSTATE_PROTO;
}
else {
gRxState = RXSTATE_NOSYNC;
}//if usRcvdCRC
}//if gRXBytecnt
else {
gMsgRcvTbl[gRxHeadIndex].Length = 0;
gMsgRcvTbl[gRxHeadIndex].Token = 0;
gRxState = RXSTATE_NOSYNC;
}
gRxByteCnt = gRxRunningCRC = 0;
} //if data
else {
gpRxBuf[fRemapRxPos(gRxByteCnt)] = data;
if (gRxByteCnt >= 2) {
gRxRunningCRC = crcByte(gRxRunningCRC,gpRxBuf[(gRxByteCnt-2)]); //start computing CRC-need remap
}
gRxByteCnt++;
}
break;
case RXSTATE_ESC:
if (data == HDLC_FLAG_BYTE) {
// Error case, fail and resync
gRxByteCnt = gRxRunningCRC = 0;
gMsgRcvTbl[gRxHeadIndex].Length = 0;
gMsgRcvTbl[gRxHeadIndex].Token = 0;
gRxState = RXSTATE_NOSYNC;
}
else {
data = data ^ 0x20;
gpRxBuf[fRemapRxPos(gRxByteCnt)] = data;
if (gRxByteCnt >= 2) {
gRxRunningCRC = crcByte(gRxRunningCRC,gpRxBuf[(gRxByteCnt-2)]);
}
gRxByteCnt++;
gRxState = RXSTATE_INFO;
}
break;
default:
gRxState = RXSTATE_NOSYNC;
break;
}
return SUCCESS;
}
//*****************************************************************************
result_t TxArbitraryByte(uint8_t inByte) {
if ((inByte == HDLC_FLAG_BYTE) || (inByte == HDLC_CTLESC_BYTE)) {
atomic {
gPrevTxState = gTxState;
gTxState = TXSTATE_ESC;
gTxEscByte = inByte;
}
inByte = HDLC_CTLESC_BYTE;
}
return call ByteComm.txByte(inByte);
}
async event result_t ByteComm.txByteReady(bool LastByteSuccess) {
result_t TxResult = SUCCESS;
uint8_t nextByte;
if (LastByteSuccess != TRUE) {
atomic gTxState = TXSTATE_ERROR;
post PacketSent();
return SUCCESS;
}
switch (gTxState) {
case TXSTATE_PROTO:
gTxState = TXSTATE_INFO;
gTxRunningCRC = crcByte(gTxRunningCRC,gTxProto);
TxResult = call ByteComm.txByte(gTxProto);
break;
case TXSTATE_INFO:
nextByte = gpTxBuf[gTxByteCnt];
gTxRunningCRC = crcByte(gTxRunningCRC,nextByte);
gTxByteCnt++;
if(gTxByteCnt == 10)
gTxByteCnt = 0; //insert TOSMsg Length field found at msg[0]
if(gTxByteCnt == 1)
gTxByteCnt = 10; //back to TOSMsg.data
if (gTxByteCnt >= gTxLength) {
gTxState = TXSTATE_FCS1;
}
TxResult = TxArbitraryByte(nextByte);
break;
case TXSTATE_ESC:
TxResult = call ByteComm.txByte((gTxEscByte ^ 0x20));
gTxState = gPrevTxState;
break;
case TXSTATE_FCS1:
nextByte = (uint8_t)(gTxRunningCRC & 0xff); // LSB
gTxState = TXSTATE_FCS2;
TxResult = TxArbitraryByte(nextByte);
break;
case TXSTATE_FCS2:
nextByte = (uint8_t)((gTxRunningCRC >> 8) & 0xff); // MSB
gTxState = TXSTATE_ENDFLAG;
TxResult = TxArbitraryByte(nextByte);
break;
case TXSTATE_ENDFLAG:
gTxState = TXSTATE_FINISH;
TxResult = call ByteComm.txByte(HDLC_FLAG_BYTE);
break;
case TXSTATE_FINISH:
case TXSTATE_ERROR:
default:
break;
}
if (TxResult != SUCCESS) {
gTxState = TXSTATE_ERROR;
post PacketSent();
}
return SUCCESS;
}
async event result_t ByteComm.txDone() {
if (gTxState == TXSTATE_FINISH) {
gTxState = TXSTATE_IDLE;
post PacketSent();
}
return SUCCESS;
}
default event TOS_MsgPtr ReceiveMsg.receive(TOS_MsgPtr Msg) {
return Msg;
}
default event TOS_MsgPtr TokenReceiveMsg.receive(TOS_MsgPtr Msg,uint8_t Token) {
return Msg;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -