Simple ring buffer

Committer:
jont
Date:
Mon Jul 13 07:54:11 2015 +0000
Revision:
0:c050eb7b0c10
First pre-release version without documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jont 0:c050eb7b0c10 1 #include "mbed.h"
jont 0:c050eb7b0c10 2 #include "nine_ring.h"
jont 0:c050eb7b0c10 3 /*
jont 0:c050eb7b0c10 4 J.J.Trinder, based on original code for midi projects 199X
jont 0:c050eb7b0c10 5 updateded sometime to the MBED
jont 0:c050eb7b0c10 6
jont 0:c050eb7b0c10 7 Yeh its atad klunky, it works and is useful to explain things to people...
jont 0:c050eb7b0c10 8 */
jont 0:c050eb7b0c10 9 #define _PC
jont 0:c050eb7b0c10 10 NRing::NRing()
jont 0:c050eb7b0c10 11 {
jont 0:c050eb7b0c10 12 ring_init();
jont 0:c050eb7b0c10 13 }
jont 0:c050eb7b0c10 14
jont 0:c050eb7b0c10 15
jont 0:c050eb7b0c10 16
jont 0:c050eb7b0c10 17 /*======================================================================*/
jont 0:c050eb7b0c10 18 /* implementation of Ringbuffer */
jont 0:c050eb7b0c10 19 /*======================================================================*/
jont 0:c050eb7b0c10 20 /** Init the indexes
jont 0:c050eb7b0c10 21
jont 0:c050eb7b0c10 22 */
jont 0:c050eb7b0c10 23 void NRing::ring_init(void)
jont 0:c050eb7b0c10 24 {
jont 0:c050eb7b0c10 25 inIndex = 0;
jont 0:c050eb7b0c10 26 inCount = 0;
jont 0:c050eb7b0c10 27 }
jont 0:c050eb7b0c10 28
jont 0:c050eb7b0c10 29 /*======================================================================*/
jont 0:c050eb7b0c10 30 /* RingWriteToBuffer */
jont 0:c050eb7b0c10 31 /*======================================================================*/
jont 0:c050eb7b0c10 32 /**
jont 0:c050eb7b0c10 33 Write value (long) into the ring buffer
jont 0:c050eb7b0c10 34 @param <n> A long value to store in the ring buffer
jont 0:c050eb7b0c10 35 */
jont 0:c050eb7b0c10 36 //add critical section ie disable interrupts while fiddling with buffers
jont 0:c050eb7b0c10 37 int NRing::RingWriteToBuffer(long n)
jont 0:c050eb7b0c10 38 {
jont 0:c050eb7b0c10 39 // printf("WriteInBuffer%d",inCount);
jont 0:c050eb7b0c10 40 __disable_irq(); // Disable Interrupts
jont 0:c050eb7b0c10 41
jont 0:c050eb7b0c10 42 // do something that can't be interrupted
jont 0:c050eb7b0c10 43 opBuffer[inIndex] = n;
jont 0:c050eb7b0c10 44 inCount++;
jont 0:c050eb7b0c10 45 inIndex++;
jont 0:c050eb7b0c10 46 if (inIndex >= buff_size)
jont 0:c050eb7b0c10 47 inIndex = 0;
jont 0:c050eb7b0c10 48
jont 0:c050eb7b0c10 49
jont 0:c050eb7b0c10 50 __enable_irq(); // Enable Interrupts
jont 0:c050eb7b0c10 51 //printf("ZWriteInBuffer%d\n",inCount);
jont 0:c050eb7b0c10 52 return 0;
jont 0:c050eb7b0c10 53 }
jont 0:c050eb7b0c10 54
jont 0:c050eb7b0c10 55
jont 0:c050eb7b0c10 56 //todo fix this as we dont want to do this
jont 0:c050eb7b0c10 57 /*======================================================================*/
jont 0:c050eb7b0c10 58 /* return current count of stuff in buffer */
jont 0:c050eb7b0c10 59 /*======================================================================*/
jont 0:c050eb7b0c10 60 int NRing::ring_count()
jont 0:c050eb7b0c10 61 {
jont 0:c050eb7b0c10 62 // printf("InCount %d",inCount);
jont 0:c050eb7b0c10 63 return (inCount);
jont 0:c050eb7b0c10 64 }
jont 0:c050eb7b0c10 65
jont 0:c050eb7b0c10 66
jont 0:c050eb7b0c10 67 //todo fix this as we dont want to do this
jont 0:c050eb7b0c10 68 /*======================================================================*/
jont 0:c050eb7b0c10 69 /* Output whats remaining.... */
jont 0:c050eb7b0c10 70 /*======================================================================*/
jont 0:c050eb7b0c10 71 long NRing::get_next()
jont 0:c050eb7b0c10 72 {
jont 0:c050eb7b0c10 73
jont 0:c050eb7b0c10 74 long toSend;
jont 0:c050eb7b0c10 75 #ifdef _PC
jont 0:c050eb7b0c10 76 printf("\nCall in %x out %x count %x",inIndex,outIndex, inCount);
jont 0:c050eb7b0c10 77 #endif
jont 0:c050eb7b0c10 78 if (inCount == 0)
jont 0:c050eb7b0c10 79 return -1; /* nowt to send */
jont 0:c050eb7b0c10 80 __disable_irq(); // Disable Interrupts
jont 0:c050eb7b0c10 81 toSend = opBuffer[outIndex];
jont 0:c050eb7b0c10 82
jont 0:c050eb7b0c10 83 #ifdef _PC
jont 0:c050eb7b0c10 84 printf(" <%i> ",toSend);
jont 0:c050eb7b0c10 85 #endif
jont 0:c050eb7b0c10 86
jont 0:c050eb7b0c10 87 inCount--;
jont 0:c050eb7b0c10 88 outIndex++;
jont 0:c050eb7b0c10 89 if (outIndex >=buff_size)
jont 0:c050eb7b0c10 90 outIndex = 0;
jont 0:c050eb7b0c10 91 __enable_irq(); // Enable Interrupts
jont 0:c050eb7b0c10 92 return toSend;
jont 0:c050eb7b0c10 93 }
jont 0:c050eb7b0c10 94