80 lines
1.5 KiB
C++
80 lines
1.5 KiB
C++
unsigned long tic_loop = 0;
|
|
const unsigned int FRAME_TIME = 20; // 20 ms -> 50 FPS
|
|
|
|
const size_t UNIVERSE_SIZE = 512;
|
|
|
|
byte channels_buffer[UNIVERSE_SIZE] = {0};
|
|
size_t bytes_read = 0;
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200); // USB
|
|
|
|
while (!Serial)
|
|
{
|
|
// spin until serial is up
|
|
}
|
|
Serial.println();
|
|
Serial.println("Init.");
|
|
|
|
Serial1.begin(250000, SERIAL_8N2); // DMX
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
bool packet_ready = update_buffer();
|
|
|
|
if (packet_ready)
|
|
{
|
|
send_packet();
|
|
}
|
|
}
|
|
|
|
void send_packet()
|
|
{
|
|
send_dmx_header();
|
|
Serial1.write(channels_buffer, UNIVERSE_SIZE);
|
|
}
|
|
|
|
bool update_buffer()
|
|
{
|
|
size_t n = Serial.available();
|
|
if (!n)
|
|
return false;
|
|
int bytes_received = Serial.read(channels_buffer + bytes_read, std::min(n, UNIVERSE_SIZE - bytes_read));
|
|
bytes_read += bytes_received;
|
|
|
|
// Serial.printf("rx n=%d rec=%d total=%d\n", n, bytes_received, bytes_read);
|
|
|
|
if (bytes_read == UNIVERSE_SIZE)
|
|
{
|
|
bytes_read = 0;
|
|
// Serial.println();
|
|
// Serial.println("Updated.");
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void send_dmx_header()
|
|
{
|
|
Serial1.flush();
|
|
Serial1.begin(90000, SERIAL_8N2);
|
|
/*
|
|
while (Serial1.available())
|
|
Serial1.read();
|
|
*/
|
|
// send the break as a "slow" byte
|
|
Serial1.write(0);
|
|
// switch back to the original baud rate
|
|
Serial1.flush();
|
|
Serial1.begin(250000, SERIAL_8N2);
|
|
/*
|
|
while (Serial1.available())
|
|
Serial1.read();
|
|
*/
|
|
Serial1.write(0); // Start-Byte
|
|
} |