all ArtPolls count towards the minimum interval, not just from the periodic polling thread.
This commit is contained in:
parent
652e9e9017
commit
a15b0d90f7
|
@ -30,6 +30,7 @@ Controller::Controller()
|
|||
: minimum_polling_interval(2500)
|
||||
, _periodic_polling_enabled(true)
|
||||
, _pollster(std::thread(&Controller::_periodic_polling, this))
|
||||
, last_poll(std::chrono::system_clock::from_time_t(0))
|
||||
, _talktome_request()
|
||||
, _priority_request(DpCritial)
|
||||
{
|
||||
|
@ -55,7 +56,7 @@ Controller::~Controller()
|
|||
*/
|
||||
void Controller::setTalkToMeRequest(TalkToMe talktome)
|
||||
{
|
||||
std::unique_lock lk_ctl(_mtx_poll_control);
|
||||
std::unique_lock lk_data(_mtx_control_data);
|
||||
_talktome_request = talktome;
|
||||
}
|
||||
|
||||
|
@ -66,7 +67,7 @@ void Controller::setTalkToMeRequest(TalkToMe talktome)
|
|||
*/
|
||||
void Controller::setPriorityRequest(Priority priority)
|
||||
{
|
||||
std::unique_lock lk_ctl(_mtx_poll_control);
|
||||
std::unique_lock lk_data(_mtx_control_data);
|
||||
_priority_request = priority;
|
||||
}
|
||||
|
||||
|
@ -76,37 +77,42 @@ void Controller::setPriorityRequest(Priority priority)
|
|||
* @param talkToMe
|
||||
* @param priority
|
||||
*/
|
||||
void Controller::txArtPoll(TalkToMe talkToMe, Priority priority) const
|
||||
void Controller::txArtPoll()
|
||||
{
|
||||
auto data = std::make_shared<poll_data>();
|
||||
data->talk_to_me = talkToMe;
|
||||
data->diagnostic_level = priority;
|
||||
{
|
||||
std::shared_lock lk_data(_mtx_control_data);
|
||||
data->talk_to_me = _talktome_request;
|
||||
data->diagnostic_level = _priority_request;
|
||||
}
|
||||
auto packet = std::make_shared<ArtPoll>(data);
|
||||
send(packet, broadcastIp());
|
||||
|
||||
// every poll tx gets considered in the minimum_poll_interval
|
||||
{
|
||||
std::unique_lock lk_ctl(_mtx_poll_control);
|
||||
last_poll = std::chrono::system_clock::now();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Controller::_periodic_polling()
|
||||
{
|
||||
std::chrono::system_clock::time_point last_send = std::chrono::system_clock::from_time_t(0);
|
||||
std::chrono::nanoseconds elapsed;
|
||||
std::unique_lock lk_thread(_mtx_poll_thread);
|
||||
TalkToMe talktome;
|
||||
Priority priority;
|
||||
|
||||
while (_periodic_polling_enabled) {
|
||||
// enforce strict minimum update times
|
||||
elapsed = std::chrono::system_clock::now() - last_send;
|
||||
// enforce strict minimum update interval
|
||||
{
|
||||
std::shared_lock lk_ctl(_mtx_poll_control);
|
||||
elapsed = std::chrono::system_clock::now() - last_poll;
|
||||
}
|
||||
if (elapsed < minimum_polling_interval)
|
||||
std::this_thread::sleep_for(minimum_polling_interval - elapsed);
|
||||
if(!_periodic_polling_enabled) // may have been disabled while enforcing minimum interval
|
||||
break;
|
||||
|
||||
{
|
||||
std::unique_lock lk_ctl(_mtx_poll_control);
|
||||
talktome = _talktome_request;
|
||||
priority = _priority_request;
|
||||
}
|
||||
txArtPoll(talktome, priority);
|
||||
last_send = std::chrono::system_clock::now();
|
||||
txArtPoll();
|
||||
|
||||
// sleep before the next cycle
|
||||
_poll_request.wait_for(lk_thread, minimum_polling_interval);
|
||||
|
|
|
@ -50,7 +50,7 @@ public:
|
|||
void setPriorityRequest(Priority);
|
||||
|
||||
protected:
|
||||
virtual void txArtPoll(TalkToMe = TalkToMe(), Priority = DpCritial) const;
|
||||
virtual void txArtPoll();
|
||||
|
||||
private:
|
||||
const std::chrono::milliseconds minimum_polling_interval;
|
||||
|
@ -61,6 +61,8 @@ private:
|
|||
std::thread _pollster;
|
||||
void _periodic_polling();
|
||||
|
||||
mutable std::shared_mutex _mtx_control_data;
|
||||
std::chrono::system_clock::time_point last_poll;
|
||||
TalkToMe _talktome_request; //!< TalkToMe to be uses in the ArtPoll
|
||||
Priority _priority_request; //!< Priority to be used in the ArtPoll
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue