BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gustavatmel 1:9c5af431a1f1 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
gustavatmel 1:9c5af431a1f1 2 *
gustavatmel 1:9c5af431a1f1 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gustavatmel 1:9c5af431a1f1 4 * and associated documentation files (the "Software"), to deal in the Software without
gustavatmel 1:9c5af431a1f1 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
gustavatmel 1:9c5af431a1f1 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
gustavatmel 1:9c5af431a1f1 7 * Software is furnished to do so, subject to the following conditions:
gustavatmel 1:9c5af431a1f1 8 *
gustavatmel 1:9c5af431a1f1 9 * The above copyright notice and this permission notice shall be included in all copies or
gustavatmel 1:9c5af431a1f1 10 * substantial portions of the Software.
gustavatmel 1:9c5af431a1f1 11 *
gustavatmel 1:9c5af431a1f1 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gustavatmel 1:9c5af431a1f1 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gustavatmel 1:9c5af431a1f1 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gustavatmel 1:9c5af431a1f1 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gustavatmel 1:9c5af431a1f1 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gustavatmel 1:9c5af431a1f1 17 */
gustavatmel 1:9c5af431a1f1 18
gustavatmel 1:9c5af431a1f1 19 #ifndef USBAudio_H
gustavatmel 1:9c5af431a1f1 20 #define USBAudio_H
gustavatmel 1:9c5af431a1f1 21
gustavatmel 1:9c5af431a1f1 22 /* These headers are included for child class. */
gustavatmel 1:9c5af431a1f1 23 #include "USBEndpoints.h"
gustavatmel 1:9c5af431a1f1 24 #include "USBDescriptor.h"
gustavatmel 1:9c5af431a1f1 25 #include "USBDevice_Types.h"
gustavatmel 1:9c5af431a1f1 26
gustavatmel 1:9c5af431a1f1 27 #include "USBDevice.h"
gustavatmel 1:9c5af431a1f1 28 #include "Callback.h"
gustavatmel 1:9c5af431a1f1 29
gustavatmel 1:9c5af431a1f1 30 /**
gustavatmel 1:9c5af431a1f1 31 * USBAudio example
gustavatmel 1:9c5af431a1f1 32 *
gustavatmel 1:9c5af431a1f1 33 * @code
gustavatmel 1:9c5af431a1f1 34 * #include "mbed.h"
gustavatmel 1:9c5af431a1f1 35 * #include "USBAudio.h"
gustavatmel 1:9c5af431a1f1 36 *
gustavatmel 1:9c5af431a1f1 37 * Serial pc(USBTX, USBRX);
gustavatmel 1:9c5af431a1f1 38 *
gustavatmel 1:9c5af431a1f1 39 * // frequency: 48 kHz
gustavatmel 1:9c5af431a1f1 40 * #define FREQ 48000
gustavatmel 1:9c5af431a1f1 41 *
gustavatmel 1:9c5af431a1f1 42 * // 1 channel: mono
gustavatmel 1:9c5af431a1f1 43 * #define NB_CHA 1
gustavatmel 1:9c5af431a1f1 44 *
gustavatmel 1:9c5af431a1f1 45 * // length of an audio packet: each ms, we receive 48 * 16bits ->48 * 2 bytes. as there is one channel, the length will be 48 * 2 * 1
gustavatmel 1:9c5af431a1f1 46 * #define AUDIO_LENGTH_PACKET 48 * 2 * 1
gustavatmel 1:9c5af431a1f1 47 *
gustavatmel 1:9c5af431a1f1 48 * // USBAudio
gustavatmel 1:9c5af431a1f1 49 * USBAudio audio(FREQ, NB_CHA);
gustavatmel 1:9c5af431a1f1 50 *
gustavatmel 1:9c5af431a1f1 51 * int main() {
gustavatmel 1:9c5af431a1f1 52 * int16_t buf[AUDIO_LENGTH_PACKET/2];
gustavatmel 1:9c5af431a1f1 53 *
gustavatmel 1:9c5af431a1f1 54 * while (1) {
gustavatmel 1:9c5af431a1f1 55 * // read an audio packet
gustavatmel 1:9c5af431a1f1 56 * audio.read((uint8_t *)buf);
gustavatmel 1:9c5af431a1f1 57 *
gustavatmel 1:9c5af431a1f1 58 *
gustavatmel 1:9c5af431a1f1 59 * // print packet received
gustavatmel 1:9c5af431a1f1 60 * pc.printf("recv: ");
gustavatmel 1:9c5af431a1f1 61 * for(int i = 0; i < AUDIO_LENGTH_PACKET/2; i++) {
gustavatmel 1:9c5af431a1f1 62 * pc.printf("%d ", buf[i]);
gustavatmel 1:9c5af431a1f1 63 * }
gustavatmel 1:9c5af431a1f1 64 * pc.printf("\r\n");
gustavatmel 1:9c5af431a1f1 65 * }
gustavatmel 1:9c5af431a1f1 66 * }
gustavatmel 1:9c5af431a1f1 67 * @endcode
gustavatmel 1:9c5af431a1f1 68 */
gustavatmel 1:9c5af431a1f1 69 class USBAudio: public USBDevice {
gustavatmel 1:9c5af431a1f1 70 public:
gustavatmel 1:9c5af431a1f1 71
gustavatmel 1:9c5af431a1f1 72 /**
gustavatmel 1:9c5af431a1f1 73 * Constructor
gustavatmel 1:9c5af431a1f1 74 *
gustavatmel 1:9c5af431a1f1 75 * @param frequency_in frequency in Hz (default: 48000)
gustavatmel 1:9c5af431a1f1 76 * @param channel_nb_in channel number (1 or 2) (default: 1)
gustavatmel 1:9c5af431a1f1 77 * @param frequency_out frequency in Hz (default: 8000)
gustavatmel 1:9c5af431a1f1 78 * @param channel_nb_out_in channel number (1 or 2) (default: 1)
gustavatmel 1:9c5af431a1f1 79 * @param vendor_id Your vendor_id
gustavatmel 1:9c5af431a1f1 80 * @param product_id Your product_id
gustavatmel 1:9c5af431a1f1 81 * @param product_release Your preoduct_release
gustavatmel 1:9c5af431a1f1 82 */
gustavatmel 1:9c5af431a1f1 83 USBAudio(uint32_t frequency_in = 48000, uint8_t channel_nb_in = 1, uint32_t frequency_out = 8000, uint8_t channel_nb_out = 1, uint16_t vendor_id = 0x7bb8, uint16_t product_id = 0x1111, uint16_t product_release = 0x0100);
gustavatmel 1:9c5af431a1f1 84
gustavatmel 1:9c5af431a1f1 85 /**
gustavatmel 1:9c5af431a1f1 86 * Get current volume between 0.0 and 1.0
gustavatmel 1:9c5af431a1f1 87 *
gustavatmel 1:9c5af431a1f1 88 * @returns volume
gustavatmel 1:9c5af431a1f1 89 */
gustavatmel 1:9c5af431a1f1 90 float getVolume();
gustavatmel 1:9c5af431a1f1 91
gustavatmel 1:9c5af431a1f1 92 /**
gustavatmel 1:9c5af431a1f1 93 * Read an audio packet. During a frame, only a single reading (you can't write and read an audio packet during the same frame)can be done using this method. Warning: Blocking
gustavatmel 1:9c5af431a1f1 94 *
gustavatmel 1:9c5af431a1f1 95 * @param buf pointer on a buffer which will be filled with an audio packet
gustavatmel 1:9c5af431a1f1 96 *
gustavatmel 1:9c5af431a1f1 97 * @returns true if successfull
gustavatmel 1:9c5af431a1f1 98 */
gustavatmel 1:9c5af431a1f1 99 bool read(uint8_t * buf);
gustavatmel 1:9c5af431a1f1 100
gustavatmel 1:9c5af431a1f1 101 /**
gustavatmel 1:9c5af431a1f1 102 * Try to read an audio packet. During a frame, only a single reading (you can't write and read an audio packet during the same frame)can be done using this method. Warning: Non Blocking
gustavatmel 1:9c5af431a1f1 103 *
gustavatmel 1:9c5af431a1f1 104 * @param buf pointer on a buffer which will be filled if an audio packet is available
gustavatmel 1:9c5af431a1f1 105 *
gustavatmel 1:9c5af431a1f1 106 * @returns true if successfull
gustavatmel 1:9c5af431a1f1 107 */
gustavatmel 1:9c5af431a1f1 108 bool readNB(uint8_t * buf);
gustavatmel 1:9c5af431a1f1 109
gustavatmel 1:9c5af431a1f1 110 /**
gustavatmel 1:9c5af431a1f1 111 * read last received packet if some.
gustavatmel 1:9c5af431a1f1 112 * @param buf pointer on a buffer which will be filled if an audio packet is available
gustavatmel 1:9c5af431a1f1 113 *
gustavatmel 1:9c5af431a1f1 114 * @returns the packet length
gustavatmel 1:9c5af431a1f1 115 */
gustavatmel 1:9c5af431a1f1 116 uint32_t readSync(uint8_t *buf);
gustavatmel 1:9c5af431a1f1 117
gustavatmel 1:9c5af431a1f1 118 /**
gustavatmel 1:9c5af431a1f1 119 * Write an audio packet. During a frame, only a single writing (you can't write and read an audio packet during the same frame)can be done using this method.
gustavatmel 1:9c5af431a1f1 120 *
gustavatmel 1:9c5af431a1f1 121 * @param buf pointer on the audio packet which will be sent
gustavatmel 1:9c5af431a1f1 122 * @returns true if successful
gustavatmel 1:9c5af431a1f1 123 */
gustavatmel 1:9c5af431a1f1 124 bool write(uint8_t * buf);
gustavatmel 1:9c5af431a1f1 125
gustavatmel 1:9c5af431a1f1 126 /** Audio Jitter value*/
gustavatmel 1:9c5af431a1f1 127 enum AudioSampleCorrectType {
gustavatmel 1:9c5af431a1f1 128 RemoveOneSample = -1,
gustavatmel 1:9c5af431a1f1 129 NoCorrection = 0,
gustavatmel 1:9c5af431a1f1 130 AddOneSample = 1
gustavatmel 1:9c5af431a1f1 131 };
gustavatmel 1:9c5af431a1f1 132 /**
gustavatmel 1:9c5af431a1f1 133 * Write packet in endpoint fifo. assuming tx fifo is empty
gustavatmel 1:9c5af431a1f1 134 * @param buf pointer on the audio packet which will be sent
gustavatmel 1:9c5af431a1f1 135 * @param jitter_nb : AudioSampleCorrecttype
gustavatmel 1:9c5af431a1f1 136 **/
gustavatmel 1:9c5af431a1f1 137 void writeSync(uint8_t *buf, AudioSampleCorrectType jitter_nb = NoCorrection );
gustavatmel 1:9c5af431a1f1 138
gustavatmel 1:9c5af431a1f1 139 /**
gustavatmel 1:9c5af431a1f1 140 * Write and read an audio packet at the same time (on the same frame)
gustavatmel 1:9c5af431a1f1 141 *
gustavatmel 1:9c5af431a1f1 142 * @param buf_read pointer on a buffer which will be filled with an audio packet
gustavatmel 1:9c5af431a1f1 143 * @param buf_write pointer on the audio packet which will be sent
gustavatmel 1:9c5af431a1f1 144 * @returns true if successful
gustavatmel 1:9c5af431a1f1 145 */
gustavatmel 1:9c5af431a1f1 146 bool readWrite(uint8_t * buf_read, uint8_t * buf_write);
gustavatmel 1:9c5af431a1f1 147
gustavatmel 1:9c5af431a1f1 148
gustavatmel 1:9c5af431a1f1 149 /** attach a handler to update the volume
gustavatmel 1:9c5af431a1f1 150 *
gustavatmel 1:9c5af431a1f1 151 * @param function Function to attach
gustavatmel 1:9c5af431a1f1 152 *
gustavatmel 1:9c5af431a1f1 153 */
gustavatmel 1:9c5af431a1f1 154 void attach(void(*fptr)(void)) {
gustavatmel 1:9c5af431a1f1 155 updateVol = Callback<void()>(fptr);
gustavatmel 1:9c5af431a1f1 156 }
gustavatmel 1:9c5af431a1f1 157 /** attach a handler to Tx Done
gustavatmel 1:9c5af431a1f1 158 *
gustavatmel 1:9c5af431a1f1 159 * @param function Function to attach
gustavatmel 1:9c5af431a1f1 160 *
gustavatmel 1:9c5af431a1f1 161 */
gustavatmel 1:9c5af431a1f1 162 void attachTx(void(*fptr)(void)) {
gustavatmel 1:9c5af431a1f1 163 txDone = Callback<void()>(fptr);
gustavatmel 1:9c5af431a1f1 164 }
gustavatmel 1:9c5af431a1f1 165 /** attach a handler to Rx Done
gustavatmel 1:9c5af431a1f1 166 *
gustavatmel 1:9c5af431a1f1 167 * @param function Function to attach
gustavatmel 1:9c5af431a1f1 168 *
gustavatmel 1:9c5af431a1f1 169 */
gustavatmel 1:9c5af431a1f1 170 void attachRx(void(*fptr)(void)) {
gustavatmel 1:9c5af431a1f1 171 rxDone = Callback<void()>(fptr);
gustavatmel 1:9c5af431a1f1 172 }
gustavatmel 1:9c5af431a1f1 173
gustavatmel 1:9c5af431a1f1 174 /** Attach a nonstatic void/void member function to update the volume
gustavatmel 1:9c5af431a1f1 175 *
gustavatmel 1:9c5af431a1f1 176 * @param tptr Object pointer
gustavatmel 1:9c5af431a1f1 177 * @param mptr Member function pointer
gustavatmel 1:9c5af431a1f1 178 *
gustavatmel 1:9c5af431a1f1 179 */
gustavatmel 1:9c5af431a1f1 180 template<typename T>
gustavatmel 1:9c5af431a1f1 181 void attach(T *tptr, void(T::*mptr)(void)) {
gustavatmel 1:9c5af431a1f1 182 updateVol = Callback<void()>(tptr, mptr);
gustavatmel 1:9c5af431a1f1 183 }
gustavatmel 1:9c5af431a1f1 184 /** Attach a nonstatic void/void member function to Tx Done
gustavatmel 1:9c5af431a1f1 185 *
gustavatmel 1:9c5af431a1f1 186 * @param tptr Object pointer
gustavatmel 1:9c5af431a1f1 187 * @param mptr Member function pointer
gustavatmel 1:9c5af431a1f1 188 *
gustavatmel 1:9c5af431a1f1 189 */
gustavatmel 1:9c5af431a1f1 190 template<typename T>
gustavatmel 1:9c5af431a1f1 191 void attachTx(T *tptr, void(T::*mptr)(void)) {
gustavatmel 1:9c5af431a1f1 192 txDone = Callback<void()>(tptr, mptr);
gustavatmel 1:9c5af431a1f1 193 }
gustavatmel 1:9c5af431a1f1 194 /** Attach a nonstatic void/void member function to Rx Done
gustavatmel 1:9c5af431a1f1 195 *
gustavatmel 1:9c5af431a1f1 196 * @param tptr Object pointer
gustavatmel 1:9c5af431a1f1 197 * @param mptr Member function pointer
gustavatmel 1:9c5af431a1f1 198 *
gustavatmel 1:9c5af431a1f1 199 */
gustavatmel 1:9c5af431a1f1 200 template<typename T>
gustavatmel 1:9c5af431a1f1 201 void attachRx(T *tptr, void(T::*mptr)(void)) {
gustavatmel 1:9c5af431a1f1 202 rxDone = Callback<void()>(tptr, mptr);
gustavatmel 1:9c5af431a1f1 203 }
gustavatmel 1:9c5af431a1f1 204
gustavatmel 1:9c5af431a1f1 205 /** Attach a Callback to update the volume
gustavatmel 1:9c5af431a1f1 206 *
gustavatmel 1:9c5af431a1f1 207 * @param cb Callback to attach
gustavatmel 1:9c5af431a1f1 208 *
gustavatmel 1:9c5af431a1f1 209 */
gustavatmel 1:9c5af431a1f1 210 void attach(Callback<void()> &cb) {
gustavatmel 1:9c5af431a1f1 211 updateVol = cb;
gustavatmel 1:9c5af431a1f1 212 }
gustavatmel 1:9c5af431a1f1 213 /** attach a Callback to Tx Done
gustavatmel 1:9c5af431a1f1 214 *
gustavatmel 1:9c5af431a1f1 215 * @param cb Callback to attach
gustavatmel 1:9c5af431a1f1 216 *
gustavatmel 1:9c5af431a1f1 217 */
gustavatmel 1:9c5af431a1f1 218 void attachTx(Callback<void()> &cb) {
gustavatmel 1:9c5af431a1f1 219 txDone = cb;
gustavatmel 1:9c5af431a1f1 220 }
gustavatmel 1:9c5af431a1f1 221 /** attach a Callback to Rx Done
gustavatmel 1:9c5af431a1f1 222 *
gustavatmel 1:9c5af431a1f1 223 * @param cb Callback to attach
gustavatmel 1:9c5af431a1f1 224 *
gustavatmel 1:9c5af431a1f1 225 */
gustavatmel 1:9c5af431a1f1 226 void attachRx(Callback<void()> &cb) {
gustavatmel 1:9c5af431a1f1 227 rxDone = cb;
gustavatmel 1:9c5af431a1f1 228 }
gustavatmel 1:9c5af431a1f1 229
gustavatmel 1:9c5af431a1f1 230
gustavatmel 1:9c5af431a1f1 231 protected:
gustavatmel 1:9c5af431a1f1 232
gustavatmel 1:9c5af431a1f1 233 /*
gustavatmel 1:9c5af431a1f1 234 * Called by USBDevice layer. Set configuration of the device.
gustavatmel 1:9c5af431a1f1 235 * For instance, you can add all endpoints that you need on this function.
gustavatmel 1:9c5af431a1f1 236 *
gustavatmel 1:9c5af431a1f1 237 * @param configuration Number of the configuration
gustavatmel 1:9c5af431a1f1 238 * @returns true if class handles this request
gustavatmel 1:9c5af431a1f1 239 */
gustavatmel 1:9c5af431a1f1 240 virtual bool USBCallback_setConfiguration(uint8_t configuration);
gustavatmel 1:9c5af431a1f1 241
gustavatmel 1:9c5af431a1f1 242 /*
gustavatmel 1:9c5af431a1f1 243 * Called by USBDevice on Endpoint0 request. Warning: Called in ISR context
gustavatmel 1:9c5af431a1f1 244 * This is used to handle extensions to standard requests
gustavatmel 1:9c5af431a1f1 245 * and class specific requests
gustavatmel 1:9c5af431a1f1 246 *
gustavatmel 1:9c5af431a1f1 247 * @returns true if class handles this request
gustavatmel 1:9c5af431a1f1 248 */
gustavatmel 1:9c5af431a1f1 249 virtual bool USBCallback_request();
gustavatmel 1:9c5af431a1f1 250
gustavatmel 1:9c5af431a1f1 251 /*
gustavatmel 1:9c5af431a1f1 252 * Get string product descriptor
gustavatmel 1:9c5af431a1f1 253 *
gustavatmel 1:9c5af431a1f1 254 * @returns pointer to the string product descriptor
gustavatmel 1:9c5af431a1f1 255 */
gustavatmel 1:9c5af431a1f1 256 virtual const uint8_t * stringIproductDesc();
gustavatmel 1:9c5af431a1f1 257
gustavatmel 1:9c5af431a1f1 258 /*
gustavatmel 1:9c5af431a1f1 259 * Get string interface descriptor
gustavatmel 1:9c5af431a1f1 260 *
gustavatmel 1:9c5af431a1f1 261 * @returns pointer to the string interface descriptor
gustavatmel 1:9c5af431a1f1 262 */
gustavatmel 1:9c5af431a1f1 263 virtual const uint8_t * stringIinterfaceDesc();
gustavatmel 1:9c5af431a1f1 264
gustavatmel 1:9c5af431a1f1 265 /*
gustavatmel 1:9c5af431a1f1 266 * Get configuration descriptor
gustavatmel 1:9c5af431a1f1 267 *
gustavatmel 1:9c5af431a1f1 268 * @returns pointer to the configuration descriptor
gustavatmel 1:9c5af431a1f1 269 */
gustavatmel 1:9c5af431a1f1 270 virtual const uint8_t * configurationDesc();
gustavatmel 1:9c5af431a1f1 271
gustavatmel 1:9c5af431a1f1 272 /*
gustavatmel 1:9c5af431a1f1 273 * Called by USBDevice layer. Set interface/alternate of the device.
gustavatmel 1:9c5af431a1f1 274 *
gustavatmel 1:9c5af431a1f1 275 * @param interface Number of the interface to be configured
gustavatmel 1:9c5af431a1f1 276 * @param alternate Number of the alternate to be configured
gustavatmel 1:9c5af431a1f1 277 * @returns true if class handles this request
gustavatmel 1:9c5af431a1f1 278 */
gustavatmel 1:9c5af431a1f1 279 virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate);
gustavatmel 1:9c5af431a1f1 280
gustavatmel 1:9c5af431a1f1 281 /*
gustavatmel 1:9c5af431a1f1 282 * Called by USBDevice on Endpoint0 request completion
gustavatmel 1:9c5af431a1f1 283 * if the 'notify' flag has been set to true. Warning: Called in ISR context
gustavatmel 1:9c5af431a1f1 284 *
gustavatmel 1:9c5af431a1f1 285 * In this case it is used to indicate that a HID report has
gustavatmel 1:9c5af431a1f1 286 * been received from the host on endpoint 0
gustavatmel 1:9c5af431a1f1 287 *
gustavatmel 1:9c5af431a1f1 288 * @param buf buffer received on endpoint 0
gustavatmel 1:9c5af431a1f1 289 * @param length length of this buffer
gustavatmel 1:9c5af431a1f1 290 */
gustavatmel 1:9c5af431a1f1 291 virtual void USBCallback_requestCompleted(uint8_t * buf, uint32_t length);
gustavatmel 1:9c5af431a1f1 292
gustavatmel 1:9c5af431a1f1 293 /*
gustavatmel 1:9c5af431a1f1 294 * Callback called on each Start of Frame event
gustavatmel 1:9c5af431a1f1 295 */
gustavatmel 1:9c5af431a1f1 296 virtual void SOF(int frameNumber);
gustavatmel 1:9c5af431a1f1 297
gustavatmel 1:9c5af431a1f1 298 /*
gustavatmel 1:9c5af431a1f1 299 * Callback called when a packet is received
gustavatmel 1:9c5af431a1f1 300 */
gustavatmel 1:9c5af431a1f1 301 virtual bool EPISO_OUT_callback();
gustavatmel 1:9c5af431a1f1 302
gustavatmel 1:9c5af431a1f1 303 /*
gustavatmel 1:9c5af431a1f1 304 * Callback called when a packet has been sent
gustavatmel 1:9c5af431a1f1 305 */
gustavatmel 1:9c5af431a1f1 306 virtual bool EPISO_IN_callback();
gustavatmel 1:9c5af431a1f1 307
gustavatmel 1:9c5af431a1f1 308 private:
gustavatmel 1:9c5af431a1f1 309
gustavatmel 1:9c5af431a1f1 310 /*
gustavatmel 1:9c5af431a1f1 311 * Call to rebuild the configuration descriptor
gustavatmel 1:9c5af431a1f1 312 *
gustavatmel 1:9c5af431a1f1 313 * This function should be called on creation or when any
gustavatmel 1:9c5af431a1f1 314 * value that is part of the configuration descriptor
gustavatmel 1:9c5af431a1f1 315 * changes.
gustavatmel 1:9c5af431a1f1 316 * @note This function uses ~200 bytes of stack so
gustavatmel 1:9c5af431a1f1 317 * make sure your stack is big enough for it.
gustavatmel 1:9c5af431a1f1 318 */
gustavatmel 1:9c5af431a1f1 319 void _build_configurationDesc();
gustavatmel 1:9c5af431a1f1 320
gustavatmel 1:9c5af431a1f1 321 // configuration descriptor
gustavatmel 1:9c5af431a1f1 322 uint8_t configDescriptor[183];
gustavatmel 1:9c5af431a1f1 323
gustavatmel 1:9c5af431a1f1 324 // stream available ?
gustavatmel 1:9c5af431a1f1 325 volatile bool available;
gustavatmel 1:9c5af431a1f1 326
gustavatmel 1:9c5af431a1f1 327 // interrupt OUT has been received
gustavatmel 1:9c5af431a1f1 328 volatile bool interruptOUT;
gustavatmel 1:9c5af431a1f1 329
gustavatmel 1:9c5af431a1f1 330 // interrupt IN has been received
gustavatmel 1:9c5af431a1f1 331 volatile bool interruptIN;
gustavatmel 1:9c5af431a1f1 332
gustavatmel 1:9c5af431a1f1 333 // audio packet has been written
gustavatmel 1:9c5af431a1f1 334 volatile bool writeIN;
gustavatmel 1:9c5af431a1f1 335
gustavatmel 1:9c5af431a1f1 336 // FREQ
gustavatmel 1:9c5af431a1f1 337 uint32_t FREQ_OUT;
gustavatmel 1:9c5af431a1f1 338 uint32_t FREQ_IN;
gustavatmel 1:9c5af431a1f1 339
gustavatmel 1:9c5af431a1f1 340 // size of the maximum packet for the isochronous endpoint
gustavatmel 1:9c5af431a1f1 341 uint32_t PACKET_SIZE_ISO_IN;
gustavatmel 1:9c5af431a1f1 342 uint32_t PACKET_SIZE_ISO_OUT;
gustavatmel 1:9c5af431a1f1 343
gustavatmel 1:9c5af431a1f1 344 // mono, stereo,...
gustavatmel 1:9c5af431a1f1 345 uint8_t channel_nb_in;
gustavatmel 1:9c5af431a1f1 346 uint8_t channel_nb_out;
gustavatmel 1:9c5af431a1f1 347
gustavatmel 1:9c5af431a1f1 348 // channel config: master, left, right
gustavatmel 1:9c5af431a1f1 349 uint8_t channel_config_in;
gustavatmel 1:9c5af431a1f1 350 uint8_t channel_config_out;
gustavatmel 1:9c5af431a1f1 351
gustavatmel 1:9c5af431a1f1 352 // mute state
gustavatmel 1:9c5af431a1f1 353 uint8_t mute;
gustavatmel 1:9c5af431a1f1 354
gustavatmel 1:9c5af431a1f1 355 // Volume Current Value
gustavatmel 1:9c5af431a1f1 356 uint16_t volCur;
gustavatmel 1:9c5af431a1f1 357
gustavatmel 1:9c5af431a1f1 358 // Volume Minimum Value
gustavatmel 1:9c5af431a1f1 359 uint16_t volMin;
gustavatmel 1:9c5af431a1f1 360
gustavatmel 1:9c5af431a1f1 361 // Volume Maximum Value
gustavatmel 1:9c5af431a1f1 362 uint16_t volMax;
gustavatmel 1:9c5af431a1f1 363
gustavatmel 1:9c5af431a1f1 364 // Volume Resolution
gustavatmel 1:9c5af431a1f1 365 uint16_t volRes;
gustavatmel 1:9c5af431a1f1 366
gustavatmel 1:9c5af431a1f1 367 // Buffer containing one audio packet (to be read)
gustavatmel 1:9c5af431a1f1 368 volatile uint8_t * buf_stream_in;
gustavatmel 1:9c5af431a1f1 369
gustavatmel 1:9c5af431a1f1 370 // Buffer containing one audio packet (to be written)
gustavatmel 1:9c5af431a1f1 371 volatile uint8_t * buf_stream_out;
gustavatmel 1:9c5af431a1f1 372
gustavatmel 1:9c5af431a1f1 373 // callback to update volume
gustavatmel 1:9c5af431a1f1 374 Callback<void()> updateVol;
gustavatmel 1:9c5af431a1f1 375
gustavatmel 1:9c5af431a1f1 376 // callback transmit Done
gustavatmel 1:9c5af431a1f1 377 Callback<void()> txDone;
gustavatmel 1:9c5af431a1f1 378 // callback transmit Done
gustavatmel 1:9c5af431a1f1 379 Callback<void()> rxDone;
gustavatmel 1:9c5af431a1f1 380
gustavatmel 1:9c5af431a1f1 381 // boolean showing that the SOF handler has been called. Useful for readNB.
gustavatmel 1:9c5af431a1f1 382 volatile bool SOF_handler;
gustavatmel 1:9c5af431a1f1 383
gustavatmel 1:9c5af431a1f1 384 volatile float volume;
gustavatmel 1:9c5af431a1f1 385
gustavatmel 1:9c5af431a1f1 386 };
gustavatmel 1:9c5af431a1f1 387
gustavatmel 1:9c5af431a1f1 388 #endif