Created
January 21, 2016 17:52
-
-
Save j0hnm4r5/011c84e2af77dc161539 to your computer and use it in GitHub Desktop.
An example for sending and receiving OSC messages with a Particle Photon
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "simple-OSC/simple-OSC.h" | |
// create OSC object | |
UDP osc; | |
// set IP addresses and ports for I/O | |
IPAddress outIp(128, 237, 246, 8); | |
unsigned int outPort = 9000; | |
unsigned int inPort = 3000; | |
// creat named variables for pins | |
int leftMotorPin = D1; | |
int rightMotorPin = D0; | |
int ledPin = D7; | |
// runs once at the beginning of the program | |
void setup() { | |
// start serial & OSC | |
Serial.begin(115200); | |
osc.begin(inPort); | |
pinMode(leftMotorPin, OUTPUT); | |
pinMode(rightMotorPin, OUTPUT); | |
pinMode(ledPin, OUTPUT); | |
// You can view Serial.print() commands sent from the Photon via your computer's console (while it's plugged in to the computer). | |
// Do `ls /dev/tty.usb*` in terminal to find the address of the Photon, | |
// then do `screen ADDRESS BAUD` to make a serial monitor. | |
// For example, if my Photon is "/dev/tty.usbmodem331", I'd do 'screen /dev/tty.usbmodem331 115200'. | |
// while waiting for connection to be set up | |
while (!WiFi.ready()) { | |
// wait and print to console | |
delay(500); | |
Serial.print("."); | |
} | |
// print to console when connection is started | |
Serial.println(""); | |
Serial.println("WiFi connected"); | |
// get Photon's IP:PORT and print it to console | |
IPAddress ip = WiFi.localIP(); | |
Serial.print(F("ip : ")); | |
Serial.print(ip); | |
Serial.print(F(" : ")); | |
Serial.println(inPort); | |
} | |
// continuously runs throughout the life of the program, after setup() | |
void loop() { | |
// RECEIVE === | |
// create message object | |
OSCMessage inMessage; | |
// if the incoming OSC packet is larger than 0 bytes | |
int size = 0; | |
size = osc.parsePacket(); | |
if (size > 0) { | |
// copy each byte from the incoming packet to the message object | |
while (size > 0) { | |
inMessage.fill(osc.read()); | |
size--; | |
} | |
// if the message can be parsed | |
if (inMessage.parse()) { | |
Serial.println("Message Received"); | |
// route it to a callback function | |
inMessage.route("/A", leftCallback); | |
inMessage.route("/B", rightCallback); | |
} | |
} | |
// SEND === | |
// To test sending messages, you can use `nc -ul PORT` in terminal to listen to incoming messages on localhost. | |
// For example, if outIp is my computer's IP address (128.237.246.8), and outPort is the port I'm sending to (9000), | |
// then I'd run `nc -ul 9000` in terminal, and send a message from the Photon using the following example. | |
// | |
// For TouchOSC, you'd want to send the appropriate route to your mobile device's IP. Follow instructions [here](http://hexler.net/docs/touchosc) | |
// create an outgoing message object | |
OSCMessage outMessage("/sensor"); | |
// add parameters to the object | |
outMessage.addString("test"); | |
outMessage.addFloat(-3.14); | |
outMessage.addInt(-1); | |
// send the object | |
outMessage.send(osc, outIp, outPort); | |
} | |
// callbacks are run asynchronously from the main loop() | |
void leftCallback(OSCMessage &inMessage) { | |
Serial.println("LEFT CALLBACK"); | |
if (inMessage.getInt(0) == 0) { | |
Serial.println("LEFT OFF"); | |
digitalWrite(leftMotorPin, LOW); | |
digitalWrite(ledPin, LOW); | |
} else { | |
Serial.println("LEFT ON"); | |
digitalWrite(leftMotorPin, HIGH); | |
digitalWrite(ledPin, HIGH); | |
} | |
} | |
void rightCallback(OSCMessage &inMessage) { | |
Serial.println("RIGHT CALLBACK"); | |
Serial.println(inMessage.getInt(0)); | |
if (inMessage.getInt(0) == 0) { | |
Serial.println("RIGHT OFF"); | |
digitalWrite(rightMotorPin, LOW); | |
digitalWrite(ledPin, LOW); | |
} else { | |
Serial.println("RIGHT ON"); | |
digitalWrite(rightMotorPin, HIGH); | |
digitalWrite(ledPin, HIGH); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment