KAMUI OSC-CV Example refer to OSCReceiver by xshige http://mbed.org/users/xshige/programs/OSCReceiver/
Dependencies: NetServices TextLCD mbed
OSCReceiver.cpp@0:eabe87e89290, 2012-05-06 (annotated)
- Committer:
- radiojunkbox
- Date:
- Sun May 06 07:17:59 2012 +0000
- Revision:
- 0:eabe87e89290
Rev. 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
radiojunkbox | 0:eabe87e89290 | 1 | // |
radiojunkbox | 0:eabe87e89290 | 2 | // OSC Receiver |
radiojunkbox | 0:eabe87e89290 | 3 | // |
radiojunkbox | 0:eabe87e89290 | 4 | // date: 2011/1/10 |
radiojunkbox | 0:eabe87e89290 | 5 | // version: 0.7 |
radiojunkbox | 0:eabe87e89290 | 6 | // written by: xshige |
radiojunkbox | 0:eabe87e89290 | 7 | // |
radiojunkbox | 0:eabe87e89290 | 8 | // please find OSC Sender program at the bottom of this file |
radiojunkbox | 0:eabe87e89290 | 9 | // |
radiojunkbox | 0:eabe87e89290 | 10 | /* |
radiojunkbox | 0:eabe87e89290 | 11 | The followings are supported: |
radiojunkbox | 0:eabe87e89290 | 12 | |
radiojunkbox | 0:eabe87e89290 | 13 | Transport Type: |
radiojunkbox | 0:eabe87e89290 | 14 | UDP |
radiojunkbox | 0:eabe87e89290 | 15 | |
radiojunkbox | 0:eabe87e89290 | 16 | Features: |
radiojunkbox | 0:eabe87e89290 | 17 | Packet Parsing (Client) |
radiojunkbox | 0:eabe87e89290 | 18 | Not Supported:Packet Construction (Server) |
radiojunkbox | 0:eabe87e89290 | 19 | Bundle NOT Support |
radiojunkbox | 0:eabe87e89290 | 20 | Timetag NOT Support |
radiojunkbox | 0:eabe87e89290 | 21 | |
radiojunkbox | 0:eabe87e89290 | 22 | Type Support: |
radiojunkbox | 0:eabe87e89290 | 23 | i: int32 |
radiojunkbox | 0:eabe87e89290 | 24 | b: blob |
radiojunkbox | 0:eabe87e89290 | 25 | s: string |
radiojunkbox | 0:eabe87e89290 | 26 | f: float32 |
radiojunkbox | 0:eabe87e89290 | 27 | m: MIDI message(port id, status byte, data1, data2) // I don't know the detail |
radiojunkbox | 0:eabe87e89290 | 28 | |
radiojunkbox | 0:eabe87e89290 | 29 | */ |
radiojunkbox | 0:eabe87e89290 | 30 | |
radiojunkbox | 0:eabe87e89290 | 31 | |
radiojunkbox | 0:eabe87e89290 | 32 | #include "mbed.h" |
radiojunkbox | 0:eabe87e89290 | 33 | #include "OSCReceiver.h" // Add by RadioJunkBox 2012/05/16 |
radiojunkbox | 0:eabe87e89290 | 34 | |
radiojunkbox | 0:eabe87e89290 | 35 | /* comment out by RadioJunkBox 2012/05/16 |
radiojunkbox | 0:eabe87e89290 | 36 | |
radiojunkbox | 0:eabe87e89290 | 37 | #include "EthernetNetIf.h" |
radiojunkbox | 0:eabe87e89290 | 38 | #include "UDPSocket.h" |
radiojunkbox | 0:eabe87e89290 | 39 | |
radiojunkbox | 0:eabe87e89290 | 40 | #define DHCP |
radiojunkbox | 0:eabe87e89290 | 41 | |
radiojunkbox | 0:eabe87e89290 | 42 | //#define INPUT_PORT 12000 |
radiojunkbox | 0:eabe87e89290 | 43 | #define INPUT_PORT 12345 |
radiojunkbox | 0:eabe87e89290 | 44 | |
radiojunkbox | 0:eabe87e89290 | 45 | #ifdef DHCP |
radiojunkbox | 0:eabe87e89290 | 46 | EthernetNetIf eth; |
radiojunkbox | 0:eabe87e89290 | 47 | #else |
radiojunkbox | 0:eabe87e89290 | 48 | EthernetNetIf eth( |
radiojunkbox | 0:eabe87e89290 | 49 | IpAddr(192,168,0,25), //IP Address |
radiojunkbox | 0:eabe87e89290 | 50 | IpAddr(255,255,255,0), //Network Mask |
radiojunkbox | 0:eabe87e89290 | 51 | IpAddr(192,168,0,1), //Gateway |
radiojunkbox | 0:eabe87e89290 | 52 | IpAddr(192,168,0,1) //DNS |
radiojunkbox | 0:eabe87e89290 | 53 | ); |
radiojunkbox | 0:eabe87e89290 | 54 | #endif |
radiojunkbox | 0:eabe87e89290 | 55 | //--- OSC related stuff --- |
radiojunkbox | 0:eabe87e89290 | 56 | union OSCarg { |
radiojunkbox | 0:eabe87e89290 | 57 | // char*, int and float are assumed four bytes |
radiojunkbox | 0:eabe87e89290 | 58 | char *address; |
radiojunkbox | 0:eabe87e89290 | 59 | char *typeTag; |
radiojunkbox | 0:eabe87e89290 | 60 | int i; |
radiojunkbox | 0:eabe87e89290 | 61 | float f; |
radiojunkbox | 0:eabe87e89290 | 62 | char *s; |
radiojunkbox | 0:eabe87e89290 | 63 | struct { |
radiojunkbox | 0:eabe87e89290 | 64 | int len; // is "int i" |
radiojunkbox | 0:eabe87e89290 | 65 | char *p; |
radiojunkbox | 0:eabe87e89290 | 66 | } blob; |
radiojunkbox | 0:eabe87e89290 | 67 | char m[4]; // for MIDI |
radiojunkbox | 0:eabe87e89290 | 68 | char _b[4]; // endian conversion temp variable |
radiojunkbox | 0:eabe87e89290 | 69 | }; |
radiojunkbox | 0:eabe87e89290 | 70 | */ |
radiojunkbox | 0:eabe87e89290 | 71 | void getOSCmsg(char *packet , union OSCarg *msg){ |
radiojunkbox | 0:eabe87e89290 | 72 | // Caution: the returned result points to packet as blobs or strings (not newly allocatd) |
radiojunkbox | 0:eabe87e89290 | 73 | char *p, *typeTag; char c; |
radiojunkbox | 0:eabe87e89290 | 74 | |
radiojunkbox | 0:eabe87e89290 | 75 | msg[0].address = packet; // address |
radiojunkbox | 0:eabe87e89290 | 76 | msg[1].typeTag = packet+4*(strlen(msg[0].s)/4+1);//typeTag |
radiojunkbox | 0:eabe87e89290 | 77 | typeTag=msg[1].s+1; // skip ',' |
radiojunkbox | 0:eabe87e89290 | 78 | p= msg[1].s+4*(strlen(msg[1].s)/4+1); |
radiojunkbox | 0:eabe87e89290 | 79 | for(int n=0; n<strlen(typeTag); n++){ |
radiojunkbox | 0:eabe87e89290 | 80 | c = typeTag[n]; |
radiojunkbox | 0:eabe87e89290 | 81 | if (('s'==c)) { |
radiojunkbox | 0:eabe87e89290 | 82 | msg[n+2].s=p; |
radiojunkbox | 0:eabe87e89290 | 83 | p += 4*(strlen(msg[n+2].s)/4+1); |
radiojunkbox | 0:eabe87e89290 | 84 | } else if (('i'==c)||('f'==c)) { |
radiojunkbox | 0:eabe87e89290 | 85 | // chang endian (big to little) |
radiojunkbox | 0:eabe87e89290 | 86 | msg[n+2]._b[3]=p[0]; |
radiojunkbox | 0:eabe87e89290 | 87 | msg[n+2]._b[2]=p[1]; |
radiojunkbox | 0:eabe87e89290 | 88 | msg[n+2]._b[1]=p[2]; |
radiojunkbox | 0:eabe87e89290 | 89 | msg[n+2]._b[0]=p[3]; |
radiojunkbox | 0:eabe87e89290 | 90 | p +=4; |
radiojunkbox | 0:eabe87e89290 | 91 | } else if ('b'==c) { |
radiojunkbox | 0:eabe87e89290 | 92 | // chang endian (big to little) |
radiojunkbox | 0:eabe87e89290 | 93 | // get lenth of blog (copy to msg[n].blog.len) |
radiojunkbox | 0:eabe87e89290 | 94 | msg[n+2]._b[3]=p[0]; |
radiojunkbox | 0:eabe87e89290 | 95 | msg[n+2]._b[2]=p[1]; |
radiojunkbox | 0:eabe87e89290 | 96 | msg[n+2]._b[1]=p[2]; |
radiojunkbox | 0:eabe87e89290 | 97 | msg[n+2]._b[0]=p[3]; |
radiojunkbox | 0:eabe87e89290 | 98 | p +=4; |
radiojunkbox | 0:eabe87e89290 | 99 | // get ponter of blog (copy to msg[n].blog.p) |
radiojunkbox | 0:eabe87e89290 | 100 | msg[n+2].blob.p=p; |
radiojunkbox | 0:eabe87e89290 | 101 | p += 4*(msg[n+2].blob.len/4+1); |
radiojunkbox | 0:eabe87e89290 | 102 | } else if ('m'==c) { |
radiojunkbox | 0:eabe87e89290 | 103 | // get midi data (copy to msg[n].m[]) |
radiojunkbox | 0:eabe87e89290 | 104 | msg[n+2].m[0]=p[0]; |
radiojunkbox | 0:eabe87e89290 | 105 | msg[n+2].m[1]=p[1]; |
radiojunkbox | 0:eabe87e89290 | 106 | msg[n+2].m[2]=p[2]; |
radiojunkbox | 0:eabe87e89290 | 107 | msg[n+2].m[3]=p[3]; |
radiojunkbox | 0:eabe87e89290 | 108 | p +=4; |
radiojunkbox | 0:eabe87e89290 | 109 | } else { |
radiojunkbox | 0:eabe87e89290 | 110 | printf("*** Not Supported TypeTag:%s ****\n",typeTag); |
radiojunkbox | 0:eabe87e89290 | 111 | } |
radiojunkbox | 0:eabe87e89290 | 112 | }; |
radiojunkbox | 0:eabe87e89290 | 113 | |
radiojunkbox | 0:eabe87e89290 | 114 | } |
radiojunkbox | 0:eabe87e89290 | 115 | //------------------------------------------- |
radiojunkbox | 0:eabe87e89290 | 116 | |
radiojunkbox | 0:eabe87e89290 | 117 | /* comment out RadioJunkBox 2012/05/06 |
radiojunkbox | 0:eabe87e89290 | 118 | |
radiojunkbox | 0:eabe87e89290 | 119 | UDPSocket udp; |
radiojunkbox | 0:eabe87e89290 | 120 | |
radiojunkbox | 0:eabe87e89290 | 121 | |
radiojunkbox | 0:eabe87e89290 | 122 | void onUDPSocketEvent(UDPSocketEvent e) |
radiojunkbox | 0:eabe87e89290 | 123 | { |
radiojunkbox | 0:eabe87e89290 | 124 | union OSCarg msg[10]; |
radiojunkbox | 0:eabe87e89290 | 125 | |
radiojunkbox | 0:eabe87e89290 | 126 | switch(e) |
radiojunkbox | 0:eabe87e89290 | 127 | { |
radiojunkbox | 0:eabe87e89290 | 128 | case UDPSOCKET_READABLE: //The only event for now |
radiojunkbox | 0:eabe87e89290 | 129 | char buf[256] = {0}; |
radiojunkbox | 0:eabe87e89290 | 130 | Host host; |
radiojunkbox | 0:eabe87e89290 | 131 | while( int len = udp.recvfrom( buf, 256, &host ) ) |
radiojunkbox | 0:eabe87e89290 | 132 | { |
radiojunkbox | 0:eabe87e89290 | 133 | if( len <= 0 ) |
radiojunkbox | 0:eabe87e89290 | 134 | break; |
radiojunkbox | 0:eabe87e89290 | 135 | printf("\r\nFrom %d.%d.%d.%d:\r\n", |
radiojunkbox | 0:eabe87e89290 | 136 | host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]); |
radiojunkbox | 0:eabe87e89290 | 137 | |
radiojunkbox | 0:eabe87e89290 | 138 | getOSCmsg(buf,msg); |
radiojunkbox | 0:eabe87e89290 | 139 | // address pattern samples |
radiojunkbox | 0:eabe87e89290 | 140 | if (strcmp(msg[0].address,"/test")==0) { |
radiojunkbox | 0:eabe87e89290 | 141 | printf("OSCmsg: %s %s %d %f %s %d\n", |
radiojunkbox | 0:eabe87e89290 | 142 | msg[0].address, msg[1].typeTag,msg[2].i, msg[3].f, msg[4].s, msg[5].blob.len); |
radiojunkbox | 0:eabe87e89290 | 143 | printf("blob content:\n"); |
radiojunkbox | 0:eabe87e89290 | 144 | char *p=msg[5].blob.p; |
radiojunkbox | 0:eabe87e89290 | 145 | for(int n=0; n<msg[5].blob.len; p++,n++) printf(" %02X",(unsigned char)(*p)); |
radiojunkbox | 0:eabe87e89290 | 146 | printf("\n"); |
radiojunkbox | 0:eabe87e89290 | 147 | break; |
radiojunkbox | 0:eabe87e89290 | 148 | } |
radiojunkbox | 0:eabe87e89290 | 149 | if (strcmp(msg[0].address,"/kb/m")==0) { |
radiojunkbox | 0:eabe87e89290 | 150 | printf("OSCmsg: %s %s %d %d %d\n", |
radiojunkbox | 0:eabe87e89290 | 151 | msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i); |
radiojunkbox | 0:eabe87e89290 | 152 | break; |
radiojunkbox | 0:eabe87e89290 | 153 | } |
radiojunkbox | 0:eabe87e89290 | 154 | if (strcmp(msg[0].address,"/cc/m")==0) { |
radiojunkbox | 0:eabe87e89290 | 155 | printf("OSCmsg: %s %s %d %d %d\n", |
radiojunkbox | 0:eabe87e89290 | 156 | msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i); |
radiojunkbox | 0:eabe87e89290 | 157 | break; |
radiojunkbox | 0:eabe87e89290 | 158 | } |
radiojunkbox | 0:eabe87e89290 | 159 | if (strcmp(msg[0].address,"/osc/padx")==0) { |
radiojunkbox | 0:eabe87e89290 | 160 | printf("OSCmsg: %s %s %f\n", |
radiojunkbox | 0:eabe87e89290 | 161 | msg[0].address, msg[1].typeTag,msg[2].f); |
radiojunkbox | 0:eabe87e89290 | 162 | break; |
radiojunkbox | 0:eabe87e89290 | 163 | } |
radiojunkbox | 0:eabe87e89290 | 164 | if (strcmp(msg[0].address,"/osc/pady")==0) { |
radiojunkbox | 0:eabe87e89290 | 165 | printf("OSCmsg: %s %s %f\n", |
radiojunkbox | 0:eabe87e89290 | 166 | msg[0].address, msg[1].typeTag, msg[2].f); |
radiojunkbox | 0:eabe87e89290 | 167 | break; |
radiojunkbox | 0:eabe87e89290 | 168 | } |
radiojunkbox | 0:eabe87e89290 | 169 | if (strcmp(msg[0].address,"/osc/button1")==0) { |
radiojunkbox | 0:eabe87e89290 | 170 | printf("OSCmsg: %s %s %i\n", |
radiojunkbox | 0:eabe87e89290 | 171 | msg[0].address, msg[1].typeTag, msg[2].i); |
radiojunkbox | 0:eabe87e89290 | 172 | break; |
radiojunkbox | 0:eabe87e89290 | 173 | } |
radiojunkbox | 0:eabe87e89290 | 174 | if (strcmp(msg[0].address,"/osc/button2")==0) { |
radiojunkbox | 0:eabe87e89290 | 175 | printf("OSCmsg: %s %s %i\n", |
radiojunkbox | 0:eabe87e89290 | 176 | msg[0].address, msg[1].typeTag, msg[2].i); |
radiojunkbox | 0:eabe87e89290 | 177 | break; |
radiojunkbox | 0:eabe87e89290 | 178 | } |
radiojunkbox | 0:eabe87e89290 | 179 | if (strcmp(msg[0].address,"/mouse/dragged")==0) { |
radiojunkbox | 0:eabe87e89290 | 180 | printf("OSCmsg: %s %s %i %i\n", |
radiojunkbox | 0:eabe87e89290 | 181 | msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i); |
radiojunkbox | 0:eabe87e89290 | 182 | break; |
radiojunkbox | 0:eabe87e89290 | 183 | } |
radiojunkbox | 0:eabe87e89290 | 184 | if (strcmp(msg[0].address,"/mouse/pressed")==0) { |
radiojunkbox | 0:eabe87e89290 | 185 | printf("OSCmsg: %s %s %i %i\n", |
radiojunkbox | 0:eabe87e89290 | 186 | msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i); |
radiojunkbox | 0:eabe87e89290 | 187 | break; |
radiojunkbox | 0:eabe87e89290 | 188 | } |
radiojunkbox | 0:eabe87e89290 | 189 | if (strcmp(msg[0].address,"/1/xy")==0) { |
radiojunkbox | 0:eabe87e89290 | 190 | printf("OSCmsg: %s %s %f %f %d\n", |
radiojunkbox | 0:eabe87e89290 | 191 | msg[0].address, msg[1].typeTag, msg[2].f, msg[3].f, msg[4].i); |
radiojunkbox | 0:eabe87e89290 | 192 | break; |
radiojunkbox | 0:eabe87e89290 | 193 | } |
radiojunkbox | 0:eabe87e89290 | 194 | printf("undefined OSCmsg:%s %s\n",msg[0].address, msg[1].typeTag); |
radiojunkbox | 0:eabe87e89290 | 195 | } // while |
radiojunkbox | 0:eabe87e89290 | 196 | break; |
radiojunkbox | 0:eabe87e89290 | 197 | } // case |
radiojunkbox | 0:eabe87e89290 | 198 | } |
radiojunkbox | 0:eabe87e89290 | 199 | |
radiojunkbox | 0:eabe87e89290 | 200 | int main() { |
radiojunkbox | 0:eabe87e89290 | 201 | // make debug port Fast |
radiojunkbox | 0:eabe87e89290 | 202 | // Serial pc(USBTX, USBRX); |
radiojunkbox | 0:eabe87e89290 | 203 | // pc.baud(9600); |
radiojunkbox | 0:eabe87e89290 | 204 | // pc.baud(115200); |
radiojunkbox | 0:eabe87e89290 | 205 | // pc.baud(230400); |
radiojunkbox | 0:eabe87e89290 | 206 | |
radiojunkbox | 0:eabe87e89290 | 207 | printf("Setting up...\r\n"); |
radiojunkbox | 0:eabe87e89290 | 208 | EthernetErr ethErr = eth.setup(); |
radiojunkbox | 0:eabe87e89290 | 209 | if(ethErr) |
radiojunkbox | 0:eabe87e89290 | 210 | { |
radiojunkbox | 0:eabe87e89290 | 211 | printf("Error %d in setup.\r\n", ethErr); |
radiojunkbox | 0:eabe87e89290 | 212 | return -1; |
radiojunkbox | 0:eabe87e89290 | 213 | } |
radiojunkbox | 0:eabe87e89290 | 214 | printf("Setup OK\r\n"); |
radiojunkbox | 0:eabe87e89290 | 215 | |
radiojunkbox | 0:eabe87e89290 | 216 | |
radiojunkbox | 0:eabe87e89290 | 217 | // port setup |
radiojunkbox | 0:eabe87e89290 | 218 | // Host recHost(IpAddr(192, 168, 0, 7), INPUT_PORT, NULL); |
radiojunkbox | 0:eabe87e89290 | 219 | Host broadcast(IpAddr(eth.getIp()[0], eth.getIp()[1], eth.getIp()[2], 255), INPUT_PORT, NULL); |
radiojunkbox | 0:eabe87e89290 | 220 | udp.setOnEvent(&onUDPSocketEvent); |
radiojunkbox | 0:eabe87e89290 | 221 | udp.bind(broadcast); |
radiojunkbox | 0:eabe87e89290 | 222 | |
radiojunkbox | 0:eabe87e89290 | 223 | Timer tmr; |
radiojunkbox | 0:eabe87e89290 | 224 | tmr.start(); |
radiojunkbox | 0:eabe87e89290 | 225 | while(true) |
radiojunkbox | 0:eabe87e89290 | 226 | { |
radiojunkbox | 0:eabe87e89290 | 227 | Net::poll(); |
radiojunkbox | 0:eabe87e89290 | 228 | if(tmr.read() > 5) |
radiojunkbox | 0:eabe87e89290 | 229 | { |
radiojunkbox | 0:eabe87e89290 | 230 | tmr.reset(); |
radiojunkbox | 0:eabe87e89290 | 231 | } |
radiojunkbox | 0:eabe87e89290 | 232 | } |
radiojunkbox | 0:eabe87e89290 | 233 | |
radiojunkbox | 0:eabe87e89290 | 234 | } |
radiojunkbox | 0:eabe87e89290 | 235 | */ |