just a test

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Wed Mar 28 14:40:01 2012 +0000
Revision:
0:345b3bc7a0ea
Child:
30:d8af03f01cd4
This version (using rigid frame, base and child classes, etc) works, but the blob is strangely smaller. Need to check this.

Who changed what in which revision?

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