messages that expect a reply may optionally block to wait for it.

This commit is contained in:
Kevin Matz 2023-04-06 09:43:41 -04:00
parent a355edd722
commit e316c71a83
2 changed files with 41 additions and 5 deletions

View File

@ -23,6 +23,8 @@
*/ */
#include "widget.h" #include "widget.h"
#include <chrono>
namespace ENTTEC { namespace ENTTEC {
Widget::Widget() Widget::Widget()
@ -386,24 +388,55 @@ void Widget::rebootBootloader()
/** /**
* @brief Widget::getSerialNumber * @brief Widget::getSerialNumber
* @param timeout block for up to 'timeout' milliseconds waiting for a reply * @param timeout Milliseconds to block while waiting for the device to reply.
* @return True if the serial number has been updated.
*/ */
void Widget::getSerialNumber() bool Widget::getSerialNumber(int timeout)
{ {
{
std::scoped_lock lock(mtx_metadata_);
reply_serialNumber_ = std::promise<bool>(); // expect a reply to this message
}
auto ftr = reply_serialNumber_.get_future(); // will be "true" when reply received
auto msg = std::make_shared<Pro::MsgGetWidgetSerialRequest>(); auto msg = std::make_shared<Pro::MsgGetWidgetSerialRequest>();
sendMessage(msg); sendMessage(msg);
auto status = ftr.wait_for(std::chrono::milliseconds(timeout)); // wait for the reply
switch (status) {
case std::future_status::ready:
return true;
case std::future_status::timeout:
return false;
default:
return false;
}
} }
/** /**
* @brief Widget::getParameters * @brief Widget::getParameters
* @param user_length * @param user_length
* @param timeout Milliseconds to block while waiting for the device to reply.
* @return True if the parameters has been updated.
*/ */
void Widget::getParameters(size_t user_length) bool Widget::getParameters(size_t user_length, int timeout)
{ {
{
std::scoped_lock lock(mtx_metadata_);
reply_parameters_ = std::promise<bool>(); // expect a reply to this message
}
auto ftr = reply_parameters_.get_future(); // will be "true" when reply received
auto msg = std::make_shared<Pro::MsgGetWidgetParametersRequest>(); auto msg = std::make_shared<Pro::MsgGetWidgetParametersRequest>();
msg->size = std::min(user_length, Pro::USER_CONFIGURATION_MAX); msg->size = std::min(user_length, Pro::USER_CONFIGURATION_MAX);
sendMessage(msg); sendMessage(msg);
auto status = ftr.wait_for(std::chrono::milliseconds(timeout)); // wait for the reply
switch (status) {
case std::future_status::ready:
return true;
case std::future_status::timeout:
return false;
default:
return false;
}
} }

View File

@ -26,6 +26,7 @@
#include "pro.h" #include "pro.h"
#include <cstring> #include <cstring>
#include <future>
#include <mutex> #include <mutex>
#include <universe.h> #include <universe.h>
#include <vector> #include <vector>
@ -78,9 +79,9 @@ protected:
// USB Host operations // USB Host operations
virtual void sendMessage(std::shared_ptr<Pro::MessageData>) const; virtual void sendMessage(std::shared_ptr<Pro::MessageData>) const;
void rebootBootloader(); void rebootBootloader();
void getParameters(size_t user_length = 0); bool getParameters(size_t user_length = 0, int timeout = 0);
void setParameters() const; void setParameters() const;
void getSerialNumber(); bool getSerialNumber(int timeout = 0);
void sendDmx(bool trimmed = true) const; void sendDmx(bool trimmed = true) const;
/** /**
@ -123,6 +124,8 @@ private:
mutable std::mutex mtx_metadata_; mutable std::mutex mtx_metadata_;
std::shared_ptr<void> token_data_changed_; std::shared_ptr<void> token_data_changed_;
std::promise<bool> reply_parameters_;
std::promise<bool> reply_serialNumber_;
}; };
} // namespace ENTTEC } // namespace ENTTEC