.. _program_listing_file_src_controller_devicethreadcontroller.cpp: Program Listing for File devicethreadcontroller.cpp =================================================== |exhale_lsh| :ref:`Return to documentation for file ` (``src/controller/devicethreadcontroller.cpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include #include "devicethreadcontroller.h" namespace PixelMaestroStudio { DeviceThreadController::DeviceThreadController(DeviceController& device, const char *out, int size) : QThread(nullptr), device_(device) { this->output_.append(out, size); } void DeviceThreadController::run() { /* * How this works: * * When sending data to an Arduino, the Arduino might fail to process large chunks even at a low baud rate. * This tends to happen at the 64 byte mark. * As a workaround, we break up the output into 64 byte chunks and give the Arduino some time between chunks to catch up. * */ emit progress_changed(0); int current_index = 0; int chunk_index = CHUNK_SIZE; do { if (current_index > 0) { msleep(SLEEP_INTERVAL); } QByteArray out_addr = output_.mid(current_index, chunk_index); if (current_index + chunk_index > output_.size()) { chunk_index = output_.size() - current_index; } device_.get_device()->write(out_addr); device_.flush(); current_index += chunk_index; emit progress_changed((current_index / (float)output_.size()) * 100); } while (current_index < output_.size()); emit progress_changed(100); } }