support OSC-string

Dependents:   OSCtoCVConverter

Fork of OSC by Toby Harris

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