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:
Thu Feb 25 11:21:14 2016 +0000
Revision:
3:ff3e4aee583e
Parent:
2:6dab18e1eb37
minor change

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 1:3d6dc580b565 30
casiotone401 2:6dab18e1eb37 31 #pragma O3
casiotone401 2:6dab18e1eb37 32 #pragma Otime
casiotone401 2:6dab18e1eb37 33
casiotone401 0:4ce7c0ce6a66 34 #include "mbed.h"
casiotone401 0:4ce7c0ce6a66 35 #include "OSCReceiver.h" // Add by RadioJunkBox 2012/05/16
casiotone401 1:3d6dc580b565 36
casiotone401 2:6dab18e1eb37 37 inline int getOSCmsg(char , union OSCarg);
casiotone401 2:6dab18e1eb37 38 inline size_t strlength(const char *);
casiotone401 2:6dab18e1eb37 39
casiotone401 2:6dab18e1eb37 40 size_t strlength(const char *s)
casiotone401 2:6dab18e1eb37 41 {
casiotone401 2:6dab18e1eb37 42 size_t len = 0;
casiotone401 1:3d6dc580b565 43
casiotone401 2:6dab18e1eb37 44 for(;;)
casiotone401 2:6dab18e1eb37 45 {
casiotone401 2:6dab18e1eb37 46 unsigned x = *(unsigned*)s;
casiotone401 2:6dab18e1eb37 47 if((x & 0xFF) == 0) return len;
casiotone401 2:6dab18e1eb37 48 if((x & 0xFF00) == 0) return len + 1;
casiotone401 2:6dab18e1eb37 49 if((x & 0xFF0000) == 0) return len + 2;
casiotone401 2:6dab18e1eb37 50 if((x & 0xFF000000) == 0) return len + 3;
casiotone401 2:6dab18e1eb37 51 s += 4, len += 4;
casiotone401 2:6dab18e1eb37 52 }
casiotone401 2:6dab18e1eb37 53 }
casiotone401 2:6dab18e1eb37 54
casiotone401 3:ff3e4aee583e 55 int getOSCmsg(const char *packet, union OSCarg *msg)
casiotone401 2:6dab18e1eb37 56 {
casiotone401 0:4ce7c0ce6a66 57 // Caution: the returned result points to packet as blobs or strings (not newly allocatd)
casiotone401 2:6dab18e1eb37 58 char *p, *typeTag;
casiotone401 3:ff3e4aee583e 59 uint8_t n, str1 = 0;
casiotone401 2:6dab18e1eb37 60
casiotone401 2:6dab18e1eb37 61 if(packet[0] != '/')
casiotone401 2:6dab18e1eb37 62 {
casiotone401 2:6dab18e1eb37 63 return -1;
casiotone401 2:6dab18e1eb37 64 }
casiotone401 2:6dab18e1eb37 65
casiotone401 0:4ce7c0ce6a66 66 msg[0].address = packet; // address
casiotone401 3:ff3e4aee583e 67 msg[1].typeTag = packet + (((strlength(msg[0].s) >> 2) + 1) << 2);//typeTag
casiotone401 3:ff3e4aee583e 68 typeTag = msg[1].s + 1; // skip ','
casiotone401 3:ff3e4aee583e 69 p = msg[1].s + (((strlength(msg[1].s) >> 2) + 1) << 2);
casiotone401 1:3d6dc580b565 70
casiotone401 2:6dab18e1eb37 71 str1 = strlength(typeTag);
casiotone401 3:ff3e4aee583e 72
casiotone401 3:ff3e4aee583e 73 for(n = 0; n < str1; ++n)
casiotone401 1:3d6dc580b565 74 {
casiotone401 3:ff3e4aee583e 75 switch (typeTag[n])
casiotone401 2:6dab18e1eb37 76 {
casiotone401 3:ff3e4aee583e 77 case 's':
casiotone401 3:ff3e4aee583e 78 msg[n+2].s = p;
casiotone401 3:ff3e4aee583e 79 p += (((strlength(msg[n+2].s) >> 2) + 1) << 2);
casiotone401 3:ff3e4aee583e 80 break;
casiotone401 3:ff3e4aee583e 81
casiotone401 3:ff3e4aee583e 82 case 'i':
casiotone401 3:ff3e4aee583e 83 case 'f':
casiotone401 3:ff3e4aee583e 84 // chang endian (big to little)
casiotone401 3:ff3e4aee583e 85 msg[n+2]._b[3] = p[0];
casiotone401 3:ff3e4aee583e 86 msg[n+2]._b[2] = p[1];
casiotone401 3:ff3e4aee583e 87 msg[n+2]._b[1] = p[2];
casiotone401 3:ff3e4aee583e 88 msg[n+2]._b[0] = p[3];
casiotone401 3:ff3e4aee583e 89
casiotone401 3:ff3e4aee583e 90 p += 4;
casiotone401 3:ff3e4aee583e 91 break;
casiotone401 3:ff3e4aee583e 92
casiotone401 3:ff3e4aee583e 93 case 'b':
casiotone401 3:ff3e4aee583e 94 // chang endian (big to little)
casiotone401 3:ff3e4aee583e 95 // get lenth of blog (copy to msg[n].blog.len)
casiotone401 3:ff3e4aee583e 96 msg[n+2]._b[3] = p[0];
casiotone401 3:ff3e4aee583e 97 msg[n+2]._b[2] = p[1];
casiotone401 3:ff3e4aee583e 98 msg[n+2]._b[1] = p[2];
casiotone401 3:ff3e4aee583e 99 msg[n+2]._b[0] = p[3];
casiotone401 3:ff3e4aee583e 100
casiotone401 3:ff3e4aee583e 101 p += 4;
casiotone401 3:ff3e4aee583e 102 // get ponter of blog (copy to msg[n].blog.p)
casiotone401 3:ff3e4aee583e 103 msg[n+2].blob.p = p;
casiotone401 3:ff3e4aee583e 104
casiotone401 3:ff3e4aee583e 105 p += (((msg[n+2].blob.len >> 2) + 1) << 2);
casiotone401 3:ff3e4aee583e 106 break;
casiotone401 3:ff3e4aee583e 107
casiotone401 3:ff3e4aee583e 108 case 'm':
casiotone401 3:ff3e4aee583e 109 // get midi data (copy to msg[n].m[])
casiotone401 3:ff3e4aee583e 110 msg[n+2].m[0] = p[0];
casiotone401 3:ff3e4aee583e 111 msg[n+2].m[1] = p[1];
casiotone401 3:ff3e4aee583e 112 msg[n+2].m[2] = p[2];
casiotone401 3:ff3e4aee583e 113 msg[n+2].m[3] = p[3];
casiotone401 3:ff3e4aee583e 114
casiotone401 3:ff3e4aee583e 115 p += 4;
casiotone401 3:ff3e4aee583e 116 break;
casiotone401 1:3d6dc580b565 117
casiotone401 3:ff3e4aee583e 118 default:
casiotone401 3:ff3e4aee583e 119 return -1;
casiotone401 1:3d6dc580b565 120
casiotone401 0:4ce7c0ce6a66 121 }
casiotone401 0:4ce7c0ce6a66 122 };
casiotone401 0:4ce7c0ce6a66 123
casiotone401 1:3d6dc580b565 124 return 1;
casiotone401 2:6dab18e1eb37 125 }