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

OSCReceiver.cpp

Committer:
casiotone401
Date:
2016-02-25
Revision:
3:ff3e4aee583e
Parent:
2:6dab18e1eb37

File content as of revision 3:ff3e4aee583e:

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

#pragma O3
#pragma Otime 
 
#include "mbed.h"
#include "OSCReceiver.h" // Add by RadioJunkBox 2012/05/16 

inline int getOSCmsg(char , union OSCarg);
inline size_t strlength(const char *);

size_t strlength(const char *s) 
{
    size_t len = 0;
    
    for(;;) 
    {
        unsigned x = *(unsigned*)s;
        if((x & 0xFF) == 0) return len;
        if((x & 0xFF00) == 0) return len + 1;
        if((x & 0xFF0000) == 0) return len + 2;
        if((x & 0xFF000000) == 0) return len + 3;
        s += 4, len += 4;
    }
}
    
int getOSCmsg(const char *packet, union OSCarg *msg)
{
// Caution: the returned result points to packet as blobs or strings (not newly allocatd)
    char *p, *typeTag; 
    uint8_t n, str1 = 0;
    
    if(packet[0] != '/')
    {
        return -1;
    }
    
    msg[0].address = packet; // address
    msg[1].typeTag = packet + (((strlength(msg[0].s) >> 2) + 1) << 2);//typeTag
    typeTag = msg[1].s + 1;   // skip ','
    p = msg[1].s + (((strlength(msg[1].s) >> 2) + 1) << 2);
    
    str1 = strlength(typeTag);
        
    for(n = 0; n < str1; ++n)
    {
        switch (typeTag[n])
        {
            case 's':
                msg[n+2].s = p;
                p += (((strlength(msg[n+2].s) >> 2) + 1) << 2);
                break;
        
            case 'i':
            case 'f':
                // 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;
                break;
                
            case 'b':
                // 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 += (((msg[n+2].blob.len >> 2) + 1) << 2);
                break;
        
            case 'm':
                // 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; 
                break;
            
            default:
                return -1;
            
        }
    };
    
    return 1;
}