Ibiltari Nora / OSC
Committer:
Ibiltari
Date:
Fri Dec 14 20:51:12 2018 +0100
Revision:
18:3c678e1d5a84
Parent:
17:9479c15a9d54
Child:
19:35408d190f4e
Bundle changes, still 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 18:3c678e1d5a84 460 buff[i]=nullChar;
Ibiltari 9:e4528f622bcc 461 }
Ibiltari 9:e4528f622bcc 462
Ibiltari 18:3c678e1d5a84 463
Ibiltari 9:e4528f622bcc 464
Ibiltari 9:e4528f622bcc 465 lengthStart=lengthEnd;
Ibiltari 9:e4528f622bcc 466
Ibiltari 7:98280cef1c4f 467 //add the comma seperator
Ibiltari 9:e4528f622bcc 468
Ibiltari 9:e4528f622bcc 469 buff[lengthEnd++]=',';
Ibiltari 9:e4528f622bcc 470
Ibiltari 9:e4528f622bcc 471 /*
Ibiltari 7:98280cef1c4f 472 p.write((uint8_t) ',');
Ibiltari 7:98280cef1c4f 473 //add the types
Ibiltari 9:e4528f622bcc 474 */
Ibiltari 7:98280cef1c4f 475
Ibiltari 7:98280cef1c4f 476 for (int i = 0; i < dataCount; i++){
Ibiltari 9:e4528f622bcc 477 buff[lengthEnd++]=(uint8_t) getType(i);
Ibiltari 9:e4528f622bcc 478 // p.write((uint8_t) getType(i));
Ibiltari 7:98280cef1c4f 479 }
Ibiltari 7:98280cef1c4f 480
Ibiltari 9:e4528f622bcc 481
Ibiltari 7:98280cef1c4f 482 //pad the types
Ibiltari 7:98280cef1c4f 483 int typePad = padSize(dataCount + 1); // 1 is for the comma
Ibiltari 7:98280cef1c4f 484 if (typePad == 0){
Ibiltari 7:98280cef1c4f 485 typePad = 4; // This is because the type string has to be null terminated
Ibiltari 7:98280cef1c4f 486 }
Ibiltari 9:e4528f622bcc 487
Ibiltari 9:e4528f622bcc 488
Ibiltari 7:98280cef1c4f 489 while(typePad--){
Ibiltari 9:e4528f622bcc 490 buff[lengthEnd++]=nullChar;
Ibiltari 7:98280cef1c4f 491 }
Ibiltari 7:98280cef1c4f 492 //write the data
Ibiltari 9:e4528f622bcc 493
Ibiltari 9:e4528f622bcc 494
Ibiltari 7:98280cef1c4f 495 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 496 OSCData * datum = getOSCData(i);
Ibiltari 10:936c3afce828 497 if ((datum->type == 's') || (datum->type == 'b')){
Ibiltari 10:936c3afce828 498 for(int i = 0; i < datum->bytes; i++){
Ibiltari 10:936c3afce828 499 buff[lengthEnd++]=datum->data.b[i];
Ibiltari 10:936c3afce828 500 }
Ibiltari 10:936c3afce828 501
Ibiltari 10:936c3afce828 502
Ibiltari 7:98280cef1c4f 503 int dataPad = padSize(datum->bytes);
Ibiltari 7:98280cef1c4f 504 while(dataPad--){
Ibiltari 10:936c3afce828 505 buff[lengthEnd++]=nullChar;
Ibiltari 7:98280cef1c4f 506 }
Ibiltari 9:e4528f622bcc 507 } else if (datum->type == 'd'){
Ibiltari 9:e4528f622bcc 508 double d = BigEndian(datum->data.d); //TODO
Ibiltari 7:98280cef1c4f 509 uint8_t * ptr = (uint8_t *) &d;
Ibiltari 10:936c3afce828 510 for(int i = 0; i < 8; i++){
Ibiltari 10:936c3afce828 511 buff[lengthEnd++]=ptr[i];
Ibiltari 10:936c3afce828 512 }
Ibiltari 10:936c3afce828 513
Ibiltari 18:3c678e1d5a84 514 } else if (datum->type == 't'){
Ibiltari 7:98280cef1c4f 515 osctime_t time = datum->data.time;
Ibiltari 7:98280cef1c4f 516 uint32_t d = BigEndian(time.seconds);
Ibiltari 7:98280cef1c4f 517 uint8_t * ptr = (uint8_t *) &d;
Ibiltari 18:3c678e1d5a84 518 for(int i = 0; i < 4; i++){
Ibiltari 18:3c678e1d5a84 519 buff[lengthEnd++]=ptr[i];
Ibiltari 18:3c678e1d5a84 520 }
Ibiltari 18:3c678e1d5a84 521 // p.write(ptr, 4);
Ibiltari 7:98280cef1c4f 522 d = BigEndian(time.fractionofseconds);
Ibiltari 7:98280cef1c4f 523 ptr = (uint8_t *) &d;
Ibiltari 18:3c678e1d5a84 524 for(int i = 0; i < 4; i++){
Ibiltari 18:3c678e1d5a84 525 buff[lengthEnd++]=ptr[i];
Ibiltari 18:3c678e1d5a84 526 }
Ibiltari 18:3c678e1d5a84 527 // p.write(ptr, 4);
Ibiltari 7:98280cef1c4f 528
Ibiltari 18:3c678e1d5a84 529 } else if (datum->type == 'T' || datum->type == 'F')
Ibiltari 7:98280cef1c4f 530 { }
Ibiltari 7:98280cef1c4f 531 else { // float or int
Ibiltari 7:98280cef1c4f 532 uint32_t i = BigEndian(datum->data.i);
Ibiltari 7:98280cef1c4f 533 uint8_t * ptr = (uint8_t *) &i;
Ibiltari 9:e4528f622bcc 534 for (int i = 0; i < datum->bytes; i++){
Ibiltari 15:feef2588372f 535 buff[lengthEnd++]=ptr[i];
Ibiltari 15:feef2588372f 536 }
Ibiltari 9:e4528f622bcc 537 // p.write(ptr, datum->bytes);
Ibiltari 7:98280cef1c4f 538 }
Ibiltari 7:98280cef1c4f 539 }
Ibiltari 10:936c3afce828 540 p.sendto(host, port, buff, lengthEnd);
Ibiltari 7:98280cef1c4f 541 return *this;
Ibiltari 7:98280cef1c4f 542 }
Ibiltari 9:e4528f622bcc 543
Ibiltari 7:98280cef1c4f 544 /*=============================================================================
Ibiltari 7:98280cef1c4f 545 FILLING
Ibiltari 7:98280cef1c4f 546 =============================================================================*/
Ibiltari 7:98280cef1c4f 547
Ibiltari 7:98280cef1c4f 548 OSCMessage& OSCMessage::fill(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 549 decode(incomingByte);
Ibiltari 7:98280cef1c4f 550 return *this;
Ibiltari 7:98280cef1c4f 551 }
Ibiltari 7:98280cef1c4f 552
Ibiltari 7:98280cef1c4f 553 OSCMessage& OSCMessage::fill(uint8_t * incomingBytes, int length){
Ibiltari 7:98280cef1c4f 554 while (length--){
Ibiltari 7:98280cef1c4f 555 decode(*incomingBytes++);
Ibiltari 7:98280cef1c4f 556 }
Ibiltari 7:98280cef1c4f 557 return *this;
Ibiltari 7:98280cef1c4f 558 }
Ibiltari 7:98280cef1c4f 559
Ibiltari 7:98280cef1c4f 560 /*=============================================================================
Ibiltari 7:98280cef1c4f 561 DECODING
Ibiltari 7:98280cef1c4f 562 =============================================================================*/
Ibiltari 7:98280cef1c4f 563
Ibiltari 7:98280cef1c4f 564 void OSCMessage::decodeAddress(){
Ibiltari 7:98280cef1c4f 565 setAddress((char *) incomingBuffer);
Ibiltari 7:98280cef1c4f 566 //change the error from invalide message
Ibiltari 7:98280cef1c4f 567 error = OSC_OK;
Ibiltari 7:98280cef1c4f 568 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 569 }
Ibiltari 7:98280cef1c4f 570
Ibiltari 7:98280cef1c4f 571 void OSCMessage::decodeType(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 572 char type = incomingByte;
Ibiltari 7:98280cef1c4f 573 add(type);
Ibiltari 7:98280cef1c4f 574 }
Ibiltari 7:98280cef1c4f 575
Ibiltari 7:98280cef1c4f 576 void OSCMessage::decodeData(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 577 //get the first OSCData to re-set
Ibiltari 7:98280cef1c4f 578 for (int i = 0; i < dataCount; i++){
Ibiltari 7:98280cef1c4f 579 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 580 if (datum->error == INVALID_OSC){
Ibiltari 7:98280cef1c4f 581 //set the contents of datum with the data received
Ibiltari 7:98280cef1c4f 582 switch (datum->type){
Ibiltari 7:98280cef1c4f 583 case 'i':
Ibiltari 7:98280cef1c4f 584 if (incomingBufferSize == 4){
Ibiltari 7:98280cef1c4f 585 //parse the buffer as an int
Ibiltari 7:98280cef1c4f 586 union {
Ibiltari 7:98280cef1c4f 587 int32_t i;
Ibiltari 7:98280cef1c4f 588 uint8_t b[4];
Ibiltari 7:98280cef1c4f 589 } u;
Ibiltari 7:98280cef1c4f 590 memcpy(u.b, incomingBuffer, 4);
Ibiltari 7:98280cef1c4f 591 int32_t dataVal = BigEndian(u.i);
Ibiltari 7:98280cef1c4f 592 set(i, (int32_t)dataVal);
Ibiltari 7:98280cef1c4f 593 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 594 }
Ibiltari 7:98280cef1c4f 595 break;
Ibiltari 7:98280cef1c4f 596 case 'f':
Ibiltari 7:98280cef1c4f 597 if (incomingBufferSize == 4){
Ibiltari 7:98280cef1c4f 598 //parse the buffer as a float
Ibiltari 7:98280cef1c4f 599 union {
Ibiltari 7:98280cef1c4f 600 float f;
Ibiltari 7:98280cef1c4f 601 uint8_t b[4];
Ibiltari 7:98280cef1c4f 602 } u;
Ibiltari 7:98280cef1c4f 603 memcpy(u.b, incomingBuffer, 4);
Ibiltari 7:98280cef1c4f 604 float dataVal = BigEndian(u.f);
Ibiltari 7:98280cef1c4f 605 set(i, dataVal);
Ibiltari 7:98280cef1c4f 606 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 607 }
Ibiltari 7:98280cef1c4f 608 break;
Ibiltari 7:98280cef1c4f 609 case 'd':
Ibiltari 7:98280cef1c4f 610 if (incomingBufferSize == 8){
Ibiltari 7:98280cef1c4f 611 //parse the buffer as a double
Ibiltari 7:98280cef1c4f 612 union {
Ibiltari 7:98280cef1c4f 613 double d;
Ibiltari 7:98280cef1c4f 614 uint8_t b[8];
Ibiltari 7:98280cef1c4f 615 } u;
Ibiltari 7:98280cef1c4f 616 memcpy(u.b, incomingBuffer, 8);
Ibiltari 7:98280cef1c4f 617 double dataVal = BigEndian(u.d);
Ibiltari 7:98280cef1c4f 618 set(i, dataVal);
Ibiltari 7:98280cef1c4f 619 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 620 }
Ibiltari 7:98280cef1c4f 621 break;
Ibiltari 7:98280cef1c4f 622 /* case 't':
Ibiltari 7:98280cef1c4f 623 if (incomingBufferSize == 8){
Ibiltari 7:98280cef1c4f 624 //parse the buffer as a timetag
Ibiltari 7:98280cef1c4f 625 union {
Ibiltari 7:98280cef1c4f 626 osctime_t t;
Ibiltari 7:98280cef1c4f 627 uint8_t b[8];
Ibiltari 7:98280cef1c4f 628 } u;
Ibiltari 7:98280cef1c4f 629 memcpy(u.b, incomingBuffer, 8);
Ibiltari 7:98280cef1c4f 630
Ibiltari 7:98280cef1c4f 631 u.t.seconds = BigEndian(u.t.seconds);
Ibiltari 7:98280cef1c4f 632 u.t.fractionofseconds = BigEndian(u.t.fractionofseconds);
Ibiltari 7:98280cef1c4f 633 set(i, u.t);
Ibiltari 7:98280cef1c4f 634 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 635 }
Ibiltari 7:98280cef1c4f 636 break;
Ibiltari 7:98280cef1c4f 637 */
Ibiltari 7:98280cef1c4f 638 case 's':
Ibiltari 7:98280cef1c4f 639 if (incomingByte == 0){
Ibiltari 7:98280cef1c4f 640 char * str = (char *) incomingBuffer;
Ibiltari 7:98280cef1c4f 641 set(i, str);
Ibiltari 7:98280cef1c4f 642 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 643 decodeState = DATA_PADDING;
Ibiltari 7:98280cef1c4f 644 }
Ibiltari 7:98280cef1c4f 645 break;
Ibiltari 10:936c3afce828 646 case 'b':
Ibiltari 7:98280cef1c4f 647 if (incomingBufferSize > 4){
Ibiltari 7:98280cef1c4f 648 //compute the expected blob size
Ibiltari 7:98280cef1c4f 649 union {
Ibiltari 7:98280cef1c4f 650 uint32_t i;
Ibiltari 7:98280cef1c4f 651 uint8_t b[4];
Ibiltari 7:98280cef1c4f 652 } u;
Ibiltari 7:98280cef1c4f 653 memcpy(u.b, incomingBuffer, 4);
Ibiltari 7:98280cef1c4f 654 uint32_t blobLength = BigEndian(u.i);
Ibiltari 7:98280cef1c4f 655 if (incomingBufferSize == (int)(blobLength + 4)){
Ibiltari 7:98280cef1c4f 656 set(i, incomingBuffer + 4, blobLength);
Ibiltari 7:98280cef1c4f 657 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 658 decodeState = DATA_PADDING;
Ibiltari 7:98280cef1c4f 659 }
Ibiltari 7:98280cef1c4f 660
Ibiltari 7:98280cef1c4f 661 }
Ibiltari 10:936c3afce828 662 break;
Ibiltari 7:98280cef1c4f 663 }
Ibiltari 7:98280cef1c4f 664 //break out of the for loop once we've selected the first invalid message
Ibiltari 7:98280cef1c4f 665 break;
Ibiltari 7:98280cef1c4f 666 }
Ibiltari 7:98280cef1c4f 667 }
Ibiltari 7:98280cef1c4f 668 }
Ibiltari 7:98280cef1c4f 669
Ibiltari 7:98280cef1c4f 670 //does not validate the incoming OSC for correctness
Ibiltari 7:98280cef1c4f 671 void OSCMessage::decode(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 672 addToIncomingBuffer(incomingByte);
Ibiltari 7:98280cef1c4f 673 switch (decodeState){
Ibiltari 7:98280cef1c4f 674 case STANDBY:
Ibiltari 7:98280cef1c4f 675 if (incomingByte == '/'){
Ibiltari 7:98280cef1c4f 676 decodeState = ADDRESS;
Ibiltari 7:98280cef1c4f 677 }
Ibiltari 7:98280cef1c4f 678 break;
Ibiltari 7:98280cef1c4f 679 case ADDRESS:
Ibiltari 7:98280cef1c4f 680 if (incomingByte == 0){
Ibiltari 7:98280cef1c4f 681 //end of the address
Ibiltari 7:98280cef1c4f 682 //decode the address
Ibiltari 7:98280cef1c4f 683 decodeAddress();
Ibiltari 7:98280cef1c4f 684 //next state
Ibiltari 7:98280cef1c4f 685 decodeState = ADDRESS_PADDING;
Ibiltari 7:98280cef1c4f 686 }
Ibiltari 7:98280cef1c4f 687 break;
Ibiltari 7:98280cef1c4f 688 case ADDRESS_PADDING:
Ibiltari 7:98280cef1c4f 689 //it does not count the padding
Ibiltari 7:98280cef1c4f 690 if (incomingByte==','){
Ibiltari 7:98280cef1c4f 691 //next state
Ibiltari 7:98280cef1c4f 692 decodeState = TYPES;
Ibiltari 7:98280cef1c4f 693 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 694 }
Ibiltari 7:98280cef1c4f 695 break;
Ibiltari 7:98280cef1c4f 696 case TYPES:
Ibiltari 7:98280cef1c4f 697 if (incomingByte != 0){
Ibiltari 7:98280cef1c4f 698 //next state
Ibiltari 7:98280cef1c4f 699 decodeType(incomingByte);
Ibiltari 7:98280cef1c4f 700 } else {
Ibiltari 7:98280cef1c4f 701 decodeState = TYPES_PADDING;
Ibiltari 7:98280cef1c4f 702 }
Ibiltari 7:98280cef1c4f 703 //FALL THROUGH to test if it should go to the data state
Ibiltari 7:98280cef1c4f 704 case TYPES_PADDING: {
Ibiltari 7:98280cef1c4f 705 //compute the padding size for the types
Ibiltari 7:98280cef1c4f 706 //to determine the start of the data section
Ibiltari 7:98280cef1c4f 707 int typePad = padSize(dataCount + 1); // 1 is the comma
Ibiltari 7:98280cef1c4f 708 if (typePad == 0){
Ibiltari 7:98280cef1c4f 709 typePad = 4; // to make sure it will be null terminated
Ibiltari 7:98280cef1c4f 710 }
Ibiltari 7:98280cef1c4f 711 if (incomingBufferSize == (typePad + dataCount)){
Ibiltari 7:98280cef1c4f 712 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 713 decodeState = DATA;
Ibiltari 7:98280cef1c4f 714 }
Ibiltari 7:98280cef1c4f 715 }
Ibiltari 7:98280cef1c4f 716 break;
Ibiltari 7:98280cef1c4f 717 case DATA:
Ibiltari 7:98280cef1c4f 718 decodeData(incomingByte);
Ibiltari 7:98280cef1c4f 719 break;
Ibiltari 7:98280cef1c4f 720 case DATA_PADDING:{
Ibiltari 7:98280cef1c4f 721 //get the last valid data
Ibiltari 7:98280cef1c4f 722 for (int i = dataCount - 1; i >= 0; i--){
Ibiltari 7:98280cef1c4f 723 OSCData * datum = getOSCData(i);
Ibiltari 7:98280cef1c4f 724 if (datum->error == OSC_OK){
Ibiltari 7:98280cef1c4f 725 //compute the padding size for the data
Ibiltari 7:98280cef1c4f 726 int dataPad = padSize(datum->bytes);
Ibiltari 7:98280cef1c4f 727 // if there is no padding required, switch back to DATA, and don't clear the incomingBuffer because it holds next data
Ibiltari 7:98280cef1c4f 728 if (dataPad == 0){
Ibiltari 7:98280cef1c4f 729 decodeState = DATA;
Ibiltari 7:98280cef1c4f 730 }
Ibiltari 7:98280cef1c4f 731 else if (incomingBufferSize == dataPad){
Ibiltari 7:98280cef1c4f 732 clearIncomingBuffer();
Ibiltari 7:98280cef1c4f 733 decodeState = DATA;
Ibiltari 7:98280cef1c4f 734 }
Ibiltari 7:98280cef1c4f 735 break;
Ibiltari 7:98280cef1c4f 736 }
Ibiltari 7:98280cef1c4f 737 }
Ibiltari 7:98280cef1c4f 738 }
Ibiltari 7:98280cef1c4f 739 break;
Ibiltari 7:98280cef1c4f 740 case DONE:
Ibiltari 16:36d28d8e5491 741 break;
Ibiltari 7:98280cef1c4f 742 }
Ibiltari 7:98280cef1c4f 743 }
Ibiltari 7:98280cef1c4f 744
Ibiltari 7:98280cef1c4f 745
Ibiltari 7:98280cef1c4f 746 /*=============================================================================
Ibiltari 7:98280cef1c4f 747 INCOMING BUFFER MANAGEMENT
Ibiltari 7:98280cef1c4f 748 =============================================================================*/
Ibiltari 7:98280cef1c4f 749 #define OSCPREALLOCATEIZE 16
Ibiltari 7:98280cef1c4f 750 void OSCMessage::addToIncomingBuffer(uint8_t incomingByte){
Ibiltari 7:98280cef1c4f 751 //realloc some space for the new byte and stick it on the end
Ibiltari 7:98280cef1c4f 752 if(incomingBufferFree>0)
Ibiltari 7:98280cef1c4f 753 {
Ibiltari 7:98280cef1c4f 754 incomingBuffer[incomingBufferSize++] = incomingByte;
Ibiltari 7:98280cef1c4f 755 incomingBufferFree--;
Ibiltari 7:98280cef1c4f 756 }
Ibiltari 7:98280cef1c4f 757 else
Ibiltari 7:98280cef1c4f 758 {
Ibiltari 7:98280cef1c4f 759
Ibiltari 7:98280cef1c4f 760 incomingBuffer = (uint8_t *) realloc ( incomingBuffer, incomingBufferSize + 1 + OSCPREALLOCATEIZE);
Ibiltari 7:98280cef1c4f 761 if (incomingBuffer != NULL){
Ibiltari 7:98280cef1c4f 762 incomingBuffer[incomingBufferSize++] = incomingByte;
Ibiltari 7:98280cef1c4f 763 incomingBufferFree = OSCPREALLOCATEIZE;
Ibiltari 7:98280cef1c4f 764 } else {
Ibiltari 7:98280cef1c4f 765 error = ALLOCFAILED;
Ibiltari 7:98280cef1c4f 766 }
Ibiltari 7:98280cef1c4f 767 }
Ibiltari 7:98280cef1c4f 768 }
Ibiltari 7:98280cef1c4f 769
Ibiltari 7:98280cef1c4f 770 void OSCMessage::clearIncomingBuffer(){
Ibiltari 7:98280cef1c4f 771 incomingBuffer = (uint8_t *) realloc ( incomingBuffer, OSCPREALLOCATEIZE);
Ibiltari 7:98280cef1c4f 772 if (incomingBuffer != NULL){
Ibiltari 7:98280cef1c4f 773 incomingBufferFree = OSCPREALLOCATEIZE;
Ibiltari 7:98280cef1c4f 774 } else {
Ibiltari 7:98280cef1c4f 775 error = ALLOCFAILED;
Ibiltari 7:98280cef1c4f 776 incomingBuffer = NULL;
Ibiltari 7:98280cef1c4f 777
Ibiltari 7:98280cef1c4f 778 }
Ibiltari 7:98280cef1c4f 779 incomingBufferSize = 0;
Ibiltari 7:98280cef1c4f 780 }