Ibiltari Nora / OSC
Committer:
Ibiltari
Date:
Fri Dec 14 19:36:56 2018 +0100
Revision:
16:36d28d8e5491
Parent:
13:c2fe6b720f94
Child:
17:9479c15a9d54
Bundle send WIP

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