An Open Sound Control library for the mbed, created to be compatible with Recotana's OSCClass library (http://recotana.com) for the Arduino with Ethernet shield. It also uses parts of the OSC Transceiver(Sender/Receiver) code by xshige written by: Alvaro Cassinelli, October 2011 tweaked by: Toby Harris / *spark audio-visual, March 2012

Dependencies:   NetServices mbed

Committer:
tobyspark
Date:
Sun Apr 15 15:05:19 2012 +0000
Revision:
11:853a9e887023
Parent:
1:ab7dc9550de6

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tobyspark 0:49cdaebd52d5 1 /*
tobyspark 0:49cdaebd52d5 2 mbedOSC.cpp
tobyspark 0:49cdaebd52d5 3 */
tobyspark 0:49cdaebd52d5 4
tobyspark 0:49cdaebd52d5 5 #include "mbed.h"
tobyspark 0:49cdaebd52d5 6 #include "mbedOSC.h"
tobyspark 0:49cdaebd52d5 7 #include "stdarg.h"
tobyspark 0:49cdaebd52d5 8
tobyspark 0:49cdaebd52d5 9 OSCMessage::OSCMessage() {
tobyspark 0:49cdaebd52d5 10 // Initialize host address and port by default (as if this where the receiver message):
tobyspark 0:49cdaebd52d5 11 // host=new Host(IpAddr(10, 0, 0, 1), DEFAULT_RECEIVE_PORT, NULL);
tobyspark 0:49cdaebd52d5 12 }
tobyspark 0:49cdaebd52d5 13
tobyspark 0:49cdaebd52d5 14 void OSCMessage::setPort(uint16_t _port){
tobyspark 0:49cdaebd52d5 15 host.setPort(_port);
tobyspark 0:49cdaebd52d5 16 }
tobyspark 0:49cdaebd52d5 17
tobyspark 1:ab7dc9550de6 18
tobyspark 0:49cdaebd52d5 19 void OSCMessage::setIp(uint8_t *_ip){
tobyspark 0:49cdaebd52d5 20 host.setIp(IpAddr(_ip[0], _ip[1], _ip[2], _ip[3]));
tobyspark 0:49cdaebd52d5 21 }
tobyspark 0:49cdaebd52d5 22
tobyspark 0:49cdaebd52d5 23
tobyspark 1:ab7dc9550de6 24
tobyspark 0:49cdaebd52d5 25 void OSCMessage::setIp( uint8_t _ip1,
tobyspark 0:49cdaebd52d5 26 uint8_t _ip2,
tobyspark 0:49cdaebd52d5 27 uint8_t _ip3,
tobyspark 0:49cdaebd52d5 28 uint8_t _ip4 ){
tobyspark 0:49cdaebd52d5 29
tobyspark 0:49cdaebd52d5 30 host.setIp(IpAddr(_ip1, _ip2, _ip3, _ip4));
tobyspark 0:49cdaebd52d5 31 }
tobyspark 0:49cdaebd52d5 32
tobyspark 0:49cdaebd52d5 33 const IpAddr& OSCMessage::getIp(){
tobyspark 0:49cdaebd52d5 34 return host.getIp();
tobyspark 0:49cdaebd52d5 35 }
tobyspark 0:49cdaebd52d5 36
tobyspark 0:49cdaebd52d5 37
tobyspark 0:49cdaebd52d5 38 const int& OSCMessage::getPort(){
tobyspark 0:49cdaebd52d5 39 return host.getPort();
tobyspark 0:49cdaebd52d5 40 }
tobyspark 0:49cdaebd52d5 41
tobyspark 0:49cdaebd52d5 42
tobyspark 1:ab7dc9550de6 43
tobyspark 0:49cdaebd52d5 44 uint8_t OSCMessage::getAddressNum(){
tobyspark 0:49cdaebd52d5 45
tobyspark 0:49cdaebd52d5 46 return addressNum;
tobyspark 0:49cdaebd52d5 47 }
tobyspark 0:49cdaebd52d5 48
tobyspark 0:49cdaebd52d5 49
tobyspark 0:49cdaebd52d5 50 uint8_t OSCMessage::getArgNum(){
tobyspark 0:49cdaebd52d5 51
tobyspark 0:49cdaebd52d5 52 return argNum;
tobyspark 0:49cdaebd52d5 53 }
tobyspark 0:49cdaebd52d5 54
tobyspark 0:49cdaebd52d5 55
tobyspark 1:ab7dc9550de6 56
tobyspark 0:49cdaebd52d5 57 char * OSCMessage::getAddress(uint8_t _index){
tobyspark 0:49cdaebd52d5 58 if(_index>MAX_ADDRESS) _index=MAX_ADDRESS-1;
tobyspark 0:49cdaebd52d5 59 return address[_index];
tobyspark 0:49cdaebd52d5 60
tobyspark 0:49cdaebd52d5 61 }
tobyspark 0:49cdaebd52d5 62
tobyspark 0:49cdaebd52d5 63
tobyspark 1:ab7dc9550de6 64
tobyspark 0:49cdaebd52d5 65 char * OSCMessage::getTopAddress(){
tobyspark 0:49cdaebd52d5 66
tobyspark 0:49cdaebd52d5 67 return getAddress(0);
tobyspark 0:49cdaebd52d5 68
tobyspark 0:49cdaebd52d5 69 }
tobyspark 0:49cdaebd52d5 70
tobyspark 1:ab7dc9550de6 71
tobyspark 0:49cdaebd52d5 72 char * OSCMessage::getSubAddress(){
tobyspark 0:49cdaebd52d5 73
tobyspark 0:49cdaebd52d5 74 return getAddress(1);
tobyspark 0:49cdaebd52d5 75
tobyspark 0:49cdaebd52d5 76 }
tobyspark 0:49cdaebd52d5 77
tobyspark 1:ab7dc9550de6 78
tobyspark 0:49cdaebd52d5 79 char OSCMessage::getTypeTag(uint8_t _index){
tobyspark 0:49cdaebd52d5 80 if(_index>MAX_ARG) _index=MAX_ARG-1;
tobyspark 0:49cdaebd52d5 81 return typeTag[_index];
tobyspark 0:49cdaebd52d5 82 }
tobyspark 0:49cdaebd52d5 83
tobyspark 1:ab7dc9550de6 84
tobyspark 0:49cdaebd52d5 85 int32_t OSCMessage::getArgInt(uint8_t _index){
tobyspark 0:49cdaebd52d5 86 int32_t *value;
tobyspark 0:49cdaebd52d5 87 if(_index > argNum) _index=argNum;
tobyspark 0:49cdaebd52d5 88 value = (int32_t *)arg[_index]; // cast to int32_t
tobyspark 0:49cdaebd52d5 89 return *value;
tobyspark 0:49cdaebd52d5 90 }
tobyspark 0:49cdaebd52d5 91
tobyspark 1:ab7dc9550de6 92
tobyspark 0:49cdaebd52d5 93 double OSCMessage::getArgFloat(uint8_t _index){
tobyspark 0:49cdaebd52d5 94 double *value;
tobyspark 0:49cdaebd52d5 95 if(_index > argNum) _index=argNum;
tobyspark 0:49cdaebd52d5 96 value = (double *)arg[_index];
tobyspark 0:49cdaebd52d5 97 return *value;
tobyspark 0:49cdaebd52d5 98 }
tobyspark 0:49cdaebd52d5 99
tobyspark 1:ab7dc9550de6 100
tobyspark 0:49cdaebd52d5 101 void OSCMessage::setTopAddress(char *_address){
tobyspark 0:49cdaebd52d5 102 address[0]=_address;
tobyspark 0:49cdaebd52d5 103 address[1]=0;
tobyspark 0:49cdaebd52d5 104 addressNum=1; // Note: this "erases" the subaddress! (is this a good idea?)
tobyspark 0:49cdaebd52d5 105 }
tobyspark 0:49cdaebd52d5 106
tobyspark 1:ab7dc9550de6 107
tobyspark 0:49cdaebd52d5 108 void OSCMessage::setSubAddress(char *_address){
tobyspark 0:49cdaebd52d5 109 address[1]=_address;
tobyspark 0:49cdaebd52d5 110 addressNum=2; // Note: this assumes the top address was already set!
tobyspark 0:49cdaebd52d5 111 }
tobyspark 0:49cdaebd52d5 112
tobyspark 0:49cdaebd52d5 113
tobyspark 1:ab7dc9550de6 114
tobyspark 0:49cdaebd52d5 115 void OSCMessage::setAddress(char *_topAddress,char *_subAddress){
tobyspark 0:49cdaebd52d5 116 setTopAddress(_topAddress);
tobyspark 0:49cdaebd52d5 117 setSubAddress(_subAddress);
tobyspark 0:49cdaebd52d5 118 addressNum=2; // (unnecessary...)
tobyspark 0:49cdaebd52d5 119 }
tobyspark 0:49cdaebd52d5 120
tobyspark 1:ab7dc9550de6 121
tobyspark 0:49cdaebd52d5 122 void OSCMessage::setAddress(uint8_t _index, char *_address){
tobyspark 0:49cdaebd52d5 123 if(_index>MAX_ADDRESS) _index=MAX_ADDRESS-1;
tobyspark 0:49cdaebd52d5 124 address[_index]=_address;
tobyspark 0:49cdaebd52d5 125 addressNum=_index+1;
tobyspark 0:49cdaebd52d5 126 }
tobyspark 0:49cdaebd52d5 127
tobyspark 0:49cdaebd52d5 128
tobyspark 1:ab7dc9550de6 129
tobyspark 0:49cdaebd52d5 130 void OSCMessage::setArgs(char *types,...){
tobyspark 0:49cdaebd52d5 131
tobyspark 0:49cdaebd52d5 132 va_list argList;
tobyspark 0:49cdaebd52d5 133
tobyspark 0:49cdaebd52d5 134 argNum = strlen(types);
tobyspark 0:49cdaebd52d5 135 if(argNum>MAX_ARG) argNum=MAX_ARG-1;
tobyspark 0:49cdaebd52d5 136
tobyspark 0:49cdaebd52d5 137 va_start( argList, types );
tobyspark 0:49cdaebd52d5 138 for(uint8_t i=0 ; i < argNum ; i++){
tobyspark 0:49cdaebd52d5 139
tobyspark 0:49cdaebd52d5 140 typeTag[i]=types[i];
tobyspark 0:49cdaebd52d5 141
tobyspark 0:49cdaebd52d5 142 switch(types[i]) {
tobyspark 0:49cdaebd52d5 143 case 'i':
tobyspark 0:49cdaebd52d5 144 arg[i]=(uint32_t *)va_arg(argList, uint32_t *);
tobyspark 0:49cdaebd52d5 145 break;
tobyspark 0:49cdaebd52d5 146 case 'f':
tobyspark 0:49cdaebd52d5 147 arg[i]=va_arg(argList, double *);
tobyspark 0:49cdaebd52d5 148 break;
tobyspark 0:49cdaebd52d5 149 }
tobyspark 0:49cdaebd52d5 150
tobyspark 0:49cdaebd52d5 151 }
tobyspark 0:49cdaebd52d5 152
tobyspark 0:49cdaebd52d5 153 }
tobyspark 0:49cdaebd52d5 154
tobyspark 0:49cdaebd52d5 155 // ================================================================================================================================================
tobyspark 0:49cdaebd52d5 156 // ==================================== OSCClass for sending and receiving OSC messages using UDP protocol =======================================
tobyspark 0:49cdaebd52d5 157 // ================================================================================================================================================
tobyspark 0:49cdaebd52d5 158 //The class define an object wrapping the UDP functions to send and receive OSC messages
tobyspark 0:49cdaebd52d5 159
tobyspark 0:49cdaebd52d5 160 OSCClass::OSCClass(){
tobyspark 0:49cdaebd52d5 161 udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
tobyspark 0:49cdaebd52d5 162 newMessage=false;
tobyspark 0:49cdaebd52d5 163 }
tobyspark 0:49cdaebd52d5 164
tobyspark 0:49cdaebd52d5 165 OSCClass::OSCClass(OSCMessage *_mes){
tobyspark 0:49cdaebd52d5 166 udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
tobyspark 0:49cdaebd52d5 167 receiverMessage = _mes; // note: receiverMessage MUST be a pointer to the message, because we will modify things in it
tobyspark 0:49cdaebd52d5 168 newMessage=false;
tobyspark 0:49cdaebd52d5 169 }
tobyspark 0:49cdaebd52d5 170
tobyspark 0:49cdaebd52d5 171 void OSCClass::begin()
tobyspark 0:49cdaebd52d5 172 {
tobyspark 0:49cdaebd52d5 173 // setup receiver udp socket:
tobyspark 0:49cdaebd52d5 174 udpRec.bind(receiverMessage->host);
tobyspark 0:49cdaebd52d5 175 }
tobyspark 0:49cdaebd52d5 176
tobyspark 1:ab7dc9550de6 177
tobyspark 0:49cdaebd52d5 178 void OSCClass::begin(uint16_t _recievePort)
tobyspark 0:49cdaebd52d5 179 {
tobyspark 0:49cdaebd52d5 180 receiverMessage->host.setPort(_recievePort);
tobyspark 0:49cdaebd52d5 181 // setup receiver udp socket:
tobyspark 0:49cdaebd52d5 182 udpRec.bind(receiverMessage->host);
tobyspark 0:49cdaebd52d5 183 }
tobyspark 0:49cdaebd52d5 184
tobyspark 1:ab7dc9550de6 185
tobyspark 0:49cdaebd52d5 186 void OSCClass::setReceiveMessage(OSCMessage *_mes){
tobyspark 0:49cdaebd52d5 187 receiverMessage = _mes;
tobyspark 0:49cdaebd52d5 188 }
tobyspark 0:49cdaebd52d5 189
tobyspark 0:49cdaebd52d5 190 void OSCClass::onUDPSocketEvent(UDPSocketEvent e)
tobyspark 0:49cdaebd52d5 191 {
tobyspark 0:49cdaebd52d5 192 switch(e)
tobyspark 0:49cdaebd52d5 193 {
tobyspark 0:49cdaebd52d5 194 case UDPSOCKET_READABLE: //The only event for now
tobyspark 0:49cdaebd52d5 195 //char buf[256] = {0};
tobyspark 0:49cdaebd52d5 196 Host auxhost;
tobyspark 0:49cdaebd52d5 197 buflength = udpRec.recvfrom( rcvBuff, 256, &auxhost ); // QUESTION: auxhost should be equal to the receiver host I guess...
tobyspark 0:49cdaebd52d5 198 if ( buflength > 0 ) {
tobyspark 0:49cdaebd52d5 199 //printf("\r\nFrom %d.%d.%d.%d:\r\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
tobyspark 0:49cdaebd52d5 200 decodePacket(receiverMessage); // convert to OSC message, and save it in receiverMessage
tobyspark 0:49cdaebd52d5 201 newMessage=true;
tobyspark 0:49cdaebd52d5 202
tobyspark 0:49cdaebd52d5 203 messageReceivedCallback.call();
tobyspark 0:49cdaebd52d5 204 }
tobyspark 0:49cdaebd52d5 205 break;
tobyspark 0:49cdaebd52d5 206 }
tobyspark 0:49cdaebd52d5 207 }
tobyspark 0:49cdaebd52d5 208
tobyspark 0:49cdaebd52d5 209 /*
tobyspark 0:49cdaebd52d5 210 Decode UDP packet and save it in the OSCMessage structure
tobyspark 0:49cdaebd52d5 211 */
tobyspark 0:49cdaebd52d5 212 void OSCClass::decodePacket( OSCMessage *_mes) {
tobyspark 0:49cdaebd52d5 213
tobyspark 0:49cdaebd52d5 214 //uint16_t lenBuff;
tobyspark 0:49cdaebd52d5 215 uint8_t d;
tobyspark 0:49cdaebd52d5 216 uint8_t messagePos=0;
tobyspark 0:49cdaebd52d5 217 uint8_t adrCount=0;
tobyspark 0:49cdaebd52d5 218 uint8_t adrMesPos=0;
tobyspark 0:49cdaebd52d5 219 uint8_t packetCount=0;
tobyspark 0:49cdaebd52d5 220 uint8_t packetPos=4;
tobyspark 0:49cdaebd52d5 221
tobyspark 0:49cdaebd52d5 222
tobyspark 0:49cdaebd52d5 223 //W5100.writeSn(socketNo, SnIR, SnIR::RECV);
tobyspark 0:49cdaebd52d5 224 //lenBuff=recvfrom(socketNo, rcvBuff, 1, receiverMessage->ip, &receiverMessage->port);
tobyspark 0:49cdaebd52d5 225
tobyspark 0:49cdaebd52d5 226 receiverMessage->address[0]=tempAddress[0];
tobyspark 0:49cdaebd52d5 227
tobyspark 0:49cdaebd52d5 228 //(1) address process start =========================================
tobyspark 0:49cdaebd52d5 229 do{
tobyspark 0:49cdaebd52d5 230 d=rcvBuff[messagePos];
tobyspark 0:49cdaebd52d5 231
tobyspark 0:49cdaebd52d5 232
tobyspark 0:49cdaebd52d5 233 if( (d=='/') && (messagePos>0) ){
tobyspark 0:49cdaebd52d5 234
tobyspark 0:49cdaebd52d5 235 if(adrCount<MAX_ADDRESS){
tobyspark 0:49cdaebd52d5 236 tempAddress[adrCount][adrMesPos]=0;
tobyspark 0:49cdaebd52d5 237
tobyspark 0:49cdaebd52d5 238 adrCount++;
tobyspark 0:49cdaebd52d5 239 adrMesPos=0;
tobyspark 0:49cdaebd52d5 240
tobyspark 0:49cdaebd52d5 241 receiverMessage->address[adrCount]=tempAddress[adrCount];
tobyspark 0:49cdaebd52d5 242 }
tobyspark 0:49cdaebd52d5 243
tobyspark 0:49cdaebd52d5 244 }
tobyspark 0:49cdaebd52d5 245
tobyspark 0:49cdaebd52d5 246 if(adrCount<MAX_ADDRESS){
tobyspark 0:49cdaebd52d5 247 //Added this in to remove the slashes out of final output
tobyspark 0:49cdaebd52d5 248 if(d!='/'){
tobyspark 0:49cdaebd52d5 249 tempAddress[adrCount][adrMesPos]=d;
tobyspark 0:49cdaebd52d5 250
tobyspark 0:49cdaebd52d5 251 if(packetCount>3) {
tobyspark 0:49cdaebd52d5 252 packetCount=0;
tobyspark 0:49cdaebd52d5 253 packetPos+=4;
tobyspark 0:49cdaebd52d5 254 }
tobyspark 0:49cdaebd52d5 255
tobyspark 0:49cdaebd52d5 256 adrMesPos++;
tobyspark 0:49cdaebd52d5 257 }
tobyspark 0:49cdaebd52d5 258 }
tobyspark 0:49cdaebd52d5 259 messagePos++;
tobyspark 0:49cdaebd52d5 260 packetCount++;
tobyspark 0:49cdaebd52d5 261
tobyspark 0:49cdaebd52d5 262 }while(d!=0);
tobyspark 0:49cdaebd52d5 263
tobyspark 0:49cdaebd52d5 264
tobyspark 0:49cdaebd52d5 265 if(adrCount<MAX_ADDRESS) adrCount++;
tobyspark 0:49cdaebd52d5 266 receiverMessage->addressNum=adrCount;
tobyspark 0:49cdaebd52d5 267
tobyspark 0:49cdaebd52d5 268 messagePos=packetPos;
tobyspark 0:49cdaebd52d5 269
tobyspark 0:49cdaebd52d5 270 //(2) type tag process starts =========================================
tobyspark 0:49cdaebd52d5 271 packetCount=0;
tobyspark 0:49cdaebd52d5 272 packetPos+=4;
tobyspark 0:49cdaebd52d5 273
tobyspark 0:49cdaebd52d5 274 uint8_t typeTagPos=0;
tobyspark 0:49cdaebd52d5 275 uint8_t tempArgNum=0;
tobyspark 0:49cdaebd52d5 276
tobyspark 0:49cdaebd52d5 277 while(rcvBuff[messagePos]!=0 ){
tobyspark 0:49cdaebd52d5 278
tobyspark 0:49cdaebd52d5 279 if(rcvBuff[messagePos] != ',') {
tobyspark 0:49cdaebd52d5 280
tobyspark 0:49cdaebd52d5 281 if(typeTagPos<MAX_ARG){
tobyspark 0:49cdaebd52d5 282 receiverMessage->typeTag[tempArgNum]=rcvBuff[messagePos];
tobyspark 0:49cdaebd52d5 283 tempArgNum++;
tobyspark 0:49cdaebd52d5 284 }
tobyspark 0:49cdaebd52d5 285 typeTagPos++;
tobyspark 0:49cdaebd52d5 286
tobyspark 0:49cdaebd52d5 287 }
tobyspark 0:49cdaebd52d5 288
tobyspark 0:49cdaebd52d5 289 packetCount++;
tobyspark 0:49cdaebd52d5 290
tobyspark 0:49cdaebd52d5 291 if(packetCount>3) {
tobyspark 0:49cdaebd52d5 292 packetCount=0;
tobyspark 0:49cdaebd52d5 293 packetPos+=4;
tobyspark 0:49cdaebd52d5 294 }
tobyspark 0:49cdaebd52d5 295
tobyspark 0:49cdaebd52d5 296 messagePos++;
tobyspark 0:49cdaebd52d5 297 }
tobyspark 0:49cdaebd52d5 298
tobyspark 0:49cdaebd52d5 299 receiverMessage->argNum=tempArgNum;
tobyspark 0:49cdaebd52d5 300
tobyspark 0:49cdaebd52d5 301 messagePos=packetPos;
tobyspark 0:49cdaebd52d5 302
tobyspark 0:49cdaebd52d5 303 //(3) tempArg process starts =========================================
tobyspark 0:49cdaebd52d5 304 for(int i=0;i<tempArgNum;i++){
tobyspark 0:49cdaebd52d5 305
tobyspark 0:49cdaebd52d5 306 adrMesPos=3;
tobyspark 0:49cdaebd52d5 307
tobyspark 0:49cdaebd52d5 308 receiverMessage->arg[i]=tempArg[i];
tobyspark 0:49cdaebd52d5 309
tobyspark 0:49cdaebd52d5 310 for(int j=0;j<4;j++){
tobyspark 0:49cdaebd52d5 311
tobyspark 0:49cdaebd52d5 312 tempArg[i][adrMesPos]=rcvBuff[messagePos];
tobyspark 0:49cdaebd52d5 313
tobyspark 0:49cdaebd52d5 314 messagePos++;
tobyspark 0:49cdaebd52d5 315 adrMesPos--;
tobyspark 0:49cdaebd52d5 316 }
tobyspark 0:49cdaebd52d5 317
tobyspark 0:49cdaebd52d5 318 }
tobyspark 0:49cdaebd52d5 319
tobyspark 0:49cdaebd52d5 320
tobyspark 0:49cdaebd52d5 321 }
tobyspark 0:49cdaebd52d5 322
tobyspark 0:49cdaebd52d5 323
tobyspark 1:ab7dc9550de6 324
tobyspark 0:49cdaebd52d5 325 OSCMessage * OSCClass::getMessage(){
tobyspark 0:49cdaebd52d5 326 newMessage=false; // this indicate the user READ the message
tobyspark 0:49cdaebd52d5 327 return receiverMessage;
tobyspark 0:49cdaebd52d5 328 }
tobyspark 0:49cdaebd52d5 329
tobyspark 1:ab7dc9550de6 330
tobyspark 0:49cdaebd52d5 331 void OSCClass::sendOsc( OSCMessage *_mes )
tobyspark 0:49cdaebd52d5 332 {
tobyspark 0:49cdaebd52d5 333 uint8_t lengthEnd;
tobyspark 0:49cdaebd52d5 334 uint8_t lengthStart;
tobyspark 0:49cdaebd52d5 335 char buff[128];
tobyspark 0:49cdaebd52d5 336
tobyspark 0:49cdaebd52d5 337 sendContainer = _mes;
tobyspark 0:49cdaebd52d5 338
tobyspark 0:49cdaebd52d5 339 //&#12496;&#12483;&#12501;&#12449;&#21021;&#26399;&#20516;
tobyspark 0:49cdaebd52d5 340 buff[0]=0;
tobyspark 0:49cdaebd52d5 341
tobyspark 0:49cdaebd52d5 342 //1) Add name spaces:
tobyspark 0:49cdaebd52d5 343 for(int i=0;i<sendContainer->addressNum;i++){
tobyspark 0:49cdaebd52d5 344
tobyspark 0:49cdaebd52d5 345 strcat(buff,sendContainer->address[i]); // note: an address is for instance: "/test" (including the "/")
tobyspark 0:49cdaebd52d5 346
tobyspark 0:49cdaebd52d5 347 }
tobyspark 0:49cdaebd52d5 348
tobyspark 0:49cdaebd52d5 349 // pad with 0s to align in multiples of 4:
tobyspark 0:49cdaebd52d5 350 lengthStart=strlen(buff);
tobyspark 0:49cdaebd52d5 351 lengthEnd=lengthStart+(4-(lengthStart%4));
tobyspark 0:49cdaebd52d5 352 for(int i=lengthStart ; i<lengthEnd; i++){
tobyspark 0:49cdaebd52d5 353 buff[i]=0;
tobyspark 0:49cdaebd52d5 354 }
tobyspark 0:49cdaebd52d5 355
tobyspark 0:49cdaebd52d5 356 lengthStart=lengthEnd;
tobyspark 0:49cdaebd52d5 357
tobyspark 0:49cdaebd52d5 358 //2) Add TypeTag:
tobyspark 0:49cdaebd52d5 359 buff[lengthEnd++]=','; // Note: type tag is for instance: ",if"
tobyspark 0:49cdaebd52d5 360 for(int i=0;i<sendContainer->argNum;i++){
tobyspark 0:49cdaebd52d5 361 buff[lengthEnd++]=sendContainer->typeTag[i];
tobyspark 0:49cdaebd52d5 362 }
tobyspark 0:49cdaebd52d5 363
tobyspark 0:49cdaebd52d5 364 // pad with 0s to align in multiples of 4:
tobyspark 0:49cdaebd52d5 365 lengthStart=lengthEnd;
tobyspark 0:49cdaebd52d5 366 lengthEnd=lengthStart+(4-(lengthStart%4));
tobyspark 0:49cdaebd52d5 367 for(int i=lengthStart ; i<lengthEnd; i++){
tobyspark 0:49cdaebd52d5 368 buff[i]=0;
tobyspark 0:49cdaebd52d5 369 }
tobyspark 0:49cdaebd52d5 370
tobyspark 0:49cdaebd52d5 371 //3) add argument values (Note: here only big endian):
tobyspark 0:49cdaebd52d5 372 uint8_t *v;
tobyspark 0:49cdaebd52d5 373 for(int i=0;i<sendContainer->argNum;i++){
tobyspark 0:49cdaebd52d5 374 uint8_t valuePos=3;
tobyspark 0:49cdaebd52d5 375 v=(uint8_t *)sendContainer->arg[i];
tobyspark 0:49cdaebd52d5 376
tobyspark 0:49cdaebd52d5 377 buff[lengthEnd++]=v[valuePos--];
tobyspark 0:49cdaebd52d5 378 buff[lengthEnd++]=v[valuePos--];
tobyspark 0:49cdaebd52d5 379 buff[lengthEnd++]=v[valuePos--];
tobyspark 0:49cdaebd52d5 380 buff[lengthEnd++]=v[valuePos];
tobyspark 0:49cdaebd52d5 381
tobyspark 0:49cdaebd52d5 382 }
tobyspark 0:49cdaebd52d5 383
tobyspark 0:49cdaebd52d5 384 //4) Send udp packet:
tobyspark 0:49cdaebd52d5 385 //sendto( socketNo, (uint8_t *)buff, lengthEnd, sendContainer->ip, sendContainer->port );
tobyspark 0:49cdaebd52d5 386 udpSend.sendto(buff , lengthEnd, &(sendContainer->host));
tobyspark 0:49cdaebd52d5 387 }
tobyspark 0:49cdaebd52d5 388
tobyspark 0:49cdaebd52d5 389
tobyspark 0:49cdaebd52d5 390 /*
tobyspark 0:49cdaebd52d5 391 flush a receive buffer
tobyspark 0:49cdaebd52d5 392 void OSCClass::flush() {
tobyspark 0:49cdaebd52d5 393 while ( available() ){}
tobyspark 0:49cdaebd52d5 394 }
tobyspark 0:49cdaebd52d5 395 */
tobyspark 0:49cdaebd52d5 396
tobyspark 1:ab7dc9550de6 397
tobyspark 0:49cdaebd52d5 398 void OSCClass::stop() {
tobyspark 0:49cdaebd52d5 399 //close( socketNo );
tobyspark 0:49cdaebd52d5 400 udpSend.resetOnEvent(); // disables callback
tobyspark 0:49cdaebd52d5 401 }
tobyspark 0:49cdaebd52d5 402
tobyspark 0:49cdaebd52d5 403