void RingBufferPut(tRingBuffer *rb, unsigned char c, int block) { if (block) { while (RingBufferFillLevel(rb) + 1 == RingBufferSize(rb)) { // wait } } else { if (RingBufferFillLevel(rb) + 1 == RingBufferSize(rb)) { rb->Overrun++; return; } } rb->Buffer[rb->Write] = c; if (rb->Write + 1 == RingBufferSize(rb)) { rb->Write = 0; } else { rb->Write++; } if (rb->CallBack) { rb->CallBack(); } }
void RingBufferPutBlock(tRingBuffer *rb, unsigned char *data, int dataLen, int block) { if (block) { while (RingBufferFillLevel(rb) + dataLen >= RingBufferSize(rb)) { // wait } } else { if (RingBufferFillLevel(rb) + dataLen >= RingBufferSize(rb)) { rb->Overrun += dataLen; if (rb->CallBack) { rb->CallBack(); } return; } } int free1 = RingBufferSize(rb) - rb->Write; if (dataLen <= free1) { memcpy(rb->Buffer + rb->Write, data, dataLen); if (rb->Write + dataLen == RingBufferSize(rb)) { rb->Write = 0; } else { rb->Write += dataLen; } } else { memcpy(rb->Buffer + rb->Write, data, free1); int len2 = dataLen - free1; memcpy(rb->Buffer, data + free1, len2); rb->Write = len2; } if (rb->CallBack) { rb->CallBack(); } }
void USART_Flush(void) { while (RingBufferFillLevel(&RingBufferUART4TX) != 0) ; }
int USART_Available(void) { return RingBufferFillLevel(&RingBufferUART4RX); }