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