LineLedControl

Dependencies:   LPD8806 mbed

Fork of LPD8806_Test by Jelmer Tiete

Committer:
sfjmt
Date:
Mon Aug 19 12:14:37 2013 +0000
Revision:
3:b0a1b4b24d3c
LPD8806 control

Who changed what in which revision?

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