xshige & Radio Junk Box's OSCReceiver modded version(#define INPUT_PORT >> extern) http://mbed.org/users/radiojunkbox/code/KAMUI_OSC-CV_Example/ http://mbed.org/users/xshige/programs/OSCReceiver/

Dependents:   OSCtoCVConverter

Committer:
casiotone401
Date:
Fri Dec 21 13:14:14 2012 +0000
Revision:
0:4ce7c0ce6a66
Child:
1:3d6dc580b565
change #define INPUT_PORT >> extern

Who changed what in which revision?

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