![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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: osc_sys.h
- Revision:
- 0:439354122597
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/osc_sys.h Wed Mar 17 03:17:38 2010 +0000 @@ -0,0 +1,133 @@ +/* + * osc.h + * + * Created on: Mar 8, 2010 + * Author: pehr + * + * The functions to receive, parse and delegate OSC commands + * Based on osc_cpp.h in Make Controller repository + * This code is trimmed down to be UDP-only, no USB (code never had TCP) + * http://makingthings.com + */ +/********************************************************************************* + + 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. + +*********************************************************************************/ +#ifndef OSC_H_ +#define OSC_H_ + +#include "ipv4/lwip/ip_addr.h" +#include "lwip/udp.h" + +#ifndef UDP_BROADCAST_PORT +#define UDP_BROADCAST_PORT 5555 +#endif + +#include "error.h" //Make Controller error codes + +#define OSC_SUBSYSTEM_COUNT 18 + +#define OSC_SCRATCH_SIZE 100 + +#define OSC_CHANNEL_COUNT 3 +#define OSC_CHANNEL_UDP 0 +#define OSC_CHANNEL_USB 1 //not implemented yet +#define OSC_CHANNEL_TCP 2 //not implemented yet + + +#define OSC_MAX_MESSAGE_IN 200 +#define OSC_MAX_MESSAGE_OUT 600 + + +typedef unsigned char uchar; + +typedef struct OscChannel_ +{ + char buffer[ OSC_MAX_MESSAGE_OUT ]; + char incoming[ OSC_MAX_MESSAGE_IN ]; + char* bufferPointer; + int bufferRemaining; + int messages; + struct ip_addr * replyAddress; //where to send + int replyPort; + //A function pointer to the func used to send using this channel, set up in an init function + int (*sendMessage)( char* packet, int length, struct ip_addr * replyAddress, int replyPort ); + int running; +}OscChannel; + +// Top level functions +void Osc_SystemInit( struct udp_pcb * pcb ); +void Osc_UdpInit( int channel, struct udp_pcb * pcb); //set up UDP channel + +OscChannel * Osc_GetChannel(int channel); //get ptr to the channel struct + +int Osc_CreateMessage( int channel, char* address, char* format, ... ); +int Osc_CreateMessageToBuf( char* bp, int* length, char* address, char* format, ... ); +int Osc_SendPacket( int channel ); +int Osc_ReceivePacket( int channel, char* packet, int length ); +int Osc_RegisterSubsystem( const char *name, + int (*Subsystem_ReceiveMessage)( int channel, char* buffer, int length ), + int (*Subsystem_Poll)( int channel ) ); + +// Helpers for processing messages - they return error codes as spec'ed above +int Osc_IntReceiverHelper( int channel, char* message, int length, + char* subsystemName, + int (*propertySet)( int property, int value ), + int (*propertyGet)( int property ), + char* propertyNames[] ); + +int Osc_IndexIntReceiverHelper( int channel, char* message, int length, + int indexCount, bool (*validIndex)( int index ),char* subsystemName, + int (*propertySet)( int index, int property, int value ), + int (*propertyGet)( int index, int property ), + char* propertyNames[] ); + +int Osc_BlobReceiverHelper( int channel, char* message, int length, + char* subsystemName, + int (*blobPropertySet)( int property, uchar* buffer, int length ), + int (*blobPropertyGet)( int property, uchar* buffer, int size ), + char* blobPropertyNames[] ); + + +int Osc_IndexBlobReceiverHelper( int channel, char* message, int length, + int indexCount, char* subsystemName, + int (*blobPropertySet)( int index, int property, uchar* buffer, int length ), + int (*blobPropertyGet)( int index, int property, uchar* buffer, int size ), + char* blobPropertyNames[] ); + +int Osc_GeneralReceiverHelper( int channel, char* message, int length, + char* subsystemName, + int (*propertySet)( int property, char* typedata, int channel ), + int (*propertyGet)( int property, int channel ), + char* propertyNames[] ); + +int Osc_SendError( int channel, char* subsystemName, int error ); + + +// Functions needed to process messages +int Osc_SubsystemError( int channel, char* subsystem, char* string ); +int Osc_PropertyLookup( char** properties, char* property ); +char *Osc_FindDataTag( char* message, int length ); +int Osc_ExtractData( char* buffer, char* format, ... ); +int Osc_NumberMatch( int max, char* pattern, int* fancy ); +int Osc_SetReplyAddress( int channel, struct ip_addr * replyAddress ); +int Osc_SetReplyPort( int channel, int replyPort ); + +// Pattern Match Stuff +bool Osc_PatternMatch(const char * pattern, const char * test); + + +#endif /* OSC_H_ */ +