Skip to content

Instantly share code, notes, and snippets.

Created January 30, 2015 18:28
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save anonymous/884be2953d3eadd4e553 to your computer and use it in GitHub Desktop.
/*
* This is a minimal example, see extra-examples.cpp for a version
* with more explantory documentation, example routines, how to
* hook up your pixels and all of the pixel types that are supported.
*
*/
#include "application.h"
//#include "spark_disable_wlan.h" // For faster local debugging only
#include "neopixel/neopixel.h"
// IMPORTANT: Set pixel COUNT, PIN and TYPE
#define PIXEL_PIN D3
#define PIXEL_COUNT 170
#define PIXEL_TYPE WS2812B
//"552a41691ae145f96c59fe0d30200cc55a0a2ccd"
#define ART_NET_PORT 6454
// Opcodes
#define ART_POLL 0x2000
#define ART_DMX 0x5000
// Buffers
// Packet
#define ART_NET_ID "Art-Net\0"
#define ART_DMX_START 18
#define BUFFER_SIZE 1500
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);
const int universeId = 0;
const int numberOfChannels = PIXEL_COUNT * 3; // Total number of channels you want to receive (1 led = 3 channels)
byte packetBuffer[BUFFER_SIZE];
byte* artnetPacket = packetBuffer;
int receivedSize = 0;
byte* colours;
bool ready = false;
uint8_t _sock;
sockaddr tUDPAddr;
int nu0 =0, nu1=0;
void setup()
{
pinMode(D7, OUTPUT);
pinMode(D4, OUTPUT);
digitalWrite(D4, HIGH);
strip.begin();
colours = strip.getPixels();
if (WiFi.ready()) {
_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset(&tUDPAddr, 0, sizeof(tUDPAddr));
tUDPAddr.sa_family = AF_INET;
tUDPAddr.sa_data[0] = (ART_NET_PORT & 0xFF00) >> 8;
tUDPAddr.sa_data[1] = (ART_NET_PORT & 0x00FF);
bool bound = bind(_sock, (sockaddr*)&tUDPAddr, sizeof(tUDPAddr)) >= 0;
ready = bound;
}
if (ready) {
for (int k=0; k < numberOfChannels; ++k)
colours[k] = 2;
strip.show();
}
else {
for (int k=0; k < numberOfChannels; ++k)
colours[k] = (k) % 3 ? 0 : 1;
strip.show(); // Set all pixels to 'red'
if (isOpen(_sock))
closesocket(_sock);
}
/////Spark.disconnect();
}
void loop()
{
if (ready)
read(colours);
}
uint16_t read(byte* data_buffer)
{
int remainingSize = 0;
if (artnetPacket - packetBuffer < receivedSize) {
remainingSize = receivedSize - (artnetPacket - packetBuffer);
}
else {
_types_fd_set_cc3000 readSet;
timeval timeout;
FD_ZERO(&readSet);
FD_SET(_sock, &readSet);
timeout.tv_sec = 1;
timeout.tv_usec = 0;
receivedSize = 0;
remainingSize = 0;
if (select(_sock + 1, &readSet, NULL, NULL, &timeout) > 0) {
if (FD_ISSET(_sock, &readSet)) {
int ret = recv(_sock, packetBuffer, BUFFER_SIZE, 0);
if (ret > 0) {
receivedSize = remainingSize = ret;
artnetPacket = packetBuffer;
}
}
}
}
bool valid = true;
if (remainingSize >= 18) {
digitalWrite(D7, HIGH);
for (byte i = 0 ; valid && i < 9 ; i++) {
if (artnetPacket[i] != ART_NET_ID[i])
valid = false;
}
int opcode = artnetPacket[8] | artnetPacket[9] << 8;
if (valid && opcode == ART_DMX) {
int sequence = artnetPacket[12];
int universe = artnetPacket[14] | artnetPacket[15] << 8;
int dmxDataLength = artnetPacket[17] | artnetPacket[16] << 8;
long now = millis();
valid = (universe == universeId);
if (valid) {
if (dmxDataLength <= remainingSize - ART_DMX_START) {
int maxlen = min(numberOfChannels, dmxDataLength);
for (int i=0; i<maxlen; i+=3) {
colours[i+1] = artnetPacket[ART_DMX_START + i];
colours[i] = artnetPacket[ART_DMX_START + i + 1];
colours[i+2] = artnetPacket[ART_DMX_START + i + 2];
}
strip.show();
artnetPacket = artnetPacket + ART_DMX_START + dmxDataLength;
}
else {
valid = false;
}
}
}
}
else {
valid = false;
}
if (!valid) {
receivedSize = 0;
}
digitalWrite(D7, LOW);
return 0;
}
static bool inline isOpen(long sd)
{
return sd != MAX_SOCK_NUM;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment