diff --git a/protocol/enttec/dmx-usb-pro/widget.cpp b/protocol/enttec/dmx-usb-pro/widget.cpp index 2f6fc43..af3fd7f 100644 --- a/protocol/enttec/dmx-usb-pro/widget.cpp +++ b/protocol/enttec/dmx-usb-pro/widget.cpp @@ -253,6 +253,43 @@ void Widget::setTxRate(uint8_t rate) } +/** + * @brief Widget::writeFirmware + * @param data + * @param size + * @return + */ +bool Widget::writeFirmware(const uint8_t *data, const size_t size) +{ + /** + * While the API documents the message formats, there is little discussion of the + * implimentation for updating firmware. As such, do nothing and return false. + */ + return false; + + // reboot the device into the fw loader + rebootBootloader(); + + auto msg = std::make_shared(); + std::future ftr; + bool success; + for (uint i = 0; i < size / sizeof(msg->page);) + { + { + std::scoped_lock lock(mtx_metadata_); + reply_firmwarePage_ = std::promise(); // expect a reply to this message + ftr = reply_firmwarePage_.get_future(); + } + std::copy(data + (i*sizeof(msg->page)), data + ((i+1)*sizeof(msg->page)), msg->page); + sendMessage(msg); + success = ftr.get(); + if (success) + i++; // page write was successful, do the next. + } + return success; +} + + /** * @brief Widget::routeRxMessage * @param msg @@ -528,7 +565,7 @@ void Widget::rxMsgProgramFlashPageRequest(std::shared_ptr msg) { - (void)msg; + reply_firmwarePage_.set_value(msg->success); } diff --git a/protocol/enttec/dmx-usb-pro/widget.h b/protocol/enttec/dmx-usb-pro/widget.h index 3b9b409..6b47797 100644 --- a/protocol/enttec/dmx-usb-pro/widget.h +++ b/protocol/enttec/dmx-usb-pro/widget.h @@ -72,6 +72,7 @@ public: uint8_t txRate() const; void setTxRate(uint8_t); + bool writeFirmware(const uint8_t *, const size_t); protected: void routeRxMessage(std::shared_ptr); @@ -124,6 +125,7 @@ private: mutable std::mutex mtx_metadata_; std::shared_ptr token_data_changed_; + std::promise reply_firmwarePage_; std::promise reply_parameters_; std::promise reply_serialNumber_; };