modded version CNMAT/OSC https://github.com/CNMAT/OSC

Dependents:   CVtoOSCConverter

Fork of osc-cnmat by Asperius van Hansen

Revision:
3:f58c63b78853
Child:
4:107c23eb31b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OSCBundle.h	Sat May 17 12:42:29 2014 +0000
@@ -0,0 +1,172 @@
+/*
+ Written by Yotam Mann, The Center for New Music and Audio Technologies,
+ University of California, Berkeley.  Copyright (c) 2012, 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.
+ 
+
+ */
+
+#ifndef OSCBUNDLE_h
+#define OSCBUNDLE_h
+
+#include "OSCMessage.h"
+
+class OSCBundle
+{
+
+private:
+
+/*=============================================================================
+    PRIVATE VARIABLES
+=============================================================================*/
+
+    //the array of messages contained in the bundle
+    OSCMessage ** messages;
+
+    //the number of messages in the array
+    int numMessages;
+    
+    uint64_t timetag;
+    
+    //error codes
+    OSCErrorCode error;
+    
+/*=============================================================================
+ DECODING INCOMING BYTES
+ =============================================================================*/
+    
+    //the decoding states for incoming bytes
+    enum DecodeState {
+        STANDBY,
+        HEADER,
+        TIMETAG,
+        MESSAGE_SIZE,
+        MESSAGE,
+    } decodeState;
+    
+    //stores incoming bytes until they can be decoded
+    uint8_t * incomingBuffer;
+    int incomingBufferSize;
+    
+    //the size of the incoming message
+    int incomingMessageSize;
+    
+    //adds a byte to the buffer
+    void addToIncomingBuffer(uint8_t);
+    //clears the incoming buffer
+    void clearIncomingBuffer();
+    
+    //decoding functions
+    void decode(uint8_t);
+    void decodeTimetag();
+    void decodeHeader();
+    void decodeMessage(uint8_t);
+    
+    //just a placeholder while filling
+    OSCMessage & add();
+
+
+public:
+
+/*=============================================================================
+    CONSTRUCTORS / DESTRUCTOR
+=============================================================================*/
+        
+    //default timetag of 1
+    OSCBundle(uint64_t = 1);
+
+    //DESTRUCTOR
+    ~OSCBundle();
+
+    //clears all of the OSCMessages inside
+    void empty();
+    
+/*=============================================================================
+    SETTERS
+=============================================================================*/
+    
+    //start a new OSC Message in the bundle
+    OSCMessage & add( char * address);
+    //add with nothing in it produces an invalid osc message
+    //copies an existing message into the bundle
+    OSCMessage & add(OSCMessage & msg);
+    
+    template <typename T>
+    void setTimetag(T t){
+        timetag = (uint64_t) t;
+    }
+    //sets the timetag from a buffer
+    void setTimetag(uint8_t * buff){
+        memcpy(&timetag, buff, 8);
+    }
+    
+/*=============================================================================
+    GETTERS
+ =============================================================================*/
+
+    //gets the message the matches the address string
+    //will do regex matching
+    OSCMessage * getOSCMessage(char * addr);
+    
+    //get message by position
+    OSCMessage * getOSCMessage(int position);
+    
+/*=============================================================================
+    MATCHING
+=============================================================================*/
+
+    //if the bundle contains a message that matches the pattern, 
+    //call the function callback on that message
+    bool dispatch(const char * pattern, void (*callback)(OSCMessage&), int = 0);
+    
+    //like dispatch, but allows for partial matches
+    //the address match offset is sent as an argument to the callback
+    bool route(const char * pattern, void (*callback)(OSCMessage&, int), int = 0);
+    
+/*=============================================================================
+     SIZE
+=============================================================================*/
+    //returns the number of messages in the bundle;
+    int size();
+    
+/*=============================================================================
+    ERROR
+ =============================================================================*/
+    
+    bool hasError();
+    
+    OSCErrorCode getError();
+    
+/*=============================================================================
+    SENDING
+ =============================================================================*/
+    
+    //void send(Print &p);
+    
+/*=============================================================================
+    FILLING
+ =============================================================================*/
+    
+    void fill(uint8_t incomingByte);
+    
+    void fill(uint8_t * incomingBytes, int length);
+};
+
+#endif
\ No newline at end of file