support OSC-string

Dependents:   OSCtoCVConverter

Fork of OSC by Toby Harris

Committer:
casiotone401
Date:
Sun Aug 02 09:56:26 2015 +0000
Revision:
2:507dea4cc97a
Parent:
1:63b72e393989
Child:
3:f4118f0bc1ab
added OSC-string type

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 2:507dea4cc97a 115 int32_t OSCMessage::getArgInt(uint8_t _index) {
tobyspark 0:fdea65150534 116 int32_t *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
tobyspark 0:fdea65150534 123 value = (int32_t *)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,...) {
tobyspark 0:fdea65150534 182
tobyspark 0:fdea65150534 183 va_list argList;
tobyspark 0:fdea65150534 184
casiotone401 2:507dea4cc97a 185 argNum = strlength(types);
casiotone401 2:507dea4cc97a 186
casiotone401 2:507dea4cc97a 187 if (argNum > MAX_ARG) {
casiotone401 2:507dea4cc97a 188
casiotone401 2:507dea4cc97a 189 argNum = MAX_ARG - 1;
casiotone401 2:507dea4cc97a 190 }
tobyspark 0:fdea65150534 191
tobyspark 0:fdea65150534 192 va_start( argList, types );
casiotone401 2:507dea4cc97a 193
casiotone401 2:507dea4cc97a 194 for (uint8_t i = 0 ; i < argNum ; ++i) {
tobyspark 0:fdea65150534 195
casiotone401 2:507dea4cc97a 196 typeTag[i] = types[i];
tobyspark 0:fdea65150534 197
tobyspark 0:fdea65150534 198 switch(types[i]) {
tobyspark 0:fdea65150534 199 case 'i':
casiotone401 2:507dea4cc97a 200 arg[i] = (uint32_t *)va_arg(argList, int32_t *);
tobyspark 0:fdea65150534 201 break;
tobyspark 0:fdea65150534 202 case 'f':
casiotone401 2:507dea4cc97a 203 arg[i] = va_arg(argList, float *);
casiotone401 2:507dea4cc97a 204 break;
casiotone401 2:507dea4cc97a 205 case 's':
casiotone401 2:507dea4cc97a 206 arg[i] = va_arg(argList, char *);
tobyspark 0:fdea65150534 207 break;
tobyspark 1:63b72e393989 208 }
tobyspark 0:fdea65150534 209 }
tobyspark 0:fdea65150534 210 }
tobyspark 0:fdea65150534 211
tobyspark 0:fdea65150534 212 // ================================================================================================================================================
tobyspark 0:fdea65150534 213 // ==================================== OSCClass for sending and receiving OSC messages using UDP protocol =======================================
tobyspark 0:fdea65150534 214 // ================================================================================================================================================
tobyspark 0:fdea65150534 215 //The class define an object wrapping the UDP functions to send and receive OSC messages
tobyspark 0:fdea65150534 216
casiotone401 2:507dea4cc97a 217 OSCClass::OSCClass() {
casiotone401 2:507dea4cc97a 218
tobyspark 0:fdea65150534 219 udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
tobyspark 0:fdea65150534 220 newMessage=false;
tobyspark 0:fdea65150534 221 }
tobyspark 0:fdea65150534 222
casiotone401 2:507dea4cc97a 223 OSCClass::~OSCClass() {
casiotone401 2:507dea4cc97a 224
tobyspark 1:63b72e393989 225 udpSend.resetOnEvent();
tobyspark 1:63b72e393989 226 udpRec.close();
tobyspark 1:63b72e393989 227 }
tobyspark 1:63b72e393989 228
casiotone401 2:507dea4cc97a 229 OSCClass::OSCClass(OSCMessage *_mes) {
casiotone401 2:507dea4cc97a 230
tobyspark 0:fdea65150534 231 udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
tobyspark 0:fdea65150534 232 receiverMessage = _mes; // note: receiverMessage MUST be a pointer to the message, because we will modify things in it
casiotone401 2:507dea4cc97a 233 newMessage = false;
tobyspark 0:fdea65150534 234 }
tobyspark 0:fdea65150534 235
casiotone401 2:507dea4cc97a 236 void OSCClass::begin() {
tobyspark 0:fdea65150534 237 // setup receiver udp socket:
tobyspark 0:fdea65150534 238 udpRec.bind(receiverMessage->host);
tobyspark 0:fdea65150534 239 }
tobyspark 0:fdea65150534 240
tobyspark 0:fdea65150534 241
casiotone401 2:507dea4cc97a 242 void OSCClass::begin(uint16_t _recievePort) {
casiotone401 2:507dea4cc97a 243
tobyspark 0:fdea65150534 244 receiverMessage->host.setPort(_recievePort);
tobyspark 0:fdea65150534 245 // setup receiver udp socket:
tobyspark 0:fdea65150534 246 udpRec.bind(receiverMessage->host);
tobyspark 0:fdea65150534 247 }
tobyspark 0:fdea65150534 248
tobyspark 0:fdea65150534 249
casiotone401 2:507dea4cc97a 250 void OSCClass::setReceiveMessage(OSCMessage *_mes) {
casiotone401 2:507dea4cc97a 251
tobyspark 0:fdea65150534 252 receiverMessage = _mes;
tobyspark 0:fdea65150534 253 }
tobyspark 0:fdea65150534 254
casiotone401 2:507dea4cc97a 255 void OSCClass::onUDPSocketEvent(UDPSocketEvent e) {
casiotone401 2:507dea4cc97a 256
casiotone401 2:507dea4cc97a 257 switch(e) {
casiotone401 2:507dea4cc97a 258
casiotone401 2:507dea4cc97a 259 case UDPSOCKET_READABLE: //The only event for now
casiotone401 2:507dea4cc97a 260 //char buf[256] = {0};
casiotone401 2:507dea4cc97a 261 Host auxhost;
casiotone401 2:507dea4cc97a 262 buflength = udpRec.recvfrom( rcvBuff, 128, &auxhost ); // QUESTION: auxhost should be equal to the receiver host I guess...
casiotone401 2:507dea4cc97a 263 if ( buflength > 0 ) {
tobyspark 0:fdea65150534 264 //printf("\r\nFrom %d.%d.%d.%d:\r\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
casiotone401 2:507dea4cc97a 265 decodePacket(receiverMessage); // convert to OSC message, and save it in receiverMessage
casiotone401 2:507dea4cc97a 266 newMessage = true;
tobyspark 0:fdea65150534 267
casiotone401 2:507dea4cc97a 268 messageReceivedCallback.call();
casiotone401 2:507dea4cc97a 269 }
casiotone401 2:507dea4cc97a 270
casiotone401 2:507dea4cc97a 271 break;
casiotone401 2:507dea4cc97a 272 }
tobyspark 0:fdea65150534 273 }
tobyspark 0:fdea65150534 274
tobyspark 0:fdea65150534 275 /*
tobyspark 0:fdea65150534 276 Decode UDP packet and save it in the OSCMessage structure
tobyspark 0:fdea65150534 277 */
tobyspark 0:fdea65150534 278 void OSCClass::decodePacket( OSCMessage *_mes) {
casiotone401 2:507dea4cc97a 279 int i, j;
tobyspark 0:fdea65150534 280 //uint16_t lenBuff;
tobyspark 0:fdea65150534 281 uint8_t d;
casiotone401 2:507dea4cc97a 282 uint8_t messagePos = 0;
casiotone401 2:507dea4cc97a 283 uint8_t adrCount = 0;
casiotone401 2:507dea4cc97a 284 uint8_t adrMesPos = 0;
casiotone401 2:507dea4cc97a 285 uint8_t packetCount = 0;
casiotone401 2:507dea4cc97a 286 uint8_t packetPos = 4;
tobyspark 0:fdea65150534 287
tobyspark 0:fdea65150534 288
tobyspark 0:fdea65150534 289 //W5100.writeSn(socketNo, SnIR, SnIR::RECV);
tobyspark 0:fdea65150534 290 //lenBuff=recvfrom(socketNo, rcvBuff, 1, receiverMessage->ip, &receiverMessage->port);
tobyspark 0:fdea65150534 291
casiotone401 2:507dea4cc97a 292 receiverMessage->address[0] = tempAddress[0];
tobyspark 0:fdea65150534 293
tobyspark 0:fdea65150534 294 //(1) address process start =========================================
casiotone401 2:507dea4cc97a 295 do {
casiotone401 2:507dea4cc97a 296 d = rcvBuff[messagePos];
tobyspark 0:fdea65150534 297
casiotone401 2:507dea4cc97a 298 if ( (d == '/') && (messagePos > 0) ) {
tobyspark 0:fdea65150534 299
casiotone401 2:507dea4cc97a 300 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 301
casiotone401 2:507dea4cc97a 302 tempAddress[adrCount][adrMesPos] = 0;
tobyspark 0:fdea65150534 303
casiotone401 2:507dea4cc97a 304 ++adrCount;
casiotone401 2:507dea4cc97a 305 adrMesPos = 0;
tobyspark 0:fdea65150534 306
casiotone401 2:507dea4cc97a 307 receiverMessage->address[adrCount] = tempAddress[adrCount];
tobyspark 0:fdea65150534 308 }
tobyspark 0:fdea65150534 309
tobyspark 0:fdea65150534 310 }
tobyspark 0:fdea65150534 311
casiotone401 2:507dea4cc97a 312 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 313 //Added this in to remove the slashes out of final output
casiotone401 2:507dea4cc97a 314 if (d != '/') {
casiotone401 2:507dea4cc97a 315
casiotone401 2:507dea4cc97a 316 tempAddress[adrCount][adrMesPos]=d;
tobyspark 0:fdea65150534 317
casiotone401 2:507dea4cc97a 318 if (packetCount > 3) {
casiotone401 2:507dea4cc97a 319
casiotone401 2:507dea4cc97a 320 packetCount = 0;
casiotone401 2:507dea4cc97a 321 packetPos += 4;
casiotone401 2:507dea4cc97a 322 }
casiotone401 2:507dea4cc97a 323
casiotone401 2:507dea4cc97a 324 ++adrMesPos;
casiotone401 2:507dea4cc97a 325 }
tobyspark 0:fdea65150534 326 }
tobyspark 0:fdea65150534 327
casiotone401 2:507dea4cc97a 328 ++messagePos;
casiotone401 2:507dea4cc97a 329 ++packetCount;
tobyspark 0:fdea65150534 330
casiotone401 2:507dea4cc97a 331 } while(d != 0);
tobyspark 0:fdea65150534 332
tobyspark 0:fdea65150534 333
casiotone401 2:507dea4cc97a 334 if (adrCount < MAX_ADDRESS) {
casiotone401 2:507dea4cc97a 335 ++adrCount;
casiotone401 2:507dea4cc97a 336 }
tobyspark 0:fdea65150534 337
casiotone401 2:507dea4cc97a 338 receiverMessage->addressNum = adrCount;
casiotone401 2:507dea4cc97a 339
casiotone401 2:507dea4cc97a 340 messagePos = packetPos;
tobyspark 0:fdea65150534 341
tobyspark 0:fdea65150534 342 //(2) type tag process starts =========================================
casiotone401 2:507dea4cc97a 343 packetCount = 0;
casiotone401 2:507dea4cc97a 344 packetPos += 4;
tobyspark 0:fdea65150534 345
casiotone401 2:507dea4cc97a 346 uint8_t typeTagPos = 0;
casiotone401 2:507dea4cc97a 347 uint8_t tempArgNum = 0;
tobyspark 0:fdea65150534 348
casiotone401 2:507dea4cc97a 349 while(rcvBuff[messagePos] != 0) {
tobyspark 0:fdea65150534 350
casiotone401 2:507dea4cc97a 351 if (rcvBuff[messagePos] != ',') {
casiotone401 2:507dea4cc97a 352
casiotone401 2:507dea4cc97a 353 if (typeTagPos < MAX_ARG) {
casiotone401 2:507dea4cc97a 354
casiotone401 2:507dea4cc97a 355 receiverMessage->typeTag[tempArgNum] = rcvBuff[messagePos];
casiotone401 2:507dea4cc97a 356 ++tempArgNum;
casiotone401 2:507dea4cc97a 357 }
tobyspark 0:fdea65150534 358
casiotone401 2:507dea4cc97a 359 ++typeTagPos;
casiotone401 2:507dea4cc97a 360
tobyspark 0:fdea65150534 361 }
tobyspark 0:fdea65150534 362
casiotone401 2:507dea4cc97a 363 ++packetCount;
casiotone401 2:507dea4cc97a 364
casiotone401 2:507dea4cc97a 365 if (packetCount > 3) {
casiotone401 2:507dea4cc97a 366
casiotone401 2:507dea4cc97a 367 packetCount = 0;
casiotone401 2:507dea4cc97a 368 packetPos += 4;
casiotone401 2:507dea4cc97a 369 }
casiotone401 2:507dea4cc97a 370
casiotone401 2:507dea4cc97a 371 ++messagePos;
tobyspark 0:fdea65150534 372 }
tobyspark 0:fdea65150534 373
casiotone401 2:507dea4cc97a 374 receiverMessage->argNum = tempArgNum;
tobyspark 0:fdea65150534 375
casiotone401 2:507dea4cc97a 376 messagePos = packetPos;
tobyspark 0:fdea65150534 377
tobyspark 0:fdea65150534 378 //(3) tempArg process starts =========================================
casiotone401 2:507dea4cc97a 379 for (i = 0; i < tempArgNum; ++i) {
tobyspark 0:fdea65150534 380
casiotone401 2:507dea4cc97a 381 adrMesPos = 3;
tobyspark 0:fdea65150534 382
casiotone401 2:507dea4cc97a 383 receiverMessage->arg[i] = tempArg[i];
tobyspark 0:fdea65150534 384
casiotone401 2:507dea4cc97a 385 for (j = 0; j < 4; ++j) {
tobyspark 0:fdea65150534 386
casiotone401 2:507dea4cc97a 387 tempArg[i][adrMesPos] = rcvBuff[messagePos];
tobyspark 0:fdea65150534 388
casiotone401 2:507dea4cc97a 389 ++messagePos;
casiotone401 2:507dea4cc97a 390 --adrMesPos;
tobyspark 0:fdea65150534 391 }
tobyspark 0:fdea65150534 392
tobyspark 0:fdea65150534 393 }
tobyspark 0:fdea65150534 394 }
tobyspark 0:fdea65150534 395
tobyspark 0:fdea65150534 396
tobyspark 0:fdea65150534 397
casiotone401 2:507dea4cc97a 398 OSCMessage * OSCClass::getMessage() {
casiotone401 2:507dea4cc97a 399
casiotone401 2:507dea4cc97a 400 newMessage = false; // this indicate the user READ the message
tobyspark 0:fdea65150534 401 return receiverMessage;
tobyspark 0:fdea65150534 402 }
tobyspark 0:fdea65150534 403
tobyspark 0:fdea65150534 404
casiotone401 2:507dea4cc97a 405 void OSCClass::sendOsc( OSCMessage *_mes ) {
casiotone401 2:507dea4cc97a 406 int i, j;
tobyspark 0:fdea65150534 407 uint8_t lengthEnd;
tobyspark 0:fdea65150534 408 uint8_t lengthStart;
tobyspark 0:fdea65150534 409 char buff[128];
casiotone401 2:507dea4cc97a 410 bool strCheck = false;
tobyspark 0:fdea65150534 411
tobyspark 0:fdea65150534 412 sendContainer = _mes;
tobyspark 0:fdea65150534 413
casiotone401 2:507dea4cc97a 414 buff[0] = '\0';
tobyspark 0:fdea65150534 415
tobyspark 0:fdea65150534 416 //1) Add name spaces:
casiotone401 2:507dea4cc97a 417 for (i = 0; i < sendContainer->addressNum; ++i) {
tobyspark 0:fdea65150534 418
casiotone401 2:507dea4cc97a 419 strcat(buff, sendContainer->address[i]); // note: an address is for instance: "/test" (including the "/")
tobyspark 0:fdea65150534 420 }
tobyspark 0:fdea65150534 421
tobyspark 0:fdea65150534 422 // pad with 0s to align in multiples of 4:
casiotone401 2:507dea4cc97a 423 lengthStart = strlength(buff);
casiotone401 2:507dea4cc97a 424
casiotone401 2:507dea4cc97a 425 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 2:507dea4cc97a 426
casiotone401 2:507dea4cc97a 427 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 2:507dea4cc97a 428
casiotone401 2:507dea4cc97a 429 buff[i] = '\0';
tobyspark 0:fdea65150534 430 }
tobyspark 0:fdea65150534 431
casiotone401 2:507dea4cc97a 432 lengthStart = lengthEnd;
tobyspark 0:fdea65150534 433
tobyspark 0:fdea65150534 434 //2) Add TypeTag:
casiotone401 2:507dea4cc97a 435 buff[lengthEnd++] = ','; // Note: type tag is for instance: ",if"
casiotone401 2:507dea4cc97a 436
casiotone401 2:507dea4cc97a 437 for (i = 0; i < sendContainer->argNum; ++i) {
casiotone401 2:507dea4cc97a 438
casiotone401 2:507dea4cc97a 439 buff[lengthEnd++] = sendContainer->typeTag[i];
casiotone401 2:507dea4cc97a 440
casiotone401 2:507dea4cc97a 441 if (sendContainer->typeTag[i] == 's') {
casiotone401 2:507dea4cc97a 442
casiotone401 2:507dea4cc97a 443 strCheck = true;
casiotone401 2:507dea4cc97a 444 }
tobyspark 0:fdea65150534 445 }
tobyspark 0:fdea65150534 446
tobyspark 0:fdea65150534 447 // pad with 0s to align in multiples of 4:
casiotone401 2:507dea4cc97a 448 lengthStart = lengthEnd;
casiotone401 2:507dea4cc97a 449
casiotone401 2:507dea4cc97a 450 lengthEnd = lengthStart + (4 - (lengthStart % 4));
casiotone401 2:507dea4cc97a 451
casiotone401 2:507dea4cc97a 452 for (i = lengthStart; i < lengthEnd; ++i) {
casiotone401 2:507dea4cc97a 453
casiotone401 2:507dea4cc97a 454 buff[i] = '\0';
tobyspark 0:fdea65150534 455 }
tobyspark 0:fdea65150534 456
tobyspark 0:fdea65150534 457 //3) add argument values (Note: here only big endian):
tobyspark 0:fdea65150534 458 uint8_t *v;
casiotone401 2:507dea4cc97a 459
casiotone401 2:507dea4cc97a 460 for (i = 0; i < sendContainer->argNum; ++i) {
tobyspark 0:fdea65150534 461
casiotone401 2:507dea4cc97a 462 if (!strCheck) {
casiotone401 2:507dea4cc97a 463
casiotone401 2:507dea4cc97a 464 v = (uint8_t *)&sendContainer->arg[i];
casiotone401 2:507dea4cc97a 465
casiotone401 2:507dea4cc97a 466 buff[lengthEnd++] = v[3];
casiotone401 2:507dea4cc97a 467 buff[lengthEnd++] = v[2];
casiotone401 2:507dea4cc97a 468 buff[lengthEnd++] = v[1];
casiotone401 2:507dea4cc97a 469 buff[lengthEnd++] = v[0];
casiotone401 2:507dea4cc97a 470
casiotone401 2:507dea4cc97a 471 } else {
casiotone401 2:507dea4cc97a 472
casiotone401 2:507dea4cc97a 473 v = (uint8_t *)sendContainer->arg[i];
casiotone401 2:507dea4cc97a 474
casiotone401 2:507dea4cc97a 475 for (j = 0; j < 16; ++j) {
casiotone401 2:507dea4cc97a 476
casiotone401 2:507dea4cc97a 477 buff[lengthEnd++] = v[j];
casiotone401 2:507dea4cc97a 478 }
casiotone401 2:507dea4cc97a 479
casiotone401 2:507dea4cc97a 480 strCheck = false;
casiotone401 2:507dea4cc97a 481 }
tobyspark 0:fdea65150534 482 }
tobyspark 0:fdea65150534 483
tobyspark 0:fdea65150534 484 //4) Send udp packet:
tobyspark 0:fdea65150534 485 //sendto( socketNo, (uint8_t *)buff, lengthEnd, sendContainer->ip, sendContainer->port );
tobyspark 0:fdea65150534 486 udpSend.sendto(buff , lengthEnd, &(sendContainer->host));
tobyspark 0:fdea65150534 487 }
tobyspark 0:fdea65150534 488
tobyspark 0:fdea65150534 489
tobyspark 0:fdea65150534 490 /*
tobyspark 0:fdea65150534 491 flush a receive buffer
tobyspark 0:fdea65150534 492 void OSCClass::flush() {
tobyspark 0:fdea65150534 493 while ( available() ){}
tobyspark 0:fdea65150534 494 }
tobyspark 0:fdea65150534 495 */
tobyspark 0:fdea65150534 496
tobyspark 0:fdea65150534 497
tobyspark 0:fdea65150534 498 void OSCClass::stop() {
tobyspark 0:fdea65150534 499 //close( socketNo );
tobyspark 0:fdea65150534 500 udpSend.resetOnEvent(); // disables callback
tobyspark 0:fdea65150534 501 }
tobyspark 0:fdea65150534 502
tobyspark 0:fdea65150534 503