RequestedObjects.cpp
Go to the documentation of this file.
1#include "RequestedObjects.h"
2
6
8
9namespace armarx::objpose
10{
14
15 void
16 RequestedObjects::requestObjects(const std::vector<armarx::data::ObjectID>& objectIDs,
17 long relativeTimeOutMS)
18 {
19 requestObjects(::armarx::fromIce(objectIDs), relativeTimeOutMS);
20 }
21
22 void
23 RequestedObjects::requestObjects(const std::vector<armarx::ObjectID>& objectIDs,
24 long relativeTimeOutMS)
25 {
26 requestObjects(objectIDs, IceUtil::Time::milliSeconds(relativeTimeOutMS));
27 }
28
29 void
30 RequestedObjects::requestObjects(const std::vector<armarx::ObjectID>& objectIDs,
31 IceUtil::Time relativeTimeout)
32 {
33 ARMARX_INFO << VAROUT(relativeTimeout.toMilliSeconds());
34
35 if (relativeTimeout.toMilliSeconds() < 0)
36 {
37 ARMARX_INFO << "Infite localization request for object ids :" << objectIDs;
38 for (const auto& id : objectIDs)
39 {
40 infiniteRequests.push_back(id);
41 }
42 }
43 else
44 {
45 ARMARX_INFO << "Localization request for " << relativeTimeout
46 << " for object ids :" << objectIDs;
47
48 IceUtil::Time absoluteTimeout = TimeUtil::GetTime() + relativeTimeout;
49 Request req;
50 req.objectIDs = objectIDs;
51 currentRequests[absoluteTimeout].push_back(req);
52 }
53 }
54
60
63 {
64 // Remove requests with timeout.
65
66 if (not currentRequests.empty())
67 {
68 ARMARX_INFO << currentRequests.begin()->first - now;
69 }
70
71 while (not currentRequests.empty() and currentRequests.begin()->first <= now)
72 {
73 ARMARX_INFO << "No longer localizing objects: ";
74 for (const Request& request : currentRequests.begin()->second)
75 {
76 ARMARX_INFO << request.objectIDs;
77 }
78 currentRequests.erase(currentRequests.begin());
79 }
80
81 std::set<armarx::ObjectID> current;
82 current.insert(infiniteRequests.begin(), infiniteRequests.end());
83
84 // Process current requests.
85 for (const auto& [timeout, requests] : currentRequests)
86 {
87 ARMARX_CHECK_LESS(now, timeout);
88 for (const auto& request : requests)
89 {
90 current.insert(request.objectIDs.begin(), request.objectIDs.end());
91 }
92 }
93
94 Update update;
95 update.current = {current.begin(), current.end()};
96
97 // added = current - last
98 std::set_difference(update.current.begin(),
99 update.current.end(),
100 lastCurrent.begin(),
101 lastCurrent.end(),
102 std::inserter(update.added, update.added.begin()));
103 // removed = last - current
104 std::set_difference(lastCurrent.begin(),
105 lastCurrent.end(),
106 update.current.begin(),
107 update.current.end(),
108 std::inserter(update.removed, update.removed.begin()));
109
110 this->lastCurrent = update.current;
111 return update;
112 }
113
114} // namespace armarx::objpose
#define VAROUT(x)
static IceUtil::Time GetTime(TimeMode timeMode=TimeMode::VirtualTime)
Get the current time.
Definition TimeUtil.cpp:42
std::vector< armarx::ObjectID > infiniteRequests
std::map< IceUtil::Time, std::vector< Request > > currentRequests
Map from (absolute timeout) to (request)
void requestObjects(const std::vector< armarx::data::ObjectID > &objectIDs, long relativeTimeOutMS)
#define ARMARX_CHECK_LESS(lhs, rhs)
This macro evaluates whether lhs is less (<) than rhs and if it turns out to be false it will throw a...
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
void fromIce(const std::map< IceKeyT, IceValueT > &iceMap, boost::container::flat_map< CppKeyT, CppValueT > &cppMap)
std::vector< armarx::ObjectID > objectIDs