diff options
Diffstat (limited to 'Libraries/OSC/OSCMessage.cpp')
| -rw-r--r-- | Libraries/OSC/OSCMessage.cpp | 335 |
1 files changed, 144 insertions, 191 deletions
diff --git a/Libraries/OSC/OSCMessage.cpp b/Libraries/OSC/OSCMessage.cpp index 5fb4d87..f3d98b1 100644 --- a/Libraries/OSC/OSCMessage.cpp +++ b/Libraries/OSC/OSCMessage.cpp @@ -1,39 +1,32 @@ /* - - ArdOSC - OSC Library for Arduino. - - -------- Lisence ----------------------------------------------------------- - - ArdOSC - - The MIT License - - Copyright (c) 2009 - 2010 recotana( http://recotana.com ) All right reserved - - */ -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> + ArdOSC - OSC Library for Arduino. -#include "OSCcommon.h" -#include "OSCMessage.h" + -------- Lisence ----------------------------------------------------------- + + ArdOSC + The MIT License + Copyright (c) 2009 - 2010 recotana( http://recotana.com ) All right reserved +*/ +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include "OSCcommon.h" +#include "OSCMessage.h" OSCMessage::OSCMessage() -{ +{ DBG_LOGLN("construct message"); oscAddress=NULL; typeTag=NULL; - arguments=NULL; - + flush(); - } OSCMessage::OSCMessage(const char *_oscAddress) @@ -41,10 +34,9 @@ OSCMessage::OSCMessage(const char *_oscAddress) DBG_LOGLN("construct message with Adr"); oscAddress=NULL; typeTag=NULL; - arguments=NULL; - + flush(); - + setOSCAddress(_oscAddress); } @@ -56,54 +48,39 @@ OSCMessage::~OSCMessage() } -void OSCMessage::flush(){ - - if(oscAddress!=NULL) free(oscAddress); - +void OSCMessage::flush() +{ oscAddress=NULL; oscAdrSize=0; oscAdrPacSize=0; - - if(typeTag!=NULL) free(typeTag); - + typeTag=NULL; typeTagSize=0; typeTagPacSize=0; - - if(arguments!=NULL){ - - for (uint16_t i=0; i< argsNum; i++) { - free((void*)arguments[i]); - arguments[i]=NULL; - } - free(arguments); - } + argsNum=0; - argsPacSize=0; - - arguments=NULL; - + argsPacSize=0; + setIpAddress(0,0,0,0); portNumber=0; - + DBG_LOGLN("flush message obj"); - } void OSCMessage::setAddress(uint8_t *_ip , uint16_t _port){ - + setIpAddress(_ip); - + portNumber=_port; - + } void OSCMessage::setIpAddress(uint8_t *_ip){ - + ipAddress[0] = _ip[0]; ipAddress[1] = _ip[1]; ipAddress[2] = _ip[2]; ipAddress[3] = _ip[3]; - + DBG_LOG("set IP Adr with IParray:"); DBG_LOG((int)ipAddress[0]); DBG_LOG("."); @@ -116,12 +93,12 @@ void OSCMessage::setIpAddress(uint8_t *_ip){ } void OSCMessage::setIpAddress( uint8_t _ip1 ,uint8_t _ip2 ,uint8_t _ip3 ,uint8_t _ip4 ){ - + ipAddress[0] = _ip1; ipAddress[1] = _ip2; ipAddress[2] = _ip3; ipAddress[3] = _ip4; - + DBG_LOG("set IP Adr with IP nums:"); DBG_LOG((int)ipAddress[0]); DBG_LOG("."); @@ -130,7 +107,7 @@ void OSCMessage::setIpAddress( uint8_t _ip1 ,uint8_t _ip2 ,uint8_t _ip3 ,uint8_t DBG_LOG((int)ipAddress[2]); DBG_LOG("."); DBG_LOGLN((int)ipAddress[3]); - + } uint8_t *OSCMessage::getIpAddress(){ @@ -145,104 +122,94 @@ uint16_t OSCMessage::getPortNumber(){ return portNumber; } +int16_t OSCMessage::setOSCMessage( const char *_address ,char *types , ... ){ + va_list argsList; + DBG_LOG("set OSCMessage:"); -int16_t OSCMessage::setOSCMessage( const char *_address ,char *types , ... ){ - - va_list argsList; - - DBG_LOG("set OSCMessage:"); - - if( setOSCAddress(_address) > 0) return 1; if( setTypeTags(types) > 0) return 1; - - - - - //------------------------------------------------- - + + //------------------------------------------------- + + argStart = NULL; + argsPacSize=0; +#if 0 if (arguments!=NULL) free(arguments); arguments=(void**)calloc(argsNum, sizeof(void*)); - - - - argsPacSize=0; - + void *tmpPtr; char *tmpStr; uint16_t strSize; - - va_start( argsList, types ); - - for(uint8_t i=0 ; i < argsNum ; i++){ - - typeTag[i]=types[i]; - - + + va_start( argsList, types ); + + for(uint8_t i=0 ; i < argsNum ; i++) + { switch(types[i]){ - - case 'i': - tmpPtr=calloc(1, 4); - - memcpy(tmpPtr,(int32_t *)va_arg(argsList, int32_t *),4); - arguments[i]=(int32_t *)tmpPtr; - argsPacSize += 4; - - DBG_LOG(" int(4byte):"); - DBG_LOG(*(int32_t *)tmpPtr); - - break; - - -#ifdef _USE_FLOAT_ - case 'f': - tmpPtr=calloc(1, 4); - - memcpy(tmpPtr,(float *)va_arg(argsList, float *),4); - arguments[i]=(float *)tmpPtr; - - argsPacSize += 4; - - DBG_LOG(" float(4byte):"); - DBG_LOG(*(float *)tmpPtr); - - break; -#endif - - + + case 'i': + tmpPtr=calloc(1, 4); + + memcpy(tmpPtr,(int32_t *)va_arg(argsList, int32_t *),4); + arguments[i]=(int32_t *)tmpPtr; + argsPacSize += 4; + + DBG_LOG(" int(4byte):"); + DBG_LOG(*(int32_t *)tmpPtr); + + break; + + +#ifdef _USE_FLOAT_ + case 'f': + tmpPtr=calloc(1, 4); + + memcpy(tmpPtr,(float *)va_arg(argsList, float *),4); + arguments[i]=(float *)tmpPtr; + + argsPacSize += 4; + + DBG_LOG(" float(4byte):"); + DBG_LOG(*(float *)tmpPtr); + + break; +#endif + + #ifdef _USE_STRING_ - case 's': - tmpStr=(char *)va_arg(argsList, char *); - strSize=strlen(tmpStr); - DBG_LOGLN(strSize); - if(strSize > kMaxStringCharactor){ - - DBG_LOGLN("set args message max str err"); - return 1; - } - - tmpPtr=calloc(strSize+1, 1); - strcpy((char*)tmpPtr, tmpStr); - - arguments[i]=tmpPtr; - argsPacSize += getPackSize( strSize ); - - DBG_LOG(" String,size:"); - DBG_LOG(strSize); - DBG_LOG(" packsize:"); - DBG_LOG(getPackSize( strSize )); - DBG_LOG(" :"); - DBG_LOG((char *)tmpPtr); - - break; + case 's': + tmpStr=(char *)va_arg(argsList, char *); + strSize=strlen(tmpStr); + DBG_LOGLN(strSize); + if(strSize > kMaxStringCharactor){ + + DBG_LOGLN("set args message max str err"); + return 1; + } + + tmpPtr=calloc(strSize+1, 1); + strcpy((char*)tmpPtr, tmpStr); + + arguments[i]=tmpPtr; + argsPacSize += getPackSize( strSize ); + + DBG_LOG(" String,size:"); + DBG_LOG(strSize); + DBG_LOG(" packsize:"); + DBG_LOG(getPackSize( strSize )); + DBG_LOG(" :"); + DBG_LOG((char *)tmpPtr); + + break; #endif - + } - + } +#endif DBG_LOGLN(""); DBG_LOGLN(""); return 0; @@ -254,70 +221,58 @@ int16_t OSCMessage::setOSCMessage( const char *_address ,char *types , ... ){ int16_t OSCMessage::setOSCAddress(const char *_address){ oscAdrSize=(uint16_t)strlen(_address); - + if( oscAdrSize > kMaxOSCAdrCharactor ){ DBG_LOGLN("set OSC max OSC Adr err"); flush(); return 1; } - - if(oscAddress!=NULL) free(oscAddress); - - oscAddress=(char*)calloc(1,oscAdrSize+1); - strcpy(oscAddress,_address); - + + oscAddress = _address; oscAdrPacSize=getPackSize(oscAdrSize); - + DBG_LOG("set OSC Adr:"); DBG_LOG(oscAddress); DBG_LOG(" size:"); DBG_LOG(oscAdrSize); DBG_LOG(" packsize:"); DBG_LOGLN(oscAdrPacSize); - + return 0; } -char *OSCMessage::getOSCAddress(){ + +const char* OSCMessage::getOSCAddress(){ return oscAddress; } - - -int16_t OSCMessage::setTypeTags(const char *_tags ){ - - uint8_t maxErr=0; - +int16_t OSCMessage::setTypeTags(const char *_tags ) +{ argsNum=(uint16_t)strlen(_tags); - + if(argsNum > kMaxAugument){ DBG_LOGLN("set tags max arg err"); flush(); return 1; } - + typeTagSize = argsNum+1; - - if(typeTag!=NULL) free(typeTag); - typeTag=(char*)calloc(1,argsNum+1); - strcpy(typeTag,_tags); - + typeTag = _tags; typeTagPacSize=getPackSize(typeTagSize); - argsNum=typeTagSize; - - + + DBG_LOG("set TypeTag:"); DBG_LOG(typeTag); DBG_LOG(" size:"); DBG_LOG(typeTagSize); DBG_LOG(" packsize:"); DBG_LOGLN(typeTagPacSize); - + return 0; } -char * OSCMessage::getTypeTags(){ +const char* OSCMessage::getTypeTags(){ return typeTag; } @@ -331,56 +286,54 @@ int16_t OSCMessage::getArgsNum(){ return argsNum; } +void OSCMessage::getRaw(uint16_t _index, void* ptr) +{ + const uint8_t* source = &(argStart[_index * 4]); + uint8_t* dest = (uint8_t*) ptr; + *(dest+3) = source[0]; + *(dest+2) = source[1]; + *(dest+1) = source[2]; + *(dest+0) = source[3]; +} -int32_t OSCMessage::getInteger32(uint16_t _index){ - - int32_t *value; - if(_index > argsNum) _index=argsNum-1; - value = (int32_t *)arguments[_index]; - - return *value; - +int32_t OSCMessage::getInteger32(uint16_t _index) +{ + int32_t ret; + getRaw(_index, &ret); + return ret; } #ifdef _USE_FLOAT_ -float OSCMessage::getFloat(uint16_t _index){ - - float *value; - if(_index > argsNum) _index=argsNum-1; - value = (float *)arguments[_index]; - - return *value; - - +float OSCMessage::getFloat(uint16_t _index) +{ + float ret; + getRaw(_index, &ret); + return ret; } #endif #ifdef _USE_STRING_ char * OSCMessage::getString(uint16_t _index){ - + if(_index > argsNum) _index=argsNum-1; - + return (char *)arguments[_index]; - + } #endif uint16_t OSCMessage::getAllPackSize(){ - + return oscAdrPacSize+typeTagPacSize+argsPacSize; } uint16_t OSCMessage::getStrPackSize(const char* data){ - + return getPackSize(strlen(data)); } uint16_t OSCMessage::getPackSize(uint16_t size){ - + return (size+4)&0xfffc; } - - - - |
