Simple ring buffer
nine_ring/nine_ring.cpp@0:c050eb7b0c10, 2015-07-13 (annotated)
- 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?
User | Revision | Line number | New 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 |