kopia lustrzana https://github.com/sq8vps/vp-digi
concurrency handling
rodzic
c0d90a3793
commit
f23d89dadb
19
Src/ax25.c
19
Src/ax25.c
|
@ -147,15 +147,11 @@ void Ax25ClearReceivedFrameBitmap(void)
|
||||||
|
|
||||||
void *Ax25WriteTxFrame(uint8_t *data, uint16_t size)
|
void *Ax25WriteTxFrame(uint8_t *data, uint16_t size)
|
||||||
{
|
{
|
||||||
while(txStage != TX_STAGE_IDLE)
|
|
||||||
;
|
|
||||||
|
|
||||||
if((GET_FREE_SIZE(FRAME_BUFFER_SIZE, txBufferHead, txBufferTail) < size) || txFrameBufferFull)
|
if((GET_FREE_SIZE(FRAME_BUFFER_SIZE, txBufferHead, txBufferTail) < size) || txFrameBufferFull)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
txFrame[txFrameHead].size = size;
|
txFrame[txFrameHead].size = size;
|
||||||
txFrame[txFrameHead].start = txBufferHead;
|
txFrame[txFrameHead].start = txBufferHead;
|
||||||
for(uint16_t i = 0; i < size; i++)
|
for(uint16_t i = 0; i < size; i++)
|
||||||
|
@ -164,10 +160,12 @@ void *Ax25WriteTxFrame(uint8_t *data, uint16_t size)
|
||||||
txBufferHead %= FRAME_BUFFER_SIZE;
|
txBufferHead %= FRAME_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
void *ret = &txFrame[txFrameHead];
|
void *ret = &txFrame[txFrameHead];
|
||||||
|
__disable_irq();
|
||||||
txFrameHead++;
|
txFrameHead++;
|
||||||
txFrameHead %= FRAME_MAX_COUNT;
|
txFrameHead %= FRAME_MAX_COUNT;
|
||||||
if(txFrameHead == txFrameTail)
|
if(txFrameHead == txFrameTail)
|
||||||
txFrameBufferFull = true;
|
txFrameBufferFull = true;
|
||||||
|
__enable_irq();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +173,9 @@ void *Ax25WriteTxFrame(uint8_t *data, uint16_t size)
|
||||||
bool Ax25ReadNextRxFrame(uint8_t **dst, uint16_t *size, uint16_t *signalLevel)
|
bool Ax25ReadNextRxFrame(uint8_t **dst, uint16_t *size, uint16_t *signalLevel)
|
||||||
{
|
{
|
||||||
if((rxFrameHead == rxFrameTail) && !rxFrameBufferFull)
|
if((rxFrameHead == rxFrameTail) && !rxFrameBufferFull)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
*dst = outputFrameBuffer;
|
*dst = outputFrameBuffer;
|
||||||
|
|
||||||
|
@ -187,9 +187,11 @@ bool Ax25ReadNextRxFrame(uint8_t **dst, uint16_t *size, uint16_t *signalLevel)
|
||||||
*signalLevel = rxFrame[rxFrameTail].signalLevel;
|
*signalLevel = rxFrame[rxFrameTail].signalLevel;
|
||||||
*size = rxFrame[rxFrameTail].size;
|
*size = rxFrame[rxFrameTail].size;
|
||||||
|
|
||||||
|
__disable_irq();
|
||||||
rxFrameBufferFull = false;
|
rxFrameBufferFull = false;
|
||||||
rxFrameTail++;
|
rxFrameTail++;
|
||||||
rxFrameTail %= FRAME_MAX_COUNT;
|
rxFrameTail %= FRAME_MAX_COUNT;
|
||||||
|
__enable_irq();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,10 +255,12 @@ void Ax25BitParse(uint8_t bit, uint8_t modem)
|
||||||
{
|
{
|
||||||
rxFrame[rxFrameHead].start = rxBufferHead;
|
rxFrame[rxFrameHead].start = rxBufferHead;
|
||||||
rxFrame[rxFrameHead].signalLevel = ModemGetRMS(modem);
|
rxFrame[rxFrameHead].signalLevel = ModemGetRMS(modem);
|
||||||
|
__disable_irq();
|
||||||
rxFrame[rxFrameHead++].size = rx->frameIdx;
|
rxFrame[rxFrameHead++].size = rx->frameIdx;
|
||||||
rxFrameHead %= FRAME_MAX_COUNT;
|
rxFrameHead %= FRAME_MAX_COUNT;
|
||||||
if(rxFrameHead == txFrameHead)
|
if(rxFrameHead == rxFrameTail)
|
||||||
rxFrameBufferFull = true;
|
rxFrameBufferFull = true;
|
||||||
|
__enable_irq();
|
||||||
|
|
||||||
for(uint16_t i = 0; i < rx->frameIdx; i++)
|
for(uint16_t i = 0; i < rx->frameIdx; i++)
|
||||||
{
|
{
|
||||||
|
@ -369,8 +373,10 @@ uint8_t Ax25GetTxBit(void)
|
||||||
if(txStage == TX_STAGE_DATA) //transmitting normal data
|
if(txStage == TX_STAGE_DATA) //transmitting normal data
|
||||||
{
|
{
|
||||||
transmitNormalData:
|
transmitNormalData:
|
||||||
|
__disable_irq();
|
||||||
if((txFrameHead != txFrameTail) || txFrameBufferFull)
|
if((txFrameHead != txFrameTail) || txFrameBufferFull)
|
||||||
{
|
{
|
||||||
|
__enable_irq();
|
||||||
if(txByteIdx < txFrame[txFrameTail].size) //send buffer
|
if(txByteIdx < txFrame[txFrameTail].size) //send buffer
|
||||||
{
|
{
|
||||||
txByte = txBuffer[(txFrame[txFrameTail].start + txByteIdx) % FRAME_BUFFER_SIZE];
|
txByte = txBuffer[(txFrame[txFrameTail].start + txByteIdx) % FRAME_BUFFER_SIZE];
|
||||||
|
@ -384,6 +390,7 @@ transmitNormalData:
|
||||||
}
|
}
|
||||||
else //no more frames
|
else //no more frames
|
||||||
{
|
{
|
||||||
|
__enable_irq();
|
||||||
txByteIdx = 0;
|
txByteIdx = 0;
|
||||||
txBitIdx = 0;
|
txBitIdx = 0;
|
||||||
txStage = TX_STAGE_TAIL;
|
txStage = TX_STAGE_TAIL;
|
||||||
|
@ -417,9 +424,11 @@ transmitNormalData:
|
||||||
txFlagsElapsed = 0;
|
txFlagsElapsed = 0;
|
||||||
txByteIdx = 0;
|
txByteIdx = 0;
|
||||||
txStage = TX_STAGE_DATA; //return to normal data transmission stage. There might be a next frame to transmit
|
txStage = TX_STAGE_DATA; //return to normal data transmission stage. There might be a next frame to transmit
|
||||||
|
__disable_irq();
|
||||||
txFrameBufferFull = false;
|
txFrameBufferFull = false;
|
||||||
txFrameTail++;
|
txFrameTail++;
|
||||||
txFrameTail %= FRAME_MAX_COUNT;
|
txFrameTail %= FRAME_MAX_COUNT;
|
||||||
|
__enable_irq();
|
||||||
goto transmitNormalData;
|
goto transmitNormalData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue