support OSC-string

Dependents:   OSCtoCVConverter

Fork of OSC by Toby Harris

Revision:
4:601f6a1141fb
Parent:
3:f4118f0bc1ab
Child:
5:5d585d5107da
--- a/mbedOSC.cpp	Sun Jan 03 00:13:22 2016 +0000
+++ b/mbedOSC.cpp	Sat Jan 09 10:54:31 2016 +0000
@@ -1,7 +1,7 @@
 /*
  mbedOSC.cpp 
 */                    
-
+ 
 #pragma O3
 #pragma Otime
    
@@ -9,12 +9,12 @@
 #include "mbedOSC.h"
 #include "stdarg.h"
 #include <string.h>
-
+ 
 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);
 }
-
+ 
 inline size_t strlength(const char *s) 
 {
     size_t len = 0;
@@ -29,20 +29,20 @@
         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,
@@ -50,31 +50,31 @@
     
     host.setIp(IpAddr(_ip1, _ip2, _ip3, _ip4));
 }
-
+ 
 const IpAddr& OSCMessage::getIp() {
     
     return host.getIp();
 }
-
-
+ 
+ 
 const int& OSCMessage::getPort() {
      
     return host.getPort();
 }
-
-
-uint8_t    OSCMessage::getAddressNum(){
+ 
+ 
+uint8_t OSCMessage::getAddressNum(){
     
     return addressNum;
 }
-
-
-uint8_t    OSCMessage::getArgNum() {
+ 
+ 
+uint8_t OSCMessage::getArgNum() {
     
     return argNum;
 }
-
-
+ 
+ 
 char * OSCMessage::getAddress(uint8_t _index) {
     
     if (_index > MAX_ADDRESS) {
@@ -85,23 +85,23 @@
     return address[_index];
     
 }
-
-
+ 
+ 
 char * OSCMessage::getTopAddress() {
     
     return getAddress(0);
     
 }
-
-
+ 
+ 
 char * OSCMessage::getSubAddress() {
     
     return getAddress(1);
     
 }
-
-
-char  OSCMessage::getTypeTag(uint8_t _index) {
+ 
+ 
+char OSCMessage::getTypeTag(uint8_t _index) {
     
     if (_index > MAX_ARG) {
         
@@ -110,8 +110,8 @@
     
     return typeTag[_index];
 }
-
-
+ 
+ 
 int OSCMessage::getArgInt(uint8_t _index) {
     int *value;
     
@@ -124,9 +124,9 @@
     
     return *value;
 }
-
-
-double OSCMessage::getArgFloat(uint8_t _index) {
+ 
+ 
+float OSCMessage::getArgFloat(uint8_t _index) {
     float *value;
     
     if (_index > argNum) {
@@ -138,24 +138,24 @@
     
     return *value;
 }
-
-
+ 
+ 
 void OSCMessage::setTopAddress(char *_address) {
     
     address[0] = _address;
     address[1] = 0;
     addressNum = 1; // Note: this "erases" the subaddress! (is this a good idea?)
 }
-
-
+ 
+ 
 void OSCMessage::setSubAddress(char *_address) {
     
     address[1] = _address;
     addressNum = 2; // Note: this assumes the top address was already set!
 }
-
-
-
+ 
+ 
+ 
 void OSCMessage::setAddress(char *_topAddress,char *_subAddress) {
     
     setTopAddress(_topAddress);
@@ -163,8 +163,8 @@
     
     addressNum = 2; // (unnecessary...)
 }
-
-
+ 
+ 
 void OSCMessage::setAddress(uint8_t _index, char *_address) {
     
     if (_index>MAX_ADDRESS) {
@@ -175,11 +175,11 @@
     address[_index] = _address;
     addressNum = (_index + 1);
 }
-
-
-
+ 
+ 
+ 
 void OSCMessage::setArgs(char *types,...) {
-
+ 
     uint8_t i;
     va_list argList;
     
@@ -197,65 +197,65 @@
         typeTag[i] = types[i];
         
         switch(types[i]) {
-
+ 
             case 'i':
                 arg[i] = va_arg(argList, int *);
                 break;
-
+ 
             case 'f':
                 arg[i] = va_arg(argList, float *);
                 break;
-
+ 
             case 's':
                 arg[i] = va_arg(argList, char *);
                 break;
         }   
     }
 }
-
+ 
 // ================================================================================================================================================
 // ====================================  OSCClass for sending and receiving OSC messages using UDP protocol =======================================
 // ================================================================================================================================================
 //The class define an object wrapping the UDP functions to send and receive OSC messages
-
+ 
 OSCClass::OSCClass() {
     
     udpRec.setOnEvent(this, &OSCClass::onUDPSocketEvent);
-    newMessage=false;
+    newMessage = false;
 }
-
+ 
 OSCClass::~OSCClass() {
     
     udpSend.resetOnEvent();
     udpRec.close();
 }
-
+ 
 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
     newMessage = false;
 }
-
+ 
 void OSCClass::begin() {    
   // setup receiver udp socket:
   udpRec.bind(receiverMessage->host);
 }
-
-
+ 
+ 
 void OSCClass::begin(uint16_t _recievePort) {
     
   receiverMessage->host.setPort(_recievePort);
   // setup receiver udp socket:
   udpRec.bind(receiverMessage->host);
 }
-
-
+ 
+ 
 void OSCClass::setReceiveMessage(OSCMessage *_mes) {
     
     receiverMessage = _mes;
 }
-
+ 
 void OSCClass::onUDPSocketEvent(UDPSocketEvent e) {
     
   switch(e) {
@@ -274,7 +274,7 @@
             break;
         }
 }
-
+ 
 /*
  Decode UDP packet and save it in the OSCMessage structure
  */
@@ -293,23 +293,23 @@
     //lenBuff=recvfrom(socketNo, rcvBuff, 1, receiverMessage->ip, &receiverMessage->port);    
     
     receiverMessage->address[0] = tempAddress[0];
-
+ 
     //(1) address process start =========================================
     do {
         d = rcvBuff[messagePos];
         
         if ( (d == '/') && (messagePos > 0) ) {
-
+ 
             if (adrCount < MAX_ADDRESS) {
                 
                 tempAddress[adrCount][adrMesPos] = 0;
-
+ 
                 ++adrCount;
                 adrMesPos = 0;
-
+ 
                 receiverMessage->address[adrCount] = tempAddress[adrCount];
             }
-
+ 
         }
         
         if (adrCount < MAX_ADDRESS) {
@@ -332,7 +332,7 @@
         ++packetCount;
         
     } while(d != 0);
-
+ 
     
     if (adrCount < MAX_ADDRESS) {
         ++adrCount;  
@@ -341,14 +341,14 @@
     receiverMessage->addressNum = adrCount;
     
     messagePos = packetPos;
-
+ 
     //(2) type tag process starts =========================================
     packetCount = 0;
     packetPos += 4;
-
+ 
     uint8_t  typeTagPos = 0;
     uint8_t  tempArgNum = 0;
-
+ 
     while(rcvBuff[messagePos] != 0) {
             
         if (rcvBuff[messagePos] != ',') {
@@ -375,36 +375,36 @@
     }
     
     receiverMessage->argNum = tempArgNum;
-
+ 
     messagePos = packetPos;
-
+ 
     //(3) tempArg process starts =========================================
     for (i = 0; i < tempArgNum; ++i) {
         
         adrMesPos = 3;
-
+ 
         receiverMessage->arg[i] = tempArg[i];
     
         for (j = 0; j < 4; ++j) {
-
+ 
             tempArg[i][adrMesPos] = rcvBuff[messagePos];
-
+ 
             ++messagePos;
             --adrMesPos;
         }
     
     }
 }
-
-
-
+ 
+ 
+ 
 OSCMessage * OSCClass::getMessage() {
     
     newMessage = false; // this indicate the user READ the message
     return receiverMessage;
 }
-
-
+ 
+ 
 void OSCClass::sendOsc( OSCMessage *_mes ) {
     uint8_t i, j = 0;
     uint8_t lengthEnd;
@@ -421,32 +421,28 @@
         
         strcat(buff, sendContainer->address[i]); // note: an address is for instance: "/test" (including the "/")
     }
-
+ 
     // pad with 0s to align in multiples of 4:
     lengthStart = strlength(buff);
-
+ 
     lengthEnd = lengthStart + (4 - (lengthStart % 4));
     
     for (i = lengthStart; i < lengthEnd; ++i) {
         
         buff[i] = '\0';  
     }
-
+ 
     lengthStart = lengthEnd;
-
+ 
     //2) Add TypeTag:
     buff[lengthEnd++] = ','; // Note: type tag is for instance: ",if"
-
+ 
     for (i = 0; i < sendContainer->argNum; ++i) {
         
         buff[lengthEnd++] = sendContainer->typeTag[i];
         
-        if (sendContainer->typeTag[i] == 's') {
-            
-            strCheck = true;
-        }
     }
-
+ 
     // pad with 0s to align in multiples of 4:
     lengthStart = lengthEnd;
     
@@ -462,6 +458,11 @@
     
     for (i = 0; i < sendContainer->argNum; ++i) {
         
+        if (sendContainer->typeTag[i] == 's') {
+            
+            strCheck = true;
+        }
+        
         if (!strCheck) {
             
             v = (uint8_t *)&sendContainer->arg[i];
@@ -472,7 +473,7 @@
             buff[lengthEnd++] = v[0];
             
         } else {
-
+ 
             v = (uint8_t *)sendContainer->arg[i];
             
             while (v[j] != '\0') {
@@ -489,6 +490,8 @@
         
                 buff[i] = '\0';
             }
+            
+            strCheck = false;
         }
     }
     
@@ -496,19 +499,20 @@
     //sendto(    socketNo, (uint8_t *)buff, lengthEnd, sendContainer->ip, sendContainer->port );
     udpSend.sendto(buff , lengthEnd, &(sendContainer->host));
 }
-
-
+ 
+ 
 /*
  flush a receive buffer
 void OSCClass::flush() {    
     while ( available() ){}
 }
 */
-
-
+ 
+ 
 void OSCClass::stop() {
     //close( socketNo );
     udpSend.resetOnEvent(); // disables callback
 }
-
-
+ 
+ 
+