Control of mbed using OSC. Based on code from the Make Controller. Right now you can turn the onboard LEDs on/off and toggle 8 digital out pins. More I/O will be done in the future.
Diff: mbed_system_osc.cpp
- Revision:
- 0:439354122597
diff -r 000000000000 -r 439354122597 mbed_system_osc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_system_osc.cpp Wed Mar 17 03:17:38 2010 +0000 @@ -0,0 +1,185 @@ +/* + * Pehr Hovey + * + * mBed OSC - SystemOsc subsystem + * Get/set info about the system like ip address, hostname + * Based on code from Make Controller + */ +/********************************************************************************* + + Copyright 2006-2009 MakingThings + + Licensed under the Apache License, + Version 2.0 (the "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed + under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. See the License for + the specific language governing permissions and limitations under the License. + +*********************************************************************************/ + +#include "mbed_system_osc.h" +#include "osc_sys.h" +#include "mbed_osc.h" //to get the netserver +#include "mbed.h" + +static char* SystemOsc_Name = "system"; //the OSC container for this address +static char* SystemOsc_PropertyNames[] = { "serialnumber", "version","name", "ipinfo", "mac","hostname", + 0 }; // must have a trailing 0 + +int SystemOsc_PropertySet( int property, char* typedata, int channel ); +int SystemOsc_PropertyGet( int property, int channel ); + +const char* SystemOsc_GetName( void ) +{ + return SystemOsc_Name; +} +// need to allow this to accept non-int arguments +int SystemOsc_ReceiveMessage( int channel, char* message, int length ) +{ + //printf("SystemOsc received a message: %s\r\n",message); + int status = Osc_GeneralReceiverHelper( channel, message, length, + SystemOsc_Name, + SystemOsc_PropertySet, SystemOsc_PropertyGet, + SystemOsc_PropertyNames ); + + if ( status != CONTROLLER_OK ){ + printf("SystemOsc error, status is: %d\r\n",status); + return Osc_SendError( channel, SystemOsc_Name, status ); + } + + return CONTROLLER_OK; +} + +int SystemOsc_Poll( ) +{ + return CONTROLLER_OK; +} + +// Set the index'd property, property with the value +//Not everything can be set +int SystemOsc_PropertySet( int property, char* typedata, int channel ) +{ + //printf("SysOSC property SET: %d data: %s\r\n",property, typedata); + int value = 0; + switch ( property ) + { + + case 0: // serialnumber + { + int count = Osc_ExtractData( typedata, "i", &value ); + if ( count != 1 ) + return Osc_SubsystemError( channel, SystemOsc_Name, "Incorrect data - need an int" ); + + //nothing yet System_SetSerialNumber( value ); + break; + } + case 1: //version + { + + break; + } + case 2: // name + { + int count = Osc_ExtractData( typedata, "s", &value ); + if ( count != 1 ) + return Osc_SubsystemError( channel, SystemOsc_Name, "Incorrect data - need a string" ); + + break; + } + case 5: //hostname + { + char *newname; + int count = Osc_ExtractData( typedata, "s", &newname ); + if ( count != 1 ) + return Osc_SubsystemError( channel, SystemOsc_Name, "Incorrect data - need a string" ); + NetServer * net = getNetServer(); + net->setHostname(newname); + break; + } + + } + return CONTROLLER_OK; +} +//A hack, from mbed forums, to get MAC adress directly +//This is useful since the NetServer doesnt seem to give direct access to the netif to get it +extern "C" void mbed_mac_address(char *mac); + +// Get the value of a property +int SystemOsc_PropertyGet( int property, int channel ) +{ + //printf("SysOSC property GET: %d\r\n",property); + int value = 0; + char * oscaddr = getScratch(); //a reserved scratch space + //Construct the return OSC-address + snprintf( oscaddr, OSC_SCRATCH_SIZE, "/%s/%s", SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); + switch ( property ) + { + case 0: // serialnumber + value = 12345;//hardcoded for now + + Osc_CreateMessage( channel, oscaddr, ",i", value ); + break; + case 1: // version + { + char versionString[50]; + snprintf(versionString, 50, "%s",MBED_LIBRARY_VERSION); + + Osc_CreateMessage( channel, oscaddr, ",s", versionString ); + break; + } + + case 3: // ipinfo + { + NetServer * net = getNetServer(); + struct ip_addr ipaddr = net->getIPAddr(); + + char ipstring[25]; + snprintf(ipstring, 25,"%hhu.%hhu.%hhu.%hhu", (ipaddr.addr)&0xFF, (ipaddr.addr>>8)&0xFF, (ipaddr.addr>>16)&0xFF, (ipaddr.addr>>24)&0xFF); + + int port = UDP_RECV_PORT; //where is it listening? + + //snprintf( oscaddr, OSC_SCRATCH_SIZE, "/%s/%s", SystemOsc_Name, SystemOsc_PropertyNames[ property ] ); + int rval = Osc_CreateMessage( channel, oscaddr, ",si", ipstring,port ); + + break; + } + case 4: // mac (MAC address of ethernet port) + char mac[6]; + + mbed_mac_address(mac); // update mac to the unique mbed mac address + + char mac_str[50]; + + snprintf(mac_str,50,"%02x:%02x:%02x:%02x:%02x:%02x", + (char*) mac[0], + (char*) mac[1], + (char*) mac[2], + (char*) mac[3], + (char*) mac[4], + (char*) mac[5]); + + + Osc_CreateMessage( channel, oscaddr, ",s", mac_str ); + break; + case 2: // name (same as hostname for now) + case 5: // hostname + { + NetServer * net = getNetServer(); + const char * hname = net->getHostname(); + + Osc_CreateMessage( channel, oscaddr, ",s", hname ); + break; + } + + } + + return CONTROLLER_OK; +} + + +