![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
OSCTransceiver.cpp@0:a11a5771a1a9, 2011-01-11 (annotated)
- Committer:
- xshige
- Date:
- Tue Jan 11 13:49:57 2011 +0000
- Revision:
- 0:a11a5771a1a9
Who changed what in which revision?
User | Revision | Line number | New 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 | //---------------------------------------------------------------------------------------------------------- |