Ibiltari Nora / OSC
Committer:
Ibiltari
Date:
Tue Dec 04 19:58:14 2018 +0100
Revision:
10:936c3afce828
Parent:
9:e4528f622bcc
Child:
12:f2c792ac1aca
String send working, receive needs fix

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