OSC Transceiver(Sender/Receiver) program on mbed supporting types i:int32, b:blob, s:string, f:float32, m:MIDI. Attached OSC test program(in processing). Plese refer for detail:http://opensoundcontrol.org/introduction-osc

Dependencies:   EthernetNetIf mbed

Committer:
xshige
Date:
Tue Jan 11 13:49:57 2011 +0000
Revision:
0:a11a5771a1a9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xshige 0:a11a5771a1a9 1 //
xshige 0:a11a5771a1a9 2 // OSC Transceiver(Sender/Receiver)
xshige 0:a11a5771a1a9 3 //
xshige 0:a11a5771a1a9 4 // date: 2011/1/11
xshige 0:a11a5771a1a9 5 // version: 0.7
xshige 0:a11a5771a1a9 6 // written by: xshige
xshige 0:a11a5771a1a9 7 //
xshige 0:a11a5771a1a9 8 // please find OSC Sender/Receiver test program at the bottom of this file
xshige 0:a11a5771a1a9 9 //
xshige 0:a11a5771a1a9 10 // please refer to: http://opensoundcontrol.org/introduction-osc for OSC(Open Sound Control)
xshige 0:a11a5771a1a9 11 /*
xshige 0:a11a5771a1a9 12 The followings are supported:
xshige 0:a11a5771a1a9 13
xshige 0:a11a5771a1a9 14 Transport Type:
xshige 0:a11a5771a1a9 15 UDP
xshige 0:a11a5771a1a9 16
xshige 0:a11a5771a1a9 17 Features:
xshige 0:a11a5771a1a9 18 Packet Parsing (Client)
xshige 0:a11a5771a1a9 19 Packet Construction (Server)
xshige 0:a11a5771a1a9 20 Bundle NOT Support
xshige 0:a11a5771a1a9 21 Timetag NOT Support
xshige 0:a11a5771a1a9 22
xshige 0:a11a5771a1a9 23 Type Support:
xshige 0:a11a5771a1a9 24 i: int32
xshige 0:a11a5771a1a9 25 b: blob
xshige 0:a11a5771a1a9 26 s: string
xshige 0:a11a5771a1a9 27 f: float32
xshige 0:a11a5771a1a9 28 m: MIDI message(port id, status byte, data1, data2) // I don't know the detail
xshige 0:a11a5771a1a9 29
xshige 0:a11a5771a1a9 30 */
xshige 0:a11a5771a1a9 31
xshige 0:a11a5771a1a9 32
xshige 0:a11a5771a1a9 33 #include "mbed.h"
xshige 0:a11a5771a1a9 34 #include "EthernetNetIf.h"
xshige 0:a11a5771a1a9 35 #include "UDPSocket.h"
xshige 0:a11a5771a1a9 36
xshige 0:a11a5771a1a9 37 //#define DHCP
xshige 0:a11a5771a1a9 38 //#define LED
xshige 0:a11a5771a1a9 39 //int ledsOSC;
xshige 0:a11a5771a1a9 40
xshige 0:a11a5771a1a9 41 #define INPUT_PORT 57130
xshige 0:a11a5771a1a9 42 #define OUTPUT_PORT 12000
xshige 0:a11a5771a1a9 43 // setup your mbed IP address
xshige 0:a11a5771a1a9 44 Host sendHost(IpAddr(192, 168, 0, 7), OUTPUT_PORT, NULL); // Send Port
xshige 0:a11a5771a1a9 45 Host recHost(IpAddr(192, 168, 0, 7), INPUT_PORT, NULL); // Receive Port
xshige 0:a11a5771a1a9 46 UDPSocket udpRec,udpSend;
xshige 0:a11a5771a1a9 47
xshige 0:a11a5771a1a9 48 #ifdef DHCP
xshige 0:a11a5771a1a9 49 EthernetNetIf eth;
xshige 0:a11a5771a1a9 50 #else
xshige 0:a11a5771a1a9 51 EthernetNetIf eth(
xshige 0:a11a5771a1a9 52 IpAddr(192,168,0,25), //IP Address
xshige 0:a11a5771a1a9 53 IpAddr(255,255,255,0), //Network Mask
xshige 0:a11a5771a1a9 54 IpAddr(192,168,0,1), //Gateway
xshige 0:a11a5771a1a9 55 IpAddr(192,168,0,1) //DNS
xshige 0:a11a5771a1a9 56 );
xshige 0:a11a5771a1a9 57 #endif
xshige 0:a11a5771a1a9 58
xshige 0:a11a5771a1a9 59
xshige 0:a11a5771a1a9 60 //--- OSC related stuff ---
xshige 0:a11a5771a1a9 61 int putOSCmsg(char *packet , union OSCarg *msg); // makes packet from OSC message and returns packet size
xshige 0:a11a5771a1a9 62 void getOSCmsg(char *packet , union OSCarg *msg); // makes OSC message from packet
xshige 0:a11a5771a1a9 63
xshige 0:a11a5771a1a9 64 union OSCarg {
xshige 0:a11a5771a1a9 65 // char*, int and float are assumed four bytes
xshige 0:a11a5771a1a9 66 char *address;
xshige 0:a11a5771a1a9 67 char *typeTag;
xshige 0:a11a5771a1a9 68 int i;
xshige 0:a11a5771a1a9 69 float f;
xshige 0:a11a5771a1a9 70 char *s;
xshige 0:a11a5771a1a9 71 struct {
xshige 0:a11a5771a1a9 72 int len; // is "int i"
xshige 0:a11a5771a1a9 73 char *p;
xshige 0:a11a5771a1a9 74 } blob;
xshige 0:a11a5771a1a9 75 char m[4]; // for MIDI
xshige 0:a11a5771a1a9 76 char _b[4]; // endian conversion temp variable
xshige 0:a11a5771a1a9 77 };
xshige 0:a11a5771a1a9 78
xshige 0:a11a5771a1a9 79 int putOSCmsg(char *packet , union OSCarg *msg){
xshige 0:a11a5771a1a9 80 char *p, *s, *d, *typeTag; char c;
xshige 0:a11a5771a1a9 81
xshige 0:a11a5771a1a9 82 p=packet;
xshige 0:a11a5771a1a9 83 d=p;
xshige 0:a11a5771a1a9 84 s=msg[0].address; // address
xshige 0:a11a5771a1a9 85 for(int i=0; i<strlen(msg[0].address); i++) *d++ = *s++;
xshige 0:a11a5771a1a9 86 *d=0; // terminator
xshige 0:a11a5771a1a9 87 p += 4*(strlen(msg[1].address)/4+1);
xshige 0:a11a5771a1a9 88 //
xshige 0:a11a5771a1a9 89 s=msg[1].typeTag;
xshige 0:a11a5771a1a9 90 d=p;
xshige 0:a11a5771a1a9 91 for(int i=0; i<strlen(msg[1].typeTag); i++) *d++ = *s++;
xshige 0:a11a5771a1a9 92 *d=0; // terminator
xshige 0:a11a5771a1a9 93 p += 4*(strlen(msg[1].s)/4+1);
xshige 0:a11a5771a1a9 94 //
xshige 0:a11a5771a1a9 95 typeTag=msg[1].s+1; // skip ','
xshige 0:a11a5771a1a9 96 for(int n=0; n<strlen(typeTag); n++){
xshige 0:a11a5771a1a9 97 c = typeTag[n];
xshige 0:a11a5771a1a9 98 if (('s'==c)) {
xshige 0:a11a5771a1a9 99 s=msg[n+2].s;
xshige 0:a11a5771a1a9 100 d=p;
xshige 0:a11a5771a1a9 101 for(int i=0; i<strlen(msg[n+2].s); i++) *d++ = *s++;
xshige 0:a11a5771a1a9 102 *d=0; // terminater
xshige 0:a11a5771a1a9 103 p += 4*(strlen(msg[n+2].s)/4+1);
xshige 0:a11a5771a1a9 104 } else if (('i'==c)||('f'==c)) {
xshige 0:a11a5771a1a9 105 // chang endian (little to big)
xshige 0:a11a5771a1a9 106 p[0]=msg[n+2]._b[3];
xshige 0:a11a5771a1a9 107 p[1]=msg[n+2]._b[2];
xshige 0:a11a5771a1a9 108 p[2]=msg[n+2]._b[1];
xshige 0:a11a5771a1a9 109 p[3]=msg[n+2]._b[0];
xshige 0:a11a5771a1a9 110 p +=4;
xshige 0:a11a5771a1a9 111 } else if ('b'==c) {
xshige 0:a11a5771a1a9 112 // chang endian (little to big)
xshige 0:a11a5771a1a9 113 // put length of blog
xshige 0:a11a5771a1a9 114 p[0]=msg[n+2]._b[3];
xshige 0:a11a5771a1a9 115 p[1]=msg[n+2]._b[2];
xshige 0:a11a5771a1a9 116 p[2]=msg[n+2]._b[1];
xshige 0:a11a5771a1a9 117 p[3]=msg[n+2]._b[0];
xshige 0:a11a5771a1a9 118 p +=4;
xshige 0:a11a5771a1a9 119 // get ponter of blog (copy to msg[n].blog.p)
xshige 0:a11a5771a1a9 120 s=msg[n+2].blob.p;
xshige 0:a11a5771a1a9 121 d=p;
xshige 0:a11a5771a1a9 122 for(int i=0; i<msg[n+2].blob.len; i++) *d++ = *s++;
xshige 0:a11a5771a1a9 123 p += 4*(msg[n+2].blob.len/4+1);
xshige 0:a11a5771a1a9 124 } else if ('m'==c) {
xshige 0:a11a5771a1a9 125 // get midi data (copy to msg[n].m[])
xshige 0:a11a5771a1a9 126 p[0]=msg[n+2].m[0];
xshige 0:a11a5771a1a9 127 p[1]=msg[n+2].m[1];
xshige 0:a11a5771a1a9 128 p[2]=msg[n+2].m[2];
xshige 0:a11a5771a1a9 129 p[3]=msg[n+2].m[3];
xshige 0:a11a5771a1a9 130 p +=4;
xshige 0:a11a5771a1a9 131 } else {
xshige 0:a11a5771a1a9 132 printf("*** Not Supported TypeTag:%s ****\n",typeTag);
xshige 0:a11a5771a1a9 133 }
xshige 0:a11a5771a1a9 134 };
xshige 0:a11a5771a1a9 135 return (p-packet); // return packet size
xshige 0:a11a5771a1a9 136 }
xshige 0:a11a5771a1a9 137
xshige 0:a11a5771a1a9 138 void getOSCmsg(char *packet , union OSCarg *msg){
xshige 0:a11a5771a1a9 139 // Caution: the returned result points to packet as blobs or strings (not newly allocatd)
xshige 0:a11a5771a1a9 140 char *p, *typeTag; char c;
xshige 0:a11a5771a1a9 141
xshige 0:a11a5771a1a9 142 msg[0].address = packet; // address
xshige 0:a11a5771a1a9 143 msg[1].typeTag = packet+4*(strlen(msg[0].s)/4+1);//typeTag
xshige 0:a11a5771a1a9 144 typeTag=msg[1].s+1; // skip ','
xshige 0:a11a5771a1a9 145 p= msg[1].s+4*(strlen(msg[1].s)/4+1);
xshige 0:a11a5771a1a9 146 for(int n=0; n<strlen(typeTag); n++){
xshige 0:a11a5771a1a9 147 c = typeTag[n];
xshige 0:a11a5771a1a9 148 if (('s'==c)) {
xshige 0:a11a5771a1a9 149 msg[n+2].s=p;
xshige 0:a11a5771a1a9 150 p += 4*(strlen(msg[n+2].s)/4+1);
xshige 0:a11a5771a1a9 151 } else if (('i'==c)||('f'==c)) {
xshige 0:a11a5771a1a9 152 // chang endian (big to little)
xshige 0:a11a5771a1a9 153 msg[n+2]._b[3]=p[0];
xshige 0:a11a5771a1a9 154 msg[n+2]._b[2]=p[1];
xshige 0:a11a5771a1a9 155 msg[n+2]._b[1]=p[2];
xshige 0:a11a5771a1a9 156 msg[n+2]._b[0]=p[3];
xshige 0:a11a5771a1a9 157 p +=4;
xshige 0:a11a5771a1a9 158 } else if ('b'==c) {
xshige 0:a11a5771a1a9 159 // chang endian (big to little)
xshige 0:a11a5771a1a9 160 // get lenth of blog (copy to msg[n].blog.len)
xshige 0:a11a5771a1a9 161 msg[n+2]._b[3]=p[0];
xshige 0:a11a5771a1a9 162 msg[n+2]._b[2]=p[1];
xshige 0:a11a5771a1a9 163 msg[n+2]._b[1]=p[2];
xshige 0:a11a5771a1a9 164 msg[n+2]._b[0]=p[3];
xshige 0:a11a5771a1a9 165 p +=4;
xshige 0:a11a5771a1a9 166 // get ponter of blog (copy to msg[n].blog.p)
xshige 0:a11a5771a1a9 167 msg[n+2].blob.p=p;
xshige 0:a11a5771a1a9 168 p += 4*(msg[n+2].blob.len/4+1);
xshige 0:a11a5771a1a9 169 } else if ('m'==c) {
xshige 0:a11a5771a1a9 170 // get midi data (copy to msg[n].m[])
xshige 0:a11a5771a1a9 171 msg[n+2].m[0]=p[0];
xshige 0:a11a5771a1a9 172 msg[n+2].m[1]=p[1];
xshige 0:a11a5771a1a9 173 msg[n+2].m[2]=p[2];
xshige 0:a11a5771a1a9 174 msg[n+2].m[3]=p[3];
xshige 0:a11a5771a1a9 175 p +=4;
xshige 0:a11a5771a1a9 176 } else {
xshige 0:a11a5771a1a9 177 printf("*** Not Supported TypeTag:%s ****\n",typeTag);
xshige 0:a11a5771a1a9 178 }
xshige 0:a11a5771a1a9 179 };
xshige 0:a11a5771a1a9 180
xshige 0:a11a5771a1a9 181 }
xshige 0:a11a5771a1a9 182 //-------------------------------------------
xshige 0:a11a5771a1a9 183
xshige 0:a11a5771a1a9 184 void onUDPSocketEvent(UDPSocketEvent e)
xshige 0:a11a5771a1a9 185 {
xshige 0:a11a5771a1a9 186 union OSCarg msg[10];
xshige 0:a11a5771a1a9 187
xshige 0:a11a5771a1a9 188 switch(e)
xshige 0:a11a5771a1a9 189 {
xshige 0:a11a5771a1a9 190 case UDPSOCKET_READABLE: //The only event for now
xshige 0:a11a5771a1a9 191 char buf[256] = {0};
xshige 0:a11a5771a1a9 192 Host host;
xshige 0:a11a5771a1a9 193 while( int len = udpRec.recvfrom( buf, 256, &host ) )
xshige 0:a11a5771a1a9 194 {
xshige 0:a11a5771a1a9 195 if( len <= 0 )
xshige 0:a11a5771a1a9 196 break;
xshige 0:a11a5771a1a9 197 printf("\r\nFrom %d.%d.%d.%d:\r\n",
xshige 0:a11a5771a1a9 198 host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);
xshige 0:a11a5771a1a9 199
xshige 0:a11a5771a1a9 200 getOSCmsg(buf,msg);
xshige 0:a11a5771a1a9 201
xshige 0:a11a5771a1a9 202 // address pattern samples
xshige 0:a11a5771a1a9 203 if (strcmp(msg[0].address,"/test")==0) {
xshige 0:a11a5771a1a9 204 printf("OSCmsg: %s %s %d %f %s %d\n",
xshige 0:a11a5771a1a9 205 msg[0].address, msg[1].typeTag,msg[2].i, msg[3].f, msg[4].s, msg[5].blob.len);
xshige 0:a11a5771a1a9 206 printf("blob content:\n");
xshige 0:a11a5771a1a9 207 char *p=msg[5].blob.p;
xshige 0:a11a5771a1a9 208 for(int n=0; n<msg[5].blob.len; p++,n++) printf(" %02X",(unsigned char)(*p));
xshige 0:a11a5771a1a9 209 printf("\n");
xshige 0:a11a5771a1a9 210 break;
xshige 0:a11a5771a1a9 211 }
xshige 0:a11a5771a1a9 212 if (strcmp(msg[0].address,"/kb/m")==0) {
xshige 0:a11a5771a1a9 213 printf("OSCmsg: %s %s %d %d %d\n",
xshige 0:a11a5771a1a9 214 msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i);
xshige 0:a11a5771a1a9 215 break;
xshige 0:a11a5771a1a9 216 }
xshige 0:a11a5771a1a9 217 if (strcmp(msg[0].address,"/cc/m")==0) {
xshige 0:a11a5771a1a9 218 printf("OSCmsg: %s %s %d %d %d\n",
xshige 0:a11a5771a1a9 219 msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i);
xshige 0:a11a5771a1a9 220 break;
xshige 0:a11a5771a1a9 221 }
xshige 0:a11a5771a1a9 222 if (strcmp(msg[0].address,"/1/fader1")==0) {
xshige 0:a11a5771a1a9 223 printf("OSCmsg: %s %s %f\n",
xshige 0:a11a5771a1a9 224 msg[0].address, msg[1].typeTag,msg[2].f);
xshige 0:a11a5771a1a9 225 break;
xshige 0:a11a5771a1a9 226 }
xshige 0:a11a5771a1a9 227 if (strcmp(msg[0].address,"/1/knob1")==0) {
xshige 0:a11a5771a1a9 228 printf("OSCmsg: %s %s %f\n",
xshige 0:a11a5771a1a9 229 msg[0].address, msg[1].typeTag, msg[2].f);
xshige 0:a11a5771a1a9 230 break;
xshige 0:a11a5771a1a9 231 }
xshige 0:a11a5771a1a9 232 if (strcmp(msg[0].address,"/1/butt/A1")==0) {
xshige 0:a11a5771a1a9 233 printf("OSCmsg: %s %s %i\n",
xshige 0:a11a5771a1a9 234 msg[0].address, msg[1].typeTag, msg[2].i);
xshige 0:a11a5771a1a9 235 break;
xshige 0:a11a5771a1a9 236 }
xshige 0:a11a5771a1a9 237 if (strcmp(msg[0].address,"/1/butt/B1")==0) {
xshige 0:a11a5771a1a9 238 printf("OSCmsg: %s %s %i\n",
xshige 0:a11a5771a1a9 239 msg[0].address, msg[1].typeTag, msg[2].i);
xshige 0:a11a5771a1a9 240 break;
xshige 0:a11a5771a1a9 241 }
xshige 0:a11a5771a1a9 242 if (strcmp(msg[0].address,"/mouse/dragged")==0) {
xshige 0:a11a5771a1a9 243 printf("OSCmsg: %s %s %i %i\n",
xshige 0:a11a5771a1a9 244 msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i);
xshige 0:a11a5771a1a9 245 break;
xshige 0:a11a5771a1a9 246 }
xshige 0:a11a5771a1a9 247 if (strcmp(msg[0].address,"/mouse/pressed")==0) {
xshige 0:a11a5771a1a9 248 printf("OSCmsg: %s %s %i %i\n",
xshige 0:a11a5771a1a9 249 msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i);
xshige 0:a11a5771a1a9 250 break;
xshige 0:a11a5771a1a9 251 }
xshige 0:a11a5771a1a9 252 if (strcmp(msg[0].address,"/1/xy")==0) {
xshige 0:a11a5771a1a9 253 printf("OSCmsg: %s %s %f %f %d\n",
xshige 0:a11a5771a1a9 254 msg[0].address, msg[1].typeTag, msg[2].f, msg[3].f, msg[4].i);
xshige 0:a11a5771a1a9 255 #ifdef LED
xshige 0:a11a5771a1a9 256 ledsOSC=16*msg[2].f;
xshige 0:a11a5771a1a9 257 #endif
xshige 0:a11a5771a1a9 258 break;
xshige 0:a11a5771a1a9 259 }
xshige 0:a11a5771a1a9 260 printf("undefined OSCmsg:%s %s\n",msg[0].address, msg[1].typeTag);
xshige 0:a11a5771a1a9 261 } // while
xshige 0:a11a5771a1a9 262 break;
xshige 0:a11a5771a1a9 263 } // case
xshige 0:a11a5771a1a9 264 }
xshige 0:a11a5771a1a9 265
xshige 0:a11a5771a1a9 266 #ifdef LED
xshige 0:a11a5771a1a9 267 BusOut myleds(LED1, LED2, LED3, LED4);
xshige 0:a11a5771a1a9 268 #endif
xshige 0:a11a5771a1a9 269
xshige 0:a11a5771a1a9 270
xshige 0:a11a5771a1a9 271 int counter=1; // for test
xshige 0:a11a5771a1a9 272 void sendTestOSCmsg(){
xshige 0:a11a5771a1a9 273 char packet[128]; int len;
xshige 0:a11a5771a1a9 274
xshige 0:a11a5771a1a9 275 union OSCarg outmsg[10];
xshige 0:a11a5771a1a9 276 char bb[17]={0x00, 0x01, 0x10, 0x20,0x30,0x40,0x50,0x60,0x7F,0x80,0x90,0xA0,0xB0,0xC0,0xD0,0xE0,0xFF};
xshige 0:a11a5771a1a9 277 // setup OSC message
xshige 0:a11a5771a1a9 278 outmsg[0].address="/test2";
xshige 0:a11a5771a1a9 279 outmsg[1].typeTag=",ifsb";
xshige 0:a11a5771a1a9 280 outmsg[2].i=counter; counter++;
xshige 0:a11a5771a1a9 281 outmsg[3].f=34.55*counter;
xshige 0:a11a5771a1a9 282 outmsg[4].s="Hello! Everything is going right?";
xshige 0:a11a5771a1a9 283 outmsg[5].blob.len=sizeof(bb);
xshige 0:a11a5771a1a9 284 outmsg[5].blob.p=bb;
xshige 0:a11a5771a1a9 285 // make packet from OSC message
xshige 0:a11a5771a1a9 286 len=putOSCmsg(packet,outmsg);
xshige 0:a11a5771a1a9 287
xshige 0:a11a5771a1a9 288 // send it
xshige 0:a11a5771a1a9 289 udpSend.sendto(packet, len, &sendHost );
xshige 0:a11a5771a1a9 290
xshige 0:a11a5771a1a9 291 //debug code
xshige 0:a11a5771a1a9 292 #if 0
xshige 0:a11a5771a1a9 293 union OSCarg msg[10]; //debug
xshige 0:a11a5771a1a9 294 getOSCmsg(packet,msg);
xshige 0:a11a5771a1a9 295 if (strcmp(msg[0].address,"/test2")==0) {
xshige 0:a11a5771a1a9 296 printf("\nsend packet debugging:\n");
xshige 0:a11a5771a1a9 297 printf("OSCmsg: %s %s %d %f %s %d\n",
xshige 0:a11a5771a1a9 298 msg[0].address, msg[1].typeTag,msg[2].i, msg[3].f, msg[4].s, msg[5].blob.len);
xshige 0:a11a5771a1a9 299 printf("blob content:\n");
xshige 0:a11a5771a1a9 300 char *p=msg[5].blob.p;
xshige 0:a11a5771a1a9 301 for(int n=0; n<msg[5].blob.len; p++,n++) printf(" %02X",(unsigned char)(*p));
xshige 0:a11a5771a1a9 302 printf("\n");
xshige 0:a11a5771a1a9 303 }
xshige 0:a11a5771a1a9 304 #endif
xshige 0:a11a5771a1a9 305 }
xshige 0:a11a5771a1a9 306
xshige 0:a11a5771a1a9 307
xshige 0:a11a5771a1a9 308 int main() {
xshige 0:a11a5771a1a9 309 // make debug port Fast
xshige 0:a11a5771a1a9 310 Serial pc(USBTX, USBRX);
xshige 0:a11a5771a1a9 311 // pc.baud(9600);
xshige 0:a11a5771a1a9 312 pc.baud(115200);
xshige 0:a11a5771a1a9 313 // pc.baud(230400);
xshige 0:a11a5771a1a9 314
xshige 0:a11a5771a1a9 315 printf("Setting up...\r\n");
xshige 0:a11a5771a1a9 316 EthernetErr ethErr = eth.setup();
xshige 0:a11a5771a1a9 317 if(ethErr)
xshige 0:a11a5771a1a9 318 {
xshige 0:a11a5771a1a9 319 printf("Error %d in setup.\r\n", ethErr);
xshige 0:a11a5771a1a9 320 return -1;
xshige 0:a11a5771a1a9 321 }
xshige 0:a11a5771a1a9 322 printf("Setup OK\r\n");
xshige 0:a11a5771a1a9 323
xshige 0:a11a5771a1a9 324
xshige 0:a11a5771a1a9 325 // setup receiver
xshige 0:a11a5771a1a9 326 udpRec.setOnEvent(&onUDPSocketEvent);
xshige 0:a11a5771a1a9 327 udpRec.bind(recHost);
xshige 0:a11a5771a1a9 328
xshige 0:a11a5771a1a9 329
xshige 0:a11a5771a1a9 330 Timer tmr;
xshige 0:a11a5771a1a9 331 tmr.start();
xshige 0:a11a5771a1a9 332 while(true)
xshige 0:a11a5771a1a9 333 {
xshige 0:a11a5771a1a9 334 Net::poll();
xshige 0:a11a5771a1a9 335 if(tmr.read() > 2)
xshige 0:a11a5771a1a9 336 {
xshige 0:a11a5771a1a9 337 tmr.reset();
xshige 0:a11a5771a1a9 338 sendTestOSCmsg();
xshige 0:a11a5771a1a9 339 }
xshige 0:a11a5771a1a9 340
xshige 0:a11a5771a1a9 341 // sendTestOSCmsg();
xshige 0:a11a5771a1a9 342
xshige 0:a11a5771a1a9 343 #ifdef LED
xshige 0:a11a5771a1a9 344 myleds=ledsOSC%16;
xshige 0:a11a5771a1a9 345 #endif
xshige 0:a11a5771a1a9 346 }
xshige 0:a11a5771a1a9 347 }
xshige 0:a11a5771a1a9 348
xshige 0:a11a5771a1a9 349 //----------------------------------------------------------------------------------------------------------
xshige 0:a11a5771a1a9 350 /*
xshige 0:a11a5771a1a9 351 //
xshige 0:a11a5771a1a9 352 // OSC Sender/Receiver test
xshige 0:a11a5771a1a9 353 //
xshige 0:a11a5771a1a9 354 // written in: processing(refer to: http://processing.org/)
xshige 0:a11a5771a1a9 355 //
xshige 0:a11a5771a1a9 356 // this program is based on oscP5plug in examples of oscP5 lib.
xshige 0:a11a5771a1a9 357 //
xshige 0:a11a5771a1a9 358 // please install oscP5 lib
xshige 0:a11a5771a1a9 359 // you can download this from: http://www.sojamo.de/libraries/oscP5/
xshige 0:a11a5771a1a9 360
xshige 0:a11a5771a1a9 361 import oscP5.*;
xshige 0:a11a5771a1a9 362 import netP5.*;
xshige 0:a11a5771a1a9 363
xshige 0:a11a5771a1a9 364 // change them to fit your environment
xshige 0:a11a5771a1a9 365 int INPUT_PORT=12000; // receive port
xshige 0:a11a5771a1a9 366 int OUTPUT_PORT=57130; // send port
xshige 0:a11a5771a1a9 367 String remoteIP="192.168.0.25"; // mbed IP address
xshige 0:a11a5771a1a9 368
xshige 0:a11a5771a1a9 369 OscP5 oscP5;
xshige 0:a11a5771a1a9 370 NetAddress remoteHost;
xshige 0:a11a5771a1a9 371
xshige 0:a11a5771a1a9 372 void setup() {
xshige 0:a11a5771a1a9 373 size(400,400);
xshige 0:a11a5771a1a9 374 // setup receiver
xshige 0:a11a5771a1a9 375 oscP5 = new OscP5(this,INPUT_PORT);
xshige 0:a11a5771a1a9 376 // setup mbed IP & sender
xshige 0:a11a5771a1a9 377 remoteHost = new NetAddress(remoteIP,OUTPUT_PORT);
xshige 0:a11a5771a1a9 378
xshige 0:a11a5771a1a9 379 // setup OSC message address for receiving
xshige 0:a11a5771a1a9 380 oscP5.plug(this,"received_test2","/test2");
xshige 0:a11a5771a1a9 381
xshige 0:a11a5771a1a9 382 // send test message
xshige 0:a11a5771a1a9 383 sendTestMsg();
xshige 0:a11a5771a1a9 384 }
xshige 0:a11a5771a1a9 385
xshige 0:a11a5771a1a9 386 public void received_test2(int a1, float a2, String a3, byte[] a4) {
xshige 0:a11a5771a1a9 387 println("\nreceived /test2 "+a1+", "+a2+" "+a3);
xshige 0:a11a5771a1a9 388 println("Blob contents:");
xshige 0:a11a5771a1a9 389 for(int n=0; n<a4.length; n++) print(" "+hex(a4[n]));
xshige 0:a11a5771a1a9 390 println();
xshige 0:a11a5771a1a9 391 }
xshige 0:a11a5771a1a9 392
xshige 0:a11a5771a1a9 393 void draw() {
xshige 0:a11a5771a1a9 394 background(0);
xshige 0:a11a5771a1a9 395 }
xshige 0:a11a5771a1a9 396
xshige 0:a11a5771a1a9 397 void sendTestMsg() {
xshige 0:a11a5771a1a9 398 OscMessage oscMsg= oscP5.newMsg("/test");
xshige 0:a11a5771a1a9 399 oscMsg.add(mouseY);
xshige 0:a11a5771a1a9 400 oscMsg.add(54.32);
xshige 0:a11a5771a1a9 401 oscMsg.add("Can you chatch this?");
xshige 0:a11a5771a1a9 402 // add a byte blob to the osc message
xshige 0:a11a5771a1a9 403 oscMsg.add(
xshige 0:a11a5771a1a9 404 new byte[] {0x00, 0x01, 0x10, 0x20,0x30,0x40,0x50,0x60,0x7F,
xshige 0:a11a5771a1a9 405 -128,-1,(byte)0x80,(byte)0x90,(byte)0xA0,(byte)0xB0,(byte)0xC0,
xshige 0:a11a5771a1a9 406 (byte)0xD0,(byte)0xE0,(byte)0xFF});
xshige 0:a11a5771a1a9 407 // 0x80,0x90,0xFE,0xFF etc do not work because byte is 127 thru -128.
xshige 0:a11a5771a1a9 408 // so do it like: (byte)0xFF
xshige 0:a11a5771a1a9 409 oscP5.send(oscMsg, remoteHost);
xshige 0:a11a5771a1a9 410 }
xshige 0:a11a5771a1a9 411
xshige 0:a11a5771a1a9 412 void mousePressed() {
xshige 0:a11a5771a1a9 413 OscMessage myMessage = new OscMessage("/mouse/pressed");
xshige 0:a11a5771a1a9 414 myMessage.add(mouseX); // add an int to the osc message
xshige 0:a11a5771a1a9 415 myMessage.add(mouseY); // add a second int to the osc message
xshige 0:a11a5771a1a9 416 // send the message
xshige 0:a11a5771a1a9 417 oscP5.send(myMessage, remoteHost);
xshige 0:a11a5771a1a9 418 //
xshige 0:a11a5771a1a9 419 sendTestMsg();
xshige 0:a11a5771a1a9 420 }
xshige 0:a11a5771a1a9 421
xshige 0:a11a5771a1a9 422 void mouseDragged() {
xshige 0:a11a5771a1a9 423 OscMessage oscMsg= oscP5.newMsg("/mouse/dragged");
xshige 0:a11a5771a1a9 424 oscMsg.add(mouseX);
xshige 0:a11a5771a1a9 425 oscMsg.add(mouseY);
xshige 0:a11a5771a1a9 426 oscP5.send(oscMsg, remoteHost);
xshige 0:a11a5771a1a9 427 //
xshige 0:a11a5771a1a9 428 oscMsg= oscP5.newMsg("/1/xy");
xshige 0:a11a5771a1a9 429 oscMsg.add(mouseX*1.0/width);
xshige 0:a11a5771a1a9 430 oscMsg.add(mouseY*1.0/height);
xshige 0:a11a5771a1a9 431 oscMsg.add(1); // button status:pressed
xshige 0:a11a5771a1a9 432 oscP5.send(oscMsg, remoteHost);
xshige 0:a11a5771a1a9 433 }
xshige 0:a11a5771a1a9 434
xshige 0:a11a5771a1a9 435 void mouseReleased() {
xshige 0:a11a5771a1a9 436 OscMessage oscMsg= oscP5.newMsg("/1/xy");
xshige 0:a11a5771a1a9 437 oscMsg.add(mouseX*1.0/width);
xshige 0:a11a5771a1a9 438 oscMsg.add(mouseY*1.0/height);
xshige 0:a11a5771a1a9 439 oscMsg.add(0); // button status:released
xshige 0:a11a5771a1a9 440 oscP5.send(oscMsg, remoteHost);
xshige 0:a11a5771a1a9 441 }
xshige 0:a11a5771a1a9 442
xshige 0:a11a5771a1a9 443 // incoming osc message are forwarded to the oscEvent method.
xshige 0:a11a5771a1a9 444 void oscEvent(OscMessage theOscMessage) {
xshige 0:a11a5771a1a9 445 // with theOscMessage.isPlugged() you check if the osc message has already been
xshige 0:a11a5771a1a9 446 // forwarded to a plugged method. if theOscMessage.isPlugged()==true, it has already
xshige 0:a11a5771a1a9 447 // been forwared to another method in your sketch. theOscMessage.isPlugged() can
xshige 0:a11a5771a1a9 448 // be used for double posting but is not required.
xshige 0:a11a5771a1a9 449 //
xshige 0:a11a5771a1a9 450 if(theOscMessage.isPlugged()==false) {
xshige 0:a11a5771a1a9 451 // print the address pattern and the typetag of the received OscMessage
xshige 0:a11a5771a1a9 452 println("### received an osc message.");
xshige 0:a11a5771a1a9 453 println("### addrpattern\t"+theOscMessage.addrPattern());
xshige 0:a11a5771a1a9 454 println("### typetag\t"+theOscMessage.typetag());
xshige 0:a11a5771a1a9 455 }
xshige 0:a11a5771a1a9 456 }
xshige 0:a11a5771a1a9 457
xshige 0:a11a5771a1a9 458 */
xshige 0:a11a5771a1a9 459 //----------------------------------------------------------------------------------------------------------