An Open Sound Control library for the mbed, created to be compatible with Recotana's OSCClass library (http://recotana.com) for the Arduino with Ethernet shield. It also uses parts of the OSC Transceiver(Sender/Receiver) code by xshige written by: Alvaro Cassinelli, October 2011 tweaked by: Toby Harris / *spark audio-visual, March 2012

Dependencies:   NetServices mbed

Committer:
tobyspark
Date:
Sun Apr 15 12:06:01 2012 +0000
Revision:
1:ab7dc9550de6
Parent:
0:49cdaebd52d5
Child:
11:853a9e887023

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tobyspark 0:49cdaebd52d5 1 #include "mbed.h"
tobyspark 0:49cdaebd52d5 2 #include "mbedOSC.h"
tobyspark 0:49cdaebd52d5 3
tobyspark 0:49cdaebd52d5 4 DigitalOut myled(LED1);
tobyspark 0:49cdaebd52d5 5
tobyspark 0:49cdaebd52d5 6 // mbed IP address (server):
tobyspark 0:49cdaebd52d5 7 #ifdef DHCP
tobyspark 0:49cdaebd52d5 8 EthernetNetIf eth;
tobyspark 0:49cdaebd52d5 9 #else
tobyspark 0:49cdaebd52d5 10 EthernetNetIf eth(
tobyspark 0:49cdaebd52d5 11 IpAddr(10,0,0,2), //IP Address
tobyspark 0:49cdaebd52d5 12 IpAddr(255,255,255,0), //Network Mask
tobyspark 0:49cdaebd52d5 13 IpAddr(10,0,0,1), //Gateway
tobyspark 0:49cdaebd52d5 14 IpAddr(10,0,0,1) //DNS
tobyspark 0:49cdaebd52d5 15 );
tobyspark 0:49cdaebd52d5 16 #endif
tobyspark 0:49cdaebd52d5 17
tobyspark 0:49cdaebd52d5 18 uint8_t serverIp[] = { 10, 0, 0, 2 }; // not needed perhaps!
tobyspark 0:49cdaebd52d5 19 int serverPort = 10000;
tobyspark 0:49cdaebd52d5 20
tobyspark 0:49cdaebd52d5 21 uint8_t destIp[] = { 10, 0, 0, 1};
tobyspark 0:49cdaebd52d5 22 int destPort = 12000;
tobyspark 0:49cdaebd52d5 23
tobyspark 0:49cdaebd52d5 24 char *topAddress="/mbed";
tobyspark 0:49cdaebd52d5 25 char *subAddress[3]={ "/test1" , "/test2" , "/test3" };
tobyspark 0:49cdaebd52d5 26
tobyspark 0:49cdaebd52d5 27 OSCMessage recMes;
tobyspark 0:49cdaebd52d5 28 OSCMessage sendMes;
tobyspark 0:49cdaebd52d5 29
tobyspark 0:49cdaebd52d5 30 OSCClass osc;
tobyspark 0:49cdaebd52d5 31 //OSCClass osc(&recMes); // instantiate OSC communication object, and set the receiver container from the OSC packets
tobyspark 0:49cdaebd52d5 32
tobyspark 1:ab7dc9550de6 33 Serial pc(USBTX, USBRX);
tobyspark 0:49cdaebd52d5 34
tobyspark 0:49cdaebd52d5 35 void processOSC();
tobyspark 0:49cdaebd52d5 36
tobyspark 0:49cdaebd52d5 37 int main() {
tobyspark 0:49cdaebd52d5 38
tobyspark 0:49cdaebd52d5 39 // make debug port:
tobyspark 0:49cdaebd52d5 40 pc.baud(115200);
tobyspark 0:49cdaebd52d5 41
tobyspark 0:49cdaebd52d5 42 // Set the Ethernet port:
tobyspark 0:49cdaebd52d5 43 printf("Setting up...\r\n");
tobyspark 0:49cdaebd52d5 44 EthernetErr ethErr = eth.setup();
tobyspark 0:49cdaebd52d5 45 if(ethErr)
tobyspark 0:49cdaebd52d5 46 {
tobyspark 0:49cdaebd52d5 47 printf("Error %d in setup.\r\n", ethErr);
tobyspark 0:49cdaebd52d5 48 return -1;
tobyspark 0:49cdaebd52d5 49 }
tobyspark 0:49cdaebd52d5 50 printf("Setup OK\r\n");
tobyspark 0:49cdaebd52d5 51
tobyspark 0:49cdaebd52d5 52
tobyspark 0:49cdaebd52d5 53 //(1) Sending message:
tobyspark 0:49cdaebd52d5 54 // Set IP and Port:
tobyspark 0:49cdaebd52d5 55 sendMes.setIp( destIp );
tobyspark 0:49cdaebd52d5 56 sendMes.setPort( destPort );
tobyspark 0:49cdaebd52d5 57 // Set data:
tobyspark 0:49cdaebd52d5 58 // sendMes.setTopAddress(topAddress);
tobyspark 0:49cdaebd52d5 59
tobyspark 0:49cdaebd52d5 60 //setting osc functionnality:
tobyspark 0:49cdaebd52d5 61 //(2) Receiving:
tobyspark 0:49cdaebd52d5 62 // recMes.setIp( serverIp ); // not needed?
tobyspark 0:49cdaebd52d5 63 osc.setReceiveMessage(&recMes); // this sets the receiver container for the OSC packets (we can avoid doing this if we use osc.getMessage() to get messages)
tobyspark 0:49cdaebd52d5 64 osc.begin(serverPort); // binds the upd (osc) messages to an arbitrary listening port ("server" port), and callback function
tobyspark 0:49cdaebd52d5 65 osc.messageReceivedCallback.attach(&processOSC);
tobyspark 0:49cdaebd52d5 66
tobyspark 0:49cdaebd52d5 67 //========================================== INFINITE LOOP (in USER PROGRAM CONTEXT) ===================================================================
tobyspark 0:49cdaebd52d5 68 while(true) {
tobyspark 0:49cdaebd52d5 69 Net::poll();
tobyspark 0:49cdaebd52d5 70
tobyspark 0:49cdaebd52d5 71 // ... Do whatever needs to be done (note: the osc processing is done in the processOSC function.
tobyspark 0:49cdaebd52d5 72 // BUT DO NOT FORGET to call osc.onUDPSocketEvent(e). This is messy... should find a better way to do it.
tobyspark 0:49cdaebd52d5 73
tobyspark 0:49cdaebd52d5 74 }
tobyspark 0:49cdaebd52d5 75 }
tobyspark 0:49cdaebd52d5 76
tobyspark 0:49cdaebd52d5 77 void processOSC() {
tobyspark 0:49cdaebd52d5 78
tobyspark 0:49cdaebd52d5 79 if (osc.newMessage) { // in fact, there is no need to check this if using the method of a global callback function - it is clear this is a new packet... however, it may be
tobyspark 0:49cdaebd52d5 80 // interesting to use a timer, and process data (answers, etc) only after a certain amount of time, so as to avoid blocking the program in IRQ context...
tobyspark 0:49cdaebd52d5 81
tobyspark 0:49cdaebd52d5 82 //pc.printf("we received top address %s\n", recMes.getAddress(0) );
tobyspark 0:49cdaebd52d5 83
tobyspark 0:49cdaebd52d5 84 osc.newMessage=false; // note: if using: message=osc.getMessage(), then we don't need to do this explicitly.
tobyspark 0:49cdaebd52d5 85
tobyspark 0:49cdaebd52d5 86 // Test:
tobyspark 0:49cdaebd52d5 87 if( !strcmp( recMes.getAddress(0) , "mbed" ) ) {
tobyspark 0:49cdaebd52d5 88 pc.printf("we received topAddress= mbed \n");
tobyspark 0:49cdaebd52d5 89 if( !strcmp( recMes.getAddress(1) , "test1" ) )
tobyspark 0:49cdaebd52d5 90 pc.printf("we received subAddress= test1 \n");
tobyspark 0:49cdaebd52d5 91
tobyspark 0:49cdaebd52d5 92 // Send some osc message:
tobyspark 0:49cdaebd52d5 93 sendMes.setTopAddress("/working...");
tobyspark 0:49cdaebd52d5 94 osc.sendOsc(&sendMes);
tobyspark 0:49cdaebd52d5 95 }
tobyspark 0:49cdaebd52d5 96 }
tobyspark 0:49cdaebd52d5 97
tobyspark 0:49cdaebd52d5 98 }
tobyspark 0:49cdaebd52d5 99
tobyspark 0:49cdaebd52d5 100
tobyspark 0:49cdaebd52d5 101 /* EXAMPLE SEND/RECEIVE on PROCESSING:
tobyspark 0:49cdaebd52d5 102
tobyspark 0:49cdaebd52d5 103 // oscP5sendreceive by andreas schlegel
tobyspark 0:49cdaebd52d5 104 // example shows how to send and receive osc messages.
tobyspark 0:49cdaebd52d5 105 // oscP5 website at http://www.sojamo.de/oscP5
tobyspark 0:49cdaebd52d5 106
tobyspark 0:49cdaebd52d5 107
tobyspark 0:49cdaebd52d5 108 import oscP5.*;
tobyspark 0:49cdaebd52d5 109 import netP5.*;
tobyspark 0:49cdaebd52d5 110
tobyspark 0:49cdaebd52d5 111 OscP5 oscP5;
tobyspark 0:49cdaebd52d5 112 NetAddress myRemoteLocation;
tobyspark 0:49cdaebd52d5 113
tobyspark 0:49cdaebd52d5 114 void setup() {
tobyspark 0:49cdaebd52d5 115 size(400,400);
tobyspark 0:49cdaebd52d5 116 frameRate(25);
tobyspark 0:49cdaebd52d5 117 // start oscP5, listening for incoming messages at port 12000
tobyspark 0:49cdaebd52d5 118 oscP5 = new OscP5(this,12000);
tobyspark 0:49cdaebd52d5 119
tobyspark 0:49cdaebd52d5 120 // myRemoteLocation is a NetAddress. a NetAddress takes 2 parameters,
tobyspark 0:49cdaebd52d5 121 // an ip address and a port number. myRemoteLocation is used as parameter in
tobyspark 0:49cdaebd52d5 122 // oscP5.send() when sending osc packets to another computer, device,
tobyspark 0:49cdaebd52d5 123 // application. usage see below. for testing purposes the listening port
tobyspark 0:49cdaebd52d5 124 // and the port of the remote location address are the same, hence you will
tobyspark 0:49cdaebd52d5 125 // send messages back to this sketch.
tobyspark 0:49cdaebd52d5 126 myRemoteLocation = new NetAddress("10.0.0.2",10000);
tobyspark 0:49cdaebd52d5 127 }
tobyspark 0:49cdaebd52d5 128
tobyspark 0:49cdaebd52d5 129
tobyspark 0:49cdaebd52d5 130 void draw() {
tobyspark 0:49cdaebd52d5 131 background(0);
tobyspark 0:49cdaebd52d5 132 }
tobyspark 0:49cdaebd52d5 133
tobyspark 0:49cdaebd52d5 134 void mousePressed() {
tobyspark 0:49cdaebd52d5 135 // in the following different ways of creating osc messages are shown by example
tobyspark 0:49cdaebd52d5 136 OscMessage myMessage = new OscMessage("/mbed/test1");
tobyspark 0:49cdaebd52d5 137
tobyspark 0:49cdaebd52d5 138 myMessage.add(123); // add an int to the osc message
tobyspark 0:49cdaebd52d5 139
tobyspark 0:49cdaebd52d5 140 // send the message
tobyspark 0:49cdaebd52d5 141 oscP5.send(myMessage, myRemoteLocation);
tobyspark 0:49cdaebd52d5 142 }
tobyspark 0:49cdaebd52d5 143
tobyspark 0:49cdaebd52d5 144
tobyspark 0:49cdaebd52d5 145 // incoming osc message are forwarded to the oscEvent method.
tobyspark 0:49cdaebd52d5 146 void oscEvent(OscMessage theOscMessage) {
tobyspark 0:49cdaebd52d5 147 // print the address pattern and the typetag of the received OscMessage
tobyspark 0:49cdaebd52d5 148 print("### received an osc message.");
tobyspark 0:49cdaebd52d5 149 print(" addrpattern: "+theOscMessage.addrPattern());
tobyspark 0:49cdaebd52d5 150 println(" typetag: "+theOscMessage.typetag());
tobyspark 0:49cdaebd52d5 151 }
tobyspark 0:49cdaebd52d5 152
tobyspark 0:49cdaebd52d5 153 */