support OSC-string

Dependents:   OSCtoCVConverter

Fork of OSC by Toby Harris

Committer:
casiotone401
Date:
Thu Feb 18 13:25:30 2016 +0000
Revision:
6:a47004fb44f5
Parent:
5:5d585d5107da
Child:
7:498455cded21
bugfix

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 6:a47004fb44f5 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 6:a47004fb44f5 99 return recArgs[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 6:a47004fb44f5 110 return recArgs[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 6:a47004fb44f5 120 return recArgs[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 6:a47004fb44f5 130 return recArgs[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 2:507dea4cc97a 160 void OSCMessage::setTopAddress(char *_address) {
casiotone401 2:507dea4cc97a 161
casiotone401 2:507dea4cc97a 162 address[0] = _address;
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 2:507dea4cc97a 168 void OSCMessage::setSubAddress(char *_address) {
casiotone401 2:507dea4cc97a 169
casiotone401 2:507dea4cc97a 170 address[1] = _address;
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 6:a47004fb44f5 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 6:a47004fb44f5 184 void OSCMessage::setAddress(uint8_t index, char *_address) {
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 6:a47004fb44f5 191 address[index] = _address;
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 6:a47004fb44f5 218 sendArgs[i].s = va_arg(argList, char *);
casiotone401 5:5d585d5107da 219 break;
casiotone401 4:601f6a1141fb 220
tobyspark 0:fdea65150534 221 case 'i':
casiotone401 6:a47004fb44f5 222 sendArgs[i].i = va_arg(argList, int);
tobyspark 0:fdea65150534 223 break;
casiotone401 4:601f6a1141fb 224
casiotone401 6:a47004fb44f5 225 case 'f':
casiotone401 6:a47004fb44f5 226 sendArgs[i].f = va_arg(argList, double);
casiotone401 2:507dea4cc97a 227 break;
casiotone401 5:5d585d5107da 228
casiotone401 5:5d585d5107da 229 case 'd':
casiotone401 6:a47004fb44f5 230 sendArgs[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 2:507dea4cc97a 288 Host auxhost;
casiotone401 6:a47004fb44f5 289 buflength = udpRec.recvfrom(rcvBuff, MAX_RECEIVEBUFF_SIZE, &auxhost); // QUESTION: auxhost should be equal to the receiver host I guess...
casiotone401 6:a47004fb44f5 290
casiotone401 6:a47004fb44f5 291 if (buflength > 0) {
casiotone401 6:a47004fb44f5 292
casiotone401 2:507dea4cc97a 293 decodePacket(receiverMessage); // convert to OSC message, and save it in receiverMessage
casiotone401 2:507dea4cc97a 294 newMessage = true;
tobyspark 0:fdea65150534 295
casiotone401 2:507dea4cc97a 296 messageReceivedCallback.call();
casiotone401 2:507dea4cc97a 297 }
casiotone401 2:507dea4cc97a 298 break;
casiotone401 2:507dea4cc97a 299 }
tobyspark 0:fdea65150534 300 }
casiotone401 4:601f6a1141fb 301
tobyspark 0:fdea65150534 302 /*
tobyspark 0:fdea65150534 303 Decode UDP packet and save it in the OSCMessage structure
tobyspark 0:fdea65150534 304 */
casiotone401 6:a47004fb44f5 305 void OSCClass::decodePacket(OSCMessage *mes) {
casiotone401 6:a47004fb44f5 306 int i;
tobyspark 0:fdea65150534 307 uint8_t d;
casiotone401 2:507dea4cc97a 308 uint8_t messagePos = 0;
casiotone401 2:507dea4cc97a 309 uint8_t adrCount = 0;
casiotone401 2:507dea4cc97a 310 uint8_t adrMesPos = 0;
casiotone401 2:507dea4cc97a 311 uint8_t packetCount = 0;
casiotone401 2:507dea4cc97a 312 uint8_t packetPos = 4;
tobyspark 0:fdea65150534 313
casiotone401 2:507dea4cc97a 314 receiverMessage->address[0] = tempAddress[0];
casiotone401 4:601f6a1141fb 315
tobyspark 0:fdea65150534 316 //(1) address process start =========================================
casiotone401 2:507dea4cc97a 317 do {
casiotone401 2:507dea4cc97a 318 d = rcvBuff[messagePos];
tobyspark 0:fdea65150534 319
casiotone401 2:507dea4cc97a 320 if ( (d == '/') && (messagePos > 0) ) {
casiotone401 4:601f6a1141fb 321
casiotone401 2:507dea4cc97a 322 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 323
casiotone401 2:507dea4cc97a 324 tempAddress[adrCount][adrMesPos] = 0;
casiotone401 4:601f6a1141fb 325
casiotone401 2:507dea4cc97a 326 ++adrCount;
casiotone401 2:507dea4cc97a 327 adrMesPos = 0;
casiotone401 4:601f6a1141fb 328
casiotone401 2:507dea4cc97a 329 receiverMessage->address[adrCount] = tempAddress[adrCount];
tobyspark 0:fdea65150534 330 }
casiotone401 4:601f6a1141fb 331
tobyspark 0:fdea65150534 332 }
tobyspark 0:fdea65150534 333
casiotone401 2:507dea4cc97a 334 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 335 //Added this in to remove the slashes out of final output
casiotone401 2:507dea4cc97a 336 if (d != '/') {
casiotone401 2:507dea4cc97a 337
casiotone401 2:507dea4cc97a 338 tempAddress[adrCount][adrMesPos]=d;
tobyspark 0:fdea65150534 339
casiotone401 2:507dea4cc97a 340 if (packetCount > 3) {
casiotone401 2:507dea4cc97a 341
casiotone401 2:507dea4cc97a 342 packetCount = 0;
casiotone401 2:507dea4cc97a 343 packetPos += 4;
casiotone401 2:507dea4cc97a 344 }
casiotone401 2:507dea4cc97a 345
casiotone401 2:507dea4cc97a 346 ++adrMesPos;
casiotone401 2:507dea4cc97a 347 }
tobyspark 0:fdea65150534 348 }
tobyspark 0:fdea65150534 349
casiotone401 2:507dea4cc97a 350 ++messagePos;
casiotone401 2:507dea4cc97a 351 ++packetCount;
tobyspark 0:fdea65150534 352
casiotone401 2:507dea4cc97a 353 } while(d != 0);
tobyspark 0:fdea65150534 354
casiotone401 2:507dea4cc97a 355 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 356 ++adrCount;
casiotone401 2:507dea4cc97a 357 }
tobyspark 0:fdea65150534 358
casiotone401 2:507dea4cc97a 359 receiverMessage->addressNum = adrCount;
casiotone401 2:507dea4cc97a 360
casiotone401 2:507dea4cc97a 361 messagePos = packetPos;
casiotone401 4:601f6a1141fb 362
tobyspark 0:fdea65150534 363 //(2) type tag process starts =========================================
casiotone401 2:507dea4cc97a 364 packetCount = 0;
casiotone401 2:507dea4cc97a 365 packetPos += 4;
casiotone401 4:601f6a1141fb 366
casiotone401 2:507dea4cc97a 367 uint8_t typeTagPos = 0;
casiotone401 2:507dea4cc97a 368 uint8_t tempArgNum = 0;
casiotone401 4:601f6a1141fb 369
casiotone401 2:507dea4cc97a 370 while(rcvBuff[messagePos] != 0) {
tobyspark 0:fdea65150534 371
casiotone401 2:507dea4cc97a 372 if (rcvBuff[messagePos] != ',') {
casiotone401 2:507dea4cc97a 373
casiotone401 2:507dea4cc97a 374 if (typeTagPos < MAX_ARG) {
casiotone401 2:507dea4cc97a 375
casiotone401 2:507dea4cc97a 376 receiverMessage->typeTag[tempArgNum] = rcvBuff[messagePos];
casiotone401 2:507dea4cc97a 377 ++tempArgNum;
casiotone401 2:507dea4cc97a 378 }
tobyspark 0:fdea65150534 379
casiotone401 2:507dea4cc97a 380 ++typeTagPos;
casiotone401 2:507dea4cc97a 381
tobyspark 0:fdea65150534 382 }
tobyspark 0:fdea65150534 383
casiotone401 2:507dea4cc97a 384 ++packetCount;
casiotone401 2:507dea4cc97a 385
casiotone401 2:507dea4cc97a 386 if (packetCount > 3) {
casiotone401 2:507dea4cc97a 387
casiotone401 2:507dea4cc97a 388 packetCount = 0;
casiotone401 2:507dea4cc97a 389 packetPos += 4;
casiotone401 2:507dea4cc97a 390 }
casiotone401 2:507dea4cc97a 391
casiotone401 2:507dea4cc97a 392 ++messagePos;
tobyspark 0:fdea65150534 393 }
tobyspark 0:fdea65150534 394
casiotone401 2:507dea4cc97a 395 receiverMessage->argNum = tempArgNum;
casiotone401 4:601f6a1141fb 396
casiotone401 2:507dea4cc97a 397 messagePos = packetPos;
casiotone401 4:601f6a1141fb 398
tobyspark 0:fdea65150534 399 //(3) tempArg process starts =========================================
casiotone401 2:507dea4cc97a 400 for (i = 0; i < tempArgNum; ++i) {
tobyspark 0:fdea65150534 401
casiotone401 2:507dea4cc97a 402 adrMesPos = 3;
casiotone401 6:a47004fb44f5 403
casiotone401 6:a47004fb44f5 404 switch(receiverMessage->typeTag[i]) {
casiotone401 6:a47004fb44f5 405
casiotone401 6:a47004fb44f5 406 case 's':
casiotone401 6:a47004fb44f5 407
casiotone401 6:a47004fb44f5 408 receiverMessage->recArgs[i].s = (char *)tempArg[i];
casiotone401 6:a47004fb44f5 409 break;
casiotone401 4:601f6a1141fb 410
casiotone401 6:a47004fb44f5 411 case 'i':
casiotone401 6:a47004fb44f5 412
casiotone401 6:a47004fb44f5 413 union {
casiotone401 6:a47004fb44f5 414 int i;
casiotone401 6:a47004fb44f5 415 uint8_t b[4];
casiotone401 6:a47004fb44f5 416 } ui;
casiotone401 6:a47004fb44f5 417
casiotone401 6:a47004fb44f5 418 memcpy(ui.b, tempArg[i], 4);
casiotone401 6:a47004fb44f5 419 receiverMessage->recArgs[i].i = ui.i;
casiotone401 6:a47004fb44f5 420 break;
casiotone401 4:601f6a1141fb 421
casiotone401 6:a47004fb44f5 422 case 'f':
casiotone401 6:a47004fb44f5 423
casiotone401 6:a47004fb44f5 424 union {
casiotone401 6:a47004fb44f5 425 float f;
casiotone401 6:a47004fb44f5 426 uint8_t b[4];
casiotone401 6:a47004fb44f5 427 } uf;
casiotone401 6:a47004fb44f5 428
casiotone401 6:a47004fb44f5 429 memcpy(uf.b, tempArg[i], 4);
casiotone401 6:a47004fb44f5 430 receiverMessage->recArgs[i].f = uf.f;
casiotone401 6:a47004fb44f5 431 break;
casiotone401 6:a47004fb44f5 432
casiotone401 6:a47004fb44f5 433 case 'd':
casiotone401 6:a47004fb44f5 434
casiotone401 6:a47004fb44f5 435 union {
casiotone401 6:a47004fb44f5 436 double d;
casiotone401 6:a47004fb44f5 437 uint8_t b[8];
casiotone401 6:a47004fb44f5 438 } ud;
casiotone401 6:a47004fb44f5 439
casiotone401 6:a47004fb44f5 440 memcpy(ud.b, tempArg[i], 8);
casiotone401 6:a47004fb44f5 441 receiverMessage->recArgs[i].d = ud.d;
casiotone401 6:a47004fb44f5 442 break;
casiotone401 6:a47004fb44f5 443
casiotone401 6:a47004fb44f5 444 default:
casiotone401 6:a47004fb44f5 445 break;
tobyspark 0:fdea65150534 446 }
tobyspark 0:fdea65150534 447
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 tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
casiotone401 6:a47004fb44f5 452
tobyspark 0:fdea65150534 453 }
tobyspark 0:fdea65150534 454 }
casiotone401 4:601f6a1141fb 455
casiotone401 5:5d585d5107da 456
casiotone401 2:507dea4cc97a 457 OSCMessage * OSCClass::getMessage() {
casiotone401 2:507dea4cc97a 458
casiotone401 2:507dea4cc97a 459 newMessage = false; // this indicate the user READ the message
tobyspark 0:fdea65150534 460 return receiverMessage;
tobyspark 0:fdea65150534 461 }
casiotone401 4:601f6a1141fb 462
casiotone401 4:601f6a1141fb 463
casiotone401 6:a47004fb44f5 464 void OSCClass::sendOsc(OSCMessage *mes) {
casiotone401 3:f4118f0bc1ab 465 uint8_t i, j = 0;
casiotone401 5:5d585d5107da 466 uint8_t lengthStart, lengthEnd;
casiotone401 6:a47004fb44f5 467 char buff[MAX_SENDBUFF_SIZE] = {0};
tobyspark 0:fdea65150534 468
casiotone401 6:a47004fb44f5 469 sendContainer = mes;
tobyspark 0:fdea65150534 470
tobyspark 0:fdea65150534 471 //1) Add name spaces:
casiotone401 2:507dea4cc97a 472 for (i = 0; i < sendContainer->addressNum; ++i) {
tobyspark 0:fdea65150534 473
casiotone401 2:507dea4cc97a 474 strcat(buff, sendContainer->address[i]); // note: an address is for instance: "/test" (including the "/")
tobyspark 0:fdea65150534 475 }
casiotone401 4:601f6a1141fb 476
tobyspark 0:fdea65150534 477 // pad with 0s to align in multiples of 4:
casiotone401 2:507dea4cc97a 478 lengthStart = strlength(buff);
casiotone401 4:601f6a1141fb 479
casiotone401 2:507dea4cc97a 480 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 2:507dea4cc97a 481
casiotone401 2:507dea4cc97a 482 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 2:507dea4cc97a 483
casiotone401 2:507dea4cc97a 484 buff[i] = '\0';
tobyspark 0:fdea65150534 485 }
casiotone401 6:a47004fb44f5 486
tobyspark 0:fdea65150534 487 //2) Add TypeTag:
casiotone401 2:507dea4cc97a 488 buff[lengthEnd++] = ','; // Note: type tag is for instance: ",if"
casiotone401 4:601f6a1141fb 489
casiotone401 2:507dea4cc97a 490 for (i = 0; i < sendContainer->argNum; ++i) {
casiotone401 2:507dea4cc97a 491
casiotone401 2:507dea4cc97a 492 buff[lengthEnd++] = sendContainer->typeTag[i];
tobyspark 0:fdea65150534 493 }
casiotone401 4:601f6a1141fb 494
tobyspark 0:fdea65150534 495 // pad with 0s to align in multiples of 4:
casiotone401 2:507dea4cc97a 496 lengthStart = lengthEnd;
casiotone401 2:507dea4cc97a 497
casiotone401 2:507dea4cc97a 498 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 2:507dea4cc97a 499
casiotone401 2:507dea4cc97a 500 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 2:507dea4cc97a 501
casiotone401 2:507dea4cc97a 502 buff[i] = '\0';
tobyspark 0:fdea65150534 503 }
tobyspark 0:fdea65150534 504
tobyspark 0:fdea65150534 505 //3) add argument values (Note: here only big endian):
tobyspark 0:fdea65150534 506 uint8_t *v;
casiotone401 2:507dea4cc97a 507
casiotone401 2:507dea4cc97a 508 for (i = 0; i < sendContainer->argNum; ++i) {
tobyspark 0:fdea65150534 509
casiotone401 5:5d585d5107da 510 if (sendContainer->typeTag[i] == 's') { // strings
casiotone401 2:507dea4cc97a 511
casiotone401 6:a47004fb44f5 512 v = (uint8_t *)sendContainer->sendArgs[i].s;
casiotone401 2:507dea4cc97a 513
casiotone401 3:f4118f0bc1ab 514 while (v[j] != '\0') {
casiotone401 2:507dea4cc97a 515
casiotone401 3:f4118f0bc1ab 516 buff[lengthEnd++] = v[j++];
casiotone401 2:507dea4cc97a 517 }
casiotone401 2:507dea4cc97a 518
casiotone401 3:f4118f0bc1ab 519 // pad with 0s to align in multiples of 4:
casiotone401 3:f4118f0bc1ab 520 lengthStart = lengthEnd;
casiotone401 3:f4118f0bc1ab 521
casiotone401 3:f4118f0bc1ab 522 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 3:f4118f0bc1ab 523
casiotone401 3:f4118f0bc1ab 524 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 3:f4118f0bc1ab 525
casiotone401 3:f4118f0bc1ab 526 buff[i] = '\0';
casiotone401 3:f4118f0bc1ab 527 }
casiotone401 4:601f6a1141fb 528
casiotone401 5:5d585d5107da 529 } else if (sendContainer->typeTag[i] == 'd') { // double
casiotone401 5:5d585d5107da 530
casiotone401 6:a47004fb44f5 531 v = (uint8_t *)&sendContainer->sendArgs[i].d;
casiotone401 5:5d585d5107da 532
casiotone401 5:5d585d5107da 533 buff[lengthEnd++] = v[7];
casiotone401 5:5d585d5107da 534 buff[lengthEnd++] = v[6];
casiotone401 5:5d585d5107da 535 buff[lengthEnd++] = v[5];
casiotone401 5:5d585d5107da 536 buff[lengthEnd++] = v[4];
casiotone401 5:5d585d5107da 537 buff[lengthEnd++] = v[3];
casiotone401 5:5d585d5107da 538 buff[lengthEnd++] = v[2];
casiotone401 5:5d585d5107da 539 buff[lengthEnd++] = v[1];
casiotone401 5:5d585d5107da 540 buff[lengthEnd++] = v[0];
casiotone401 5:5d585d5107da 541
casiotone401 5:5d585d5107da 542 } if (sendContainer->typeTag[i] == 'f') { // float
casiotone401 5:5d585d5107da 543
casiotone401 6:a47004fb44f5 544 v = (uint8_t *)&sendContainer->sendArgs[i].f;
casiotone401 5:5d585d5107da 545
casiotone401 5:5d585d5107da 546 buff[lengthEnd++] = v[3];
casiotone401 5:5d585d5107da 547 buff[lengthEnd++] = v[2];
casiotone401 5:5d585d5107da 548 buff[lengthEnd++] = v[1];
casiotone401 5:5d585d5107da 549 buff[lengthEnd++] = v[0];
casiotone401 5:5d585d5107da 550
casiotone401 5:5d585d5107da 551 } else { // int
casiotone401 5:5d585d5107da 552
casiotone401 6:a47004fb44f5 553 v = (uint8_t *)&sendContainer->sendArgs[i].i;
casiotone401 5:5d585d5107da 554
casiotone401 5:5d585d5107da 555 buff[lengthEnd++] = v[3];
casiotone401 5:5d585d5107da 556 buff[lengthEnd++] = v[2];
casiotone401 5:5d585d5107da 557 buff[lengthEnd++] = v[1];
casiotone401 5:5d585d5107da 558 buff[lengthEnd++] = v[0];
casiotone401 2:507dea4cc97a 559 }
casiotone401 5:5d585d5107da 560
tobyspark 0:fdea65150534 561 }
tobyspark 0:fdea65150534 562
tobyspark 0:fdea65150534 563 //4) Send udp packet:
tobyspark 0:fdea65150534 564 //sendto( socketNo, (uint8_t *)buff, lengthEnd, sendContainer->ip, sendContainer->port );
tobyspark 0:fdea65150534 565 udpSend.sendto(buff , lengthEnd, &(sendContainer->host));
tobyspark 0:fdea65150534 566 }
casiotone401 4:601f6a1141fb 567
casiotone401 4:601f6a1141fb 568
tobyspark 0:fdea65150534 569 /*
tobyspark 0:fdea65150534 570 flush a receive buffer
tobyspark 0:fdea65150534 571 void OSCClass::flush() {
tobyspark 0:fdea65150534 572 while ( available() ){}
tobyspark 0:fdea65150534 573 }
tobyspark 0:fdea65150534 574 */
casiotone401 4:601f6a1141fb 575
casiotone401 4:601f6a1141fb 576
tobyspark 0:fdea65150534 577 void OSCClass::stop() {
tobyspark 0:fdea65150534 578 //close( socketNo );
tobyspark 0:fdea65150534 579 udpSend.resetOnEvent(); // disables callback
tobyspark 0:fdea65150534 580 }
casiotone401 4:601f6a1141fb 581
casiotone401 4:601f6a1141fb 582
casiotone401 4:601f6a1141fb 583