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
mbedOSC.cpp@11:853a9e887023, 2012-04-15 (annotated)
- Committer:
- tobyspark
- Date:
- Sun Apr 15 15:05:19 2012 +0000
- Revision:
- 11:853a9e887023
- Parent:
- 1:ab7dc9550de6
Who changed what in which revision?
User | Revision | Line number | New 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 | //バッファ初期値 |
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 |