support OSC-string
Fork of OSC by
Diff: mbedOSC.cpp
- 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 } - - + + +