diff --git a/protocol/enttec/dmx-usb-pro/pro.h b/protocol/enttec/dmx-usb-pro/pro.h index 61e9ef4..cd8c396 100644 --- a/protocol/enttec/dmx-usb-pro/pro.h +++ b/protocol/enttec/dmx-usb-pro/pro.h @@ -55,6 +55,7 @@ enum FIRMWARE_TYPE { * @brief All message labels from API 1.44 */ enum MESSAGE_LABEL { + OpNoop = 0, //!< null message, out-of-spec definition. Not in API! OpReprogramFirmware = 1, //!< Reprogram Firmware Request OpProgramFlashPage = 2, //!< Program Flash Page Request / Reply OpGetWidgetParameters = 3, //!< Get Widget Parameters Request / Reply @@ -78,8 +79,16 @@ struct MessageData /** * @brief Initialize MessageData with the appropriate Label * @param l Label + * + * While null messages (label = 0) are not present in the API spec., allow their IO, + * perhaps to act as a "ping/echo" to detect emulated devices. */ - MessageData(uint8_t l) : label(l) {}; + MessageData(uint8_t l = 0) : label(l) {}; + + size_t streamSize() const override { return 0; }; + void iStream(std::shared_ptr) override {}; + void oStream(std::shared_ptr) const override{}; + const uint8_t label; //!< Message ID label (OpCode) }; diff --git a/protocol/enttec/dmx-usb-pro/widget.cpp b/protocol/enttec/dmx-usb-pro/widget.cpp index af3fd7f..4538f4f 100644 --- a/protocol/enttec/dmx-usb-pro/widget.cpp +++ b/protocol/enttec/dmx-usb-pro/widget.cpp @@ -296,7 +296,11 @@ bool Widget::writeFirmware(const uint8_t *data, const size_t size) */ void Widget::routeRxMessage(std::shared_ptr msg) { - switch (msg->label) { + switch (msg->label) + { + case Pro::OpNoop: + rxMsgHello(msg); + break; case Pro::OpReprogramFirmware: { auto data = std::static_pointer_cast(msg); @@ -537,6 +541,25 @@ void Widget::sendDmx(bool trimmed) const } +/** + * @brief Widget::rxMsgHello + * @param msg + */ +void Widget::rxMsgHello(std::shared_ptr msg) +{ + switch (usb_mode_) { + case USBdevice: + sendMessage(msg); // mirror the message back to the host + break; + case USBhost: + reply_hello_.set_value(true); // device was polite + break; + default: + break; + } +} + + /** * @brief Widget::rxMsgReprogramFirmware * @param msg diff --git a/protocol/enttec/dmx-usb-pro/widget.h b/protocol/enttec/dmx-usb-pro/widget.h index 6b47797..0a04ce9 100644 --- a/protocol/enttec/dmx-usb-pro/widget.h +++ b/protocol/enttec/dmx-usb-pro/widget.h @@ -101,6 +101,7 @@ protected: std::vector user_configuration; //!< User defined configuration data. private: + void rxMsgHello(std::shared_ptr); void rxMsgReprogramFirmware(std::shared_ptr); void rxMsgProgramFlashPageRequest(std::shared_ptr); void rxMsgProgramFlashPageReply(std::shared_ptr); @@ -125,6 +126,7 @@ private: mutable std::mutex mtx_metadata_; std::shared_ptr token_data_changed_; + std::promise reply_hello_; std::promise reply_firmwarePage_; std::promise reply_parameters_; std::promise reply_serialNumber_;