KAMUI OSC-CV Example refer to OSCReceiver by xshige http://mbed.org/users/xshige/programs/OSCReceiver/

Dependencies:   NetServices TextLCD mbed

Committer:
radiojunkbox
Date:
Sun May 06 07:17:59 2012 +0000
Revision:
0:eabe87e89290
Rev. 1.0

Who changed what in which revision?

UserRevisionLine numberNew 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 */