232 lines
4.3 KiB
C++
232 lines
4.3 KiB
C++
|
/*
|
|||
|
|
|||
|
ArdOSC 2.1 - OSC Library for Arduino.
|
|||
|
|
|||
|
-------- Lisence -----------------------------------------------------------
|
|||
|
|
|||
|
ArdOSC
|
|||
|
|
|||
|
The MIT License
|
|||
|
|
|||
|
Copyright (c) 2009 - 2011 recotana( http://recotana.com ) All right reserved
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
#include <stdarg.h>
|
|||
|
|
|||
|
#include "OSCcommon.h"
|
|||
|
#include "OSCMessage.h"
|
|||
|
|
|||
|
|
|||
|
OSCMessage::OSCMessage(void)
|
|||
|
{
|
|||
|
_oscAddress = NULL;
|
|||
|
_oscAdrSize = 0;
|
|||
|
_oscAdrAlignmentSize = 0;
|
|||
|
_argsNum = 0;
|
|||
|
_argsAlignmentSize = 0;
|
|||
|
}
|
|||
|
|
|||
|
OSCMessage::OSCMessage(const char *_oscAddr)
|
|||
|
{
|
|||
|
_argsNum = 0;
|
|||
|
_argsAlignmentSize = 0;
|
|||
|
setOSCAddress(_oscAddr);
|
|||
|
}
|
|||
|
|
|||
|
OSCMessage::~OSCMessage(void)
|
|||
|
{
|
|||
|
flush();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void OSCMessage::flush(void){
|
|||
|
|
|||
|
if ( _oscAdrSize == 0 ) return;
|
|||
|
|
|||
|
free(_oscAddress);
|
|||
|
_oscAddress = NULL;
|
|||
|
_oscAdrSize = 0;
|
|||
|
_oscAdrAlignmentSize = 0;
|
|||
|
|
|||
|
OSCArg *tmp;
|
|||
|
|
|||
|
for ( uint8_t i = 0 ; i<_argsNum ; i++ ){
|
|||
|
tmp = _args[i];
|
|||
|
delete tmp;
|
|||
|
}
|
|||
|
|
|||
|
_argsNum = 0;
|
|||
|
_argsAlignmentSize = 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int16_t OSCMessage::setOSCAddress(const char *_address){
|
|||
|
|
|||
|
_oscAdrSize = (uint16_t)strlen(_address);
|
|||
|
|
|||
|
if( _oscAdrSize > kMaxOSCAdrCharactor ){
|
|||
|
flush();
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
if( _oscAddress != NULL ) free(_oscAddress);
|
|||
|
|
|||
|
_oscAddress = (char*)calloc(1,_oscAdrSize+1);
|
|||
|
strcpy( _oscAddress , _address) ;
|
|||
|
|
|||
|
_oscAdrAlignmentSize = CULC_ALIGNMENT(_oscAdrSize);
|
|||
|
|
|||
|
return 1;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
uint16_t OSCMessage::getMessageSize(void){
|
|||
|
return _oscAdrAlignmentSize + _typeTagAlignmentSize + _argsAlignmentSize;
|
|||
|
}
|
|||
|
|
|||
|
uint16_t OSCMessage::getArgAlignmentSize(uint8_t _index){
|
|||
|
return _args[_index]->_alignmentSize;
|
|||
|
}
|
|||
|
|
|||
|
char *OSCMessage::getOSCAddress(void){
|
|||
|
return _oscAddress;
|
|||
|
}
|
|||
|
|
|||
|
int16_t OSCMessage::getArgsNum(void){
|
|||
|
return _argsNum;
|
|||
|
}
|
|||
|
|
|||
|
char OSCMessage::getArgTypeTag(int16_t _index) {
|
|||
|
|
|||
|
if(_index>_argsNum) return -1;
|
|||
|
|
|||
|
return _args[_index]->_typeTag;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void OSCMessage::swap(uint8_t *data1, uint8_t *data2){
|
|||
|
data1[0] = data2[3];
|
|||
|
data1[1] = data2[2];
|
|||
|
data1[2] = data2[1];
|
|||
|
data1[3] = data2[0];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int16_t OSCMessage::beginMessage(const char *_address){
|
|||
|
flush();
|
|||
|
return setOSCAddress(_address);
|
|||
|
}
|
|||
|
|
|||
|
int16_t OSCMessage::setArgData(char _type , void *_value , uint8_t _byte,bool _enableAlignment){
|
|||
|
|
|||
|
_args[_argsNum]= new OSCArg( _type , _value , _byte , _enableAlignment );
|
|||
|
|
|||
|
uint16_t alignSize = _args[_argsNum]->_alignmentSize;
|
|||
|
|
|||
|
_argsAlignmentSize += alignSize;
|
|||
|
|
|||
|
_argsNum++;
|
|||
|
|
|||
|
_typeTagAlignmentSize = CULC_ALIGNMENT( _argsNum + 1 );
|
|||
|
|
|||
|
return alignSize;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int16_t OSCMessage::addArgInt32(int32_t _value){
|
|||
|
|
|||
|
if( _argsNum > kMaxAugument ) return -1;
|
|||
|
|
|||
|
uint8_t tmpValue[4];
|
|||
|
uint8_t *data = (uint8_t*)&_value;
|
|||
|
swap( tmpValue , data );
|
|||
|
|
|||
|
setArgData( kTagInt32 , tmpValue , 4 , false );
|
|||
|
|
|||
|
return 1;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
int32_t OSCMessage::getArgInt32(int16_t _index){
|
|||
|
|
|||
|
if ( _index > _argsNum ) return -1;
|
|||
|
|
|||
|
|
|||
|
uint8_t tmpValue[4];
|
|||
|
uint8_t *_bin = (uint8_t*)_args[_index]->_argData;
|
|||
|
swap( tmpValue , _bin );
|
|||
|
|
|||
|
return *(int32_t*)tmpValue;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef _USE_FLOAT_
|
|||
|
|
|||
|
int16_t OSCMessage::addArgFloat(float _value){
|
|||
|
|
|||
|
if( _argsNum > kMaxAugument ) return -1;
|
|||
|
|
|||
|
uint8_t tmpValue[4];
|
|||
|
uint8_t *data = (uint8_t*)&_value;
|
|||
|
swap( tmpValue , data );
|
|||
|
|
|||
|
setArgData( kTagFloat , tmpValue , 4 , false );
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
float OSCMessage::getArgFloat(int16_t _index){
|
|||
|
|
|||
|
if ( _index > _argsNum ) return -1;
|
|||
|
|
|||
|
|
|||
|
uint8_t tmpValue[4];
|
|||
|
uint8_t *_bin = (uint8_t*)_args[_index]->_argData;
|
|||
|
swap( tmpValue , _bin );
|
|||
|
|
|||
|
return *(float*)tmpValue;
|
|||
|
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef _USE_STRING_
|
|||
|
int16_t OSCMessage::addArgString(const char* _value){
|
|||
|
|
|||
|
if (_argsNum > kMaxAugument ) return -1;
|
|||
|
|
|||
|
setArgData( kTagString , (void*)_value , strlen(_value) , true );
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
int16_t OSCMessage::getArgString(int16_t _index , char *_rcvstr){
|
|||
|
|
|||
|
if ( _index > _argsNum ) return -1;
|
|||
|
|
|||
|
strcpy( _rcvstr , (char*)_args[_index]->_argData );
|
|||
|
|
|||
|
return 1;
|
|||
|
|
|||
|
}
|
|||
|
char* OSCMessage:: getArgStringData(int16_t _index ){
|
|||
|
if ( _index > _argsNum ) return NULL;
|
|||
|
return (char*)_args[_index]->_argData;
|
|||
|
}
|
|||
|
|
|||
|
int16_t OSCMessage::getArgStringSize(int16_t _index){
|
|||
|
|
|||
|
if ( _index > _argsNum ) return -1;
|
|||
|
|
|||
|
return _args[_index]->_dataSize+1;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|