support OSC-string
Fork of OSC by
Diff: mbedOSC.cpp
- Revision:
- 6:a47004fb44f5
- Parent:
- 5:5d585d5107da
- Child:
- 7:498455cded21
--- a/mbedOSC.cpp Tue Feb 16 11:30:55 2016 +0000 +++ b/mbedOSC.cpp Thu Feb 18 13:25:30 2016 +0000 @@ -12,7 +12,7 @@ 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); + // host=new Host(IpAddr(10, 0, 0, 1), DEFAULT_RECEIVEport, NULL); } inline size_t strlength(const char *s) @@ -29,27 +29,8 @@ 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, - uint8_t _ip4 ) { - - host.setIp(IpAddr(_ip1, _ip2, _ip3, _ip4)); -} - const IpAddr& OSCMessage::getIp() { return host.getIp(); @@ -74,71 +55,108 @@ } -char * OSCMessage::getAddress(uint8_t _index) { +char * OSCMessage::getAddress(uint8_t index) { - if (_index > MAX_ADDRESS) { + if (index > MAX_ADDRESS) { - _index = (MAX_ADDRESS - 1); + index = (MAX_ADDRESS - 1); } - return address[_index]; - + return address[index]; } char * OSCMessage::getTopAddress() { - return getAddress(0); - + return getAddress(0); } char * OSCMessage::getSubAddress() { - return getAddress(1); - + return getAddress(1); } -char OSCMessage::getTypeTag(uint8_t _index) { +char OSCMessage::getTypeTag(uint8_t index) { - if (_index > MAX_ARG) { + if (index > MAX_ARG) { - _index = MAX_ARG-1; + index = MAX_ARG - 1; } - return typeTag[_index]; + return typeTag[index]; +} + + +int OSCMessage::getArgInt(uint8_t index) { + + if (index > argNum) { + + index = argNum; + } + + return recArgs[index].i; } -int OSCMessage::getArgInt(uint8_t _index) { - int *value; +float OSCMessage::getArgFloat(uint8_t index) { - if (_index > argNum) { + if (index > argNum) { - _index = argNum; + index = argNum; } - value = (int *)arg[_index]; // cast to int32_t + return recArgs[index].f; +} + +double OSCMessage::getArgDouble(uint8_t index) { + + if (index > argNum) { + + index = argNum; + } - return *value; + return recArgs[index].d; +} + +char * OSCMessage::getArgString(uint8_t index) { + + if (index > argNum) { + + index = argNum; + } + + return recArgs[index].s; } +//------------------------------------------------- +// setup SendHost IP&Port -float OSCMessage::getArgFloat(uint8_t _index) { - float *value; +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, + uint8_t ip4 ) { - if (_index > argNum) { - - _index=argNum; - } + host.setIp(IpAddr(ip1, ip2, ip3, ip4)); +} + + +void OSCMessage::setPort(uint16_t port) { - value = (float *)arg[_index]; // cast to float not double for correct parsing on mbed! - - return *value; + host.setPort(port); } - - + + +//------------------------------------------------- +// Construct OSC messages + void OSCMessage::setTopAddress(char *_address) { address[0] = _address; @@ -154,24 +172,24 @@ } -void OSCMessage::setAddress(char *_topAddress,char *_subAddress) { +void OSCMessage::setAddress(char *topAddress, char *subAddress) { - setTopAddress(_topAddress); - setSubAddress(_subAddress); + setTopAddress(topAddress); + setSubAddress(subAddress); addressNum = 2; // (unnecessary...) } -void OSCMessage::setAddress(uint8_t _index, char *_address) { +void OSCMessage::setAddress(uint8_t index, char *_address) { - if (_index>MAX_ADDRESS) { - - _index = (MAX_ADDRESS - 1); + if (index > MAX_ADDRESS) { + + index = (MAX_ADDRESS - 1); } - address[_index] = _address; - addressNum = (_index + 1); + address[index] = _address; + addressNum = (index + 1); } @@ -185,10 +203,10 @@ if (argNum > MAX_ARG) { - argNum = MAX_ARG - 1; + argNum = (MAX_ARG - 1); } - va_start( argList, types ); + va_start(argList, types); for (i = 0 ; i < argNum ; ++i) { @@ -197,20 +215,19 @@ switch(types[i]) { case 's': - args[i].s = va_arg(argList, char *); + sendArgs[i].s = va_arg(argList, char *); break; case 'i': - args[i].i = va_arg(argList, uint32_t); + sendArgs[i].i = va_arg(argList, int); break; - case 'f': // variadic function float is promoted to double - - args[i].f = (va_arg(argList, double)); + case 'f': + sendArgs[i].f = va_arg(argList, double); break; case 'd': - args[i].d = va_arg(argList, double); + sendArgs[i].d = va_arg(argList, double); break; default: @@ -236,10 +253,10 @@ udpRec.close(); } -OSCClass::OSCClass(OSCMessage *_mes) { +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 + receiverMessage = mes; // note: receiverMessage MUST be a pointer to the message, because we will modify things in it newMessage = false; } @@ -249,17 +266,17 @@ } -void OSCClass::begin(uint16_t _recievePort) { +void OSCClass::begin(uint16_t recievePort) { - receiverMessage->host.setPort(_recievePort); + receiverMessage->host.setPort(recievePort); // setup receiver udp socket: udpRec.bind(receiverMessage->host); } -void OSCClass::setReceiveMessage(OSCMessage *_mes) { +void OSCClass::setReceiveMessage(OSCMessage *mes) { - receiverMessage = _mes; + receiverMessage = mes; } void OSCClass::onUDPSocketEvent(UDPSocketEvent e) { @@ -267,16 +284,17 @@ switch(e) { case UDPSOCKET_READABLE: //The only event for now + Host auxhost; - buflength = udpRec.recvfrom( rcvBuff, 128, &auxhost ); // QUESTION: auxhost should be equal to the receiver host I guess... - if ( buflength > 0 ) { - //printf("\r\nFrom %d.%d.%d.%d:\r\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3]); + buflength = udpRec.recvfrom(rcvBuff, MAX_RECEIVEBUFF_SIZE, &auxhost); // QUESTION: auxhost should be equal to the receiver host I guess... + + if (buflength > 0) { + decodePacket(receiverMessage); // convert to OSC message, and save it in receiverMessage newMessage = true; messageReceivedCallback.call(); } - break; } } @@ -284,9 +302,8 @@ /* Decode UDP packet and save it in the OSCMessage structure */ -void OSCClass::decodePacket( OSCMessage *_mes) { - int i, j; - //uint16_t lenBuff; +void OSCClass::decodePacket(OSCMessage *mes) { + int i; uint8_t d; uint8_t messagePos = 0; uint8_t adrCount = 0; @@ -294,10 +311,6 @@ uint8_t packetCount = 0; uint8_t packetPos = 4; - - //W5100.writeSn(socketNo, SnIR, SnIR::RECV); - //lenBuff=recvfrom(socketNo, rcvBuff, 1, receiverMessage->ip, &receiverMessage->port); - receiverMessage->address[0] = tempAddress[0]; //(1) address process start ========================================= @@ -338,7 +351,6 @@ ++packetCount; } while(d != 0); - if (adrCount < MAX_ADDRESS) { ++adrCount; @@ -388,17 +400,56 @@ for (i = 0; i < tempArgNum; ++i) { adrMesPos = 3; + + switch(receiverMessage->typeTag[i]) { + + case 's': + + receiverMessage->recArgs[i].s = (char *)tempArg[i]; + break; - receiverMessage->arg[i] = tempArg[i]; - - for (j = 0; j < 4; ++j) { + case 'i': + + union { + int i; + uint8_t b[4]; + } ui; + + memcpy(ui.b, tempArg[i], 4); + receiverMessage->recArgs[i].i = ui.i; + break; - tempArg[i][adrMesPos] = rcvBuff[messagePos]; - - ++messagePos; - --adrMesPos; + case 'f': + + union { + float f; + uint8_t b[4]; + } uf; + + memcpy(uf.b, tempArg[i], 4); + receiverMessage->recArgs[i].f = uf.f; + break; + + case 'd': + + union { + double d; + uint8_t b[8]; + } ud; + + memcpy(ud.b, tempArg[i], 8); + receiverMessage->recArgs[i].d = ud.d; + break; + + default: + break; } + tempArg[i][adrMesPos--] = rcvBuff[messagePos++]; + tempArg[i][adrMesPos--] = rcvBuff[messagePos++]; + tempArg[i][adrMesPos--] = rcvBuff[messagePos++]; + tempArg[i][adrMesPos--] = rcvBuff[messagePos++]; + } } @@ -410,12 +461,12 @@ } -void OSCClass::sendOsc( OSCMessage *_mes ) { +void OSCClass::sendOsc(OSCMessage *mes) { uint8_t i, j = 0; uint8_t lengthStart, lengthEnd; - char buff[128] = {0}; + char buff[MAX_SENDBUFF_SIZE] = {0}; - sendContainer = _mes; + sendContainer = mes; //1) Add name spaces: for (i = 0; i < sendContainer->addressNum; ++i) { @@ -432,9 +483,7 @@ buff[i] = '\0'; } - - lengthStart = lengthEnd; - + //2) Add TypeTag: buff[lengthEnd++] = ','; // Note: type tag is for instance: ",if" @@ -460,7 +509,7 @@ if (sendContainer->typeTag[i] == 's') { // strings - v = (uint8_t *)sendContainer->args[i].s; + v = (uint8_t *)sendContainer->sendArgs[i].s; while (v[j] != '\0') { @@ -479,7 +528,7 @@ } else if (sendContainer->typeTag[i] == 'd') { // double - v = (uint8_t *)&sendContainer->args[i].d; + v = (uint8_t *)&sendContainer->sendArgs[i].d; buff[lengthEnd++] = v[7]; buff[lengthEnd++] = v[6]; @@ -492,7 +541,7 @@ } if (sendContainer->typeTag[i] == 'f') { // float - v = (uint8_t *)&sendContainer->args[i].f; + v = (uint8_t *)&sendContainer->sendArgs[i].f; buff[lengthEnd++] = v[3]; buff[lengthEnd++] = v[2]; @@ -501,13 +550,12 @@ } else { // int - v = (uint8_t *)&sendContainer->args[i].i; + v = (uint8_t *)&sendContainer->sendArgs[i].i; buff[lengthEnd++] = v[3]; buff[lengthEnd++] = v[2]; buff[lengthEnd++] = v[1]; buff[lengthEnd++] = v[0]; - } }