modded version CNMAT/OSC https://github.com/CNMAT/OSC

Dependents:   CVtoOSCConverter

Fork of osc-cnmat by Asperius van Hansen

Committer:
aspeteRakete
Date:
Fri May 16 22:41:39 2014 +0000
Revision:
2:61caa2495215
Parent:
1:18009e3041ea
Child:
4:107c23eb31b6
rumprobiert. send bleibt erstmal drau?en.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aspeteRakete 1:18009e3041ea 1 /*
aspeteRakete 1:18009e3041ea 2 Written by Yotam Mann, The Center for New Music and Audio Technologies,
aspeteRakete 1:18009e3041ea 3 University of California, Berkeley. Copyright (c) 2012, The Regents of
aspeteRakete 1:18009e3041ea 4 the University of California (Regents).
aspeteRakete 1:18009e3041ea 5
aspeteRakete 1:18009e3041ea 6 Permission to use, copy, modify, distribute, and distribute modified versions
aspeteRakete 1:18009e3041ea 7 of this software and its documentation without fee and without a signed
aspeteRakete 1:18009e3041ea 8 licensing agreement, is hereby granted, provided that the above copyright
aspeteRakete 1:18009e3041ea 9 notice, this paragraph and the following two paragraphs appear in all copies,
aspeteRakete 1:18009e3041ea 10 modifications, and distributions.
aspeteRakete 1:18009e3041ea 11
aspeteRakete 1:18009e3041ea 12 IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
aspeteRakete 1:18009e3041ea 13 SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
aspeteRakete 1:18009e3041ea 14 OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
aspeteRakete 1:18009e3041ea 15 BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
aspeteRakete 1:18009e3041ea 16
aspeteRakete 1:18009e3041ea 17 REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
aspeteRakete 1:18009e3041ea 18 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
aspeteRakete 1:18009e3041ea 19 PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
aspeteRakete 1:18009e3041ea 20 HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
aspeteRakete 1:18009e3041ea 21 MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
aspeteRakete 1:18009e3041ea 22
aspeteRakete 1:18009e3041ea 23 For bug reports and feature requests please email me at yotam@cnmat.berkeley.edu
aspeteRakete 1:18009e3041ea 24 */
aspeteRakete 1:18009e3041ea 25
aspeteRakete 1:18009e3041ea 26 #ifndef OSCMESSAGE_h
aspeteRakete 1:18009e3041ea 27 #define OSCMESSAGE_h
aspeteRakete 1:18009e3041ea 28
aspeteRakete 1:18009e3041ea 29 #include "OSCData.h"
aspeteRakete 2:61caa2495215 30 #include "Stream.h"
aspeteRakete 1:18009e3041ea 31 //#include <Print.h>
aspeteRakete 1:18009e3041ea 32
aspeteRakete 2:61caa2495215 33 using namespace mbed;
aspeteRakete 1:18009e3041ea 34 class OSCMessage
aspeteRakete 1:18009e3041ea 35 {
aspeteRakete 1:18009e3041ea 36
aspeteRakete 1:18009e3041ea 37 private:
aspeteRakete 1:18009e3041ea 38
aspeteRakete 1:18009e3041ea 39 //friends
aspeteRakete 1:18009e3041ea 40 friend class OSCBundle;
aspeteRakete 1:18009e3041ea 41
aspeteRakete 1:18009e3041ea 42
aspeteRakete 1:18009e3041ea 43 /*=============================================================================
aspeteRakete 1:18009e3041ea 44 PRIVATE VARIABLES
aspeteRakete 1:18009e3041ea 45 =============================================================================*/
aspeteRakete 1:18009e3041ea 46
aspeteRakete 1:18009e3041ea 47 //the address
aspeteRakete 1:18009e3041ea 48 char * address;
aspeteRakete 1:18009e3041ea 49
aspeteRakete 1:18009e3041ea 50 //the data
aspeteRakete 1:18009e3041ea 51 OSCData ** data;
aspeteRakete 1:18009e3041ea 52
aspeteRakete 1:18009e3041ea 53 //the number of OSCData in the data array
aspeteRakete 1:18009e3041ea 54 int dataCount;
aspeteRakete 1:18009e3041ea 55
aspeteRakete 1:18009e3041ea 56 //error codes for potential runtime problems
aspeteRakete 1:18009e3041ea 57 OSCErrorCode error;
aspeteRakete 1:18009e3041ea 58
aspeteRakete 1:18009e3041ea 59 /*=============================================================================
aspeteRakete 1:18009e3041ea 60 DECODING INCOMING BYTES
aspeteRakete 1:18009e3041ea 61 =============================================================================*/
aspeteRakete 1:18009e3041ea 62
aspeteRakete 1:18009e3041ea 63 //the decoding states for incoming bytes
aspeteRakete 1:18009e3041ea 64 enum DecodeState {
aspeteRakete 1:18009e3041ea 65 STANDBY,
aspeteRakete 1:18009e3041ea 66 ADDRESS,
aspeteRakete 1:18009e3041ea 67 ADDRESS_PADDING,
aspeteRakete 1:18009e3041ea 68 TYPES,
aspeteRakete 1:18009e3041ea 69 TYPES_PADDING,
aspeteRakete 1:18009e3041ea 70 DATA,
aspeteRakete 1:18009e3041ea 71 DATA_PADDING,
aspeteRakete 1:18009e3041ea 72 DONE,
aspeteRakete 1:18009e3041ea 73 } decodeState;
aspeteRakete 1:18009e3041ea 74
aspeteRakete 1:18009e3041ea 75 //stores incoming bytes until they can be decoded
aspeteRakete 1:18009e3041ea 76 uint8_t * incomingBuffer;
aspeteRakete 1:18009e3041ea 77 int incomingBufferSize; // how many bytes are stored
aspeteRakete 1:18009e3041ea 78 int incomingBufferFree; // how many bytes are allocated but unused
aspeteRakete 1:18009e3041ea 79
aspeteRakete 1:18009e3041ea 80 //adds a byte to the buffer
aspeteRakete 1:18009e3041ea 81 void addToIncomingBuffer(uint8_t);
aspeteRakete 1:18009e3041ea 82 //clears the incoming buffer
aspeteRakete 1:18009e3041ea 83 void clearIncomingBuffer();
aspeteRakete 1:18009e3041ea 84
aspeteRakete 1:18009e3041ea 85 //decoding function
aspeteRakete 1:18009e3041ea 86 void decode(uint8_t);
aspeteRakete 1:18009e3041ea 87 void decodeAddress();
aspeteRakete 1:18009e3041ea 88 void decodeType(uint8_t);
aspeteRakete 1:18009e3041ea 89 void decodeData(uint8_t);
aspeteRakete 1:18009e3041ea 90
aspeteRakete 1:18009e3041ea 91 /*=============================================================================
aspeteRakete 1:18009e3041ea 92 HELPER FUNCTIONS
aspeteRakete 1:18009e3041ea 93 =============================================================================*/
aspeteRakete 1:18009e3041ea 94
aspeteRakete 1:18009e3041ea 95 void setupMessage();
aspeteRakete 1:18009e3041ea 96
aspeteRakete 1:18009e3041ea 97 //compares the OSCData's type char to a test char
aspeteRakete 1:18009e3041ea 98 bool testType(int position, char type);
aspeteRakete 1:18009e3041ea 99
aspeteRakete 1:18009e3041ea 100 //returns the number of bytes to pad to make it 4-bit aligned
aspeteRakete 1:18009e3041ea 101 // int padSize(int bytes);
aspeteRakete 1:18009e3041ea 102
aspeteRakete 1:18009e3041ea 103 public:
aspeteRakete 1:18009e3041ea 104
aspeteRakete 1:18009e3041ea 105 //returns the OSCData at that position
aspeteRakete 1:18009e3041ea 106 OSCData * getOSCData(int);
aspeteRakete 1:18009e3041ea 107
aspeteRakete 1:18009e3041ea 108 /*=============================================================================
aspeteRakete 1:18009e3041ea 109 CONSTRUCTORS / DESTRUCTOR
aspeteRakete 1:18009e3041ea 110 =============================================================================*/
aspeteRakete 1:18009e3041ea 111
aspeteRakete 1:18009e3041ea 112 //new constructor needs an address
aspeteRakete 1:18009e3041ea 113 OSCMessage (const char * _address);
aspeteRakete 1:18009e3041ea 114 //no address
aspeteRakete 1:18009e3041ea 115 //placeholder since it's invalide OSC
aspeteRakete 1:18009e3041ea 116 OSCMessage();
aspeteRakete 1:18009e3041ea 117
aspeteRakete 1:18009e3041ea 118 //can optionally accept all of the data after the address
aspeteRakete 1:18009e3041ea 119 //OSCMessage(const char * _address, char * types, ... );
aspeteRakete 1:18009e3041ea 120 //created from another OSCMessage
aspeteRakete 1:18009e3041ea 121 OSCMessage (OSCMessage *);
aspeteRakete 1:18009e3041ea 122
aspeteRakete 1:18009e3041ea 123 //DESTRUCTOR
aspeteRakete 1:18009e3041ea 124 ~OSCMessage();
aspeteRakete 1:18009e3041ea 125
aspeteRakete 1:18009e3041ea 126 //empties all of the data
aspeteRakete 1:18009e3041ea 127 void empty();
aspeteRakete 1:18009e3041ea 128
aspeteRakete 1:18009e3041ea 129 /*=============================================================================
aspeteRakete 1:18009e3041ea 130 SETTING DATA
aspeteRakete 1:18009e3041ea 131 =============================================================================*/
aspeteRakete 1:18009e3041ea 132
aspeteRakete 1:18009e3041ea 133 //returns the OSCMessage so that multiple 'add's can be strung together
aspeteRakete 1:18009e3041ea 134 template <typename T>
aspeteRakete 1:18009e3041ea 135 OSCMessage& add(T datum){
aspeteRakete 1:18009e3041ea 136 //make a piece of data
aspeteRakete 1:18009e3041ea 137 OSCData * d = new OSCData(datum);
aspeteRakete 1:18009e3041ea 138 //check if it has any errors
aspeteRakete 1:18009e3041ea 139 if (d->error == ALLOCFAILED){
aspeteRakete 1:18009e3041ea 140 error = ALLOCFAILED;
aspeteRakete 1:18009e3041ea 141 } else {
aspeteRakete 1:18009e3041ea 142 //resize the data array
aspeteRakete 1:18009e3041ea 143 OSCData ** dataMem = (OSCData **) realloc(data, sizeof(OSCData *) * (dataCount + 1));
aspeteRakete 1:18009e3041ea 144 if (dataMem == NULL){
aspeteRakete 1:18009e3041ea 145 error = ALLOCFAILED;
aspeteRakete 1:18009e3041ea 146 } else {
aspeteRakete 1:18009e3041ea 147 data = dataMem;
aspeteRakete 1:18009e3041ea 148 //add data to the end of the array
aspeteRakete 1:18009e3041ea 149 data[dataCount] = d;
aspeteRakete 1:18009e3041ea 150 //increment the data size
aspeteRakete 1:18009e3041ea 151 dataCount++;
aspeteRakete 1:18009e3041ea 152 }
aspeteRakete 1:18009e3041ea 153 }
aspeteRakete 1:18009e3041ea 154 return *this;
aspeteRakete 1:18009e3041ea 155 }
aspeteRakete 1:18009e3041ea 156
aspeteRakete 1:18009e3041ea 157 //blob specific add
aspeteRakete 1:18009e3041ea 158 OSCMessage& add(uint8_t * blob, int length){
aspeteRakete 1:18009e3041ea 159 //make a piece of data
aspeteRakete 1:18009e3041ea 160 OSCData * d = new OSCData(blob, length);
aspeteRakete 1:18009e3041ea 161 //check if it has any errors
aspeteRakete 1:18009e3041ea 162 if (d->error == ALLOCFAILED){
aspeteRakete 1:18009e3041ea 163 error = ALLOCFAILED;
aspeteRakete 1:18009e3041ea 164 } else {
aspeteRakete 1:18009e3041ea 165 //resize the data array
aspeteRakete 1:18009e3041ea 166 OSCData ** dataMem = (OSCData **) realloc(data, sizeof(OSCData *) * (dataCount + 1));
aspeteRakete 1:18009e3041ea 167 if (dataMem == NULL){
aspeteRakete 1:18009e3041ea 168 error = ALLOCFAILED;
aspeteRakete 1:18009e3041ea 169 } else {
aspeteRakete 1:18009e3041ea 170 data = dataMem;
aspeteRakete 1:18009e3041ea 171 //add data to the end of the array
aspeteRakete 1:18009e3041ea 172 data[dataCount] = d;
aspeteRakete 1:18009e3041ea 173 //increment the data size
aspeteRakete 1:18009e3041ea 174 dataCount++;
aspeteRakete 1:18009e3041ea 175 }
aspeteRakete 1:18009e3041ea 176 }
aspeteRakete 1:18009e3041ea 177 return *this;
aspeteRakete 1:18009e3041ea 178 }
aspeteRakete 1:18009e3041ea 179
aspeteRakete 1:18009e3041ea 180 //sets the data at a position
aspeteRakete 1:18009e3041ea 181 template <typename T>
aspeteRakete 1:18009e3041ea 182 void set(int position, T datum){
aspeteRakete 1:18009e3041ea 183 if (position < dataCount){
aspeteRakete 1:18009e3041ea 184 //replace the OSCData with a new one
aspeteRakete 1:18009e3041ea 185 OSCData * oldDatum = getOSCData(position);
aspeteRakete 1:18009e3041ea 186 //destroy the old one
aspeteRakete 1:18009e3041ea 187 delete oldDatum;
aspeteRakete 1:18009e3041ea 188 //make a new one
aspeteRakete 1:18009e3041ea 189 OSCData * newDatum = new OSCData(datum);
aspeteRakete 1:18009e3041ea 190 //test if there was an error
aspeteRakete 1:18009e3041ea 191 if (newDatum->error == ALLOCFAILED){
aspeteRakete 1:18009e3041ea 192 error = ALLOCFAILED;
aspeteRakete 1:18009e3041ea 193 } else {
aspeteRakete 1:18009e3041ea 194 //otherwise, put it in the data array
aspeteRakete 1:18009e3041ea 195 data[position] = newDatum;
aspeteRakete 1:18009e3041ea 196 }
aspeteRakete 1:18009e3041ea 197 } else if (position == (dataCount)){
aspeteRakete 1:18009e3041ea 198 //add the data to the end
aspeteRakete 1:18009e3041ea 199 add(datum);
aspeteRakete 1:18009e3041ea 200 } else {
aspeteRakete 1:18009e3041ea 201 //else out of bounds error
aspeteRakete 1:18009e3041ea 202 error = INDEX_OUT_OF_BOUNDS;
aspeteRakete 1:18009e3041ea 203 }
aspeteRakete 1:18009e3041ea 204 }
aspeteRakete 1:18009e3041ea 205
aspeteRakete 1:18009e3041ea 206 //blob specific setter
aspeteRakete 1:18009e3041ea 207 void set(int position, uint8_t * blob, int length){
aspeteRakete 1:18009e3041ea 208 if (position < dataCount){
aspeteRakete 1:18009e3041ea 209 //replace the OSCData with a new one
aspeteRakete 1:18009e3041ea 210 OSCData * oldDatum = getOSCData(position);
aspeteRakete 1:18009e3041ea 211 //destroy the old one
aspeteRakete 1:18009e3041ea 212 delete oldDatum;
aspeteRakete 1:18009e3041ea 213 //make a new one
aspeteRakete 1:18009e3041ea 214 OSCData * newDatum = new OSCData(blob, length);
aspeteRakete 1:18009e3041ea 215 //test if there was an error
aspeteRakete 1:18009e3041ea 216 if (newDatum->error == ALLOCFAILED){
aspeteRakete 1:18009e3041ea 217 error = ALLOCFAILED;
aspeteRakete 1:18009e3041ea 218 } else {
aspeteRakete 1:18009e3041ea 219 //otherwise, put it in the data array
aspeteRakete 1:18009e3041ea 220 data[position] = newDatum;
aspeteRakete 1:18009e3041ea 221 }
aspeteRakete 1:18009e3041ea 222 } else if (position == (dataCount)){
aspeteRakete 1:18009e3041ea 223 //add the data to the end
aspeteRakete 1:18009e3041ea 224 add(blob, length);
aspeteRakete 1:18009e3041ea 225 } else {
aspeteRakete 1:18009e3041ea 226 //else out of bounds error
aspeteRakete 1:18009e3041ea 227 error = INDEX_OUT_OF_BOUNDS;
aspeteRakete 1:18009e3041ea 228 }
aspeteRakete 1:18009e3041ea 229 }
aspeteRakete 1:18009e3041ea 230
aspeteRakete 1:18009e3041ea 231 void setAddress(const char *);
aspeteRakete 1:18009e3041ea 232
aspeteRakete 1:18009e3041ea 233 /*=============================================================================
aspeteRakete 1:18009e3041ea 234 GETTING DATA
aspeteRakete 1:18009e3041ea 235
aspeteRakete 1:18009e3041ea 236 getters take a position as an argument
aspeteRakete 1:18009e3041ea 237 =============================================================================*/
aspeteRakete 1:18009e3041ea 238
aspeteRakete 1:18009e3041ea 239 int32_t getInt(int);
aspeteRakete 1:18009e3041ea 240 uint64_t getTime(int);
aspeteRakete 1:18009e3041ea 241
aspeteRakete 1:18009e3041ea 242 float getFloat(int);
aspeteRakete 1:18009e3041ea 243 double getDouble(int);
aspeteRakete 1:18009e3041ea 244 bool getBoolean(int);
aspeteRakete 1:18009e3041ea 245
aspeteRakete 1:18009e3041ea 246 //return the copied string's length
aspeteRakete 1:18009e3041ea 247 int getString(int, char *, int);
aspeteRakete 1:18009e3041ea 248 //returns the number of unsigned int8's copied into the buffer
aspeteRakete 1:18009e3041ea 249 int getBlob(int, uint8_t *, int);
aspeteRakete 1:18009e3041ea 250
aspeteRakete 1:18009e3041ea 251 //returns the number of bytes of the data at that position
aspeteRakete 1:18009e3041ea 252 int getDataLength(int);
aspeteRakete 1:18009e3041ea 253
aspeteRakete 1:18009e3041ea 254 //returns the type at the position
aspeteRakete 1:18009e3041ea 255 char getType(int);
aspeteRakete 1:18009e3041ea 256
aspeteRakete 1:18009e3041ea 257 //put the address in the buffer
aspeteRakete 1:18009e3041ea 258 int getAddress(char * buffer, int offset = 0);
aspeteRakete 1:18009e3041ea 259 int getAddress(char * buffer, int offset, int len);
aspeteRakete 1:18009e3041ea 260
aspeteRakete 1:18009e3041ea 261 // TODO: int getAddressLength(int offset = 0);
aspeteRakete 1:18009e3041ea 262
aspeteRakete 1:18009e3041ea 263
aspeteRakete 1:18009e3041ea 264 /*=============================================================================
aspeteRakete 1:18009e3041ea 265 TESTING DATA
aspeteRakete 1:18009e3041ea 266
aspeteRakete 1:18009e3041ea 267 testers take a position as an argument
aspeteRakete 1:18009e3041ea 268 =============================================================================*/
aspeteRakete 1:18009e3041ea 269
aspeteRakete 1:18009e3041ea 270 bool isInt(int);
aspeteRakete 1:18009e3041ea 271 bool isFloat(int);
aspeteRakete 1:18009e3041ea 272 bool isBlob(int);
aspeteRakete 1:18009e3041ea 273 bool isChar(int);
aspeteRakete 1:18009e3041ea 274 bool isString(int);
aspeteRakete 1:18009e3041ea 275 bool isDouble(int);
aspeteRakete 1:18009e3041ea 276 bool isBoolean(int);
aspeteRakete 1:18009e3041ea 277 bool isTime(int);
aspeteRakete 1:18009e3041ea 278
aspeteRakete 1:18009e3041ea 279 /*=============================================================================
aspeteRakete 1:18009e3041ea 280 PATTERN MATCHING
aspeteRakete 1:18009e3041ea 281 =============================================================================*/
aspeteRakete 1:18009e3041ea 282
aspeteRakete 1:18009e3041ea 283 //match the pattern against the address
aspeteRakete 1:18009e3041ea 284 //returns true only for a complete match
aspeteRakete 1:18009e3041ea 285 bool fullMatch( const char * pattern, int = 0);
aspeteRakete 1:18009e3041ea 286
aspeteRakete 1:18009e3041ea 287 //returns the number of characters matched in the address
aspeteRakete 1:18009e3041ea 288 int match( const char * pattern, int = 0);
aspeteRakete 1:18009e3041ea 289
aspeteRakete 1:18009e3041ea 290 //calls the function with the message as the arg if it was a full match
aspeteRakete 1:18009e3041ea 291 bool dispatch(const char * pattern, void (*callback)(OSCMessage &), int = 0);
aspeteRakete 1:18009e3041ea 292
aspeteRakete 1:18009e3041ea 293 //like dispatch, but allows for partial matches
aspeteRakete 1:18009e3041ea 294 //the address match offset is sent as an argument to the callback
aspeteRakete 1:18009e3041ea 295 //also room for an option address offset to allow for multiple nested routes
aspeteRakete 1:18009e3041ea 296 bool route(const char * pattern, void (*callback)(OSCMessage &, int), int = 0);
aspeteRakete 1:18009e3041ea 297
aspeteRakete 1:18009e3041ea 298
aspeteRakete 1:18009e3041ea 299
aspeteRakete 1:18009e3041ea 300 /*=============================================================================
aspeteRakete 1:18009e3041ea 301 SIZE
aspeteRakete 1:18009e3041ea 302 =============================================================================*/
aspeteRakete 1:18009e3041ea 303
aspeteRakete 1:18009e3041ea 304 //the number of data that the message contains
aspeteRakete 1:18009e3041ea 305 int size();
aspeteRakete 1:18009e3041ea 306
aspeteRakete 1:18009e3041ea 307 //computes the number of bytes the OSCMessage occupies if everything is 32-bit aligned
aspeteRakete 1:18009e3041ea 308 int bytes();
aspeteRakete 1:18009e3041ea 309
aspeteRakete 1:18009e3041ea 310 /*=============================================================================
aspeteRakete 1:18009e3041ea 311 TRANSMISSION
aspeteRakete 1:18009e3041ea 312 =============================================================================*/
aspeteRakete 1:18009e3041ea 313
aspeteRakete 1:18009e3041ea 314 //send the message
aspeteRakete 2:61caa2495215 315 // void send(Stream &p);
aspeteRakete 1:18009e3041ea 316
aspeteRakete 1:18009e3041ea 317 //fill the message from a byte stream
aspeteRakete 1:18009e3041ea 318 void fill(uint8_t);
aspeteRakete 1:18009e3041ea 319 void fill(uint8_t *, int);
aspeteRakete 1:18009e3041ea 320
aspeteRakete 1:18009e3041ea 321 /*=============================================================================
aspeteRakete 1:18009e3041ea 322 ERROR
aspeteRakete 1:18009e3041ea 323 =============================================================================*/
aspeteRakete 1:18009e3041ea 324
aspeteRakete 1:18009e3041ea 325 bool hasError();
aspeteRakete 1:18009e3041ea 326
aspeteRakete 1:18009e3041ea 327 OSCErrorCode getError();
aspeteRakete 1:18009e3041ea 328
aspeteRakete 1:18009e3041ea 329 };
aspeteRakete 1:18009e3041ea 330
aspeteRakete 1:18009e3041ea 331 #endif