fota lib for mdot

Dependents:   UQ_LoraWAN

Committer:
Jenkins@KEILDM1.dc.multitech.prv
Date:
Fri Sep 14 15:39:09 2018 -0500
Revision:
3:63d10f2375ea
fota lib updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 1 #ifndef MTSCIRCULARBUFFER_H
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 2 #define MTSCIRCULARBUFFER_H
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 3
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 4 #include <Callback.h>
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 5
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 6 #include "Utils.h"
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 7
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 8 namespace mts
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 9 {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 10
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 11 /** This class provides a circular byte buffer meant for temporary storage
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 12 * during IO transactions. It contains many of the common methods you
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 13 * would expect from a circular buffer like read, write, and various
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 14 * methods for checking the size or status. It should be noted that
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 15 * this class does not include any special code for thread safety like
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 16 * a lock. In most cases this is not problematic, but is something
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 17 * to be aware of.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 18 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 19 class MTSCircularBuffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 20 {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 21 public:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 22 /** Creates an MTSCircularBuffer object with the specified static size.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 23 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 24 * @prarm bufferSize size of the buffer in bytes.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 25 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 26 MTSCircularBuffer(int bufferSize);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 27
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 28 /** Destructs an MTSCircularBuffer object and frees all related resources.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 29 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 30 ~MTSCircularBuffer();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 31
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 32 /** This method enables bulk reads from the buffer. If more data is
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 33 * requested then available it simply returns all remaining data within the
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 34 * buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 35 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 36 * @param data the buffer where data read will be added to.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 37 * @param length the amount of data in bytes to be read into the buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 38 * @returns the total number of bytes that were read.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 39 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 40 int read(char* data, int length);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 41
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 42 /** This method reads a single byte from the buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 43 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 44 * @param data char where the read byte will be stored.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 45 * @returns 1 if byte is read or 0 if no bytes available.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 46 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 47 int read(char& data);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 48
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 49 /** This method enables bulk writes to the buffer. If more data
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 50 * is requested to be written then space available the method writes
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 51 * as much data as possible and returns the actual amount written.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 52 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 53 * @param data the byte array to be written.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 54 * @param length the length of data to be written from the data paramter.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 55 * @returns the number of bytes written to the buffer, which is 0 if
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 56 * the buffer is full.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 57 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 58 int write(const char* data, int length);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 59
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 60 /** This method writes a signle byte as a char to the buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 61 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 62 * @param data the byte to be written as a char.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 63 * @returns 1 if the byte was written or 0 if the buffer was full.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 64 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 65 int write(char data);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 66
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 67 /** This method is used to setup a callback funtion when the buffer reaches
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 68 * a certain threshold. The threshold condition is checked after every read
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 69 * and write call is completed. The condition is made up of both a threshold
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 70 * value and operator. An example that would trigger a callback is if the
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 71 * threshold was 10, the operator GREATER, and there were 12 bytes added to an
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 72 * empty buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 73 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 74 * @param tptr a pointer to the object to be called when the condition is met.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 75 * @param mptr a pointer to the function within the object to be called when
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 76 * the condition is met.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 77 * @param threshold the value in bytes to be used as part of the condition.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 78 * @param op the operator to be used in conjunction with the threshold
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 79 * as part of the condition.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 80 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 81 template<typename T>
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 82 void attach(T *tptr, void( T::*mptr)(void), int threshold, RelationalOperator op) {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 83 _threshold = threshold;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 84 _op = op;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 85 notify.attach(tptr, mptr);
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 86 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 87
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 88 /** This method is used to setup a callback funtion when the buffer reaches
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 89 * a certain threshold. The threshold condition is checked after every read
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 90 * and write call is completed. The condition is made up of both a threshold
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 91 * value and operator. An example that would trigger a callback is if the
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 92 * threshold was 10, the operator GREATER, and there were 12 bytes added to an
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 93 * empty buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 94 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 95 * @param fptr a pointer to the static function to be called when the condition
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 96 * is met.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 97 * @param threshold the value in bytes to be used as part of the condition.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 98 * @param op the operator to be used in conjunction with the threshold
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 99 * as part of the condition.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 100 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 101 void attach(void(*fptr)(void), int threshold, RelationalOperator op) {
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 102 _threshold = threshold;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 103 _op = op;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 104 notify = fptr;
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 105 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 106
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 107 /** This method returns the size of the storage space currently allocated for
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 108 * the buffer. This value is equivalent to the one passed into the constructor.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 109 * This value is equal or greater than the size() of the buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 110 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 111 * @returns the allocated size of the buffer in bytes.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 112 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 113 int capacity();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 114
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 115 /** This method returns the amount of space left for writing.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 116 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 117 * @returns numbers of unused bytes in buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 118 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 119 int remaining();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 120
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 121 /** This method returns the number of bytes available for reading.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 122 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 123 * @returns number of bytes currently in buffer.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 124 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 125 int size();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 126
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 127 /** This method returns whether the buffer is full.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 128 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 129 * @returns true if full, otherwise false.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 130 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 131 bool isFull();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 132
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 133 /** This method returns whether the buffer is empty.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 134 *
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 135 * @returns true if empty, otherwise false.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 136 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 137 bool isEmpty();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 138
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 139 /** This method clears the buffer. This is done through
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 140 * setting the internal read and write indexes to the same
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 141 * value and is therefore not an expensive operation.
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 142 */
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 143 void clear();
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 144
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 145
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 146 private:
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 147 int bufferSize; // total size of the buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 148 char* buffer; // internal byte buffer as a character buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 149 int readIndex; // read index for circular buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 150 int writeIndex; // write index for circular buffer
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 151 int bytes; // available data
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 152 Callback<void()> notify; // Internal callback notification
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 153 int _threshold; // threshold for the notification
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 154 RelationalOperator _op; // operator that determines the direction of the threshold
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 155 void checkThreshold(); // private function that checks thresholds and processes notifications
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 156 };
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 157
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 158 }
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 159
Jenkins@KEILDM1.dc.multitech.prv 3:63d10f2375ea 160 #endif /* MTSCIRCULARBUFFER_H */