37 std::shared_ptr<armem::gui::model::MemoryViewerModel>
model)
39 _model = std::move(
model);
48 _periodicTimer =
new QTimer(
this);
49 _periodicTimer->setInterval(1000 / 60);
50 connect(_periodicTimer,
53 &This::onPeriodicTimerTimeout);
55 _autoUpdateTimer =
new QTimer(
this);
56 connect(_autoUpdateTimer,
65 _periodicTimer->deleteLater();
66 _periodicTimer =
nullptr;
68 _autoUpdateTimer->deleteLater();
69 _autoUpdateTimer =
nullptr;
74 _periodicTimer->start();
79 _periodicTimer->stop();
82 void PeriodicUpdateWorker::onPeriodicTimerTimeout()
84 updateMemoryReadersWriters();
85 processQueryResults();
90 _autoUpdateTimer->start();
95 _autoUpdateTimer->stop();
100 _autoUpdateTimer->setInterval(freq);
107 _updateLabelAndTree =
true;
110 void PeriodicUpdateWorker::startDueQueries()
113 int recursionDepth = _model->recursionDepth();
117 auto enabledMemories = _model->getEnabledMemories();
118 for (
const auto& pair : _model->memoryReadersCopy())
121 if (std::find(enabledMemories.begin(), enabledMemories.end(), pair.first) ==
122 enabledMemories.end())
127 const auto& name = pair.first;
128 const auto& reader = pair.second;
131 if (_runningQueries.count(name) != 0)
138 _runningQueries[name] = std::async(
140 [reader, input, recursionDepth,
this]()
144 ? reader.query(input.toIce())
145 : reader.query(input.toIce(), _model->mns(), recursionDepth);
151 PeriodicUpdateWorker::processQueryResults()
153 const std::map<std::string, client::QueryResult> results = collectQueryResults();
156 if (results.size() > 0)
159 applyQueryResults(results, &errorCount);
160 _updateLabelAndTree =
true;
162 if (_updateLabelAndTree)
164 _updateLabelAndTree =
false;
169 std::map<std::string, client::QueryResult>
170 PeriodicUpdateWorker::collectQueryResults()
175 std::map<std::string, client::QueryResult> results;
176 for (
auto it = _runningQueries.begin(); it != _runningQueries.end();)
178 const std::string& name = it->first;
179 std::future<armem::query::data::Result>* queryPromise = &it->second;
181 if (queryPromise->wait_for(std::chrono::seconds(0)) == std::future_status::ready)
183 auto readers = _model->memoryReadersCopy();
184 if (
auto jt = readers.find(name); jt != readers.end())
190 catch (
const Ice::ConnectionRefusedException&)
198 it = _runningQueries.erase(it);
207 if (_model->debugObserver())
209 _model->debugObserver()->begin_setDebugChannel(
212 {
"t Collect Query Results [ms]",
213 new Variant(tCollectQueryResults.toMilliSecondsDouble())},
214 {
"# Collected Query Results",
new Variant(
static_cast<int>(results.size()))},
222 PeriodicUpdateWorker::applyQueryResults(
const std::map<std::string, client::QueryResult>& results,
226 auto memoryData = _model->memoryDataCopy();
227 for (
const auto& [name, result] : results)
231 memoryData[name] = std::move(result.memory);
235 ARMARX_WARNING <<
"Querying memory server '" << name <<
"' produced an error: \n"
236 << result.errorMessage;
245 auto enabledMemories = _model->getEnabledMemories();
246 for (
auto it = memoryData.begin(); it != memoryData.end();)
249 if (_model->memoryReadersCopy().count(it->first) == 0)
251 if (_model->dropRemovedMemories())
253 it = memoryData.erase(it);
263 if (std::find(enabledMemories.begin(), enabledMemories.end(), it->first) ==
264 enabledMemories.end())
266 if (_model->dropDisabledMemories())
268 it = memoryData.erase(it);
280 _model->setMemoryData(memoryData);
283 if (_model->debugObserver())
285 _model->debugObserver()->begin_setDebugChannel(
288 {
"t Process Query Results [ms]",
289 new Variant(tProcessQueryResults.toMilliSecondsDouble())},
290 {
"# Processed Query Results",
new Variant(
static_cast<int>(results.size()))},
296 PeriodicUpdateWorker::updateMemoryReadersWriters()
298 if (_model->connected() and _model->mns())
303 auto readers = _model->mns().getAllReaders(
true);
304 auto writers = _model->mns().getAllWriters(
true);
305 _model->setMemoryReaders(readers);
306 _model->setMemoryWriters(writers);
308 std::vector<std::string> activeMemoryNames;
311 std::transform(readers.begin(),
313 std::back_inserter(activeMemoryNames),
314 [](
const auto& p) { return p.first; });
318 if (activeMemoryNames != _activeMemoryNames)
320 _activeMemoryNames = activeMemoryNames;
324 for (
auto &s : activeMemoryNames) {
325 qnames << QString::fromStdString(s);
340 <<
"MNS not ready yet. Skip update of available memories in query widget.";
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
void startPeriodicTimer()
PeriodicUpdateWorker(std::shared_ptr< armem::gui::model::MemoryViewerModel > model)
void updateLabelAndTree(int errorCount)
void setAutoUpdateTimerInterval(int freq)
void updateQueryWidget(QStringList activeMemoryNames)
void stopAutoUpdateTimer()
void startAutoUpdateTimer()
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.
#define TIMING_START(name)
Helper macro to do timing tests.
#define TIMING_END_STREAM(name, os)
Prints duration.
@ NoData
Just get the structure, but no ARON data.
static QueryResult fromIce(const armem::query::data::Result &ice)