A simple WIP that logs data from a Grove sensor, and can send and receive information over USB and SMS.
Dependencies: DHT DS_1337 SDFileSystem USBDevice mbed
circbuff.cpp@0:2df78a4443cd, 2016-04-10 (annotated)
- Committer:
- Joseph Radford
- Date:
- Sun Apr 10 15:47:33 2016 +1000
- Revision:
- 0:2df78a4443cd
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Joseph Radford |
0:2df78a4443cd | 1 | #include "circbuff.h" |
Joseph Radford |
0:2df78a4443cd | 2 | |
Joseph Radford |
0:2df78a4443cd | 3 | CircBuff::CircBuff(uint16_t buffSize) |
Joseph Radford |
0:2df78a4443cd | 4 | { |
Joseph Radford |
0:2df78a4443cd | 5 | // set up the buffer with parsed size |
Joseph Radford |
0:2df78a4443cd | 6 | m_buffSize = buffSize; |
Joseph Radford |
0:2df78a4443cd | 7 | m_buf = new unsigned char [m_buffSize]; |
Joseph Radford |
0:2df78a4443cd | 8 | for (int i = 0; i < m_buffSize; i++) { |
Joseph Radford |
0:2df78a4443cd | 9 | m_buf[i] = 0; |
Joseph Radford |
0:2df78a4443cd | 10 | } |
Joseph Radford |
0:2df78a4443cd | 11 | |
Joseph Radford |
0:2df78a4443cd | 12 | // init indexes |
Joseph Radford |
0:2df78a4443cd | 13 | m_start = 0; |
Joseph Radford |
0:2df78a4443cd | 14 | m_end = 0; |
Joseph Radford |
0:2df78a4443cd | 15 | } |
Joseph Radford |
0:2df78a4443cd | 16 | |
Joseph Radford |
0:2df78a4443cd | 17 | CircBuff::~CircBuff() |
Joseph Radford |
0:2df78a4443cd | 18 | { |
Joseph Radford |
0:2df78a4443cd | 19 | delete m_buf; |
Joseph Radford |
0:2df78a4443cd | 20 | } |
Joseph Radford |
0:2df78a4443cd | 21 | |
Joseph Radford |
0:2df78a4443cd | 22 | void CircBuff::putc(unsigned char c) |
Joseph Radford |
0:2df78a4443cd | 23 | { |
Joseph Radford |
0:2df78a4443cd | 24 | // get the remaining space left in the buffer by checking end and start idx |
Joseph Radford |
0:2df78a4443cd | 25 | uint16_t remSize = remainingSize(); |
Joseph Radford |
0:2df78a4443cd | 26 | |
Joseph Radford |
0:2df78a4443cd | 27 | // check we have enough room for the new array passed in |
Joseph Radford |
0:2df78a4443cd | 28 | if (remSize == 0) { |
Joseph Radford |
0:2df78a4443cd | 29 | return; |
Joseph Radford |
0:2df78a4443cd | 30 | } |
Joseph Radford |
0:2df78a4443cd | 31 | |
Joseph Radford |
0:2df78a4443cd | 32 | // else copy the byte in |
Joseph Radford |
0:2df78a4443cd | 33 | m_buf[m_end++] = c; |
Joseph Radford |
0:2df78a4443cd | 34 | if (m_end == m_buffSize) { |
Joseph Radford |
0:2df78a4443cd | 35 | m_end = 0; // wrap around |
Joseph Radford |
0:2df78a4443cd | 36 | } |
Joseph Radford |
0:2df78a4443cd | 37 | |
Joseph Radford |
0:2df78a4443cd | 38 | } |
Joseph Radford |
0:2df78a4443cd | 39 | |
Joseph Radford |
0:2df78a4443cd | 40 | void CircBuff::add(unsigned char *s) |
Joseph Radford |
0:2df78a4443cd | 41 | { |
Joseph Radford |
0:2df78a4443cd | 42 | // check if can write? How to check if we have connected. |
Joseph Radford |
0:2df78a4443cd | 43 | uint16_t sSize = 0, i = 0, j = 0; |
Joseph Radford |
0:2df78a4443cd | 44 | |
Joseph Radford |
0:2df78a4443cd | 45 | // get the length of the passed array (it should be null terminated, but include max buffer size for caution) |
Joseph Radford |
0:2df78a4443cd | 46 | for (sSize = 0; (sSize < m_buffSize) && (s[sSize] != 0); sSize++); |
Joseph Radford |
0:2df78a4443cd | 47 | |
Joseph Radford |
0:2df78a4443cd | 48 | // get the remaining space left in the buffer by checking end and start idx |
Joseph Radford |
0:2df78a4443cd | 49 | uint16_t remSize = remainingSize(); |
Joseph Radford |
0:2df78a4443cd | 50 | |
Joseph Radford |
0:2df78a4443cd | 51 | // check we have enough room for the new array passed in |
Joseph Radford |
0:2df78a4443cd | 52 | if (sSize > remSize) { |
Joseph Radford |
0:2df78a4443cd | 53 | return; |
Joseph Radford |
0:2df78a4443cd | 54 | } |
Joseph Radford |
0:2df78a4443cd | 55 | |
Joseph Radford |
0:2df78a4443cd | 56 | // copy the array in |
Joseph Radford |
0:2df78a4443cd | 57 | for (i = 0; i < sSize; i++) { |
Joseph Radford |
0:2df78a4443cd | 58 | m_buf[m_end++] = s[i]; |
Joseph Radford |
0:2df78a4443cd | 59 | if (m_end == m_buffSize) { |
Joseph Radford |
0:2df78a4443cd | 60 | m_end = 0; // wrap around |
Joseph Radford |
0:2df78a4443cd | 61 | } |
Joseph Radford |
0:2df78a4443cd | 62 | } |
Joseph Radford |
0:2df78a4443cd | 63 | } |
Joseph Radford |
0:2df78a4443cd | 64 | |
Joseph Radford |
0:2df78a4443cd | 65 | uint16_t CircBuff::remainingSize() |
Joseph Radford |
0:2df78a4443cd | 66 | { |
Joseph Radford |
0:2df78a4443cd | 67 | // get the remaining space left in the buffer by checking end and start idx |
Joseph Radford |
0:2df78a4443cd | 68 | uint16_t retval = 0; |
Joseph Radford |
0:2df78a4443cd | 69 | if (m_start == m_end) { |
Joseph Radford |
0:2df78a4443cd | 70 | retval = m_buffSize; |
Joseph Radford |
0:2df78a4443cd | 71 | } |
Joseph Radford |
0:2df78a4443cd | 72 | else if (m_start < m_end) { |
Joseph Radford |
0:2df78a4443cd | 73 | // the distance between the start and end point |
Joseph Radford |
0:2df78a4443cd | 74 | // subtract that from the total length of the buffer |
Joseph Radford |
0:2df78a4443cd | 75 | retval = m_buffSize - (m_end - m_start); |
Joseph Radford |
0:2df78a4443cd | 76 | } |
Joseph Radford |
0:2df78a4443cd | 77 | else { |
Joseph Radford |
0:2df78a4443cd | 78 | // the amount of space left is whatever is between the end point and the start point |
Joseph Radford |
0:2df78a4443cd | 79 | retval = m_start - m_end; |
Joseph Radford |
0:2df78a4443cd | 80 | } |
Joseph Radford |
0:2df78a4443cd | 81 | return retval; |
Joseph Radford |
0:2df78a4443cd | 82 | } |
Joseph Radford |
0:2df78a4443cd | 83 | |
Joseph Radford |
0:2df78a4443cd | 84 | uint16_t CircBuff::read(unsigned char *s, uint16_t len) |
Joseph Radford |
0:2df78a4443cd | 85 | { |
Joseph Radford |
0:2df78a4443cd | 86 | if (m_start == m_end) { |
Joseph Radford |
0:2df78a4443cd | 87 | return 0; // there is nothing stored in the circular buffer |
Joseph Radford |
0:2df78a4443cd | 88 | } |
Joseph Radford |
0:2df78a4443cd | 89 | |
Joseph Radford |
0:2df78a4443cd | 90 | // start copying the desired amount over |
Joseph Radford |
0:2df78a4443cd | 91 | for (int i = 0; i < len; i++) { |
Joseph Radford |
0:2df78a4443cd | 92 | s[i] = m_buf[m_start++]; |
Joseph Radford |
0:2df78a4443cd | 93 | |
Joseph Radford |
0:2df78a4443cd | 94 | if (m_start == m_buffSize) { |
Joseph Radford |
0:2df78a4443cd | 95 | m_start = 0; // wrap start pointer |
Joseph Radford |
0:2df78a4443cd | 96 | } |
Joseph Radford |
0:2df78a4443cd | 97 | |
Joseph Radford |
0:2df78a4443cd | 98 | if (m_start == m_end) { |
Joseph Radford |
0:2df78a4443cd | 99 | s[++i] = 0; |
Joseph Radford |
0:2df78a4443cd | 100 | return (i); // we have reached the end of the buffer |
Joseph Radford |
0:2df78a4443cd | 101 | } |
Joseph Radford |
0:2df78a4443cd | 102 | } |
Joseph Radford |
0:2df78a4443cd | 103 | return len; |
Joseph Radford |
0:2df78a4443cd | 104 | } |
Joseph Radford |
0:2df78a4443cd | 105 | |
Joseph Radford |
0:2df78a4443cd | 106 |