1
0
Fork 0

all ArtPolls count towards the minimum interval, not just from the periodic polling thread.

This commit is contained in:
Kevin Matz 2023-05-21 10:22:19 -04:00
parent 652e9e9017
commit a15b0d90f7
2 changed files with 26 additions and 18 deletions

View File

@ -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);

View File

@ -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
};