A class that converts byte streams into MIDI messages, and stores them in a FIFO. This is useful if you wish to read MIDI messages via polling instead of interrupts. The class supports every type of MIDI message, and System Realtime messages can be interleaved with regular ones.

Committer:
Padman
Date:
Thu Aug 04 12:15:36 2016 +0000
Revision:
2:cbd43ba7f842
Parent:
0:69cbdcd5d770
Further API documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Padman 0:69cbdcd5d770 1
Padman 0:69cbdcd5d770 2 /**
Padman 0:69cbdcd5d770 3 * @file Buffer.h
Padman 0:69cbdcd5d770 4 * @brief Software Buffer - Templated Ring Buffer for most data types
Padman 0:69cbdcd5d770 5 * @author sam grove
Padman 0:69cbdcd5d770 6 * @version 1.0
Padman 0:69cbdcd5d770 7 * @see
Padman 0:69cbdcd5d770 8 *
Padman 0:69cbdcd5d770 9 * Copyright (c) 2013
Padman 0:69cbdcd5d770 10 *
Padman 0:69cbdcd5d770 11 * Licensed under the Apache License, Version 2.0 (the "License");
Padman 0:69cbdcd5d770 12 * you may not use this file except in compliance with the License.
Padman 0:69cbdcd5d770 13 * You may obtain a copy of the License at
Padman 0:69cbdcd5d770 14 *
Padman 0:69cbdcd5d770 15 * http://www.apache.org/licenses/LICENSE-2.0
Padman 0:69cbdcd5d770 16 *
Padman 0:69cbdcd5d770 17 * Unless required by applicable law or agreed to in writing, software
Padman 0:69cbdcd5d770 18 * distributed under the License is distributed on an "AS IS" BASIS,
Padman 0:69cbdcd5d770 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Padman 0:69cbdcd5d770 20 * See the License for the specific language governing permissions and
Padman 0:69cbdcd5d770 21 * limitations under the License.
Padman 0:69cbdcd5d770 22 */
Padman 0:69cbdcd5d770 23
Padman 0:69cbdcd5d770 24 #ifndef MYBUFFER_H
Padman 0:69cbdcd5d770 25 #define MYBUFFER_H
Padman 0:69cbdcd5d770 26
Padman 0:69cbdcd5d770 27 #include <stdint.h>
Padman 0:69cbdcd5d770 28 #include <string.h>
Padman 0:69cbdcd5d770 29
Padman 0:69cbdcd5d770 30 /** A templated software ring buffer
Padman 0:69cbdcd5d770 31 *
Padman 0:69cbdcd5d770 32 * Example:
Padman 0:69cbdcd5d770 33 * @code
Padman 0:69cbdcd5d770 34 * #include "mbed.h"
Padman 0:69cbdcd5d770 35 * #include "MyBuffer.h"
Padman 0:69cbdcd5d770 36 *
Padman 0:69cbdcd5d770 37 * MyBuffer <char> buf;
Padman 0:69cbdcd5d770 38 *
Padman 0:69cbdcd5d770 39 * int main()
Padman 0:69cbdcd5d770 40 * {
Padman 0:69cbdcd5d770 41 * buf = 'a';
Padman 0:69cbdcd5d770 42 * buf.put('b');
Padman 0:69cbdcd5d770 43 * char *head = buf.head();
Padman 0:69cbdcd5d770 44 * puts(head);
Padman 0:69cbdcd5d770 45 *
Padman 0:69cbdcd5d770 46 * char whats_in_there[2] = {0};
Padman 0:69cbdcd5d770 47 * int pos = 0;
Padman 0:69cbdcd5d770 48 *
Padman 0:69cbdcd5d770 49 * while(buf.available())
Padman 0:69cbdcd5d770 50 * {
Padman 0:69cbdcd5d770 51 * whats_in_there[pos++] = buf;
Padman 0:69cbdcd5d770 52 * }
Padman 0:69cbdcd5d770 53 * printf("%c %c\n", whats_in_there[0], whats_in_there[1]);
Padman 0:69cbdcd5d770 54 * buf.clear();
Padman 0:69cbdcd5d770 55 * error("done\n\n\n");
Padman 0:69cbdcd5d770 56 * }
Padman 0:69cbdcd5d770 57 * @endcode
Padman 0:69cbdcd5d770 58 */
Padman 0:69cbdcd5d770 59
Padman 0:69cbdcd5d770 60 template <typename T>
Padman 0:69cbdcd5d770 61 class MyBuffer
Padman 0:69cbdcd5d770 62 {
Padman 0:69cbdcd5d770 63 private:
Padman 0:69cbdcd5d770 64 T *_buf;
Padman 0:69cbdcd5d770 65 volatile uint32_t _wloc;
Padman 0:69cbdcd5d770 66 volatile uint32_t _rloc;
Padman 0:69cbdcd5d770 67 uint32_t _size;
Padman 0:69cbdcd5d770 68
Padman 0:69cbdcd5d770 69 public:
Padman 0:69cbdcd5d770 70 /** Create a Buffer and allocate memory for it
Padman 0:69cbdcd5d770 71 * @param size The size of the buffer
Padman 0:69cbdcd5d770 72 */
Padman 0:69cbdcd5d770 73 MyBuffer(uint32_t size = 0x100);
Padman 0:69cbdcd5d770 74
Padman 0:69cbdcd5d770 75 /** Get the size of the ring buffer
Padman 0:69cbdcd5d770 76 * @return the size of the ring buffer
Padman 0:69cbdcd5d770 77 */
Padman 0:69cbdcd5d770 78 uint32_t getSize();
Padman 0:69cbdcd5d770 79
Padman 0:69cbdcd5d770 80 /** Destry a Buffer and release it's allocated memory
Padman 0:69cbdcd5d770 81 */
Padman 0:69cbdcd5d770 82 ~MyBuffer();
Padman 0:69cbdcd5d770 83
Padman 0:69cbdcd5d770 84 /** Add a data element into the buffer
Padman 0:69cbdcd5d770 85 * @param data Something to add to the buffer
Padman 0:69cbdcd5d770 86 */
Padman 0:69cbdcd5d770 87 void put(T data);
Padman 0:69cbdcd5d770 88
Padman 0:69cbdcd5d770 89 /** Remove a data element from the buffer
Padman 0:69cbdcd5d770 90 * @return Pull the oldest element from the buffer
Padman 0:69cbdcd5d770 91 */
Padman 0:69cbdcd5d770 92 T get(void);
Padman 0:69cbdcd5d770 93
Padman 0:69cbdcd5d770 94 /** Get the address to the head of the buffer
Padman 0:69cbdcd5d770 95 * @return The address of element 0 in the buffer
Padman 0:69cbdcd5d770 96 */
Padman 0:69cbdcd5d770 97 T *head(void);
Padman 0:69cbdcd5d770 98
Padman 0:69cbdcd5d770 99 /** Reset the buffer to 0. Useful if using head() to parse packeted data
Padman 0:69cbdcd5d770 100 */
Padman 0:69cbdcd5d770 101 void clear(void);
Padman 0:69cbdcd5d770 102
Padman 0:69cbdcd5d770 103 /** Determine if anything is readable in the buffer
Padman 0:69cbdcd5d770 104 * @return 1 if something can be read, 0 otherwise
Padman 0:69cbdcd5d770 105 */
Padman 0:69cbdcd5d770 106 uint32_t available(void);
Padman 0:69cbdcd5d770 107
Padman 0:69cbdcd5d770 108 uint32_t size();
Padman 0:69cbdcd5d770 109
Padman 0:69cbdcd5d770 110 /** Overloaded operator for writing to the buffer
Padman 0:69cbdcd5d770 111 * @param data Something to put in the buffer
Padman 0:69cbdcd5d770 112 * @return
Padman 0:69cbdcd5d770 113 */
Padman 0:69cbdcd5d770 114 MyBuffer &operator= (T data)
Padman 0:69cbdcd5d770 115 {
Padman 0:69cbdcd5d770 116 put(data);
Padman 0:69cbdcd5d770 117 return *this;
Padman 0:69cbdcd5d770 118 }
Padman 0:69cbdcd5d770 119
Padman 0:69cbdcd5d770 120 /** Overloaded operator for reading from the buffer
Padman 0:69cbdcd5d770 121 * @return Pull the oldest element from the buffer
Padman 0:69cbdcd5d770 122 */
Padman 0:69cbdcd5d770 123 operator int(void)
Padman 0:69cbdcd5d770 124 {
Padman 0:69cbdcd5d770 125 return get();
Padman 0:69cbdcd5d770 126 }
Padman 0:69cbdcd5d770 127
Padman 0:69cbdcd5d770 128 uint32_t peek(char c);
Padman 0:69cbdcd5d770 129
Padman 0:69cbdcd5d770 130 };
Padman 0:69cbdcd5d770 131
Padman 0:69cbdcd5d770 132 template <class T>
Padman 0:69cbdcd5d770 133 inline void MyBuffer<T>::put(T data)
Padman 0:69cbdcd5d770 134 {
Padman 0:69cbdcd5d770 135 _buf[_wloc++] = data;
Padman 0:69cbdcd5d770 136 _wloc %= (_size-1);
Padman 0:69cbdcd5d770 137
Padman 0:69cbdcd5d770 138 return;
Padman 0:69cbdcd5d770 139 }
Padman 0:69cbdcd5d770 140
Padman 0:69cbdcd5d770 141 template <class T>
Padman 0:69cbdcd5d770 142 inline T MyBuffer<T>::get(void)
Padman 0:69cbdcd5d770 143 {
Padman 0:69cbdcd5d770 144 T data_pos = _buf[_rloc++];
Padman 0:69cbdcd5d770 145 _rloc %= (_size-1);
Padman 0:69cbdcd5d770 146
Padman 0:69cbdcd5d770 147 return data_pos;
Padman 0:69cbdcd5d770 148 }
Padman 0:69cbdcd5d770 149
Padman 0:69cbdcd5d770 150 template <class T>
Padman 0:69cbdcd5d770 151 inline T *MyBuffer<T>::head(void)
Padman 0:69cbdcd5d770 152 {
Padman 0:69cbdcd5d770 153 T *data_pos = &_buf[0];
Padman 0:69cbdcd5d770 154
Padman 0:69cbdcd5d770 155 return data_pos;
Padman 0:69cbdcd5d770 156 }
Padman 0:69cbdcd5d770 157
Padman 0:69cbdcd5d770 158 template <class T>
Padman 0:69cbdcd5d770 159 inline uint32_t MyBuffer<T>::available(void)
Padman 0:69cbdcd5d770 160 {
Padman 0:69cbdcd5d770 161 return (_wloc == _rloc) ? 0 : 1;
Padman 0:69cbdcd5d770 162 }
Padman 0:69cbdcd5d770 163
Padman 0:69cbdcd5d770 164 template <class T>
Padman 0:69cbdcd5d770 165 inline uint32_t MyBuffer<T>::size(void)
Padman 0:69cbdcd5d770 166 {
Padman 0:69cbdcd5d770 167 return _wloc - _rloc;
Padman 0:69cbdcd5d770 168 }
Padman 0:69cbdcd5d770 169
Padman 0:69cbdcd5d770 170 #endif
Padman 0:69cbdcd5d770 171