This is an OSC library for the mbed, created to be compatible with Recotana\'s OSCClass library (http://recotana.com) for the Arduino with Ethernet shield. I have also used parts of the OSC Transceiver(Sender/Receiver) code by xshige. It has many limitations, but it works for simple things (check comments on the mbedOSC.h). It will be evolving. written by: Alvaro Cassinelli, 7.10.2011

Dependencies:   mbed

Committer:
mbedalvaro
Date:
Sat Oct 15 14:15:55 2011 +0000
Revision:
0:f76708a93fb3
First working test of this simple OSC library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:f76708a93fb3 1 /*
mbedalvaro 0:f76708a93fb3 2 mbedOSC.cpp
mbedalvaro 0:f76708a93fb3 3 */
mbedalvaro 0:f76708a93fb3 4
mbedalvaro 0:f76708a93fb3 5 #include "mbed.h"
mbedalvaro 0:f76708a93fb3 6 #include "mbedOSC.h"
mbedalvaro 0:f76708a93fb3 7 #include "stdarg.h"
mbedalvaro 0:f76708a93fb3 8
mbedalvaro 0:f76708a93fb3 9 OSCMessage::OSCMessage() {
mbedalvaro 0:f76708a93fb3 10 // Initialize host address and port by default (as if this where the receiver message):
mbedalvaro 0:f76708a93fb3 11 // host=new Host(IpAddr(10, 0, 0, 1), DEFAULT_RECEIVE_PORT, NULL);
mbedalvaro 0:f76708a93fb3 12 }
mbedalvaro 0:f76708a93fb3 13
mbedalvaro 0:f76708a93fb3 14 /*
mbedalvaro 0:f76708a93fb3 15 Set PortNo for the OSC Message
mbedalvaro 0:f76708a93fb3 16 @param[in] _port PortNo (unsigned int)
mbedalvaro 0:f76708a93fb3 17 @return None
mbedalvaro 0:f76708a93fb3 18 */
mbedalvaro 0:f76708a93fb3 19 void OSCMessage::setPort(uint16_t _port){
mbedalvaro 0:f76708a93fb3 20 host.setPort(_port);
mbedalvaro 0:f76708a93fb3 21 }
mbedalvaro 0:f76708a93fb3 22
mbedalvaro 0:f76708a93fb3 23 /*
mbedalvaro 0:f76708a93fb3 24 Set IP Address of the OSC Message (for SENDING messages - for receiving this will be done when receiving something )
mbedalvaro 0:f76708a93fb3 25 param[in] <-- _ip pointer of IP Address array (byte *)
mbedalvaro 0:f76708a93fb3 26 Example: IP=192.168.0.99, then we have to do: ip[]={192,168,0,1}, then setIp(ip)
mbedalvaro 0:f76708a93fb3 27 */
mbedalvaro 0:f76708a93fb3 28 void OSCMessage::setIp(uint8_t *_ip){
mbedalvaro 0:f76708a93fb3 29 host.setIp(IpAddr(_ip[0], _ip[1], _ip[2], _ip[3]));
mbedalvaro 0:f76708a93fb3 30 }
mbedalvaro 0:f76708a93fb3 31
mbedalvaro 0:f76708a93fb3 32
mbedalvaro 0:f76708a93fb3 33 /*!
mbedalvaro 0:f76708a93fb3 34 Set IP Address to the OSC Message container (not through pointer)
mbedalvaro 0:f76708a93fb3 35 Example: IP=192.168.0.99 => setIp(192,168,0,99)
mbedalvaro 0:f76708a93fb3 36 */
mbedalvaro 0:f76708a93fb3 37 void OSCMessage::setIp( uint8_t _ip1,
mbedalvaro 0:f76708a93fb3 38 uint8_t _ip2,
mbedalvaro 0:f76708a93fb3 39 uint8_t _ip3,
mbedalvaro 0:f76708a93fb3 40 uint8_t _ip4 ){
mbedalvaro 0:f76708a93fb3 41
mbedalvaro 0:f76708a93fb3 42 host.setIp(IpAddr(_ip1, _ip2, _ip3, _ip4));
mbedalvaro 0:f76708a93fb3 43 }
mbedalvaro 0:f76708a93fb3 44
mbedalvaro 0:f76708a93fb3 45 const IpAddr& OSCMessage::getIp(){
mbedalvaro 0:f76708a93fb3 46 return host.getIp();
mbedalvaro 0:f76708a93fb3 47 }
mbedalvaro 0:f76708a93fb3 48
mbedalvaro 0:f76708a93fb3 49
mbedalvaro 0:f76708a93fb3 50 const int& OSCMessage::getPort(){
mbedalvaro 0:f76708a93fb3 51 return host.getPort();
mbedalvaro 0:f76708a93fb3 52 }
mbedalvaro 0:f76708a93fb3 53
mbedalvaro 0:f76708a93fb3 54
mbedalvaro 0:f76708a93fb3 55 /*
mbedalvaro 0:f76708a93fb3 56 Gets the number of the OSC message address
mbedalvaro 0:f76708a93fb3 57 param[in] None
mbedalvaro 0:f76708a93fb3 58 return number of the OSC message address (byte)
mbedalvaro 0:f76708a93fb3 59 Examples: "/ard" --> the number of the addresses is 1
mbedalvaro 0:f76708a93fb3 60 "/ard/test" --> the number of the addresses is 2
mbedalvaro 0:f76708a93fb3 61 Attention: the maximum number of addresses is 2 (MAX_ADDRESS)
mbedalvaro 0:f76708a93fb3 62 */
mbedalvaro 0:f76708a93fb3 63 uint8_t OSCMessage::getAddressNum(){
mbedalvaro 0:f76708a93fb3 64
mbedalvaro 0:f76708a93fb3 65 return addressNum;
mbedalvaro 0:f76708a93fb3 66 }
mbedalvaro 0:f76708a93fb3 67
mbedalvaro 0:f76708a93fb3 68
mbedalvaro 0:f76708a93fb3 69 /*
mbedalvaro 0:f76708a93fb3 70 Gets the number of the OSC message args
mbedalvaro 0:f76708a93fb3 71 param[in] None
mbedalvaro 0:f76708a93fb3 72 return number of the args (byte)
mbedalvaro 0:f76708a93fb3 73 Example: "i" 123 --> number of the OSC message args is 1
mbedalvaro 0:f76708a93fb3 74 "if" 123 54.24 --> number of the OSC message args is 2
mbedalvaro 0:f76708a93fb3 75 Attention: the maximum number of args is 2 (MAX_ARG)
mbedalvaro 0:f76708a93fb3 76 */
mbedalvaro 0:f76708a93fb3 77 uint8_t OSCMessage::getArgNum(){
mbedalvaro 0:f76708a93fb3 78
mbedalvaro 0:f76708a93fb3 79 return argNum;
mbedalvaro 0:f76708a93fb3 80 }
mbedalvaro 0:f76708a93fb3 81
mbedalvaro 0:f76708a93fb3 82
mbedalvaro 0:f76708a93fb3 83 /*
mbedalvaro 0:f76708a93fb3 84 Gets the address string of the OSC message
mbedalvaro 0:f76708a93fb3 85 param [in] <-- _index is the index of the address string (byte)
mbedalvaro 0:f76708a93fb3 86 return pointer of the address string (char *)
mbedalvaro 0:f76708a93fb3 87 @note ex. "/ard/test"<br>
mbedalvaro 0:f76708a93fb3 88 getAddress(0) = "/ard"<br>
mbedalvaro 0:f76708a93fb3 89 getAddress(1) = "/test"
mbedalvaro 0:f76708a93fb3 90 @attention It is maximum number of the addresses is 2<br>
mbedalvaro 0:f76708a93fb3 91 In this case "/ard/test1/test2"<br>
mbedalvaro 0:f76708a93fb3 92 ignore it after "/test2"
mbedalvaro 0:f76708a93fb3 93 */
mbedalvaro 0:f76708a93fb3 94 char * OSCMessage::getAddress(uint8_t _index){
mbedalvaro 0:f76708a93fb3 95 if(_index>MAX_ADDRESS) _index=MAX_ADDRESS-1;
mbedalvaro 0:f76708a93fb3 96 return address[_index];
mbedalvaro 0:f76708a93fb3 97
mbedalvaro 0:f76708a93fb3 98 }
mbedalvaro 0:f76708a93fb3 99
mbedalvaro 0:f76708a93fb3 100
mbedalvaro 0:f76708a93fb3 101 /*
mbedalvaro 0:f76708a93fb3 102 Gets the TopAddress string of the OSC message (this is just the address with index 0)
mbedalvaro 0:f76708a93fb3 103 param[in] None
mbedalvaro 0:f76708a93fb3 104 return pointer of the TopAddress string (char *), i.e. address[0]
mbedalvaro 0:f76708a93fb3 105 Example: In the case "/ard/test", getTopAddress() = "/ard" (WITH the slash "/")
mbedalvaro 0:f76708a93fb3 106 */
mbedalvaro 0:f76708a93fb3 107 char * OSCMessage::getTopAddress(){
mbedalvaro 0:f76708a93fb3 108
mbedalvaro 0:f76708a93fb3 109 return getAddress(0);
mbedalvaro 0:f76708a93fb3 110
mbedalvaro 0:f76708a93fb3 111 }
mbedalvaro 0:f76708a93fb3 112
mbedalvaro 0:f76708a93fb3 113 /*
mbedalvaro 0:f76708a93fb3 114 Gets the "SubAddress" string of the OSC message (this is just the address with index 1)
mbedalvaro 0:f76708a93fb3 115 param[in] None
mbedalvaro 0:f76708a93fb3 116 return pointer of the SubAddress string (char *), i.e. address[1]
mbedalvaro 0:f76708a93fb3 117 Example: in the case "/ard/test", getSubAddress() = "/test" (WITH the slash "/")
mbedalvaro 0:f76708a93fb3 118 */
mbedalvaro 0:f76708a93fb3 119 char * OSCMessage::getSubAddress(){
mbedalvaro 0:f76708a93fb3 120
mbedalvaro 0:f76708a93fb3 121 return getAddress(1);
mbedalvaro 0:f76708a93fb3 122
mbedalvaro 0:f76708a93fb3 123 }
mbedalvaro 0:f76708a93fb3 124
mbedalvaro 0:f76708a93fb3 125 /*
mbedalvaro 0:f76708a93fb3 126 Gets the TypeTag string (with index) of the OSC message
mbedalvaro 0:f76708a93fb3 127 param[in] <--_index is the index of the TypeTag string (byte)
mbedalvaro 0:f76708a93fb3 128 return: TypeTag char (char)
mbedalvaro 0:f76708a93fb3 129 Example: in the case of a total typetag string equal to "if", getTypeTag(0) = 'i' and getTypeTag(1) = 'f'
mbedalvaro 0:f76708a93fb3 130 Attention: MAX_ARG is maximum number of the args, if the index argument is larger, it will be constrained to this max.
mbedalvaro 0:f76708a93fb3 131 */
mbedalvaro 0:f76708a93fb3 132 char OSCMessage::getTypeTag(uint8_t _index){
mbedalvaro 0:f76708a93fb3 133 if(_index>MAX_ARG) _index=MAX_ARG-1;
mbedalvaro 0:f76708a93fb3 134 return typeTag[_index];
mbedalvaro 0:f76708a93fb3 135 }
mbedalvaro 0:f76708a93fb3 136
mbedalvaro 0:f76708a93fb3 137 /*
mbedalvaro 0:f76708a93fb3 138 Get the args of the OSC message with an integer value
mbedalvaro 0:f76708a93fb3 139 param[in] <--_index is (an int, or uint8_t), corresponding to the index of the args (byte)
mbedalvaro 0:f76708a93fb3 140 return: integer value (long, or int32_t)
mbedalvaro 0:f76708a93fb3 141 Example: in the case "if" 123 54.24, getArgInt(0) = 123
mbedalvaro 0:f76708a93fb3 142 Noe: "i" is integer, but the return type is "long"
mbedalvaro 0:f76708a93fb3 143 Note: When a index is bigger than the number of the args, it is set to the number of the args
mbedalvaro 0:f76708a93fb3 144 */
mbedalvaro 0:f76708a93fb3 145 int32_t OSCMessage::getArgInt(uint8_t _index){
mbedalvaro 0:f76708a93fb3 146 int32_t *value;
mbedalvaro 0:f76708a93fb3 147 if(_index > argNum) _index=argNum;
mbedalvaro 0:f76708a93fb3 148 value = (int32_t *)arg[_index]; // cast to int32_t
mbedalvaro 0:f76708a93fb3 149 return *value;
mbedalvaro 0:f76708a93fb3 150 }
mbedalvaro 0:f76708a93fb3 151
mbedalvaro 0:f76708a93fb3 152 /*
mbedalvaro 0:f76708a93fb3 153 Get the args of the OSC message with a float value
mbedalvaro 0:f76708a93fb3 154 param[in] <--_index is the index of the args
mbedalvaro 0:f76708a93fb3 155 return: float value (double)
mbedalvaro 0:f76708a93fb3 156 note: In this case "if" 123 54.24, getArgFloat(1) = 54.24
mbedalvaro 0:f76708a93fb3 157 attention: arg declared as float, but return value cast as "double"
mbedalvaro 0:f76708a93fb3 158 attention: When index is bigger than the number of the args, it is set to the number of the args
mbedalvaro 0:f76708a93fb3 159 */
mbedalvaro 0:f76708a93fb3 160 double OSCMessage::getArgFloat(uint8_t _index){
mbedalvaro 0:f76708a93fb3 161 double *value;
mbedalvaro 0:f76708a93fb3 162 if(_index > argNum) _index=argNum;
mbedalvaro 0:f76708a93fb3 163 value = (double *)arg[_index];
mbedalvaro 0:f76708a93fb3 164 return *value;
mbedalvaro 0:f76708a93fb3 165 }
mbedalvaro 0:f76708a93fb3 166
mbedalvaro 0:f76708a93fb3 167 /*
mbedalvaro 0:f76708a93fb3 168 Set TopAddress string of OSC Message
mbedalvaro 0:f76708a93fb3 169 param[in] <-- _address is a string pointer for the TopAddress String (char *). NOTE: is this a good idea? why not pass as const, and do allocation here?
mbedalvaro 0:f76708a93fb3 170 return: None
mbedalvaro 0:f76708a93fb3 171 Example: if the complete address string is "/ard/test", we set the topaddress as follows: char top[]="/ard" (allocation done here!), then setTopAddress(top)
mbedalvaro 0:f76708a93fb3 172 */
mbedalvaro 0:f76708a93fb3 173 void OSCMessage::setTopAddress(char *_address){
mbedalvaro 0:f76708a93fb3 174 address[0]=_address;
mbedalvaro 0:f76708a93fb3 175 address[1]=0;
mbedalvaro 0:f76708a93fb3 176 addressNum=1; // Note: this "erases" the subaddress! (is this a good idea?)
mbedalvaro 0:f76708a93fb3 177 }
mbedalvaro 0:f76708a93fb3 178
mbedalvaro 0:f76708a93fb3 179 /*
mbedalvaro 0:f76708a93fb3 180 Set SubAddress string of the OSC Message
mbedalvaro 0:f76708a93fb3 181 param[in] <-- _address is a string pointer for the SubAddress String (char *)
mbedalvaro 0:f76708a93fb3 182 return: None
mbedalvaro 0:f76708a93fb3 183 Example: if the complete address string is "/ard/test", we set the subaddress as follows: char sub[]="/test" (allocation done here!), then setSubAddress(sub)
mbedalvaro 0:f76708a93fb3 184 Attention: we should call first setTopAddress, and then setSubAddress. The order is important. This does not seems like a good idea...
mbedalvaro 0:f76708a93fb3 185 */
mbedalvaro 0:f76708a93fb3 186 void OSCMessage::setSubAddress(char *_address){
mbedalvaro 0:f76708a93fb3 187 address[1]=_address;
mbedalvaro 0:f76708a93fb3 188 addressNum=2; // Note: this assumes the top address was already set!
mbedalvaro 0:f76708a93fb3 189 }
mbedalvaro 0:f76708a93fb3 190
mbedalvaro 0:f76708a93fb3 191
mbedalvaro 0:f76708a93fb3 192 /*
mbedalvaro 0:f76708a93fb3 193 Set the complete Address string of the OSC Message (top and sub addresses)
mbedalvaro 0:f76708a93fb3 194 param[in] <-- _topAddress and _subAddress are the string pointers to top and sub addresses (char *)
mbedalvaro 0:f76708a93fb3 195 return: None
mbedalvaro 0:f76708a93fb3 196 Example: in the case "/ard/test", we need to do: char top[]="/ard", char sub[]="/test", and then setAddress(top,sub)
mbedalvaro 0:f76708a93fb3 197 Reminder: in this implementation, the maximum number of addresses is MAX_ADDRESS=2
mbedalvaro 0:f76708a93fb3 198 */
mbedalvaro 0:f76708a93fb3 199 void OSCMessage::setAddress(char *_topAddress,char *_subAddress){
mbedalvaro 0:f76708a93fb3 200 setTopAddress(_topAddress);
mbedalvaro 0:f76708a93fb3 201 setSubAddress(_subAddress);
mbedalvaro 0:f76708a93fb3 202 addressNum=2; // (unnecessary...)
mbedalvaro 0:f76708a93fb3 203 }
mbedalvaro 0:f76708a93fb3 204
mbedalvaro 0:f76708a93fb3 205 /*
mbedalvaro 0:f76708a93fb3 206 Set address string using index (here 0 or 1)
mbedalvaro 0:f76708a93fb3 207 Example: "/ard/test", char adr[]="/ard", setAddress(0,adr), char adr2[]="/test", setAddress(1,adr)
mbedalvaro 0:f76708a93fb3 208 */
mbedalvaro 0:f76708a93fb3 209 void OSCMessage::setAddress(uint8_t _index, char *_address){
mbedalvaro 0:f76708a93fb3 210 if(_index>MAX_ADDRESS) _index=MAX_ADDRESS-1;
mbedalvaro 0:f76708a93fb3 211 address[_index]=_address;
mbedalvaro 0:f76708a93fb3 212 addressNum=_index+1;
mbedalvaro 0:f76708a93fb3 213 }
mbedalvaro 0:f76708a93fb3 214
mbedalvaro 0:f76708a93fb3 215
mbedalvaro 0:f76708a93fb3 216 /*
mbedalvaro 0:f76708a93fb3 217 Set TypeTag and args to the OSC Message container
mbedalvaro 0:f76708a93fb3 218 @param[in] types TypeTag string "i"(integer) or"f"(float) (char *)
mbedalvaro 0:f76708a93fb3 219 @param[in] ... Pointer of the Args(variable argument) ..
mbedalvaro 0:f76708a93fb3 220 @return None
mbedalvaro 0:f76708a93fb3 221 @Example:
mbedalvaro 0:f76708a93fb3 222 (1) integer 123: (NOTE: integers are LONG)
mbedalvaro 0:f76708a93fb3 223 long v1=123; sendMes.setArgs("i",&v1)
mbedalvaro 0:f76708a93fb3 224 (2)integer:123 and float:52.14
mbedalvaro 0:f76708a93fb3 225 long v1=123; double v2=52.14; sendMes.setArgs("if",&v1,&v2)
mbedalvaro 0:f76708a93fb3 226 Attention: in this implementation, the maximum number of the args is 2
mbedalvaro 0:f76708a93fb3 227 (if setArgs("iff",&v1,&v2,&v3), data is ignored after &v3)
mbedalvaro 0:f76708a93fb3 228 */
mbedalvaro 0:f76708a93fb3 229 void OSCMessage::setArgs(char *types,...){
mbedalvaro 0:f76708a93fb3 230
mbedalvaro 0:f76708a93fb3 231 va_list argList;
mbedalvaro 0:f76708a93fb3 232
mbedalvaro 0:f76708a93fb3 233 argNum = strlen(types);
mbedalvaro 0:f76708a93fb3 234 if(argNum>MAX_ARG) argNum=MAX_ARG-1;
mbedalvaro 0:f76708a93fb3 235
mbedalvaro 0:f76708a93fb3 236 va_start( argList, types );
mbedalvaro 0:f76708a93fb3 237 for(uint8_t i=0 ; i < argNum ; i++){
mbedalvaro 0:f76708a93fb3 238
mbedalvaro 0:f76708a93fb3 239 typeTag[i]=types[i];
mbedalvaro 0:f76708a93fb3 240
mbedalvaro 0:f76708a93fb3 241 switch(types[i]) {
mbedalvaro 0:f76708a93fb3 242 case 'i':
mbedalvaro 0:f76708a93fb3 243 arg[i]=(uint32_t *)va_arg(argList, uint32_t *);
mbedalvaro 0:f76708a93fb3 244 break;
mbedalvaro 0:f76708a93fb3 245 case 'f':
mbedalvaro 0:f76708a93fb3 246 arg[i]=va_arg(argList, double *);
mbedalvaro 0:f76708a93fb3 247 break;
mbedalvaro 0:f76708a93fb3 248 }
mbedalvaro 0:f76708a93fb3 249
mbedalvaro 0:f76708a93fb3 250 }
mbedalvaro 0:f76708a93fb3 251
mbedalvaro 0:f76708a93fb3 252 }
mbedalvaro 0:f76708a93fb3 253
mbedalvaro 0:f76708a93fb3 254 // ================================================================================================================================================
mbedalvaro 0:f76708a93fb3 255 // ==================================== OSCClass for sending and receiving OSC messages using UDP protocol =======================================
mbedalvaro 0:f76708a93fb3 256 // ================================================================================================================================================
mbedalvaro 0:f76708a93fb3 257 //The class define an object wrapping the UDP functions to send and receive OSC messages
mbedalvaro 0:f76708a93fb3 258
mbedalvaro 0:f76708a93fb3 259 OSCClass::OSCClass(){
mbedalvaro 0:f76708a93fb3 260 newMessage=false;
mbedalvaro 0:f76708a93fb3 261 }
mbedalvaro 0:f76708a93fb3 262
mbedalvaro 0:f76708a93fb3 263 /*
mbedalvaro 0:f76708a93fb3 264 This sets "binds" the received message to the receiver container of the communication object
mbedalvaro 0:f76708a93fb3 265 param[in]<--_mes is a pointer to the "receiveing" OSC message (OSCMessage *)
mbedalvaro 0:f76708a93fb3 266 */
mbedalvaro 0:f76708a93fb3 267 OSCClass::OSCClass(OSCMessage *_mes){
mbedalvaro 0:f76708a93fb3 268 receiverMessage = _mes; // note: receiverMessage MUST be a pointer to the message, because we will modify things in it
mbedalvaro 0:f76708a93fb3 269 newMessage=false;
mbedalvaro 0:f76708a93fb3 270 }
mbedalvaro 0:f76708a93fb3 271
mbedalvaro 0:f76708a93fb3 272 /*
mbedalvaro 0:f76708a93fb3 273 This initializes the OSC communication object with default receiving port (DEFAULT_REC_PORT)
mbedalvaro 0:f76708a93fb3 274 param[in]: None
mbedalvaro 0:f76708a93fb3 275 return: None
mbedalvaro 0:f76708a93fb3 276 */
mbedalvaro 0:f76708a93fb3 277 void OSCClass::begin(void (*pcallbackOnPacketArrival)(UDPSocketEvent))
mbedalvaro 0:f76708a93fb3 278 {
mbedalvaro 0:f76708a93fb3 279 // setup receiver udp socket, as well as callback function:
mbedalvaro 0:f76708a93fb3 280 udpRec.bind(receiverMessage->host);
mbedalvaro 0:f76708a93fb3 281 udpRec.setOnEvent(pcallbackOnPacketArrival); // note: onUDPSocketEvent is a member of OSCClass
mbedalvaro 0:f76708a93fb3 282 }
mbedalvaro 0:f76708a93fb3 283
mbedalvaro 0:f76708a93fb3 284 /*
mbedalvaro 0:f76708a93fb3 285 Initialize an OSC object with arbitrary listening port
mbedalvaro 0:f76708a93fb3 286 param[in] <-- _recievePort, is the listening ("receiving") Port No (unsigned int)
mbedalvaro 0:f76708a93fb3 287 return: None
mbedalvaro 0:f76708a93fb3 288 */
mbedalvaro 0:f76708a93fb3 289 void OSCClass::begin(uint16_t _recievePort, void (*pcallbackOnPacketArrival)(UDPSocketEvent))
mbedalvaro 0:f76708a93fb3 290 {
mbedalvaro 0:f76708a93fb3 291 receiverMessage->host.setPort(_recievePort);
mbedalvaro 0:f76708a93fb3 292 // setup receiver udp socket, as well as callback function:
mbedalvaro 0:f76708a93fb3 293 udpRec.bind(receiverMessage->host);
mbedalvaro 0:f76708a93fb3 294 udpRec.setOnEvent(pcallbackOnPacketArrival);
mbedalvaro 0:f76708a93fb3 295 }
mbedalvaro 0:f76708a93fb3 296
mbedalvaro 0:f76708a93fb3 297 /*
mbedalvaro 0:f76708a93fb3 298 Set a OSC receive message container
mbedalvaro 0:f76708a93fb3 299 param[in] _mes Pointer to the OSC receive message container (OSCMessage *)
mbedalvaro 0:f76708a93fb3 300 return None
mbedalvaro 0:f76708a93fb3 301 */
mbedalvaro 0:f76708a93fb3 302 void OSCClass::setReceiveMessage(OSCMessage *_mes){
mbedalvaro 0:f76708a93fb3 303 receiverMessage = _mes;
mbedalvaro 0:f76708a93fb3 304 }
mbedalvaro 0:f76708a93fb3 305
mbedalvaro 0:f76708a93fb3 306 /*
mbedalvaro 0:f76708a93fb3 307 callback function when an upd message arrives (it will be transformed as OSC message)
mbedalvaro 0:f76708a93fb3 308 */
mbedalvaro 0:f76708a93fb3 309 void OSCClass::onUDPSocketEvent(UDPSocketEvent e)
mbedalvaro 0:f76708a93fb3 310 {
mbedalvaro 0:f76708a93fb3 311 switch(e)
mbedalvaro 0:f76708a93fb3 312 {
mbedalvaro 0:f76708a93fb3 313 case UDPSOCKET_READABLE: //The only event for now
mbedalvaro 0:f76708a93fb3 314 //char buf[256] = {0};
mbedalvaro 0:f76708a93fb3 315 Host auxhost;
mbedalvaro 0:f76708a93fb3 316 buflength = udpRec.recvfrom( rcvBuff, 256, &auxhost ); // QUESTION: auxhost should be equal to the receiver host I guess...
mbedalvaro 0:f76708a93fb3 317 if ( buflength > 0 ) {
mbedalvaro 0:f76708a93fb3 318 //printf("\r\nFrom %d.%d.%d.%d:\r\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
mbedalvaro 0:f76708a93fb3 319 decodePacket(receiverMessage); // convert to OSC message, and save it in receiverMessage
mbedalvaro 0:f76708a93fb3 320 newMessage=true;
mbedalvaro 0:f76708a93fb3 321 }
mbedalvaro 0:f76708a93fb3 322 break;
mbedalvaro 0:f76708a93fb3 323 }
mbedalvaro 0:f76708a93fb3 324 }
mbedalvaro 0:f76708a93fb3 325
mbedalvaro 0:f76708a93fb3 326 /*
mbedalvaro 0:f76708a93fb3 327 Decode UDP packet and save it in the OSCMessage structure
mbedalvaro 0:f76708a93fb3 328 */
mbedalvaro 0:f76708a93fb3 329 void OSCClass::decodePacket( OSCMessage *_mes) {
mbedalvaro 0:f76708a93fb3 330
mbedalvaro 0:f76708a93fb3 331 //uint16_t lenBuff;
mbedalvaro 0:f76708a93fb3 332 uint8_t d;
mbedalvaro 0:f76708a93fb3 333 uint8_t messagePos=0;
mbedalvaro 0:f76708a93fb3 334 uint8_t adrCount=0;
mbedalvaro 0:f76708a93fb3 335 uint8_t adrMesPos=0;
mbedalvaro 0:f76708a93fb3 336 uint8_t packetCount=0;
mbedalvaro 0:f76708a93fb3 337 uint8_t packetPos=4;
mbedalvaro 0:f76708a93fb3 338
mbedalvaro 0:f76708a93fb3 339
mbedalvaro 0:f76708a93fb3 340 //W5100.writeSn(socketNo, SnIR, SnIR::RECV);
mbedalvaro 0:f76708a93fb3 341 //lenBuff=recvfrom(socketNo, rcvBuff, 1, receiverMessage->ip, &receiverMessage->port);
mbedalvaro 0:f76708a93fb3 342
mbedalvaro 0:f76708a93fb3 343 receiverMessage->address[0]=tempAddress[0];
mbedalvaro 0:f76708a93fb3 344
mbedalvaro 0:f76708a93fb3 345 //(1) address process start =========================================
mbedalvaro 0:f76708a93fb3 346 do{
mbedalvaro 0:f76708a93fb3 347 d=rcvBuff[messagePos];
mbedalvaro 0:f76708a93fb3 348
mbedalvaro 0:f76708a93fb3 349
mbedalvaro 0:f76708a93fb3 350 if( (d=='/') && (messagePos>0) ){
mbedalvaro 0:f76708a93fb3 351
mbedalvaro 0:f76708a93fb3 352 if(adrCount<MAX_ADDRESS){
mbedalvaro 0:f76708a93fb3 353 tempAddress[adrCount][adrMesPos]=0;
mbedalvaro 0:f76708a93fb3 354
mbedalvaro 0:f76708a93fb3 355 adrCount++;
mbedalvaro 0:f76708a93fb3 356 adrMesPos=0;
mbedalvaro 0:f76708a93fb3 357
mbedalvaro 0:f76708a93fb3 358 receiverMessage->address[adrCount]=tempAddress[adrCount];
mbedalvaro 0:f76708a93fb3 359 }
mbedalvaro 0:f76708a93fb3 360
mbedalvaro 0:f76708a93fb3 361 }
mbedalvaro 0:f76708a93fb3 362
mbedalvaro 0:f76708a93fb3 363 if(adrCount<MAX_ADDRESS){
mbedalvaro 0:f76708a93fb3 364 //Added this in to remove the slashes out of final output
mbedalvaro 0:f76708a93fb3 365 if(d!='/'){
mbedalvaro 0:f76708a93fb3 366 tempAddress[adrCount][adrMesPos]=d;
mbedalvaro 0:f76708a93fb3 367
mbedalvaro 0:f76708a93fb3 368 if(packetCount>3) {
mbedalvaro 0:f76708a93fb3 369 packetCount=0;
mbedalvaro 0:f76708a93fb3 370 packetPos+=4;
mbedalvaro 0:f76708a93fb3 371 }
mbedalvaro 0:f76708a93fb3 372
mbedalvaro 0:f76708a93fb3 373 adrMesPos++;
mbedalvaro 0:f76708a93fb3 374 }
mbedalvaro 0:f76708a93fb3 375 }
mbedalvaro 0:f76708a93fb3 376 messagePos++;
mbedalvaro 0:f76708a93fb3 377 packetCount++;
mbedalvaro 0:f76708a93fb3 378
mbedalvaro 0:f76708a93fb3 379 }while(d!=0);
mbedalvaro 0:f76708a93fb3 380
mbedalvaro 0:f76708a93fb3 381
mbedalvaro 0:f76708a93fb3 382 if(adrCount<MAX_ADDRESS) adrCount++;
mbedalvaro 0:f76708a93fb3 383 receiverMessage->addressNum=adrCount;
mbedalvaro 0:f76708a93fb3 384
mbedalvaro 0:f76708a93fb3 385 messagePos=packetPos;
mbedalvaro 0:f76708a93fb3 386
mbedalvaro 0:f76708a93fb3 387 //(2) type tag process starts =========================================
mbedalvaro 0:f76708a93fb3 388 packetCount=0;
mbedalvaro 0:f76708a93fb3 389 packetPos+=4;
mbedalvaro 0:f76708a93fb3 390
mbedalvaro 0:f76708a93fb3 391 uint8_t typeTagPos=0;
mbedalvaro 0:f76708a93fb3 392 uint8_t tempArgNum=0;
mbedalvaro 0:f76708a93fb3 393
mbedalvaro 0:f76708a93fb3 394 while(rcvBuff[messagePos]!=0 ){
mbedalvaro 0:f76708a93fb3 395
mbedalvaro 0:f76708a93fb3 396 if(rcvBuff[messagePos] != ',') {
mbedalvaro 0:f76708a93fb3 397
mbedalvaro 0:f76708a93fb3 398 if(typeTagPos<MAX_ARG){
mbedalvaro 0:f76708a93fb3 399 receiverMessage->typeTag[tempArgNum]=rcvBuff[messagePos];
mbedalvaro 0:f76708a93fb3 400 tempArgNum++;
mbedalvaro 0:f76708a93fb3 401 }
mbedalvaro 0:f76708a93fb3 402 typeTagPos++;
mbedalvaro 0:f76708a93fb3 403
mbedalvaro 0:f76708a93fb3 404 }
mbedalvaro 0:f76708a93fb3 405
mbedalvaro 0:f76708a93fb3 406 packetCount++;
mbedalvaro 0:f76708a93fb3 407
mbedalvaro 0:f76708a93fb3 408 if(packetCount>3) {
mbedalvaro 0:f76708a93fb3 409 packetCount=0;
mbedalvaro 0:f76708a93fb3 410 packetPos+=4;
mbedalvaro 0:f76708a93fb3 411 }
mbedalvaro 0:f76708a93fb3 412
mbedalvaro 0:f76708a93fb3 413 messagePos++;
mbedalvaro 0:f76708a93fb3 414 }
mbedalvaro 0:f76708a93fb3 415
mbedalvaro 0:f76708a93fb3 416 receiverMessage->argNum=tempArgNum;
mbedalvaro 0:f76708a93fb3 417
mbedalvaro 0:f76708a93fb3 418 messagePos=packetPos;
mbedalvaro 0:f76708a93fb3 419
mbedalvaro 0:f76708a93fb3 420 //(3) tempArg process starts =========================================
mbedalvaro 0:f76708a93fb3 421 for(int i=0;i<tempArgNum;i++){
mbedalvaro 0:f76708a93fb3 422
mbedalvaro 0:f76708a93fb3 423 adrMesPos=3;
mbedalvaro 0:f76708a93fb3 424
mbedalvaro 0:f76708a93fb3 425 receiverMessage->arg[i]=tempArg[i];
mbedalvaro 0:f76708a93fb3 426
mbedalvaro 0:f76708a93fb3 427 for(int j=0;j<4;j++){
mbedalvaro 0:f76708a93fb3 428
mbedalvaro 0:f76708a93fb3 429 tempArg[i][adrMesPos]=rcvBuff[messagePos];
mbedalvaro 0:f76708a93fb3 430
mbedalvaro 0:f76708a93fb3 431 messagePos++;
mbedalvaro 0:f76708a93fb3 432 adrMesPos--;
mbedalvaro 0:f76708a93fb3 433 }
mbedalvaro 0:f76708a93fb3 434
mbedalvaro 0:f76708a93fb3 435 }
mbedalvaro 0:f76708a93fb3 436
mbedalvaro 0:f76708a93fb3 437
mbedalvaro 0:f76708a93fb3 438 }
mbedalvaro 0:f76708a93fb3 439
mbedalvaro 0:f76708a93fb3 440
mbedalvaro 0:f76708a93fb3 441 /*
mbedalvaro 0:f76708a93fb3 442 Get the received OSC message (note: this is another way to access the message directly from the OSCClass object).
mbedalvaro 0:f76708a93fb3 443 The advantage is that we will signal that we read the message, and will be able to query if a NEW message arrived
mbedalvaro 0:f76708a93fb3 444 (Alternatively, one could have a function pointer to pass to the OSC object, that will be called each time a new packet is received: TO DO)
mbedalvaro 0:f76708a93fb3 445 */
mbedalvaro 0:f76708a93fb3 446 OSCMessage * OSCClass::getMessage(){
mbedalvaro 0:f76708a93fb3 447 newMessage=false; // this indicate the user READ the message
mbedalvaro 0:f76708a93fb3 448 return receiverMessage;
mbedalvaro 0:f76708a93fb3 449 }
mbedalvaro 0:f76708a93fb3 450
mbedalvaro 0:f76708a93fb3 451 /*
mbedalvaro 0:f76708a93fb3 452 Send an OSC Message (message contain the host ip and port where the message data has to be sent)
mbedalvaro 0:f76708a93fb3 453 param[in] _mes Pointer to the OSC message container (OSCMessage *)
mbedalvaro 0:f76708a93fb3 454 return None
mbedalvaro 0:f76708a93fb3 455 */
mbedalvaro 0:f76708a93fb3 456 void OSCClass::sendOsc( OSCMessage *_mes )
mbedalvaro 0:f76708a93fb3 457 {
mbedalvaro 0:f76708a93fb3 458 uint8_t lengthEnd;
mbedalvaro 0:f76708a93fb3 459 uint8_t lengthStart;
mbedalvaro 0:f76708a93fb3 460 char buff[128];
mbedalvaro 0:f76708a93fb3 461
mbedalvaro 0:f76708a93fb3 462 sendContainer = _mes;
mbedalvaro 0:f76708a93fb3 463
mbedalvaro 0:f76708a93fb3 464 //&#12496;&#12483;&#12501;&#12449;&#21021;&#26399;&#20516;
mbedalvaro 0:f76708a93fb3 465 buff[0]=0;
mbedalvaro 0:f76708a93fb3 466
mbedalvaro 0:f76708a93fb3 467 //1) Add name spaces:
mbedalvaro 0:f76708a93fb3 468 for(int i=0;i<sendContainer->addressNum;i++){
mbedalvaro 0:f76708a93fb3 469
mbedalvaro 0:f76708a93fb3 470 strcat(buff,sendContainer->address[i]); // note: an address is for instance: "/test" (including the "/")
mbedalvaro 0:f76708a93fb3 471
mbedalvaro 0:f76708a93fb3 472 }
mbedalvaro 0:f76708a93fb3 473
mbedalvaro 0:f76708a93fb3 474 // pad with 0s to align in multiples of 4:
mbedalvaro 0:f76708a93fb3 475 lengthStart=strlen(buff);
mbedalvaro 0:f76708a93fb3 476 lengthEnd=lengthStart+(4-(lengthStart%4));
mbedalvaro 0:f76708a93fb3 477 for(int i=lengthStart ; i<lengthEnd; i++){
mbedalvaro 0:f76708a93fb3 478 buff[i]=0;
mbedalvaro 0:f76708a93fb3 479 }
mbedalvaro 0:f76708a93fb3 480
mbedalvaro 0:f76708a93fb3 481 lengthStart=lengthEnd;
mbedalvaro 0:f76708a93fb3 482
mbedalvaro 0:f76708a93fb3 483 //2) Add TypeTag:
mbedalvaro 0:f76708a93fb3 484 buff[lengthEnd++]=','; // Note: type tag is for instance: ",if"
mbedalvaro 0:f76708a93fb3 485 for(int i=0;i<sendContainer->argNum;i++){
mbedalvaro 0:f76708a93fb3 486 buff[lengthEnd++]=sendContainer->typeTag[i];
mbedalvaro 0:f76708a93fb3 487 }
mbedalvaro 0:f76708a93fb3 488
mbedalvaro 0:f76708a93fb3 489 // pad with 0s to align in multiples of 4:
mbedalvaro 0:f76708a93fb3 490 lengthStart=lengthEnd;
mbedalvaro 0:f76708a93fb3 491 lengthEnd=lengthStart+(4-(lengthStart%4));
mbedalvaro 0:f76708a93fb3 492 for(int i=lengthStart ; i<lengthEnd; i++){
mbedalvaro 0:f76708a93fb3 493 buff[i]=0;
mbedalvaro 0:f76708a93fb3 494 }
mbedalvaro 0:f76708a93fb3 495
mbedalvaro 0:f76708a93fb3 496 //3) add argument values (Note: here only big endian):
mbedalvaro 0:f76708a93fb3 497 uint8_t *v;
mbedalvaro 0:f76708a93fb3 498 for(int i=0;i<sendContainer->argNum;i++){
mbedalvaro 0:f76708a93fb3 499 uint8_t valuePos=3;
mbedalvaro 0:f76708a93fb3 500 v=(uint8_t *)sendContainer->arg[i];
mbedalvaro 0:f76708a93fb3 501
mbedalvaro 0:f76708a93fb3 502 buff[lengthEnd++]=v[valuePos--];
mbedalvaro 0:f76708a93fb3 503 buff[lengthEnd++]=v[valuePos--];
mbedalvaro 0:f76708a93fb3 504 buff[lengthEnd++]=v[valuePos--];
mbedalvaro 0:f76708a93fb3 505 buff[lengthEnd++]=v[valuePos];
mbedalvaro 0:f76708a93fb3 506
mbedalvaro 0:f76708a93fb3 507 }
mbedalvaro 0:f76708a93fb3 508
mbedalvaro 0:f76708a93fb3 509 //4) Send udp packet:
mbedalvaro 0:f76708a93fb3 510 //sendto( socketNo, (uint8_t *)buff, lengthEnd, sendContainer->ip, sendContainer->port );
mbedalvaro 0:f76708a93fb3 511 udpSend.sendto(buff , lengthEnd, &(sendContainer->host));
mbedalvaro 0:f76708a93fb3 512 }
mbedalvaro 0:f76708a93fb3 513
mbedalvaro 0:f76708a93fb3 514
mbedalvaro 0:f76708a93fb3 515 /*
mbedalvaro 0:f76708a93fb3 516 flush a receive buffer
mbedalvaro 0:f76708a93fb3 517 void OSCClass::flush() {
mbedalvaro 0:f76708a93fb3 518 while ( available() ){}
mbedalvaro 0:f76708a93fb3 519 }
mbedalvaro 0:f76708a93fb3 520 */
mbedalvaro 0:f76708a93fb3 521
mbedalvaro 0:f76708a93fb3 522 /*
mbedalvaro 0:f76708a93fb3 523 Stop OSC communication (in fact, only the receiver - the server side)
mbedalvaro 0:f76708a93fb3 524 */
mbedalvaro 0:f76708a93fb3 525 void OSCClass::stop() {
mbedalvaro 0:f76708a93fb3 526 //close( socketNo );
mbedalvaro 0:f76708a93fb3 527 udpSend.resetOnEvent(); // disables callback
mbedalvaro 0:f76708a93fb3 528 }
mbedalvaro 0:f76708a93fb3 529
mbedalvaro 0:f76708a93fb3 530