support OSC-string

Dependents:   OSCtoCVConverter

Fork of OSC by Toby Harris

Committer:
casiotone401
Date:
Tue Feb 16 11:30:55 2016 +0000
Revision:
5:5d585d5107da
Parent:
4:601f6a1141fb
Child:
6:a47004fb44f5
bug fix

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