(uncpomplete) port of the cnmat osc library for Arduino/Teensy. Upstream url: https://github.com/CNMAT/OSC

(uncpomplete) port of the cnmat osc library for Arduino/Teensy. Upstream url: https://github.com/CNMAT/OSC

Compiles, but not Tested in any kind. OSCMessage::send(); and OSCBundle::send() don't work/are commented out due to Platform specifics I first have to figure out.

Readme

Revision:
0:36705c54059a
Child:
1:18009e3041ea
diff -r 000000000000 -r 36705c54059a OSCData.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCData.h	Fri May 16 21:50:03 2014 +0000
@@ -0,0 +1,144 @@
+/*
+ Written by Yotam Mann, The Center for New Music and Audio Technologies,
+ University of California, Berkeley.  Copyright (c) 2013, The Regents of
+ the University of California (Regents).
+ 
+ Permission to use, copy, modify, distribute, and distribute modified versions
+ of this software and its documentation without fee and without a signed
+ licensing agreement, is hereby granted, provided that the above copyright
+ notice, this paragraph and the following two paragraphs appear in all copies,
+ modifications, and distributions.
+ 
+ IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
+ SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING
+ OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF REGENTS HAS
+ BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ 
+ REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
+ HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
+ MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ 
+ For bug reports and feature requests please email me at yotam@cnmat.berkeley.edu
+ */
+
+#ifndef OSCDATA_h
+#define OSCDATA_h
+
+/*
+
+#include <inttypes.h>
+*/
+#include <stdint.h>
+#include <stdlib.h> 
+#include <string.h>
+
+//#include "mbed.h"
+
+/*#if defined(CORE_TEENSY)|| defined(__AVR_ATmega32U4__) || defined(__SAM3X8E__) || (defined(_USB) && defined(_USE_USB_FOR_SERIAL_)) || defined(BOARD_maple_mini)*/
+// mbed boards should all have usbSerial.
+#define BOARD_HAS_USB_SERIAL
+/*#endif*/
+
+/*#if defined(__SAM3X8E__)*/
+#define thisBoardsSerialUSB SerialUSB
+/*#else
+#define thisBoardsSerialUSB Serial
+#endif*/
+
+//ERRORS/////////////////////////////////////////////////
+typedef enum { OSC_OK = 0,
+    BUFFER_FULL, INVALID_OSC, ALLOCFAILED, INDEX_OUT_OF_BOUNDS
+} OSCErrorCode;
+
+class OSCData 
+{
+    
+private:
+    
+    //friends
+    friend class OSCMessage;
+    
+    //should only be used while decoding
+    //leaves an invalid OSCMessage with a type, but no data
+    OSCData(char t);
+       
+public:
+
+    OSCData(){};
+
+    //an error flag
+    OSCErrorCode error;
+
+    //the size (in bytes) of the data
+    int bytes;
+
+    //the type of the data
+    int type;
+
+    //the data
+    union {
+        char * s; //string
+        int32_t i; //int
+        float f; //float
+        double d; //double
+        uint64_t l; //long
+        uint8_t * b; //blob
+    } data;
+
+    //overload the constructor to account for all the types and sizes
+    OSCData(const char * s);
+    OSCData (int);
+    OSCData (float);
+    OSCData (double);
+    OSCData (uint8_t *, int);
+    //accepts another OSCData objects and clones it
+    OSCData (OSCData *);
+    OSCData  (bool);
+    OSCData  (uint64_t);
+
+    //destructor
+    ~OSCData();
+    
+    //GETTERS
+    int32_t getInt();
+    float getFloat();
+    double getDouble();
+    int getString(char *, int);
+    int getBlob(uint8_t *, int);
+    bool getBoolean();
+    uint64_t getTime();
+    
+    //constructor from byte array with type and length
+    OSCData(char, uint8_t *, int);
+    //fill the passed in buffer with the data
+    //uint8_t * asByteArray();
+
+};
+
+
+//## Cortex-M is little Endian
+/*
+ based on http://stackoverflow.com/questions/809902/64-bit-ntohl-in-c
+ 
+ if the system is little endian, it will flip the bits
+ if the system is big endian, it'll do nothing
+*/ 
+template<typename T> 
+static inline T BigEndian(const T& x)
+{
+    const int one = 1;
+    const char sig = *(char*)&one;
+    if (sig == 0) return x; // for big endian machine just return the input
+    T ret;
+    int size = sizeof(T);
+    char* src = (char*)&x + sizeof(T) - 1;
+    char* dst = (char*)&ret;
+    while (size-- > 0){
+        *dst++ = *src--;
+    }
+    return ret;
+}
+
+#endif
\ No newline at end of file