Ibiltari Nora / OSC
Committer:
Ibiltari
Date:
Mon Dec 03 20:27:07 2018 +0100
Revision:
7:98280cef1c4f
Child:
9:e4528f622bcc
Cambio de libreria base a CNMAT OSC Arduino

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ibiltari 7:98280cef1c4f 1 /*
Ibiltari 7:98280cef1c4f 2 #include <OSCMessage.h>
Ibiltari 7:98280cef1c4f 3 mbedOSC.cpp
Ibiltari 7:98280cef1c4f 4 */
Ibiltari 7:98280cef1c4f 5
Ibiltari 7:98280cef1c4f 6 #include "mbed.h"
Ibiltari 7:98280cef1c4f 7 #include "stdarg.h"
Ibiltari 7:98280cef1c4f 8 #include <OSCMessage.h>
Ibiltari 7:98280cef1c4f 9 #include "OSCMessage.h"
Ibiltari 7:98280cef1c4f 10 // #include "OSCMatch.h" // TODO: implement matching
Ibiltari 7:98280cef1c4f 11 // #include "OSCTiming.h" // TODO: implement timing
Ibiltari 7:98280cef1c4f 12
Ibiltari 7:98280cef1c4f 13 // extern osctime_t zerotime;
Ibiltari 7:98280cef1c4f 14 /*=============================================================================
Ibiltari 7:98280cef1c4f 15 CONSTRUCTORS / DESTRUCTOR
Ibiltari 7:98280cef1c4f 16 =============================================================================*/
Ibiltari 7:98280cef1c4f 17
Ibiltari 7:98280cef1c4f 18 //constructor with address
Ibiltari 7:98280cef1c4f 19 OSCMessage::OSCMessage(const char * _address){
Ibiltari 7:98280cef1c4f 20 setupMessage();
Ibiltari 7:98280cef1c4f 21 setAddress(_address);
Ibiltari 7:98280cef1c4f 22 }
Ibiltari 7:98280cef1c4f 23
Ibiltari 7:98280cef1c4f 24 //constructor with nothing
Ibiltari 7:98280cef1c4f 25 //just a placeholder since the message is invalid
Ibiltari 7:98280cef1c4f 26 OSCMessage::OSCMessage(){
Ibiltari 7:98280cef1c4f 27 setupMessage();
Ibiltari 7:98280cef1c4f 28 error = INVALID_OSC;
Ibiltari 7:98280cef1c4f 29 }
Ibiltari 7:98280cef1c4f 30
Ibiltari 7:98280cef1c4f 31 //variable length constructor
Ibiltari 7:98280cef1c4f 32 //for example OSCMessage msg("/address", "isf", 1, "two", 3.0);
Ibiltari 7:98280cef1c4f 33 /*
Ibiltari 7:98280cef1c4f 34 OSCMessage::OSCMessage(const char * _address, char * types, ... ){
Ibiltari 7:98280cef1c4f 35 setupMessage(_address);
Ibiltari 7:98280cef1c4f 36 }
Ibiltari 7:98280cef1c4f 37 */
Ibiltari 7:98280cef1c4f 38
Ibiltari 7:98280cef1c4f 39 //sets up a new message
Ibiltari 7:98280cef1c4f 40 void OSCMessage::setupMessage(){
Ibiltari 7:98280cef1c4f 41 address = NULL;
Ibiltari 7:98280cef1c4f 42 //setup the attributes
Ibiltari 7:98280cef1c4f 43 dataCount = 0;
Ibiltari 7:98280cef1c4f 44 error = OSC_OK;
Ibiltari 7:98280cef1c4f 45 //setup the space for data
Ibiltari 7:98280cef1c4f 46 data = NULL;
Ibiltari 7:98280cef1c4f 47 //setup for filling the message
Ibiltari 7:98280cef1c4f 48 incomingBuffer = NULL;
Ibiltari 7:98280cef1c4f 49 incomingBufferSize = 0;
Ibiltari 7:98280cef1c4f 50 incomingBufferFree = 0;
Ibiltari 7:98280cef1c4f 51 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 52 //set the decode state
Ibiltari 7:98280cef1c4f 53 decodeState = STANDBY;
Ibiltari 7:98280cef1c4f 54 }
Ibiltari 7:98280cef1c4f 55
Ibiltari 7:98280cef1c4f 56 //DESTRUCTOR
Ibiltari 7:98280cef1c4f 57 OSCMessage::~OSCMessage(){
Ibiltari 7:98280cef1c4f 58 //free everything that needs to be freed
Ibiltari 7:98280cef1c4f 59 //free the address
Ibiltari 7:98280cef1c4f 60 free(address);
Ibiltari 7:98280cef1c4f 61 //free the data
Ibiltari 7:98280cef1c4f 62 empty();
Ibiltari 7:98280cef1c4f 63 //free the filling buffer
Ibiltari 7:98280cef1c4f 64 free(incomingBuffer);
Ibiltari 7:98280cef1c4f 65 }
Ibiltari 7:98280cef1c4f 66
Ibiltari 7:98280cef1c4f 67 OSCMessage& OSCMessage::empty(){
Ibiltari 7:98280cef1c4f 68 error = OSC_OK;
Ibiltari 7:98280cef1c4f 69 //free each of hte data in the array
Ibiltari 7:98280cef1c4f 70 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 71 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 72 //explicitly destruct the data
Ibiltari 7:98280cef1c4f 73 //datum->~OSCData();
Ibiltari 7:98280cef1c4f 74 delete datum;
Ibiltari 7:98280cef1c4f 75 }
Ibiltari 7:98280cef1c4f 76 //and free the array
Ibiltari 7:98280cef1c4f 77 free(data);
Ibiltari 7:98280cef1c4f 78 data = NULL;
Ibiltari 7:98280cef1c4f 79 dataCount = 0;
Ibiltari 7:98280cef1c4f 80 decodeState = STANDBY;
Ibiltari 7:98280cef1c4f 81 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 82 return *this;
Ibiltari 7:98280cef1c4f 83 }
Ibiltari 7:98280cef1c4f 84
Ibiltari 7:98280cef1c4f 85 //COPY
Ibiltari 7:98280cef1c4f 86 OSCMessage::OSCMessage(OSCMessage * msg){
Ibiltari 7:98280cef1c4f 87 //start with a message with the same address
Ibiltari 7:98280cef1c4f 88 setupMessage();
Ibiltari 7:98280cef1c4f 89 setAddress(msg->address);
Ibiltari 7:98280cef1c4f 90 //add each of the data to the other message
Ibiltari 7:98280cef1c4f 91 for (int i = 0; i < msg->dataCount; i++){
Ibiltari 7:98280cef1c4f 92 add(msg->data[i]);
Ibiltari 7:98280cef1c4f 93 }
Ibiltari 7:98280cef1c4f 94 }
Ibiltari 7:98280cef1c4f 95
Ibiltari 7:98280cef1c4f 96 /*=============================================================================
Ibiltari 7:98280cef1c4f 97 GETTING DATA
Ibiltari 7:98280cef1c4f 98 =============================================================================*/
Ibiltari 7:98280cef1c4f 99
Ibiltari 7:98280cef1c4f 100 OSCData * OSCMessage::getOSCData(int position){
Ibiltari 7:98280cef1c4f 101 if (position < dataCount){
Ibiltari 7:98280cef1c4f 102 OSCData * datum = data[position];
Ibiltari 7:98280cef1c4f 103 return datum;
Ibiltari 7:98280cef1c4f 104 } else {
Ibiltari 7:98280cef1c4f 105 error = INDEX_OUT_OF_BOUNDS;
Ibiltari 7:98280cef1c4f 106 return NULL;
Ibiltari 7:98280cef1c4f 107 }
Ibiltari 7:98280cef1c4f 108 }
Ibiltari 7:98280cef1c4f 109
Ibiltari 7:98280cef1c4f 110 int32_t OSCMessage::getInt(int position){
Ibiltari 7:98280cef1c4f 111 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 112 if (!hasError()){
Ibiltari 7:98280cef1c4f 113 return datum->getInt();
Ibiltari 7:98280cef1c4f 114 } else {
Ibiltari 7:98280cef1c4f 115 return -1;
Ibiltari 7:98280cef1c4f 116 }
Ibiltari 7:98280cef1c4f 117 }
Ibiltari 7:98280cef1c4f 118 /* OSC TIME disabled
Ibiltari 7:98280cef1c4f 119 osctime_t OSCMessage::getTime(int position){
Ibiltari 7:98280cef1c4f 120 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 121 if (!hasError()){
Ibiltari 7:98280cef1c4f 122 return datum->getTime();
Ibiltari 7:98280cef1c4f 123 } else {
Ibiltari 7:98280cef1c4f 124 return zerotime;
Ibiltari 7:98280cef1c4f 125 }
Ibiltari 7:98280cef1c4f 126 }
Ibiltari 7:98280cef1c4f 127 */
Ibiltari 7:98280cef1c4f 128 float OSCMessage::getFloat(int position){
Ibiltari 7:98280cef1c4f 129 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 130 if (!hasError()){
Ibiltari 7:98280cef1c4f 131 return datum->getFloat();
Ibiltari 7:98280cef1c4f 132 } else {
Ibiltari 7:98280cef1c4f 133 return -1;
Ibiltari 7:98280cef1c4f 134 }
Ibiltari 7:98280cef1c4f 135 }
Ibiltari 7:98280cef1c4f 136
Ibiltari 7:98280cef1c4f 137 double OSCMessage::getDouble(int position){
Ibiltari 7:98280cef1c4f 138 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 139 if (!hasError()){
Ibiltari 7:98280cef1c4f 140 return datum->getDouble();
Ibiltari 7:98280cef1c4f 141 } else {
Ibiltari 7:98280cef1c4f 142 return -1;
Ibiltari 7:98280cef1c4f 143 }
Ibiltari 7:98280cef1c4f 144 }
Ibiltari 7:98280cef1c4f 145
Ibiltari 7:98280cef1c4f 146 bool OSCMessage::getBoolean(int position){
Ibiltari 7:98280cef1c4f 147 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 148 if (!hasError()){
Ibiltari 7:98280cef1c4f 149 return datum->getBoolean();
Ibiltari 7:98280cef1c4f 150 } else {
Ibiltari 7:98280cef1c4f 151 return -1;
Ibiltari 7:98280cef1c4f 152 }
Ibiltari 7:98280cef1c4f 153 }
Ibiltari 7:98280cef1c4f 154
Ibiltari 7:98280cef1c4f 155
Ibiltari 7:98280cef1c4f 156 int OSCMessage::getString(int position, char * buffer){
Ibiltari 7:98280cef1c4f 157 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 158 if (!hasError()){
Ibiltari 7:98280cef1c4f 159 return datum->getString(buffer, datum->bytes);
Ibiltari 7:98280cef1c4f 160 } else {
Ibiltari 7:98280cef1c4f 161
Ibiltari 7:98280cef1c4f 162 return -1;
Ibiltari 7:98280cef1c4f 163
Ibiltari 7:98280cef1c4f 164 }
Ibiltari 7:98280cef1c4f 165 }
Ibiltari 7:98280cef1c4f 166
Ibiltari 7:98280cef1c4f 167 int OSCMessage::getString(int position, char * buffer, int bufferSize){
Ibiltari 7:98280cef1c4f 168 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 169 if (!hasError()){
Ibiltari 7:98280cef1c4f 170 //the number of bytes to copy is the smaller between the buffer size and the datum's byte length
Ibiltari 7:98280cef1c4f 171 int copyBytes = bufferSize < datum->bytes? bufferSize : datum->bytes;
Ibiltari 7:98280cef1c4f 172 return datum->getString(buffer, copyBytes);
Ibiltari 7:98280cef1c4f 173 } else {
Ibiltari 7:98280cef1c4f 174 #ifndef ESPxx
Ibiltari 7:98280cef1c4f 175 return (int)NULL;
Ibiltari 7:98280cef1c4f 176 #else
Ibiltari 7:98280cef1c4f 177 return -1;
Ibiltari 7:98280cef1c4f 178 #endif
Ibiltari 7:98280cef1c4f 179 }
Ibiltari 7:98280cef1c4f 180 }
Ibiltari 7:98280cef1c4f 181
Ibiltari 7:98280cef1c4f 182 int OSCMessage::getString(int position, char * buffer, int bufferSize, int offset, int size){
Ibiltari 7:98280cef1c4f 183 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 184 if (!hasError()){
Ibiltari 7:98280cef1c4f 185 //the number of bytes to copy is the smaller between the buffer size and the datum's byte length
Ibiltari 7:98280cef1c4f 186 int copyBytes = bufferSize < datum->bytes? bufferSize : datum->bytes;
Ibiltari 7:98280cef1c4f 187 return datum->getString(buffer, copyBytes, offset, size);
Ibiltari 7:98280cef1c4f 188 } else {
Ibiltari 7:98280cef1c4f 189 #ifndef ESPxx
Ibiltari 7:98280cef1c4f 190 return (int)NULL;
Ibiltari 7:98280cef1c4f 191 #else
Ibiltari 7:98280cef1c4f 192 return -1;
Ibiltari 7:98280cef1c4f 193 #endif
Ibiltari 7:98280cef1c4f 194 }
Ibiltari 7:98280cef1c4f 195 }
Ibiltari 7:98280cef1c4f 196
Ibiltari 7:98280cef1c4f 197 /*
Ibiltari 7:98280cef1c4f 198 int OSCMessage::getBlob(int position, uint8_t * buffer){
Ibiltari 7:98280cef1c4f 199 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 200 if (!hasError()){
Ibiltari 7:98280cef1c4f 201 return datum->getBlob(buffer);
Ibiltari 7:98280cef1c4f 202 } else {
Ibiltari 7:98280cef1c4f 203 #ifndef ESPxx
Ibiltari 7:98280cef1c4f 204 return NULL;
Ibiltari 7:98280cef1c4f 205 #else
Ibiltari 7:98280cef1c4f 206 return -1;
Ibiltari 7:98280cef1c4f 207 #endif
Ibiltari 7:98280cef1c4f 208 }
Ibiltari 7:98280cef1c4f 209 }
Ibiltari 7:98280cef1c4f 210
Ibiltari 7:98280cef1c4f 211 int OSCMessage::getBlob(int position, uint8_t * buffer, int bufferSize){
Ibiltari 7:98280cef1c4f 212 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 213 if (!hasError()){
Ibiltari 7:98280cef1c4f 214 return datum->getBlob(buffer, bufferSize);
Ibiltari 7:98280cef1c4f 215 } else {
Ibiltari 7:98280cef1c4f 216 #ifndef ESPxx
Ibiltari 7:98280cef1c4f 217 return NULL;
Ibiltari 7:98280cef1c4f 218 #else
Ibiltari 7:98280cef1c4f 219 return -1;
Ibiltari 7:98280cef1c4f 220 #endif
Ibiltari 7:98280cef1c4f 221 }
Ibiltari 7:98280cef1c4f 222 }
Ibiltari 7:98280cef1c4f 223
Ibiltari 7:98280cef1c4f 224 int OSCMessage::getBlob(int position, uint8_t * buffer, int bufferSize, int offset, int size){
Ibiltari 7:98280cef1c4f 225 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 226 if (!hasError()){
Ibiltari 7:98280cef1c4f 227 return datum->getBlob(buffer, bufferSize, offset, size);
Ibiltari 7:98280cef1c4f 228 } else {
Ibiltari 7:98280cef1c4f 229 #ifndef ESPxx
Ibiltari 7:98280cef1c4f 230 return NULL;
Ibiltari 7:98280cef1c4f 231 #else
Ibiltari 7:98280cef1c4f 232 return -1;
Ibiltari 7:98280cef1c4f 233 #endif
Ibiltari 7:98280cef1c4f 234 }
Ibiltari 7:98280cef1c4f 235 }
Ibiltari 7:98280cef1c4f 236
Ibiltari 7:98280cef1c4f 237 uint32_t OSCMessage::getBlobLength(int position)
Ibiltari 7:98280cef1c4f 238 {
Ibiltari 7:98280cef1c4f 239 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 240 if (!hasError()){
Ibiltari 7:98280cef1c4f 241 return datum->getBlobLength();
Ibiltari 7:98280cef1c4f 242 } else {
Ibiltari 7:98280cef1c4f 243 #ifndef ESPxx
Ibiltari 7:98280cef1c4f 244 return NULL;
Ibiltari 7:98280cef1c4f 245 #else
Ibiltari 7:98280cef1c4f 246 return -1;
Ibiltari 7:98280cef1c4f 247 #endif
Ibiltari 7:98280cef1c4f 248 }
Ibiltari 7:98280cef1c4f 249
Ibiltari 7:98280cef1c4f 250 }
Ibiltari 7:98280cef1c4f 251 */
Ibiltari 7:98280cef1c4f 252 char OSCMessage::getType(int position){
Ibiltari 7:98280cef1c4f 253 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 254 if (!hasError()){
Ibiltari 7:98280cef1c4f 255 return datum->type;
Ibiltari 7:98280cef1c4f 256 } else {
Ibiltari 7:98280cef1c4f 257 #ifndef ESPxx
Ibiltari 7:98280cef1c4f 258 return (int)NULL;
Ibiltari 7:98280cef1c4f 259 #else
Ibiltari 7:98280cef1c4f 260 return '\0';
Ibiltari 7:98280cef1c4f 261 #endif
Ibiltari 7:98280cef1c4f 262 }
Ibiltari 7:98280cef1c4f 263 }
Ibiltari 7:98280cef1c4f 264
Ibiltari 7:98280cef1c4f 265 int OSCMessage::getDataLength(int position){
Ibiltari 7:98280cef1c4f 266 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 267 if (!hasError()){
Ibiltari 7:98280cef1c4f 268 return datum->bytes;
Ibiltari 7:98280cef1c4f 269 } else {
Ibiltari 7:98280cef1c4f 270 return 0;
Ibiltari 7:98280cef1c4f 271 }
Ibiltari 7:98280cef1c4f 272 }
Ibiltari 7:98280cef1c4f 273
Ibiltari 7:98280cef1c4f 274 /*=============================================================================
Ibiltari 7:98280cef1c4f 275 TESTING DATA
Ibiltari 7:98280cef1c4f 276 =============================================================================*/
Ibiltari 7:98280cef1c4f 277
Ibiltari 7:98280cef1c4f 278 bool OSCMessage::testType(int position, char type){
Ibiltari 7:98280cef1c4f 279 OSCData * datum = getOSCData(position);
Ibiltari 7:98280cef1c4f 280 if (!hasError()){
Ibiltari 7:98280cef1c4f 281 return datum->type == type;
Ibiltari 7:98280cef1c4f 282 } else {
Ibiltari 7:98280cef1c4f 283 return false;
Ibiltari 7:98280cef1c4f 284 }
Ibiltari 7:98280cef1c4f 285 }
Ibiltari 7:98280cef1c4f 286
Ibiltari 7:98280cef1c4f 287 bool OSCMessage::isInt(int position){
Ibiltari 7:98280cef1c4f 288 return testType(position, 'i');
Ibiltari 7:98280cef1c4f 289 }
Ibiltari 7:98280cef1c4f 290
Ibiltari 7:98280cef1c4f 291 bool OSCMessage::isTime(int position){
Ibiltari 7:98280cef1c4f 292 return testType(position, 't');
Ibiltari 7:98280cef1c4f 293 }
Ibiltari 7:98280cef1c4f 294
Ibiltari 7:98280cef1c4f 295
Ibiltari 7:98280cef1c4f 296 bool OSCMessage::isFloat(int position){
Ibiltari 7:98280cef1c4f 297 return testType(position, 'f');
Ibiltari 7:98280cef1c4f 298 }
Ibiltari 7:98280cef1c4f 299
Ibiltari 7:98280cef1c4f 300 bool OSCMessage::isBlob(int position){
Ibiltari 7:98280cef1c4f 301 return testType(position, 'b');
Ibiltari 7:98280cef1c4f 302 }
Ibiltari 7:98280cef1c4f 303
Ibiltari 7:98280cef1c4f 304 bool OSCMessage::isChar(int position){
Ibiltari 7:98280cef1c4f 305 return testType(position, 'c');
Ibiltari 7:98280cef1c4f 306 }
Ibiltari 7:98280cef1c4f 307
Ibiltari 7:98280cef1c4f 308 bool OSCMessage::isString(int position){
Ibiltari 7:98280cef1c4f 309 return testType(position, 's');
Ibiltari 7:98280cef1c4f 310 }
Ibiltari 7:98280cef1c4f 311
Ibiltari 7:98280cef1c4f 312 bool OSCMessage::isDouble(int position){
Ibiltari 7:98280cef1c4f 313 return testType(position, 'd');
Ibiltari 7:98280cef1c4f 314 }
Ibiltari 7:98280cef1c4f 315 bool OSCMessage::isBoolean(int position){
Ibiltari 7:98280cef1c4f 316 return testType(position, 'T') || testType(position, 'F');
Ibiltari 7:98280cef1c4f 317 }
Ibiltari 7:98280cef1c4f 318
Ibiltari 7:98280cef1c4f 319
Ibiltari 7:98280cef1c4f 320 /*=============================================================================
Ibiltari 7:98280cef1c4f 321 PATTERN MATCHING
Ibiltari 7:98280cef1c4f 322 =============================================================================*/
Ibiltari 7:98280cef1c4f 323 /*
Ibiltari 7:98280cef1c4f 324 int OSCMessage::match(const char * pattern, int addr_offset){
Ibiltari 7:98280cef1c4f 325 int pattern_offset;
Ibiltari 7:98280cef1c4f 326 int address_offset;
Ibiltari 7:98280cef1c4f 327 int ret = osc_match(address + addr_offset, pattern, &pattern_offset, &address_offset);
Ibiltari 7:98280cef1c4f 328 char * next = (char *) (address + addr_offset + pattern_offset);
Ibiltari 7:98280cef1c4f 329 if (ret==3){
Ibiltari 7:98280cef1c4f 330 return pattern_offset;
Ibiltari 7:98280cef1c4f 331 } else if (pattern_offset > 0 && *next == '/'){
Ibiltari 7:98280cef1c4f 332 return pattern_offset;
Ibiltari 7:98280cef1c4f 333 } else {
Ibiltari 7:98280cef1c4f 334 return 0;
Ibiltari 7:98280cef1c4f 335 }
Ibiltari 7:98280cef1c4f 336 }
Ibiltari 7:98280cef1c4f 337
Ibiltari 7:98280cef1c4f 338 bool OSCMessage::fullMatch( const char * pattern, int addr_offset){
Ibiltari 7:98280cef1c4f 339 int pattern_offset;
Ibiltari 7:98280cef1c4f 340 int address_offset;
Ibiltari 7:98280cef1c4f 341 int ret = osc_match(address + addr_offset, pattern, &address_offset, &pattern_offset);
Ibiltari 7:98280cef1c4f 342 return (ret==3);
Ibiltari 7:98280cef1c4f 343 }
Ibiltari 7:98280cef1c4f 344
Ibiltari 7:98280cef1c4f 345 bool OSCMessage::dispatch(const char * pattern, void (*callback)(OSCMessage &), int addr_offset){
Ibiltari 7:98280cef1c4f 346 if (fullMatch(pattern, addr_offset)){
Ibiltari 7:98280cef1c4f 347 callback(*this);
Ibiltari 7:98280cef1c4f 348 return true;
Ibiltari 7:98280cef1c4f 349 } else {
Ibiltari 7:98280cef1c4f 350 return false;
Ibiltari 7:98280cef1c4f 351 }
Ibiltari 7:98280cef1c4f 352 }
Ibiltari 7:98280cef1c4f 353
Ibiltari 7:98280cef1c4f 354 bool OSCMessage::route(const char * pattern, void (*callback)(OSCMessage &, int), int initial_offset){
Ibiltari 7:98280cef1c4f 355 int match_offset = match(pattern, initial_offset);
Ibiltari 7:98280cef1c4f 356 if (match_offset>0){
Ibiltari 7:98280cef1c4f 357 callback(*this, match_offset + initial_offset);
Ibiltari 7:98280cef1c4f 358 return true;
Ibiltari 7:98280cef1c4f 359 } else {
Ibiltari 7:98280cef1c4f 360 return false;
Ibiltari 7:98280cef1c4f 361 }
Ibiltari 7:98280cef1c4f 362 }
Ibiltari 7:98280cef1c4f 363 */
Ibiltari 7:98280cef1c4f 364 /*=============================================================================
Ibiltari 7:98280cef1c4f 365 ADDRESS
Ibiltari 7:98280cef1c4f 366 =============================================================================*/
Ibiltari 7:98280cef1c4f 367
Ibiltari 7:98280cef1c4f 368 const char * OSCMessage::getAddress( int offset){
Ibiltari 7:98280cef1c4f 369
Ibiltari 7:98280cef1c4f 370 return address;
Ibiltari 7:98280cef1c4f 371 }
Ibiltari 7:98280cef1c4f 372
Ibiltari 7:98280cef1c4f 373 int OSCMessage::getAddress(char * buffer, int offset, int len){
Ibiltari 7:98280cef1c4f 374 strncpy(buffer, address+offset, len);
Ibiltari 7:98280cef1c4f 375 return strlen(buffer);
Ibiltari 7:98280cef1c4f 376 }
Ibiltari 7:98280cef1c4f 377
Ibiltari 7:98280cef1c4f 378 OSCMessage& OSCMessage::setAddress(const char * _address){
Ibiltari 7:98280cef1c4f 379 //free the previous address
Ibiltari 7:98280cef1c4f 380 free(address); // are we sure address was allocated?
Ibiltari 7:98280cef1c4f 381 //copy the address
Ibiltari 7:98280cef1c4f 382 char * addressMemory = (char *) malloc( (strlen(_address) + 1) * sizeof(char) );
Ibiltari 7:98280cef1c4f 383 if (addressMemory == NULL){
Ibiltari 7:98280cef1c4f 384 error = ALLOCFAILED;
Ibiltari 7:98280cef1c4f 385 address = NULL;
Ibiltari 7:98280cef1c4f 386 } else {
Ibiltari 7:98280cef1c4f 387 strcpy(addressMemory, _address);
Ibiltari 7:98280cef1c4f 388 address = addressMemory;
Ibiltari 7:98280cef1c4f 389 }
Ibiltari 7:98280cef1c4f 390 return *this;
Ibiltari 7:98280cef1c4f 391 }
Ibiltari 7:98280cef1c4f 392
Ibiltari 7:98280cef1c4f 393 /*=============================================================================
Ibiltari 7:98280cef1c4f 394 SIZE
Ibiltari 7:98280cef1c4f 395 =============================================================================*/
Ibiltari 7:98280cef1c4f 396
Ibiltari 7:98280cef1c4f 397 int OSCMessage::padSize(int _bytes){
Ibiltari 7:98280cef1c4f 398 int space = (_bytes + 3) / 4;
Ibiltari 7:98280cef1c4f 399 space *= 4;
Ibiltari 7:98280cef1c4f 400 return space - _bytes;
Ibiltari 7:98280cef1c4f 401 }
Ibiltari 7:98280cef1c4f 402
Ibiltari 7:98280cef1c4f 403 //returns the number of OSCData in the OSCMessage
Ibiltari 7:98280cef1c4f 404 int OSCMessage::size(){
Ibiltari 7:98280cef1c4f 405 return dataCount;
Ibiltari 7:98280cef1c4f 406 }
Ibiltari 7:98280cef1c4f 407
Ibiltari 7:98280cef1c4f 408 int OSCMessage::bytes(){
Ibiltari 7:98280cef1c4f 409 int messageSize = 0;
Ibiltari 7:98280cef1c4f 410 //send the address
Ibiltari 7:98280cef1c4f 411 int addrLen = strlen(address) + 1;
Ibiltari 7:98280cef1c4f 412 messageSize += addrLen;
Ibiltari 7:98280cef1c4f 413 //padding amount
Ibiltari 7:98280cef1c4f 414 int addrPad = padSize(addrLen);
Ibiltari 7:98280cef1c4f 415 messageSize += addrPad;
Ibiltari 7:98280cef1c4f 416 //add the comma seperator
Ibiltari 7:98280cef1c4f 417 messageSize += 1;
Ibiltari 7:98280cef1c4f 418 //add the types
Ibiltari 7:98280cef1c4f 419 messageSize += dataCount;
Ibiltari 7:98280cef1c4f 420 //pad the types
Ibiltari 7:98280cef1c4f 421 int typePad = padSize(dataCount + 1); //for the comma
Ibiltari 7:98280cef1c4f 422 if (typePad == 0){
Ibiltari 7:98280cef1c4f 423 typePad = 4; // to make sure the type string is null terminated
Ibiltari 7:98280cef1c4f 424 }
Ibiltari 7:98280cef1c4f 425 messageSize+=typePad;
Ibiltari 7:98280cef1c4f 426 //then the data
Ibiltari 7:98280cef1c4f 427 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 428 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 429 messageSize+=datum->bytes;
Ibiltari 7:98280cef1c4f 430 messageSize += padSize(datum->bytes);
Ibiltari 7:98280cef1c4f 431 }
Ibiltari 7:98280cef1c4f 432 return messageSize;
Ibiltari 7:98280cef1c4f 433 }
Ibiltari 7:98280cef1c4f 434
Ibiltari 7:98280cef1c4f 435 /*=============================================================================
Ibiltari 7:98280cef1c4f 436 ERROR HANDLING
Ibiltari 7:98280cef1c4f 437 =============================================================================*/
Ibiltari 7:98280cef1c4f 438
Ibiltari 7:98280cef1c4f 439 bool OSCMessage::hasError(){
Ibiltari 7:98280cef1c4f 440 bool retError = error != OSC_OK;
Ibiltari 7:98280cef1c4f 441 //test each of the data
Ibiltari 7:98280cef1c4f 442 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 443 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 444 retError |= datum->error != OSC_OK;
Ibiltari 7:98280cef1c4f 445 }
Ibiltari 7:98280cef1c4f 446 return retError;
Ibiltari 7:98280cef1c4f 447 }
Ibiltari 7:98280cef1c4f 448
Ibiltari 7:98280cef1c4f 449 OSCErrorCode OSCMessage::getError(){
Ibiltari 7:98280cef1c4f 450 return error;
Ibiltari 7:98280cef1c4f 451 }
Ibiltari 7:98280cef1c4f 452
Ibiltari 7:98280cef1c4f 453 /*=============================================================================
Ibiltari 7:98280cef1c4f 454 SENDING
Ibiltari 7:98280cef1c4f 455 =============================================================================*/
Ibiltari 7:98280cef1c4f 456 /*
Ibiltari 7:98280cef1c4f 457 OSCMessage& OSCMessage::send(Print &p){
Ibiltari 7:98280cef1c4f 458 //don't send a message with errors
Ibiltari 7:98280cef1c4f 459 if (hasError()){
Ibiltari 7:98280cef1c4f 460 return *this;
Ibiltari 7:98280cef1c4f 461 }
Ibiltari 7:98280cef1c4f 462 uint8_t nullChar = '\0';
Ibiltari 7:98280cef1c4f 463 //send the address
Ibiltari 7:98280cef1c4f 464 int addrLen = strlen(address) + 1;
Ibiltari 7:98280cef1c4f 465 //padding amount
Ibiltari 7:98280cef1c4f 466 int addrPad = padSize(addrLen);
Ibiltari 7:98280cef1c4f 467 //write it to the stream
Ibiltari 7:98280cef1c4f 468 p.write((uint8_t *) address, addrLen);
Ibiltari 7:98280cef1c4f 469 //add the padding
Ibiltari 7:98280cef1c4f 470 while(addrPad--){
Ibiltari 7:98280cef1c4f 471 p.write(nullChar);
Ibiltari 7:98280cef1c4f 472 }
Ibiltari 7:98280cef1c4f 473 //add the comma seperator
Ibiltari 7:98280cef1c4f 474 p.write((uint8_t) ',');
Ibiltari 7:98280cef1c4f 475 //add the types
Ibiltari 7:98280cef1c4f 476
Ibiltari 7:98280cef1c4f 477 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 478 p.write((uint8_t) getType(i));
Ibiltari 7:98280cef1c4f 479 }
Ibiltari 7:98280cef1c4f 480
Ibiltari 7:98280cef1c4f 481 //pad the types
Ibiltari 7:98280cef1c4f 482 int typePad = padSize(dataCount + 1); // 1 is for the comma
Ibiltari 7:98280cef1c4f 483 if (typePad == 0){
Ibiltari 7:98280cef1c4f 484 typePad = 4; // This is because the type string has to be null terminated
Ibiltari 7:98280cef1c4f 485 }
Ibiltari 7:98280cef1c4f 486 while(typePad--){
Ibiltari 7:98280cef1c4f 487 p.write(nullChar);
Ibiltari 7:98280cef1c4f 488 }
Ibiltari 7:98280cef1c4f 489 //write the data
Ibiltari 7:98280cef1c4f 490 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 491 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 492 if ((datum->type == 's') || (datum->type == 'b')){
Ibiltari 7:98280cef1c4f 493 p.write(datum->data.b, datum->bytes);
Ibiltari 7:98280cef1c4f 494 int dataPad = padSize(datum->bytes);
Ibiltari 7:98280cef1c4f 495 while(dataPad--){
Ibiltari 7:98280cef1c4f 496 p.write(nullChar);
Ibiltari 7:98280cef1c4f 497 }
Ibiltari 7:98280cef1c4f 498 } else if (datum->type == 'd'){
Ibiltari 7:98280cef1c4f 499 double d = BigEndian(datum->data.d);
Ibiltari 7:98280cef1c4f 500 uint8_t * ptr = (uint8_t *) &d;
Ibiltari 7:98280cef1c4f 501 p.write(ptr, 8);
Ibiltari 7:98280cef1c4f 502 } else if (datum->type == 't'){
Ibiltari 7:98280cef1c4f 503 osctime_t time = datum->data.time;
Ibiltari 7:98280cef1c4f 504 uint32_t d = BigEndian(time.seconds);
Ibiltari 7:98280cef1c4f 505 uint8_t * ptr = (uint8_t *) &d;
Ibiltari 7:98280cef1c4f 506 p.write(ptr, 4);
Ibiltari 7:98280cef1c4f 507 d = BigEndian(time.fractionofseconds);
Ibiltari 7:98280cef1c4f 508 ptr = (uint8_t *) &d;
Ibiltari 7:98280cef1c4f 509 p.write(ptr, 4);
Ibiltari 7:98280cef1c4f 510
Ibiltari 7:98280cef1c4f 511 } else if (datum->type == 'T' || datum->type == 'F')
Ibiltari 7:98280cef1c4f 512 { }
Ibiltari 7:98280cef1c4f 513 else { // float or int
Ibiltari 7:98280cef1c4f 514 uint32_t i = BigEndian(datum->data.i);
Ibiltari 7:98280cef1c4f 515 uint8_t * ptr = (uint8_t *) &i;
Ibiltari 7:98280cef1c4f 516 p.write(ptr, datum->bytes);
Ibiltari 7:98280cef1c4f 517 }
Ibiltari 7:98280cef1c4f 518 }
Ibiltari 7:98280cef1c4f 519 return *this;
Ibiltari 7:98280cef1c4f 520 }
Ibiltari 7:98280cef1c4f 521 */
Ibiltari 7:98280cef1c4f 522 /*=============================================================================
Ibiltari 7:98280cef1c4f 523 FILLING
Ibiltari 7:98280cef1c4f 524 =============================================================================*/
Ibiltari 7:98280cef1c4f 525
Ibiltari 7:98280cef1c4f 526 OSCMessage& OSCMessage::fill(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 527 decode(incomingByte);
Ibiltari 7:98280cef1c4f 528 return *this;
Ibiltari 7:98280cef1c4f 529 }
Ibiltari 7:98280cef1c4f 530
Ibiltari 7:98280cef1c4f 531 OSCMessage& OSCMessage::fill(uint8_t * incomingBytes, int length){
Ibiltari 7:98280cef1c4f 532 while (length--){
Ibiltari 7:98280cef1c4f 533 decode(*incomingBytes++);
Ibiltari 7:98280cef1c4f 534 }
Ibiltari 7:98280cef1c4f 535 return *this;
Ibiltari 7:98280cef1c4f 536 }
Ibiltari 7:98280cef1c4f 537
Ibiltari 7:98280cef1c4f 538 /*=============================================================================
Ibiltari 7:98280cef1c4f 539 DECODING
Ibiltari 7:98280cef1c4f 540 =============================================================================*/
Ibiltari 7:98280cef1c4f 541
Ibiltari 7:98280cef1c4f 542 void OSCMessage::decodeAddress(){
Ibiltari 7:98280cef1c4f 543 setAddress((char *) incomingBuffer);
Ibiltari 7:98280cef1c4f 544 //change the error from invalide message
Ibiltari 7:98280cef1c4f 545 error = OSC_OK;
Ibiltari 7:98280cef1c4f 546 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 547 }
Ibiltari 7:98280cef1c4f 548
Ibiltari 7:98280cef1c4f 549 void OSCMessage::decodeType(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 550 char type = incomingByte;
Ibiltari 7:98280cef1c4f 551 add(type);
Ibiltari 7:98280cef1c4f 552 }
Ibiltari 7:98280cef1c4f 553
Ibiltari 7:98280cef1c4f 554 void OSCMessage::decodeData(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 555 //get the first OSCData to re-set
Ibiltari 7:98280cef1c4f 556 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 557 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 558 if (datum->error == INVALID_OSC){
Ibiltari 7:98280cef1c4f 559 //set the contents of datum with the data received
Ibiltari 7:98280cef1c4f 560 switch (datum->type){
Ibiltari 7:98280cef1c4f 561 case 'i':
Ibiltari 7:98280cef1c4f 562 if (incomingBufferSize == 4){
Ibiltari 7:98280cef1c4f 563 //parse the buffer as an int
Ibiltari 7:98280cef1c4f 564 union {
Ibiltari 7:98280cef1c4f 565 int32_t i;
Ibiltari 7:98280cef1c4f 566 uint8_t b[4];
Ibiltari 7:98280cef1c4f 567 } u;
Ibiltari 7:98280cef1c4f 568 memcpy(u.b, incomingBuffer, 4);
Ibiltari 7:98280cef1c4f 569 int32_t dataVal = BigEndian(u.i);
Ibiltari 7:98280cef1c4f 570 set(i, (int32_t)dataVal);
Ibiltari 7:98280cef1c4f 571 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 572 }
Ibiltari 7:98280cef1c4f 573 break;
Ibiltari 7:98280cef1c4f 574 case 'f':
Ibiltari 7:98280cef1c4f 575 if (incomingBufferSize == 4){
Ibiltari 7:98280cef1c4f 576 //parse the buffer as a float
Ibiltari 7:98280cef1c4f 577 union {
Ibiltari 7:98280cef1c4f 578 float f;
Ibiltari 7:98280cef1c4f 579 uint8_t b[4];
Ibiltari 7:98280cef1c4f 580 } u;
Ibiltari 7:98280cef1c4f 581 memcpy(u.b, incomingBuffer, 4);
Ibiltari 7:98280cef1c4f 582 float dataVal = BigEndian(u.f);
Ibiltari 7:98280cef1c4f 583 set(i, dataVal);
Ibiltari 7:98280cef1c4f 584 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 585 }
Ibiltari 7:98280cef1c4f 586 break;
Ibiltari 7:98280cef1c4f 587 case 'd':
Ibiltari 7:98280cef1c4f 588 if (incomingBufferSize == 8){
Ibiltari 7:98280cef1c4f 589 //parse the buffer as a double
Ibiltari 7:98280cef1c4f 590 union {
Ibiltari 7:98280cef1c4f 591 double d;
Ibiltari 7:98280cef1c4f 592 uint8_t b[8];
Ibiltari 7:98280cef1c4f 593 } u;
Ibiltari 7:98280cef1c4f 594 memcpy(u.b, incomingBuffer, 8);
Ibiltari 7:98280cef1c4f 595 double dataVal = BigEndian(u.d);
Ibiltari 7:98280cef1c4f 596 set(i, dataVal);
Ibiltari 7:98280cef1c4f 597 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 598 }
Ibiltari 7:98280cef1c4f 599 break;
Ibiltari 7:98280cef1c4f 600 /* case 't':
Ibiltari 7:98280cef1c4f 601 if (incomingBufferSize == 8){
Ibiltari 7:98280cef1c4f 602 //parse the buffer as a timetag
Ibiltari 7:98280cef1c4f 603 union {
Ibiltari 7:98280cef1c4f 604 osctime_t t;
Ibiltari 7:98280cef1c4f 605 uint8_t b[8];
Ibiltari 7:98280cef1c4f 606 } u;
Ibiltari 7:98280cef1c4f 607 memcpy(u.b, incomingBuffer, 8);
Ibiltari 7:98280cef1c4f 608
Ibiltari 7:98280cef1c4f 609 u.t.seconds = BigEndian(u.t.seconds);
Ibiltari 7:98280cef1c4f 610 u.t.fractionofseconds = BigEndian(u.t.fractionofseconds);
Ibiltari 7:98280cef1c4f 611 set(i, u.t);
Ibiltari 7:98280cef1c4f 612 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 613 }
Ibiltari 7:98280cef1c4f 614 break;
Ibiltari 7:98280cef1c4f 615 */
Ibiltari 7:98280cef1c4f 616 case 's':
Ibiltari 7:98280cef1c4f 617 if (incomingByte == 0){
Ibiltari 7:98280cef1c4f 618 char * str = (char *) incomingBuffer;
Ibiltari 7:98280cef1c4f 619 set(i, str);
Ibiltari 7:98280cef1c4f 620 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 621 decodeState = DATA_PADDING;
Ibiltari 7:98280cef1c4f 622 }
Ibiltari 7:98280cef1c4f 623 break;
Ibiltari 7:98280cef1c4f 624 /* case 'b':
Ibiltari 7:98280cef1c4f 625 if (incomingBufferSize > 4){
Ibiltari 7:98280cef1c4f 626 //compute the expected blob size
Ibiltari 7:98280cef1c4f 627 union {
Ibiltari 7:98280cef1c4f 628 uint32_t i;
Ibiltari 7:98280cef1c4f 629 uint8_t b[4];
Ibiltari 7:98280cef1c4f 630 } u;
Ibiltari 7:98280cef1c4f 631 memcpy(u.b, incomingBuffer, 4);
Ibiltari 7:98280cef1c4f 632 uint32_t blobLength = BigEndian(u.i);
Ibiltari 7:98280cef1c4f 633 if (incomingBufferSize == (int)(blobLength + 4)){
Ibiltari 7:98280cef1c4f 634 set(i, incomingBuffer + 4, blobLength);
Ibiltari 7:98280cef1c4f 635 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 636 decodeState = DATA_PADDING;
Ibiltari 7:98280cef1c4f 637 }
Ibiltari 7:98280cef1c4f 638
Ibiltari 7:98280cef1c4f 639 }
Ibiltari 7:98280cef1c4f 640 break; */
Ibiltari 7:98280cef1c4f 641 }
Ibiltari 7:98280cef1c4f 642 //break out of the for loop once we've selected the first invalid message
Ibiltari 7:98280cef1c4f 643 break;
Ibiltari 7:98280cef1c4f 644 }
Ibiltari 7:98280cef1c4f 645 }
Ibiltari 7:98280cef1c4f 646 }
Ibiltari 7:98280cef1c4f 647
Ibiltari 7:98280cef1c4f 648 //does not validate the incoming OSC for correctness
Ibiltari 7:98280cef1c4f 649 void OSCMessage::decode(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 650 addToIncomingBuffer(incomingByte);
Ibiltari 7:98280cef1c4f 651 switch (decodeState){
Ibiltari 7:98280cef1c4f 652 case STANDBY:
Ibiltari 7:98280cef1c4f 653 if (incomingByte == '/'){
Ibiltari 7:98280cef1c4f 654 decodeState = ADDRESS;
Ibiltari 7:98280cef1c4f 655 }
Ibiltari 7:98280cef1c4f 656 break;
Ibiltari 7:98280cef1c4f 657 case ADDRESS:
Ibiltari 7:98280cef1c4f 658 if (incomingByte == 0){
Ibiltari 7:98280cef1c4f 659 //end of the address
Ibiltari 7:98280cef1c4f 660 //decode the address
Ibiltari 7:98280cef1c4f 661 decodeAddress();
Ibiltari 7:98280cef1c4f 662 //next state
Ibiltari 7:98280cef1c4f 663 decodeState = ADDRESS_PADDING;
Ibiltari 7:98280cef1c4f 664 }
Ibiltari 7:98280cef1c4f 665 break;
Ibiltari 7:98280cef1c4f 666 case ADDRESS_PADDING:
Ibiltari 7:98280cef1c4f 667 //it does not count the padding
Ibiltari 7:98280cef1c4f 668 if (incomingByte==','){
Ibiltari 7:98280cef1c4f 669 //next state
Ibiltari 7:98280cef1c4f 670 decodeState = TYPES;
Ibiltari 7:98280cef1c4f 671 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 672 }
Ibiltari 7:98280cef1c4f 673 break;
Ibiltari 7:98280cef1c4f 674 case TYPES:
Ibiltari 7:98280cef1c4f 675 if (incomingByte != 0){
Ibiltari 7:98280cef1c4f 676 //next state
Ibiltari 7:98280cef1c4f 677 decodeType(incomingByte);
Ibiltari 7:98280cef1c4f 678 } else {
Ibiltari 7:98280cef1c4f 679 decodeState = TYPES_PADDING;
Ibiltari 7:98280cef1c4f 680 }
Ibiltari 7:98280cef1c4f 681 //FALL THROUGH to test if it should go to the data state
Ibiltari 7:98280cef1c4f 682 case TYPES_PADDING: {
Ibiltari 7:98280cef1c4f 683 //compute the padding size for the types
Ibiltari 7:98280cef1c4f 684 //to determine the start of the data section
Ibiltari 7:98280cef1c4f 685 int typePad = padSize(dataCount + 1); // 1 is the comma
Ibiltari 7:98280cef1c4f 686 if (typePad == 0){
Ibiltari 7:98280cef1c4f 687 typePad = 4; // to make sure it will be null terminated
Ibiltari 7:98280cef1c4f 688 }
Ibiltari 7:98280cef1c4f 689 if (incomingBufferSize == (typePad + dataCount)){
Ibiltari 7:98280cef1c4f 690 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 691 decodeState = DATA;
Ibiltari 7:98280cef1c4f 692 }
Ibiltari 7:98280cef1c4f 693 }
Ibiltari 7:98280cef1c4f 694 break;
Ibiltari 7:98280cef1c4f 695 case DATA:
Ibiltari 7:98280cef1c4f 696 decodeData(incomingByte);
Ibiltari 7:98280cef1c4f 697 break;
Ibiltari 7:98280cef1c4f 698 case DATA_PADDING:{
Ibiltari 7:98280cef1c4f 699 //get the last valid data
Ibiltari 7:98280cef1c4f 700 for (int i = dataCount - 1; i >= 0; i--){
Ibiltari 7:98280cef1c4f 701 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 702 if (datum->error == OSC_OK){
Ibiltari 7:98280cef1c4f 703 //compute the padding size for the data
Ibiltari 7:98280cef1c4f 704 int dataPad = padSize(datum->bytes);
Ibiltari 7:98280cef1c4f 705 // if there is no padding required, switch back to DATA, and don't clear the incomingBuffer because it holds next data
Ibiltari 7:98280cef1c4f 706 if (dataPad == 0){
Ibiltari 7:98280cef1c4f 707 decodeState = DATA;
Ibiltari 7:98280cef1c4f 708 }
Ibiltari 7:98280cef1c4f 709 else if (incomingBufferSize == dataPad){
Ibiltari 7:98280cef1c4f 710 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 711 decodeState = DATA;
Ibiltari 7:98280cef1c4f 712 }
Ibiltari 7:98280cef1c4f 713 break;
Ibiltari 7:98280cef1c4f 714 }
Ibiltari 7:98280cef1c4f 715 }
Ibiltari 7:98280cef1c4f 716 }
Ibiltari 7:98280cef1c4f 717 break;
Ibiltari 7:98280cef1c4f 718 case DONE:
Ibiltari 7:98280cef1c4f 719 break; // TODO: is this correct? - was missing from original code, it did this by default
Ibiltari 7:98280cef1c4f 720 }
Ibiltari 7:98280cef1c4f 721 }
Ibiltari 7:98280cef1c4f 722
Ibiltari 7:98280cef1c4f 723
Ibiltari 7:98280cef1c4f 724 /*=============================================================================
Ibiltari 7:98280cef1c4f 725 INCOMING BUFFER MANAGEMENT
Ibiltari 7:98280cef1c4f 726 =============================================================================*/
Ibiltari 7:98280cef1c4f 727 #define OSCPREALLOCATEIZE 16
Ibiltari 7:98280cef1c4f 728 void OSCMessage::addToIncomingBuffer(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 729 //realloc some space for the new byte and stick it on the end
Ibiltari 7:98280cef1c4f 730 if(incomingBufferFree>0)
Ibiltari 7:98280cef1c4f 731 {
Ibiltari 7:98280cef1c4f 732 incomingBuffer[incomingBufferSize++] = incomingByte;
Ibiltari 7:98280cef1c4f 733 incomingBufferFree--;
Ibiltari 7:98280cef1c4f 734 }
Ibiltari 7:98280cef1c4f 735 else
Ibiltari 7:98280cef1c4f 736 {
Ibiltari 7:98280cef1c4f 737
Ibiltari 7:98280cef1c4f 738 incomingBuffer = (uint8_t *) realloc ( incomingBuffer, incomingBufferSize + 1 + OSCPREALLOCATEIZE);
Ibiltari 7:98280cef1c4f 739 if (incomingBuffer != NULL){
Ibiltari 7:98280cef1c4f 740 incomingBuffer[incomingBufferSize++] = incomingByte;
Ibiltari 7:98280cef1c4f 741 incomingBufferFree = OSCPREALLOCATEIZE;
Ibiltari 7:98280cef1c4f 742 } else {
Ibiltari 7:98280cef1c4f 743 error = ALLOCFAILED;
Ibiltari 7:98280cef1c4f 744 }
Ibiltari 7:98280cef1c4f 745 }
Ibiltari 7:98280cef1c4f 746 }
Ibiltari 7:98280cef1c4f 747
Ibiltari 7:98280cef1c4f 748 void OSCMessage::clearIncomingBuffer(){
Ibiltari 7:98280cef1c4f 749 incomingBuffer = (uint8_t *) realloc ( incomingBuffer, OSCPREALLOCATEIZE);
Ibiltari 7:98280cef1c4f 750 if (incomingBuffer != NULL){
Ibiltari 7:98280cef1c4f 751 incomingBufferFree = OSCPREALLOCATEIZE;
Ibiltari 7:98280cef1c4f 752 } else {
Ibiltari 7:98280cef1c4f 753 error = ALLOCFAILED;
Ibiltari 7:98280cef1c4f 754 incomingBuffer = NULL;
Ibiltari 7:98280cef1c4f 755
Ibiltari 7:98280cef1c4f 756 }
Ibiltari 7:98280cef1c4f 757 incomingBufferSize = 0;
Ibiltari 7:98280cef1c4f 758 }