OSC Receiver program on mbed supporting types i:int32, b:blob, s:string, f:float32, m:MIDI. Attached OSC Sender program(in processing). Plese refer for detail:http://opensoundcontrol.org/introduction-osc
Dependencies: EthernetNetIf mbed
Revision 0:cbfa819100c7, committed 2011-01-10
- Comitter:
- xshige
- Date:
- Mon Jan 10 04:08:25 2011 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r cbfa819100c7 EthernetNetIf.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EthernetNetIf.lib Mon Jan 10 04:08:25 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/donatien/code/EthernetNetIf/#bc7df6da7589
diff -r 000000000000 -r cbfa819100c7 OSCReceiver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OSCReceiver.cpp Mon Jan 10 04:08:25 2011 +0000 @@ -0,0 +1,342 @@ +// +// OSC Receiver +// +// date: 2011/1/10 +// version: 0.7 +// written by: xshige +// +// please find OSC Sender program at the bottom of this file +// +/* + The followings are supported: + + Transport Type: + UDP + + Features: + Packet Parsing (Client) + Not Supported:Packet Construction (Server) + Bundle NOT Support + Timetag NOT Support + + Type Support: + i: int32 + b: blob + s: string + f: float32 + m: MIDI message(port id, status byte, data1, data2) // I don't know the detail + +*/ + + +#include "mbed.h" +#include "EthernetNetIf.h" +#include "UDPSocket.h" + +//#define DHCP + +//#define INPUT_PORT 12000 +#define INPUT_PORT 57130 + +#ifdef DHCP +EthernetNetIf eth; +#else +EthernetNetIf eth( + IpAddr(192,168,0,25), //IP Address + IpAddr(255,255,255,0), //Network Mask + IpAddr(192,168,0,1), //Gateway + IpAddr(192,168,0,1) //DNS +); +#endif + +//--- OSC related stuff --- +union OSCarg { +// char*, int and float are assumed four bytes + char *address; + char *typeTag; + int i; + float f; + char *s; + struct { + int len; // is "int i" + char *p; + } blob; + char m[4]; // for MIDI + char _b[4]; // endian conversion temp variable +}; + +void getOSCmsg(char *packet , union OSCarg *msg){ +// Caution: the returned result points to packet as blobs or strings (not newly allocatd) + char *p, *typeTag; char c; + + msg[0].address = packet; // address + msg[1].typeTag = packet+4*(strlen(msg[0].s)/4+1);//typeTag + typeTag=msg[1].s+1; // skip ',' + p= msg[1].s+4*(strlen(msg[1].s)/4+1); + for(int n=0; n<strlen(typeTag); n++){ + c = typeTag[n]; + if (('s'==c)) { + msg[n+2].s=p; + p += 4*(strlen(msg[n+2].s)/4+1); + } else if (('i'==c)||('f'==c)) { + // chang endian (big to little) + msg[n+2]._b[3]=p[0]; + msg[n+2]._b[2]=p[1]; + msg[n+2]._b[1]=p[2]; + msg[n+2]._b[0]=p[3]; + p +=4; + } else if ('b'==c) { + // chang endian (big to little) + // get lenth of blog (copy to msg[n].blog.len) + msg[n+2]._b[3]=p[0]; + msg[n+2]._b[2]=p[1]; + msg[n+2]._b[1]=p[2]; + msg[n+2]._b[0]=p[3]; + p +=4; + // get ponter of blog (copy to msg[n].blog.p) + msg[n+2].blob.p=p; + p += 4*(msg[n+2].blob.len/4+1); + } else if ('m'==c) { + // get midi data (copy to msg[n].m[]) + msg[n+2].m[0]=p[0]; + msg[n+2].m[1]=p[1]; + msg[n+2].m[2]=p[2]; + msg[n+2].m[3]=p[3]; + p +=4; + } else { + printf("*** Not Supported TypeTag:%s ****\n",typeTag); + } + }; + +} +//------------------------------------------- + +UDPSocket udp; + + +void onUDPSocketEvent(UDPSocketEvent e) +{ + union OSCarg msg[10]; + + switch(e) + { + case UDPSOCKET_READABLE: //The only event for now + char buf[256] = {0}; + Host host; + while( int len = udp.recvfrom( buf, 256, &host ) ) + { + if( len <= 0 ) + break; + printf("\r\nFrom %d.%d.%d.%d:\r\n", + host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]); + + getOSCmsg(buf,msg); + // address pattern samples + if (strcmp(msg[0].address,"/test")==0) { + printf("OSCmsg: %s %s %d %f %s %d\n", + msg[0].address, msg[1].typeTag,msg[2].i, msg[3].f, msg[4].s, msg[5].blob.len); + printf("blob content:\n"); + char *p=msg[5].blob.p; + for(int n=0; n<msg[5].blob.len; p++,n++) printf(" %02X",(unsigned char)(*p)); + printf("\n"); + break; + } + if (strcmp(msg[0].address,"/kb/m")==0) { + printf("OSCmsg: %s %s %d %d %d\n", + msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i); + break; + } + if (strcmp(msg[0].address,"/cc/m")==0) { + printf("OSCmsg: %s %s %d %d %d\n", + msg[0].address, msg[1].typeTag,msg[2].i, msg[3].i, msg[4].i); + break; + } + if (strcmp(msg[0].address,"/1/fader1")==0) { + printf("OSCmsg: %s %s %f\n", + msg[0].address, msg[1].typeTag,msg[2].f); + break; + } + if (strcmp(msg[0].address,"/1/knob1")==0) { + printf("OSCmsg: %s %s %f\n", + msg[0].address, msg[1].typeTag, msg[2].f); + break; + } + if (strcmp(msg[0].address,"/1/butt/A1")==0) { + printf("OSCmsg: %s %s %i\n", + msg[0].address, msg[1].typeTag, msg[2].i); + break; + } + if (strcmp(msg[0].address,"/1/butt/B1")==0) { + printf("OSCmsg: %s %s %i\n", + msg[0].address, msg[1].typeTag, msg[2].i); + break; + } + if (strcmp(msg[0].address,"/mouse/dragged")==0) { + printf("OSCmsg: %s %s %i %i\n", + msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i); + break; + } + if (strcmp(msg[0].address,"/mouse/pressed")==0) { + printf("OSCmsg: %s %s %i %i\n", + msg[0].address, msg[1].typeTag, msg[2].i, msg[3].i); + break; + } + if (strcmp(msg[0].address,"/1/xy")==0) { + printf("OSCmsg: %s %s %f %f %d\n", + msg[0].address, msg[1].typeTag, msg[2].f, msg[3].f, msg[4].i); + break; + } + printf("undefined OSCmsg:%s %s\n",msg[0].address, msg[1].typeTag); + } // while + break; + } // case +} + +int main() { +// make debug port Fast + Serial pc(USBTX, USBRX); +// pc.baud(9600); + pc.baud(115200); +// pc.baud(230400); + + printf("Setting up...\r\n"); + EthernetErr ethErr = eth.setup(); + if(ethErr) + { + printf("Error %d in setup.\r\n", ethErr); + return -1; + } + printf("Setup OK\r\n"); + + + // port setup + Host recHost(IpAddr(192, 168, 0, 7), INPUT_PORT, NULL); + udp.setOnEvent(&onUDPSocketEvent); + udp.bind(recHost); + + Timer tmr; + tmr.start(); + while(true) + { + Net::poll(); + if(tmr.read() > 5) + { + tmr.reset(); + } + } + + +} +//---------------------------------------------------------------------------------------------------------- +/* + +// +// OSC mouse (OSC Sender) +// +// written in: processing(refer to: http://processing.org/) +// +// please install oscP5 lib +// you can download this from: http://www.sojamo.de/libraries/oscP5/ + +import oscP5.*; + +// initialise all OSC functionality +void initOsc() { + host = "192.168.0.25"; // mbed IP address (change this to fit your mbed) + sendToPort = 57130; // mbed port# (chang this if you need) + receiveAtPort = 12000; // not used at this time + oscP5event = "oscEvent"; // the analyser method + oscP5 = new OscP5(this, host, sendToPort, receiveAtPort, oscP5event); +} + +// oscP5 instance for the osc communication +OscP5 oscP5; +int receiveAtPort; +int sendToPort; +String host; +String oscP5event; + +void setup(){ + background(0); + size(400, 400); + initOsc(); + sendTestMsg(); +} + +void oscEvent(OscIn oscIn) { + println("\n\nreceived a message ... forwarding to analyseMessage(OscIn)"); + analyseMessage(oscIn); +} + +void analyseMessage(OscIn oscIn) { + println("you have received an osc message "+ + oscIn.getAddrPatternAsBytes()+" "+oscIn.getTypetagAsBytes() + ); + byte[] o = oscIn.getBytes(); + for(int i=0;i<o.length;i++) { + if ((i%4)==0) println("\n--------------------"); + print(hex(o[i],2)+"("+char(o[i])+")"+":"); + if ((((i+1)%4)==0)&&((i+1)>=4)) { + int data= (0x1000000*(o[i-3]&0xFF)+ + 0x10000*(o[i-2]&0xFF)+ + 0x100*(o[i-1]&0xFF)+ + (o[i]&0xFF)); + print("\nint: "+data); + print("\nfloat: "+Float.intBitsToFloat(data)); + } + } +} + +void draw() { +} + +void sendTestMsg() { + OscMessage oscMsg= oscP5.newMsg("/test"); + oscMsg.add(mouseY); + oscMsg.add(34.55); + oscMsg.add("yippyy!"); + // add a byte blob to the osc message + oscMsg.add( + new byte[] {0x00, 0x01, 0x10, 0x20,0x30,0x40,0x50,0x60,0x7F, + -128,-1,(byte)0x80,(byte)0x90,(byte)0xA0,(byte)0xB0,(byte)0xC0, + (byte)0xD0,(byte)0xE0,(byte)0xFF}); + // 0x80,0x90,0xFE,0xFF etc do not work because byte is 127 thru -128. + // so do it like: (byte)0xFF + oscP5.send(oscMsg); +} + +void mousePressed() { + OscMessage oscMsg= oscP5.newMsg("/mouse/pressed"); + oscMsg.add(mouseX); + oscMsg.add(mouseY); + oscP5.send(oscMsg); +// + oscMsg= oscP5.newMsg("/1/xy"); + oscMsg.add(mouseX*1.0/width); + oscMsg.add(mouseY*1.0/height); + oscMsg.add(1);// button status:pressed + oscP5.send(oscMsg); +} + +void mouseDragged() { + OscMessage oscMsg= oscP5.newMsg("/mouse/dragged"); + oscMsg.add(mouseX); + oscMsg.add(mouseY); + oscP5.send(oscMsg); +// + oscMsg= oscP5.newMsg("/1/xy"); + oscMsg.add(mouseX*1.0/width); + oscMsg.add(mouseY*1.0/height); + oscMsg.add(1); // button status:pressed + oscP5.send(oscMsg); +} + +void mouseReleased() { + OscMessage oscMsg= oscP5.newMsg("/1/xy"); + oscMsg.add(mouseX*1.0/width); + oscMsg.add(mouseY*1.0/height); + oscMsg.add(0); // button status:released + oscP5.send(oscMsg); +} +*/ +//----------------------------------------------------------------------------------------------------------
diff -r 000000000000 -r cbfa819100c7 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jan 10 04:08:25 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/9114680c05da