support OSC-string

Dependents:   OSCtoCVConverter

Fork of OSC by Toby Harris

Revision:
6:a47004fb44f5
Parent:
5:5d585d5107da
Child:
7:498455cded21
--- a/mbedOSC.cpp	Tue Feb 16 11:30:55 2016 +0000
+++ b/mbedOSC.cpp	Thu Feb 18 13:25:30 2016 +0000
@@ -12,7 +12,7 @@
  
 OSCMessage::OSCMessage() {
  // Initialize host address and port by default (as if this where the receiver message):
- //    host=new Host(IpAddr(10, 0, 0, 1), DEFAULT_RECEIVE_PORT, NULL);
+ //    host=new Host(IpAddr(10, 0, 0, 1), DEFAULT_RECEIVEport, NULL);
 }
  
 inline size_t strlength(const char *s) 
@@ -29,27 +29,8 @@
         s += 4, len += 4;
     }
 }
- 
-void OSCMessage::setPort(uint16_t _port) {
-    
-     host.setPort(_port);
-}
- 
- 
-void OSCMessage::setIp(uint8_t *_ip) {
-    
-    host.setIp(IpAddr(_ip[0], _ip[1], _ip[2], _ip[3]));
-}
 
  
-void OSCMessage::setIp( uint8_t _ip1,
-                        uint8_t _ip2,
-                        uint8_t _ip3,
-                        uint8_t _ip4 ) {
-    
-    host.setIp(IpAddr(_ip1, _ip2, _ip3, _ip4));
-}
- 
 const IpAddr& OSCMessage::getIp() {
     
     return host.getIp();
@@ -74,71 +55,108 @@
 }
  
  
-char * OSCMessage::getAddress(uint8_t _index) {
+char * OSCMessage::getAddress(uint8_t index) {
     
-    if (_index > MAX_ADDRESS) {
+    if (index > MAX_ADDRESS) {
         
-        _index = (MAX_ADDRESS - 1);
+        index = (MAX_ADDRESS - 1);
     }
      
-    return address[_index];
-    
+    return address[index];    
 }
  
  
 char * OSCMessage::getTopAddress() {
     
-    return getAddress(0);
-    
+    return getAddress(0);    
 }
  
  
 char * OSCMessage::getSubAddress() {
     
-    return getAddress(1);
-    
+    return getAddress(1); 
 }
  
  
-char OSCMessage::getTypeTag(uint8_t _index) {
+char OSCMessage::getTypeTag(uint8_t index) {
     
-    if (_index > MAX_ARG) {
+    if (index > MAX_ARG) {
         
-      _index = MAX_ARG-1;  
+      index = MAX_ARG - 1;  
     }
     
-    return typeTag[_index];
+    return typeTag[index];
+}
+ 
+ 
+int OSCMessage::getArgInt(uint8_t index) {
+
+    if (index > argNum) {
+        
+        index = argNum;  
+    }
+
+    return recArgs[index].i;
 }
  
  
-int OSCMessage::getArgInt(uint8_t _index) {
-    int *value;
+float OSCMessage::getArgFloat(uint8_t index) {
     
-    if (_index > argNum) {
+    if (index > argNum) {
         
-        _index = argNum;  
+        index = argNum;  
     }
     
-    value = (int *)arg[_index]; // cast to int32_t
+    return recArgs[index].f;
+}
+
+double OSCMessage::getArgDouble(uint8_t index) {
+    
+    if (index > argNum) {
+        
+        index = argNum;  
+    }
     
-    return *value;
+    return recArgs[index].d;
+}
+
+char * OSCMessage::getArgString(uint8_t index) {
+    
+    if (index > argNum) {
+        
+        index = argNum;  
+    }
+    
+    return recArgs[index].s;
 }
  
+//-------------------------------------------------
+// setup SendHost IP&Port
  
-float OSCMessage::getArgFloat(uint8_t _index) {
-    float *value;
+void OSCMessage::setIp(uint8_t *ip) {
+    
+    host.setIp(IpAddr(ip[0], ip[1], ip[2], ip[3]));
+}
+
+ 
+void OSCMessage::setIp( uint8_t ip1,
+                        uint8_t ip2,
+                        uint8_t ip3,
+                        uint8_t ip4 ) {
     
-    if (_index > argNum) {
-        
-        _index=argNum;  
-    }
+    host.setIp(IpAddr(ip1, ip2, ip3, ip4));
+}
+
+
+void OSCMessage::setPort(uint16_t port) {
     
-    value = (float *)arg[_index]; // cast to float not double for correct parsing on mbed!
-    
-    return *value;
+     host.setPort(port);
 }
- 
- 
+
+
+//-------------------------------------------------
+//  Construct  OSC messages 
+
 void OSCMessage::setTopAddress(char *_address) {
     
     address[0] = _address;
@@ -154,24 +172,24 @@
 }
  
  
-void OSCMessage::setAddress(char *_topAddress,char *_subAddress) {
+void OSCMessage::setAddress(char *topAddress, char *subAddress) {
     
-    setTopAddress(_topAddress);
-    setSubAddress(_subAddress);
+    setTopAddress(topAddress);
+    setSubAddress(subAddress);
     
     addressNum = 2; // (unnecessary...)
 }
  
  
-void OSCMessage::setAddress(uint8_t _index, char *_address) {
+void OSCMessage::setAddress(uint8_t index, char *_address) {
     
-    if (_index>MAX_ADDRESS) {
-      
-      _index = (MAX_ADDRESS - 1);  
+    if (index > MAX_ADDRESS) {
+        
+      index = (MAX_ADDRESS - 1);  
     }
     
-    address[_index] = _address;
-    addressNum = (_index + 1);
+    address[index] = _address;
+    addressNum = (index + 1);
 }
  
  
@@ -185,10 +203,10 @@
     
     if (argNum > MAX_ARG) {
         
-        argNum = MAX_ARG - 1;
+        argNum = (MAX_ARG - 1);
     } 
     
-    va_start( argList, types );
+    va_start(argList, types);
     
     for (i = 0 ; i < argNum ; ++i) {
         
@@ -197,20 +215,19 @@
         switch(types[i]) {
             
             case 's':
-                args[i].s = va_arg(argList, char *);
+                sendArgs[i].s = va_arg(argList, char *);
                 break;
  
             case 'i':
-                args[i].i = va_arg(argList, uint32_t);
+                sendArgs[i].i = va_arg(argList, int);
                 break;
  
-            case 'f': // variadic function float is promoted to double
-                
-                args[i].f = (va_arg(argList, double));
+            case 'f':
+                sendArgs[i].f = va_arg(argList, double);
                 break;
             
             case 'd':
-                args[i].d = va_arg(argList, double);
+                sendArgs[i].d = va_arg(argList, double);
                 break;
                 
             default:
@@ -236,10 +253,10 @@
     udpRec.close();
 }
  
-OSCClass::OSCClass(OSCMessage *_mes) {
+OSCClass::OSCClass(OSCMessage *mes) {
     
     udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
-    receiverMessage = _mes; // note: receiverMessage MUST be a pointer to the message, because we will modify things in it
+    receiverMessage = mes; // note: receiverMessage MUST be a pointer to the message, because we will modify things in it
     newMessage = false;
 }
  
@@ -249,17 +266,17 @@
 }
  
  
-void OSCClass::begin(uint16_t _recievePort) {
+void OSCClass::begin(uint16_t recievePort) {
     
-  receiverMessage->host.setPort(_recievePort);
+  receiverMessage->host.setPort(recievePort);
   // setup receiver udp socket:
   udpRec.bind(receiverMessage->host);
 }
  
  
-void OSCClass::setReceiveMessage(OSCMessage *_mes) {
+void OSCClass::setReceiveMessage(OSCMessage *mes) {
     
-    receiverMessage = _mes;
+    receiverMessage = mes;
 }
  
 void OSCClass::onUDPSocketEvent(UDPSocketEvent e) {
@@ -267,16 +284,17 @@
   switch(e) {
       
       case UDPSOCKET_READABLE: //The only event for now
+      
             Host auxhost;
-            buflength = udpRec.recvfrom( rcvBuff, 128, &auxhost ); // QUESTION: auxhost should be equal to the receiver host I guess...
-            if ( buflength > 0 ) {
-      //printf("\r\nFrom %d.%d.%d.%d:\r\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]);   
+            buflength = udpRec.recvfrom(rcvBuff, MAX_RECEIVEBUFF_SIZE, &auxhost); // QUESTION: auxhost should be equal to the receiver host I guess...
+           
+            if (buflength > 0) {
+                
                 decodePacket(receiverMessage); // convert to OSC message, and save it in receiverMessage
                 newMessage = true;
       
                 messageReceivedCallback.call();
             }
-            
             break;
         }
 }
@@ -284,9 +302,8 @@
 /*
  Decode UDP packet and save it in the OSCMessage structure
  */
-void OSCClass::decodePacket( OSCMessage *_mes) {
-    int i, j;
-    //uint16_t    lenBuff;
+void OSCClass::decodePacket(OSCMessage *mes) {
+    int i;
     uint8_t        d;    
     uint8_t        messagePos = 0;    
     uint8_t        adrCount = 0;
@@ -294,10 +311,6 @@
     uint8_t        packetCount = 0;
     uint8_t        packetPos = 4;
     
-    
-    //W5100.writeSn(socketNo, SnIR, SnIR::RECV);
-    //lenBuff=recvfrom(socketNo, rcvBuff, 1, receiverMessage->ip, &receiverMessage->port);    
-    
     receiverMessage->address[0] = tempAddress[0];
  
     //(1) address process start =========================================
@@ -338,7 +351,6 @@
         ++packetCount;
         
     } while(d != 0);
- 
     
     if (adrCount < MAX_ADDRESS) {
         ++adrCount;  
@@ -388,17 +400,56 @@
     for (i = 0; i < tempArgNum; ++i) {
         
         adrMesPos = 3;
+        
+        switch(receiverMessage->typeTag[i]) {
+            
+            case 's':
+                
+                receiverMessage->recArgs[i].s = (char *)tempArg[i];
+                break;
  
-        receiverMessage->arg[i] = tempArg[i];
-    
-        for (j = 0; j < 4; ++j) {
+            case 'i':
+                
+                union {
+                    int i;
+                    uint8_t b[4];
+                } ui;
+                
+                memcpy(ui.b, tempArg[i], 4);
+                receiverMessage->recArgs[i].i = ui.i;
+                break;
  
-            tempArg[i][adrMesPos] = rcvBuff[messagePos];
- 
-            ++messagePos;
-            --adrMesPos;
+            case 'f':
+                
+                union {
+                    float f;
+                    uint8_t b[4];
+                } uf;
+            
+                memcpy(uf.b, tempArg[i], 4);
+                receiverMessage->recArgs[i].f = uf.f;
+                break;
+            
+            case 'd':
+            
+                union {
+                    double d;
+                    uint8_t b[8];
+                } ud;
+        
+                memcpy(ud.b, tempArg[i], 8);
+                receiverMessage->recArgs[i].d = ud.d;
+                break;
+                
+            default:
+                break;
         }
     
+        tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
+        tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
+        tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
+        tempArg[i][adrMesPos--] = rcvBuff[messagePos++];
+    
     }
 }
  
@@ -410,12 +461,12 @@
 }
  
  
-void OSCClass::sendOsc( OSCMessage *_mes ) {
+void OSCClass::sendOsc(OSCMessage *mes) {
     uint8_t i, j = 0;
     uint8_t lengthStart, lengthEnd;   
-    char buff[128] = {0};
+    char buff[MAX_SENDBUFF_SIZE] = {0};
     
-    sendContainer = _mes;
+    sendContainer = mes;
     
     //1) Add name spaces:
     for (i = 0; i < sendContainer->addressNum; ++i) {
@@ -432,9 +483,7 @@
         
         buff[i] = '\0';  
     }
- 
-    lengthStart = lengthEnd;
- 
+
     //2) Add TypeTag:
     buff[lengthEnd++] = ','; // Note: type tag is for instance: ",if"
  
@@ -460,7 +509,7 @@
         
         if (sendContainer->typeTag[i] == 's') {       // strings
             
-            v = (uint8_t *)sendContainer->args[i].s;
+            v = (uint8_t *)sendContainer->sendArgs[i].s;
             
             while (v[j] != '\0') {
                 
@@ -479,7 +528,7 @@
             
         } else if (sendContainer->typeTag[i] == 'd') { // double
             
-            v = (uint8_t *)&sendContainer->args[i].d;
+            v = (uint8_t *)&sendContainer->sendArgs[i].d;
             
             buff[lengthEnd++] = v[7];
             buff[lengthEnd++] = v[6];
@@ -492,7 +541,7 @@
             
         }  if (sendContainer->typeTag[i] == 'f') {     // float                                    
             
-            v = (uint8_t *)&sendContainer->args[i].f;
+            v = (uint8_t *)&sendContainer->sendArgs[i].f;
             
             buff[lengthEnd++] = v[3];
             buff[lengthEnd++] = v[2];
@@ -501,13 +550,12 @@
         
         } else {                                       // int
             
-            v = (uint8_t *)&sendContainer->args[i].i;
+            v = (uint8_t *)&sendContainer->sendArgs[i].i;
             
             buff[lengthEnd++] = v[3];
             buff[lengthEnd++] = v[2];
             buff[lengthEnd++] = v[1];
             buff[lengthEnd++] = v[0];
-            
         }
 
     }