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
/* | |
* 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