light_maymays/microcontroller/test.ino

87 lines
1.7 KiB
C++

unsigned long tic_loop = 0;
unsigned long time_since_last_sync;
const unsigned long SYNC_TIMEOUT = 1000;
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("Sync.");
time_since_last_sync = millis();
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()
{
unsigned long now = millis();
size_t n = Serial.available();
if (!n)
{
// nothing available to read
if (now - time_since_last_sync > SYNC_TIMEOUT)
{
// re-sync
bytes_read = 0;
Serial.println("Sync.");
time_since_last_sync = now;
}
return false;
}
time_since_last_sync = now;
int bytes_received = Serial.read(channels_buffer + bytes_read, std::min(n, UNIVERSE_SIZE - bytes_read));
bytes_read += bytes_received;
if (bytes_read == UNIVERSE_SIZE)
{
bytes_read = 0;
Serial.println("Ack.");
return true;
}
else
{
return false;
}
}
void send_dmx_header()
{
Serial1.flush();
Serial1.begin(90000, SERIAL_8N2);
// send the break as a "slow" byte
Serial1.write(0);
// switch back to the original baud rate
Serial1.flush();
Serial1.begin(250000, SERIAL_8N2);
Serial1.write(0); // Start-Byte
}