Skip to content

Instantly share code, notes, and snippets.

@j0hnm4r5
Created January 21, 2016 17:52
Show Gist options
  • Save j0hnm4r5/011c84e2af77dc161539 to your computer and use it in GitHub Desktop.
Save j0hnm4r5/011c84e2af77dc161539 to your computer and use it in GitHub Desktop.
An example for sending and receiving OSC messages with a Particle Photon
#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