Lab_interaccio/2016/LASERS/Z_OSC/Z_OSCMessage.cpp

393 lines
6.2 KiB
C++
Raw Normal View History

2025-02-25 21:29:42 +01:00
/*
Z_OSC - OSC Library for Arduino.
This library seems to work with Arduino firmware 0022.
Copyright 2011, Jérôme Dupraz. All Rights Reserved
Based on the ArdOSC of recotana( http://recotana.com )
-------- License -----------
Z_OSC
The MIT License see readme.txt
Copyright © 2011 Jérôme Dupraz
*/
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "Z_OSCCommon/Z_OSCcommon.h"
#include "Z_OSCCommon/Z_OSCMessage.h"
Z_OSCMessage::Z_OSCMessage()
{
DBG_LOGLN("construct message");
oscAddress=NULL;
typeTag=NULL;
arguments=NULL;
flush();
}
Z_OSCMessage::Z_OSCMessage(const char *_oscAddress)
{
DBG_LOGLN("construct message with Adr");
oscAddress=NULL;
typeTag=NULL;
arguments=NULL;
flush();
setZ_OSCAddress(_oscAddress);
}
Z_OSCMessage::~Z_OSCMessage()
{
DBG_LOGLN("destruct message");
flush();
}
void Z_OSCMessage::flush(){
if(oscAddress!=NULL) free(oscAddress);
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;
setIpAddress(0,0,0,0);
portNumber=0;
DBG_LOGLN("flush message obj");
}
void Z_OSCMessage::setAddress(uint8_t *_ip , uint16_t _port){
setIpAddress(_ip);
portNumber=_port;
}
void Z_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(".");
DBG_LOG((int)ipAddress[1]);
DBG_LOG(".");
DBG_LOG((int)ipAddress[2]);
DBG_LOG(".");
DBG_LOGLN((int)ipAddress[3]);
}
void Z_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(".");
DBG_LOG((int)ipAddress[1]);
DBG_LOG(".");
DBG_LOG((int)ipAddress[2]);
DBG_LOG(".");
DBG_LOGLN((int)ipAddress[3]);
}
uint8_t *Z_OSCMessage::getIpAddress(){
return ipAddress;
}
void Z_OSCMessage::setPortNumber(uint16_t _port){
portNumber=_port;
}
uint16_t Z_OSCMessage::getPortNumber(){
return portNumber;
}
int16_t Z_OSCMessage::setZ_OSCMessage( const char *_address ,char *types , ... ){
va_list argsList;
DBG_LOG("set Z_OSCMessage:");
if( setZ_OSCAddress(_address) > 0) return 1;
if( setTypeTags(types) > 0) return 1;
//-------------------------------------------------
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];
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
#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;
#endif
}
}
DBG_LOGLN("");
DBG_LOGLN("");
return 0;
}
int16_t Z_OSCMessage::setZ_OSCAddress(const char *_address){
oscAdrSize=(uint16_t)strlen(_address);
if( oscAdrSize > kMaxZ_OSCAdrCharactor ){
DBG_LOGLN("set Z_OSC max Z_OSC Adr err");
flush();
return 1;
}
if(oscAddress!=NULL) free(oscAddress);
oscAddress=(char*)calloc(1,oscAdrSize+1);
strcpy(oscAddress,_address);
oscAdrPacSize=getPackSize(oscAdrSize);
DBG_LOG("set Z_OSC Adr:");
DBG_LOG(oscAddress);
DBG_LOG(" size:");
DBG_LOG(oscAdrSize);
DBG_LOG(" packsize:");
DBG_LOGLN(oscAdrPacSize);
return 0;
}
char *Z_OSCMessage::getZ_OSCAddress(){
return oscAddress;
}
int16_t Z_OSCMessage::setTypeTags(const char *_tags ){
uint8_t maxErr=0;
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);
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 * Z_OSCMessage::getTypeTags(){
return typeTag;
}
char Z_OSCMessage::getTypeTag(uint16_t _index){
if(_index>argsNum) _index=argsNum-1;
return typeTag[_index];
}
int16_t Z_OSCMessage::getArgsNum(){
return argsNum;
}
int32_t Z_OSCMessage::getInteger32(uint16_t _index){
int32_t *value;
if(_index > argsNum) _index=argsNum-1;
value = (int32_t *)arguments[_index];
return *value;
}
#ifdef _USE_FLOAT_
float Z_OSCMessage::getFloat(uint16_t _index){
float *value;
if(_index > argsNum) _index=argsNum-1;
value = (float *)arguments[_index];
return *value;
}
#endif
#ifdef _USE_STRING_
char * Z_OSCMessage::getString(uint16_t _index){
if(_index > argsNum) _index=argsNum-1;
return (char *)arguments[_index];
}
#endif
uint16_t Z_OSCMessage::getAllPackSize(){
return oscAdrPacSize+typeTagPacSize+argsPacSize;
}
uint16_t Z_OSCMessage::getStrPackSize(const char* data){
return getPackSize(strlen(data));
}
uint16_t Z_OSCMessage::getPackSize(uint16_t size){
return (size+4)&0xfffc;
}