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

Committer:
Joseph Radford
Date:
Sun Apr 10 15:47:33 2016 +1000
Revision:
0:2df78a4443cd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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