support OSC-string

Dependents:   OSCtoCVConverter

Fork of OSC by Toby Harris

Committer:
casiotone401
Date:
Tue Mar 08 11:50:30 2016 +0000
Revision:
8:73bce95a6853
Parent:
7:498455cded21
minor change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tobyspark 0:fdea65150534 1 /*
tobyspark 0:fdea65150534 2 mbedOSC.cpp
tobyspark 0:fdea65150534 3 */
casiotone401 4:601f6a1141fb 4
casiotone401 2:507dea4cc97a 5 #pragma O3
casiotone401 2:507dea4cc97a 6 #pragma Otime
tobyspark 0:fdea65150534 7
tobyspark 0:fdea65150534 8 #include "mbed.h"
tobyspark 0:fdea65150534 9 #include "mbedOSC.h"
tobyspark 0:fdea65150534 10 #include "stdarg.h"
casiotone401 2:507dea4cc97a 11 #include <string.h>
casiotone401 4:601f6a1141fb 12
tobyspark 0:fdea65150534 13 OSCMessage::OSCMessage() {
tobyspark 0:fdea65150534 14 // Initialize host address and port by default (as if this where the receiver message):
casiotone401 6:a47004fb44f5 15 // host=new Host(IpAddr(10, 0, 0, 1), DEFAULT_RECEIVEport, NULL);
tobyspark 0:fdea65150534 16 }
casiotone401 4:601f6a1141fb 17
casiotone401 2:507dea4cc97a 18 inline size_t strlength(const char *s)
casiotone401 2:507dea4cc97a 19 {
casiotone401 2:507dea4cc97a 20 size_t len = 0;
casiotone401 2:507dea4cc97a 21
casiotone401 2:507dea4cc97a 22 for (;;)
casiotone401 2:507dea4cc97a 23 {
casiotone401 2:507dea4cc97a 24 unsigned x = *(unsigned*)s;
casiotone401 2:507dea4cc97a 25 if ((x & 0xFF) == 0) return len;
casiotone401 2:507dea4cc97a 26 if ((x & 0xFF00) == 0) return len + 1;
casiotone401 2:507dea4cc97a 27 if ((x & 0xFF0000) == 0) return len + 2;
casiotone401 2:507dea4cc97a 28 if ((x & 0xFF000000) == 0) return len + 3;
casiotone401 2:507dea4cc97a 29 s += 4, len += 4;
casiotone401 2:507dea4cc97a 30 }
casiotone401 2:507dea4cc97a 31 }
casiotone401 5:5d585d5107da 32
casiotone401 4:601f6a1141fb 33
casiotone401 2:507dea4cc97a 34 const IpAddr& OSCMessage::getIp() {
casiotone401 2:507dea4cc97a 35
tobyspark 0:fdea65150534 36 return host.getIp();
tobyspark 0:fdea65150534 37 }
casiotone401 4:601f6a1141fb 38
casiotone401 4:601f6a1141fb 39
casiotone401 2:507dea4cc97a 40 const int& OSCMessage::getPort() {
casiotone401 2:507dea4cc97a 41
tobyspark 0:fdea65150534 42 return host.getPort();
tobyspark 0:fdea65150534 43 }
casiotone401 4:601f6a1141fb 44
casiotone401 4:601f6a1141fb 45
casiotone401 4:601f6a1141fb 46 uint8_t OSCMessage::getAddressNum(){
tobyspark 0:fdea65150534 47
tobyspark 0:fdea65150534 48 return addressNum;
tobyspark 0:fdea65150534 49 }
casiotone401 4:601f6a1141fb 50
casiotone401 4:601f6a1141fb 51
casiotone401 4:601f6a1141fb 52 uint8_t OSCMessage::getArgNum() {
tobyspark 0:fdea65150534 53
tobyspark 0:fdea65150534 54 return argNum;
tobyspark 0:fdea65150534 55 }
casiotone401 4:601f6a1141fb 56
casiotone401 4:601f6a1141fb 57
casiotone401 6:a47004fb44f5 58 char * OSCMessage::getAddress(uint8_t index) {
casiotone401 2:507dea4cc97a 59
casiotone401 6:a47004fb44f5 60 if (index > MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 61
casiotone401 6:a47004fb44f5 62 index = (MAX_ADDRESS - 1);
casiotone401 2:507dea4cc97a 63 }
casiotone401 2:507dea4cc97a 64
casiotone401 6:a47004fb44f5 65 return address[index];
tobyspark 0:fdea65150534 66 }
casiotone401 4:601f6a1141fb 67
casiotone401 4:601f6a1141fb 68
casiotone401 2:507dea4cc97a 69 char * OSCMessage::getTopAddress() {
tobyspark 0:fdea65150534 70
casiotone401 6:a47004fb44f5 71 return getAddress(0);
tobyspark 0:fdea65150534 72 }
casiotone401 4:601f6a1141fb 73
casiotone401 4:601f6a1141fb 74
casiotone401 2:507dea4cc97a 75 char * OSCMessage::getSubAddress() {
tobyspark 0:fdea65150534 76
casiotone401 6:a47004fb44f5 77 return getAddress(1);
tobyspark 0:fdea65150534 78 }
casiotone401 4:601f6a1141fb 79
casiotone401 4:601f6a1141fb 80
casiotone401 6:a47004fb44f5 81 char OSCMessage::getTypeTag(uint8_t index) {
casiotone401 2:507dea4cc97a 82
casiotone401 6:a47004fb44f5 83 if (index > MAX_ARG) {
casiotone401 2:507dea4cc97a 84
casiotone401 7:498455cded21 85 index = (MAX_ARG - 1);
casiotone401 2:507dea4cc97a 86 }
casiotone401 2:507dea4cc97a 87
casiotone401 6:a47004fb44f5 88 return typeTag[index];
casiotone401 6:a47004fb44f5 89 }
casiotone401 6:a47004fb44f5 90
casiotone401 6:a47004fb44f5 91
casiotone401 6:a47004fb44f5 92 int OSCMessage::getArgInt(uint8_t index) {
casiotone401 6:a47004fb44f5 93
casiotone401 6:a47004fb44f5 94 if (index > argNum) {
casiotone401 6:a47004fb44f5 95
casiotone401 6:a47004fb44f5 96 index = argNum;
casiotone401 6:a47004fb44f5 97 }
casiotone401 6:a47004fb44f5 98
casiotone401 8:73bce95a6853 99 return oscArgs[index].i;
tobyspark 0:fdea65150534 100 }
casiotone401 4:601f6a1141fb 101
casiotone401 4:601f6a1141fb 102
casiotone401 6:a47004fb44f5 103 float OSCMessage::getArgFloat(uint8_t index) {
casiotone401 2:507dea4cc97a 104
casiotone401 6:a47004fb44f5 105 if (index > argNum) {
casiotone401 2:507dea4cc97a 106
casiotone401 6:a47004fb44f5 107 index = argNum;
casiotone401 2:507dea4cc97a 108 }
casiotone401 2:507dea4cc97a 109
casiotone401 8:73bce95a6853 110 return oscArgs[index].f;
casiotone401 6:a47004fb44f5 111 }
casiotone401 6:a47004fb44f5 112
casiotone401 6:a47004fb44f5 113 double OSCMessage::getArgDouble(uint8_t index) {
casiotone401 6:a47004fb44f5 114
casiotone401 6:a47004fb44f5 115 if (index > argNum) {
casiotone401 6:a47004fb44f5 116
casiotone401 6:a47004fb44f5 117 index = argNum;
casiotone401 6:a47004fb44f5 118 }
casiotone401 2:507dea4cc97a 119
casiotone401 8:73bce95a6853 120 return oscArgs[index].d;
casiotone401 6:a47004fb44f5 121 }
casiotone401 6:a47004fb44f5 122
casiotone401 6:a47004fb44f5 123 char * OSCMessage::getArgString(uint8_t index) {
casiotone401 6:a47004fb44f5 124
casiotone401 6:a47004fb44f5 125 if (index > argNum) {
casiotone401 6:a47004fb44f5 126
casiotone401 6:a47004fb44f5 127 index = argNum;
casiotone401 6:a47004fb44f5 128 }
casiotone401 6:a47004fb44f5 129
casiotone401 8:73bce95a6853 130 return oscArgs[index].s;
tobyspark 0:fdea65150534 131 }
casiotone401 4:601f6a1141fb 132
casiotone401 6:a47004fb44f5 133 //-------------------------------------------------
casiotone401 6:a47004fb44f5 134 // setup SendHost IP&Port
casiotone401 4:601f6a1141fb 135
casiotone401 6:a47004fb44f5 136 void OSCMessage::setIp(uint8_t *ip) {
casiotone401 6:a47004fb44f5 137
casiotone401 6:a47004fb44f5 138 host.setIp(IpAddr(ip[0], ip[1], ip[2], ip[3]));
casiotone401 6:a47004fb44f5 139 }
casiotone401 6:a47004fb44f5 140
casiotone401 6:a47004fb44f5 141
casiotone401 6:a47004fb44f5 142 void OSCMessage::setIp( uint8_t ip1,
casiotone401 6:a47004fb44f5 143 uint8_t ip2,
casiotone401 6:a47004fb44f5 144 uint8_t ip3,
casiotone401 6:a47004fb44f5 145 uint8_t ip4 ) {
casiotone401 2:507dea4cc97a 146
casiotone401 6:a47004fb44f5 147 host.setIp(IpAddr(ip1, ip2, ip3, ip4));
casiotone401 6:a47004fb44f5 148 }
casiotone401 6:a47004fb44f5 149
casiotone401 6:a47004fb44f5 150
casiotone401 6:a47004fb44f5 151 void OSCMessage::setPort(uint16_t port) {
casiotone401 2:507dea4cc97a 152
casiotone401 6:a47004fb44f5 153 host.setPort(port);
tobyspark 0:fdea65150534 154 }
casiotone401 6:a47004fb44f5 155
casiotone401 6:a47004fb44f5 156
casiotone401 6:a47004fb44f5 157 //-------------------------------------------------
casiotone401 6:a47004fb44f5 158 // Construct OSC messages
casiotone401 6:a47004fb44f5 159
casiotone401 7:498455cded21 160 void OSCMessage::setTopAddress(char * topAddress) {
casiotone401 2:507dea4cc97a 161
casiotone401 7:498455cded21 162 address[0] = topAddress;
casiotone401 2:507dea4cc97a 163 address[1] = 0;
casiotone401 2:507dea4cc97a 164 addressNum = 1; // Note: this "erases" the subaddress! (is this a good idea?)
tobyspark 0:fdea65150534 165 }
casiotone401 4:601f6a1141fb 166
casiotone401 4:601f6a1141fb 167
casiotone401 7:498455cded21 168 void OSCMessage::setSubAddress(char * subAddress) {
casiotone401 2:507dea4cc97a 169
casiotone401 7:498455cded21 170 address[1] = subAddress;
casiotone401 2:507dea4cc97a 171 addressNum = 2; // Note: this assumes the top address was already set!
tobyspark 0:fdea65150534 172 }
casiotone401 4:601f6a1141fb 173
casiotone401 4:601f6a1141fb 174
casiotone401 7:498455cded21 175 void OSCMessage::setAddress(char * topAddress, char *subAddress) {
casiotone401 2:507dea4cc97a 176
casiotone401 6:a47004fb44f5 177 setTopAddress(topAddress);
casiotone401 6:a47004fb44f5 178 setSubAddress(subAddress);
casiotone401 2:507dea4cc97a 179
casiotone401 2:507dea4cc97a 180 addressNum = 2; // (unnecessary...)
tobyspark 0:fdea65150534 181 }
casiotone401 4:601f6a1141fb 182
casiotone401 4:601f6a1141fb 183
casiotone401 7:498455cded21 184 void OSCMessage::setAddress(uint8_t index, char * oscAddress) {
casiotone401 2:507dea4cc97a 185
casiotone401 6:a47004fb44f5 186 if (index > MAX_ADDRESS) {
casiotone401 6:a47004fb44f5 187
casiotone401 6:a47004fb44f5 188 index = (MAX_ADDRESS - 1);
casiotone401 2:507dea4cc97a 189 }
casiotone401 2:507dea4cc97a 190
casiotone401 7:498455cded21 191 address[index] = oscAddress;
casiotone401 6:a47004fb44f5 192 addressNum = (index + 1);
tobyspark 0:fdea65150534 193 }
casiotone401 4:601f6a1141fb 194
casiotone401 4:601f6a1141fb 195
casiotone401 4:601f6a1141fb 196
casiotone401 2:507dea4cc97a 197 void OSCMessage::setArgs(char *types,...) {
casiotone401 4:601f6a1141fb 198
casiotone401 3:f4118f0bc1ab 199 uint8_t i;
tobyspark 0:fdea65150534 200 va_list argList;
tobyspark 0:fdea65150534 201
casiotone401 2:507dea4cc97a 202 argNum = strlength(types);
casiotone401 2:507dea4cc97a 203
casiotone401 2:507dea4cc97a 204 if (argNum > MAX_ARG) {
casiotone401 2:507dea4cc97a 205
casiotone401 6:a47004fb44f5 206 argNum = (MAX_ARG - 1);
casiotone401 2:507dea4cc97a 207 }
tobyspark 0:fdea65150534 208
casiotone401 6:a47004fb44f5 209 va_start(argList, types);
casiotone401 2:507dea4cc97a 210
casiotone401 3:f4118f0bc1ab 211 for (i = 0 ; i < argNum ; ++i) {
tobyspark 0:fdea65150534 212
casiotone401 2:507dea4cc97a 213 typeTag[i] = types[i];
tobyspark 0:fdea65150534 214
tobyspark 0:fdea65150534 215 switch(types[i]) {
casiotone401 5:5d585d5107da 216
casiotone401 5:5d585d5107da 217 case 's':
casiotone401 8:73bce95a6853 218 oscArgs[i].s = va_arg(argList, char *);
casiotone401 5:5d585d5107da 219 break;
casiotone401 4:601f6a1141fb 220
tobyspark 0:fdea65150534 221 case 'i':
casiotone401 8:73bce95a6853 222 oscArgs[i].i = va_arg(argList, int);
tobyspark 0:fdea65150534 223 break;
casiotone401 4:601f6a1141fb 224
casiotone401 6:a47004fb44f5 225 case 'f':
casiotone401 8:73bce95a6853 226 oscArgs[i].f = va_arg(argList, double);
casiotone401 2:507dea4cc97a 227 break;
casiotone401 5:5d585d5107da 228
casiotone401 5:5d585d5107da 229 case 'd':
casiotone401 8:73bce95a6853 230 oscArgs[i].d = va_arg(argList, double);
casiotone401 5:5d585d5107da 231 break;
casiotone401 5:5d585d5107da 232
casiotone401 5:5d585d5107da 233 default:
tobyspark 0:fdea65150534 234 break;
tobyspark 1:63b72e393989 235 }
tobyspark 0:fdea65150534 236 }
tobyspark 0:fdea65150534 237 }
casiotone401 4:601f6a1141fb 238
tobyspark 0:fdea65150534 239 // ================================================================================================================================================
tobyspark 0:fdea65150534 240 // ==================================== OSCClass for sending and receiving OSC messages using UDP protocol =======================================
tobyspark 0:fdea65150534 241 // ================================================================================================================================================
tobyspark 0:fdea65150534 242 //The class define an object wrapping the UDP functions to send and receive OSC messages
casiotone401 4:601f6a1141fb 243
casiotone401 2:507dea4cc97a 244 OSCClass::OSCClass() {
casiotone401 2:507dea4cc97a 245
tobyspark 0:fdea65150534 246 udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
casiotone401 4:601f6a1141fb 247 newMessage = false;
tobyspark 0:fdea65150534 248 }
casiotone401 4:601f6a1141fb 249
casiotone401 2:507dea4cc97a 250 OSCClass::~OSCClass() {
casiotone401 2:507dea4cc97a 251
tobyspark 1:63b72e393989 252 udpSend.resetOnEvent();
tobyspark 1:63b72e393989 253 udpRec.close();
tobyspark 1:63b72e393989 254 }
casiotone401 4:601f6a1141fb 255
casiotone401 6:a47004fb44f5 256 OSCClass::OSCClass(OSCMessage *mes) {
casiotone401 2:507dea4cc97a 257
tobyspark 0:fdea65150534 258 udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
casiotone401 6:a47004fb44f5 259 receiverMessage = mes; // note: receiverMessage MUST be a pointer to the message, because we will modify things in it
casiotone401 2:507dea4cc97a 260 newMessage = false;
tobyspark 0:fdea65150534 261 }
casiotone401 4:601f6a1141fb 262
casiotone401 2:507dea4cc97a 263 void OSCClass::begin() {
tobyspark 0:fdea65150534 264 // setup receiver udp socket:
tobyspark 0:fdea65150534 265 udpRec.bind(receiverMessage->host);
tobyspark 0:fdea65150534 266 }
casiotone401 4:601f6a1141fb 267
casiotone401 4:601f6a1141fb 268
casiotone401 6:a47004fb44f5 269 void OSCClass::begin(uint16_t recievePort) {
casiotone401 2:507dea4cc97a 270
casiotone401 6:a47004fb44f5 271 receiverMessage->host.setPort(recievePort);
tobyspark 0:fdea65150534 272 // setup receiver udp socket:
tobyspark 0:fdea65150534 273 udpRec.bind(receiverMessage->host);
tobyspark 0:fdea65150534 274 }
casiotone401 4:601f6a1141fb 275
casiotone401 4:601f6a1141fb 276
casiotone401 6:a47004fb44f5 277 void OSCClass::setReceiveMessage(OSCMessage *mes) {
casiotone401 2:507dea4cc97a 278
casiotone401 6:a47004fb44f5 279 receiverMessage = mes;
tobyspark 0:fdea65150534 280 }
casiotone401 4:601f6a1141fb 281
casiotone401 2:507dea4cc97a 282 void OSCClass::onUDPSocketEvent(UDPSocketEvent e) {
casiotone401 2:507dea4cc97a 283
casiotone401 2:507dea4cc97a 284 switch(e) {
casiotone401 2:507dea4cc97a 285
casiotone401 2:507dea4cc97a 286 case UDPSOCKET_READABLE: //The only event for now
casiotone401 6:a47004fb44f5 287
casiotone401 6:a47004fb44f5 288 buflength = udpRec.recvfrom(rcvBuff, MAX_RECEIVEBUFF_SIZE, &auxhost); // QUESTION: auxhost should be equal to the receiver host I guess...
casiotone401 6:a47004fb44f5 289
casiotone401 6:a47004fb44f5 290 if (buflength > 0) {
casiotone401 6:a47004fb44f5 291
casiotone401 2:507dea4cc97a 292 decodePacket(receiverMessage); // convert to OSC message, and save it in receiverMessage
casiotone401 2:507dea4cc97a 293 newMessage = true;
tobyspark 0:fdea65150534 294
casiotone401 2:507dea4cc97a 295 messageReceivedCallback.call();
casiotone401 2:507dea4cc97a 296 }
casiotone401 2:507dea4cc97a 297 break;
casiotone401 2:507dea4cc97a 298 }
tobyspark 0:fdea65150534 299 }
casiotone401 4:601f6a1141fb 300
tobyspark 0:fdea65150534 301 /*
tobyspark 0:fdea65150534 302 Decode UDP packet and save it in the OSCMessage structure
tobyspark 0:fdea65150534 303 */
casiotone401 6:a47004fb44f5 304 void OSCClass::decodePacket(OSCMessage *mes) {
casiotone401 6:a47004fb44f5 305 int i;
tobyspark 0:fdea65150534 306 uint8_t d;
casiotone401 2:507dea4cc97a 307 uint8_t messagePos = 0;
casiotone401 2:507dea4cc97a 308 uint8_t adrCount = 0;
casiotone401 2:507dea4cc97a 309 uint8_t adrMesPos = 0;
casiotone401 2:507dea4cc97a 310 uint8_t packetCount = 0;
casiotone401 2:507dea4cc97a 311 uint8_t packetPos = 4;
tobyspark 0:fdea65150534 312
casiotone401 2:507dea4cc97a 313 receiverMessage->address[0] = tempAddress[0];
casiotone401 4:601f6a1141fb 314
tobyspark 0:fdea65150534 315 //(1) address process start =========================================
casiotone401 2:507dea4cc97a 316 do {
casiotone401 2:507dea4cc97a 317 d = rcvBuff[messagePos];
tobyspark 0:fdea65150534 318
casiotone401 2:507dea4cc97a 319 if ( (d == '/') && (messagePos > 0) ) {
casiotone401 4:601f6a1141fb 320
casiotone401 2:507dea4cc97a 321 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 322
casiotone401 2:507dea4cc97a 323 tempAddress[adrCount][adrMesPos] = 0;
casiotone401 4:601f6a1141fb 324
casiotone401 2:507dea4cc97a 325 ++adrCount;
casiotone401 2:507dea4cc97a 326 adrMesPos = 0;
casiotone401 4:601f6a1141fb 327
casiotone401 2:507dea4cc97a 328 receiverMessage->address[adrCount] = tempAddress[adrCount];
tobyspark 0:fdea65150534 329 }
casiotone401 4:601f6a1141fb 330
tobyspark 0:fdea65150534 331 }
tobyspark 0:fdea65150534 332
casiotone401 2:507dea4cc97a 333 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 334 //Added this in to remove the slashes out of final output
casiotone401 2:507dea4cc97a 335 if (d != '/') {
casiotone401 2:507dea4cc97a 336
casiotone401 7:498455cded21 337 tempAddress[adrCount][adrMesPos] = d;
tobyspark 0:fdea65150534 338
casiotone401 2:507dea4cc97a 339 if (packetCount > 3) {
casiotone401 2:507dea4cc97a 340
casiotone401 2:507dea4cc97a 341 packetCount = 0;
casiotone401 2:507dea4cc97a 342 packetPos += 4;
casiotone401 2:507dea4cc97a 343 }
casiotone401 2:507dea4cc97a 344
casiotone401 2:507dea4cc97a 345 ++adrMesPos;
casiotone401 2:507dea4cc97a 346 }
tobyspark 0:fdea65150534 347 }
tobyspark 0:fdea65150534 348
casiotone401 2:507dea4cc97a 349 ++messagePos;
casiotone401 2:507dea4cc97a 350 ++packetCount;
tobyspark 0:fdea65150534 351
casiotone401 2:507dea4cc97a 352 } while(d != 0);
tobyspark 0:fdea65150534 353
casiotone401 2:507dea4cc97a 354 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 355 ++adrCount;
casiotone401 2:507dea4cc97a 356 }
tobyspark 0:fdea65150534 357
casiotone401 2:507dea4cc97a 358 receiverMessage->addressNum = adrCount;
casiotone401 2:507dea4cc97a 359
casiotone401 2:507dea4cc97a 360 messagePos = packetPos;
casiotone401 4:601f6a1141fb 361
tobyspark 0:fdea65150534 362 //(2) type tag process starts =========================================
casiotone401 2:507dea4cc97a 363 packetCount = 0;
casiotone401 2:507dea4cc97a 364 packetPos += 4;
casiotone401 4:601f6a1141fb 365
casiotone401 2:507dea4cc97a 366 uint8_t typeTagPos = 0;
casiotone401 2:507dea4cc97a 367 uint8_t tempArgNum = 0;
casiotone401 4:601f6a1141fb 368
casiotone401 2:507dea4cc97a 369 while(rcvBuff[messagePos] != 0) {
tobyspark 0:fdea65150534 370
casiotone401 2:507dea4cc97a 371 if (rcvBuff[messagePos] != ',') {
casiotone401 2:507dea4cc97a 372
casiotone401 2:507dea4cc97a 373 if (typeTagPos < MAX_ARG) {
casiotone401 2:507dea4cc97a 374
casiotone401 2:507dea4cc97a 375 receiverMessage->typeTag[tempArgNum] = rcvBuff[messagePos];
casiotone401 2:507dea4cc97a 376 ++tempArgNum;
casiotone401 2:507dea4cc97a 377 }
tobyspark 0:fdea65150534 378
casiotone401 2:507dea4cc97a 379 ++typeTagPos;
casiotone401 2:507dea4cc97a 380
tobyspark 0:fdea65150534 381 }
tobyspark 0:fdea65150534 382
casiotone401 2:507dea4cc97a 383 ++packetCount;
casiotone401 2:507dea4cc97a 384
casiotone401 2:507dea4cc97a 385 if (packetCount > 3) {
casiotone401 2:507dea4cc97a 386
casiotone401 2:507dea4cc97a 387 packetCount = 0;
casiotone401 2:507dea4cc97a 388 packetPos += 4;
casiotone401 2:507dea4cc97a 389 }
casiotone401 2:507dea4cc97a 390
casiotone401 2:507dea4cc97a 391 ++messagePos;
tobyspark 0:fdea65150534 392 }
tobyspark 0:fdea65150534 393
casiotone401 2:507dea4cc97a 394 receiverMessage->argNum = tempArgNum;
casiotone401 4:601f6a1141fb 395
casiotone401 2:507dea4cc97a 396 messagePos = packetPos;
casiotone401 4:601f6a1141fb 397
tobyspark 0:fdea65150534 398 //(3) tempArg process starts =========================================
casiotone401 2:507dea4cc97a 399 for (i = 0; i < tempArgNum; ++i) {
tobyspark 0:fdea65150534 400
casiotone401 2:507dea4cc97a 401 adrMesPos = 3;
casiotone401 6:a47004fb44f5 402
casiotone401 6:a47004fb44f5 403 switch(receiverMessage->typeTag[i]) {
casiotone401 6:a47004fb44f5 404
casiotone401 6:a47004fb44f5 405 case 's':
casiotone401 6:a47004fb44f5 406
casiotone401 8:73bce95a6853 407 receiverMessage->oscArgs[i].s = (char *)tempArg[i];
casiotone401 6:a47004fb44f5 408 break;
casiotone401 4:601f6a1141fb 409
casiotone401 6:a47004fb44f5 410 case 'i':
casiotone401 6:a47004fb44f5 411
casiotone401 6:a47004fb44f5 412 union {
casiotone401 6:a47004fb44f5 413 int i;
casiotone401 6:a47004fb44f5 414 uint8_t b[4];
casiotone401 6:a47004fb44f5 415 } ui;
casiotone401 6:a47004fb44f5 416
casiotone401 6:a47004fb44f5 417 memcpy(ui.b, tempArg[i], 4);
casiotone401 8:73bce95a6853 418 receiverMessage->oscArgs[i].i = ui.i;
casiotone401 6:a47004fb44f5 419 break;
casiotone401 4:601f6a1141fb 420
casiotone401 6:a47004fb44f5 421 case 'f':
casiotone401 6:a47004fb44f5 422
casiotone401 6:a47004fb44f5 423 union {
casiotone401 6:a47004fb44f5 424 float f;
casiotone401 6:a47004fb44f5 425 uint8_t b[4];
casiotone401 6:a47004fb44f5 426 } uf;
casiotone401 6:a47004fb44f5 427
casiotone401 6:a47004fb44f5 428 memcpy(uf.b, tempArg[i], 4);
casiotone401 8:73bce95a6853 429 receiverMessage->oscArgs[i].f = uf.f;
casiotone401 6:a47004fb44f5 430 break;
casiotone401 6:a47004fb44f5 431
casiotone401 6:a47004fb44f5 432 case 'd':
casiotone401 6:a47004fb44f5 433
casiotone401 6:a47004fb44f5 434 union {
casiotone401 6:a47004fb44f5 435 double d;
casiotone401 6:a47004fb44f5 436 uint8_t b[8];
casiotone401 6:a47004fb44f5 437 } ud;
casiotone401 6:a47004fb44f5 438
casiotone401 6:a47004fb44f5 439 memcpy(ud.b, tempArg[i], 8);
casiotone401 8:73bce95a6853 440 receiverMessage->oscArgs[i].d = ud.d;
casiotone401 6:a47004fb44f5 441 break;
casiotone401 6:a47004fb44f5 442
casiotone401 6:a47004fb44f5 443 default:
casiotone401 6:a47004fb44f5 444 break;
tobyspark 0:fdea65150534 445 }
tobyspark 0:fdea65150534 446
casiotone401 6:a47004fb44f5 447 tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
casiotone401 6:a47004fb44f5 448 tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
casiotone401 6:a47004fb44f5 449 tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
casiotone401 6:a47004fb44f5 450 tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
casiotone401 6:a47004fb44f5 451
tobyspark 0:fdea65150534 452 }
tobyspark 0:fdea65150534 453 }
casiotone401 4:601f6a1141fb 454
casiotone401 5:5d585d5107da 455
casiotone401 2:507dea4cc97a 456 OSCMessage * OSCClass::getMessage() {
casiotone401 2:507dea4cc97a 457
casiotone401 2:507dea4cc97a 458 newMessage = false; // this indicate the user READ the message
tobyspark 0:fdea65150534 459 return receiverMessage;
tobyspark 0:fdea65150534 460 }
casiotone401 4:601f6a1141fb 461
casiotone401 4:601f6a1141fb 462
casiotone401 6:a47004fb44f5 463 void OSCClass::sendOsc(OSCMessage *mes) {
casiotone401 3:f4118f0bc1ab 464 uint8_t i, j = 0;
casiotone401 5:5d585d5107da 465 uint8_t lengthStart, lengthEnd;
casiotone401 6:a47004fb44f5 466 char buff[MAX_SENDBUFF_SIZE] = {0};
tobyspark 0:fdea65150534 467
casiotone401 6:a47004fb44f5 468 sendContainer = mes;
tobyspark 0:fdea65150534 469
tobyspark 0:fdea65150534 470 //1) Add name spaces:
casiotone401 2:507dea4cc97a 471 for (i = 0; i < sendContainer->addressNum; ++i) {
tobyspark 0:fdea65150534 472
casiotone401 2:507dea4cc97a 473 strcat(buff, sendContainer->address[i]); // note: an address is for instance: "/test" (including the "/")
tobyspark 0:fdea65150534 474 }
casiotone401 4:601f6a1141fb 475
tobyspark 0:fdea65150534 476 // pad with 0s to align in multiples of 4:
casiotone401 2:507dea4cc97a 477 lengthStart = strlength(buff);
casiotone401 4:601f6a1141fb 478
casiotone401 2:507dea4cc97a 479 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 2:507dea4cc97a 480
casiotone401 2:507dea4cc97a 481 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 2:507dea4cc97a 482
casiotone401 2:507dea4cc97a 483 buff[i] = '\0';
tobyspark 0:fdea65150534 484 }
casiotone401 6:a47004fb44f5 485
tobyspark 0:fdea65150534 486 //2) Add TypeTag:
casiotone401 2:507dea4cc97a 487 buff[lengthEnd++] = ','; // Note: type tag is for instance: ",if"
casiotone401 4:601f6a1141fb 488
casiotone401 2:507dea4cc97a 489 for (i = 0; i < sendContainer->argNum; ++i) {
casiotone401 2:507dea4cc97a 490
casiotone401 2:507dea4cc97a 491 buff[lengthEnd++] = sendContainer->typeTag[i];
tobyspark 0:fdea65150534 492 }
casiotone401 4:601f6a1141fb 493
tobyspark 0:fdea65150534 494 // pad with 0s to align in multiples of 4:
casiotone401 2:507dea4cc97a 495 lengthStart = lengthEnd;
casiotone401 2:507dea4cc97a 496
casiotone401 2:507dea4cc97a 497 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 2:507dea4cc97a 498
casiotone401 2:507dea4cc97a 499 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 2:507dea4cc97a 500
casiotone401 2:507dea4cc97a 501 buff[i] = '\0';
tobyspark 0:fdea65150534 502 }
tobyspark 0:fdea65150534 503
tobyspark 0:fdea65150534 504 //3) add argument values (Note: here only big endian):
casiotone401 2:507dea4cc97a 505
casiotone401 2:507dea4cc97a 506 for (i = 0; i < sendContainer->argNum; ++i) {
tobyspark 0:fdea65150534 507
casiotone401 7:498455cded21 508 switch (sendContainer->typeTag[i])
casiotone401 7:498455cded21 509 {
casiotone401 7:498455cded21 510 case 's':
casiotone401 7:498455cded21 511
casiotone401 8:73bce95a6853 512 while (sendContainer->oscArgs[i].s[j] != '\0') {
casiotone401 7:498455cded21 513
casiotone401 8:73bce95a6853 514 buff[lengthEnd++] = sendContainer->oscArgs[i].s[j++];
casiotone401 7:498455cded21 515 }
casiotone401 3:f4118f0bc1ab 516
casiotone401 7:498455cded21 517 // pad with 0s to align in multiples of 4:
casiotone401 7:498455cded21 518 lengthStart = lengthEnd;
casiotone401 7:498455cded21 519
casiotone401 7:498455cded21 520 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 7:498455cded21 521
casiotone401 7:498455cded21 522 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 7:498455cded21 523
casiotone401 7:498455cded21 524 buff[i] = '\0';
casiotone401 7:498455cded21 525 }
casiotone401 3:f4118f0bc1ab 526
casiotone401 7:498455cded21 527 break;
casiotone401 7:498455cded21 528
casiotone401 7:498455cded21 529 case 'i':
casiotone401 7:498455cded21 530 case 'f':
casiotone401 8:73bce95a6853 531 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[3];
casiotone401 8:73bce95a6853 532 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[2];
casiotone401 8:73bce95a6853 533 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[1];
casiotone401 8:73bce95a6853 534 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[0];
casiotone401 7:498455cded21 535 break;
casiotone401 7:498455cded21 536
casiotone401 7:498455cded21 537 case 'd':
casiotone401 8:73bce95a6853 538 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[7];
casiotone401 8:73bce95a6853 539 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[6];
casiotone401 8:73bce95a6853 540 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[5];
casiotone401 8:73bce95a6853 541 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[4];
casiotone401 8:73bce95a6853 542 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[3];
casiotone401 8:73bce95a6853 543 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[2];
casiotone401 8:73bce95a6853 544 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[1];
casiotone401 8:73bce95a6853 545 buff[lengthEnd++] = sendContainer->oscArgs[i]._b[0];
casiotone401 7:498455cded21 546 break;
casiotone401 7:498455cded21 547
casiotone401 7:498455cded21 548 default:
casiotone401 7:498455cded21 549 break;
casiotone401 7:498455cded21 550
casiotone401 2:507dea4cc97a 551 }
casiotone401 5:5d585d5107da 552
tobyspark 0:fdea65150534 553 }
tobyspark 0:fdea65150534 554
tobyspark 0:fdea65150534 555 //4) Send udp packet:
tobyspark 0:fdea65150534 556 //sendto( socketNo, (uint8_t *)buff, lengthEnd, sendContainer->ip, sendContainer->port );
tobyspark 0:fdea65150534 557 udpSend.sendto(buff , lengthEnd, &(sendContainer->host));
tobyspark 0:fdea65150534 558 }
casiotone401 4:601f6a1141fb 559
casiotone401 4:601f6a1141fb 560
tobyspark 0:fdea65150534 561 /*
tobyspark 0:fdea65150534 562 flush a receive buffer
tobyspark 0:fdea65150534 563 void OSCClass::flush() {
tobyspark 0:fdea65150534 564 while ( available() ){}
tobyspark 0:fdea65150534 565 }
tobyspark 0:fdea65150534 566 */
casiotone401 4:601f6a1141fb 567
casiotone401 4:601f6a1141fb 568
tobyspark 0:fdea65150534 569 void OSCClass::stop() {
tobyspark 0:fdea65150534 570 //close( socketNo );
tobyspark 0:fdea65150534 571 udpSend.resetOnEvent(); // disables callback
tobyspark 0:fdea65150534 572 }
casiotone401 4:601f6a1141fb 573
casiotone401 4:601f6a1141fb 574
casiotone401 4:601f6a1141fb 575