2 Copyright (C) 2012 Intel Corporation
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 #ifndef ABSTRACTROUTINGENGINE_H
21 #define ABSTRACTROUTINGENGINE_H
23 #include <sys/types.h>
25 #include <boost/any.hpp>
30 #include "vehicleproperty.h"
31 #include "abstractpropertytype.h"
32 #include "propertyinfo.hpp"
36 class AsyncPropertyReply;
37 class AsyncRangePropertyReply;
38 class AsyncSetPropertyRequest;
41 typedef std::function<void (AsyncPropertyReply*)> GetPropertyCompletedSignal;
42 typedef std::function<void (AsyncRangePropertyReply*)> GetRangedPropertyCompletedSignal;
45 * \brief The AsyncPropertyRequest class is used by sinks to request property values.
46 * \see AbstractRoutingEngine::getPropertyAsync
47 * \see AsyncPropertyReply
49 class AsyncPropertyRequest
52 AsyncPropertyRequest()
53 :property(VehicleProperty::NoValue),zoneFilter(Zone::None), timeout(10000)
58 AsyncPropertyRequest(const AsyncPropertyRequest &request)
60 this->property = request.property;
61 this->completed = request.completed;
62 this->sourceUuidFilter = request.sourceUuidFilter;
63 this->zoneFilter = request.zoneFilter;
64 this->timeout = request.timeout;
67 AsyncPropertyRequest & operator = (const AsyncPropertyRequest & other)
69 this->property = other.property;
70 this->completed = other.completed;
71 this->sourceUuidFilter = other.sourceUuidFilter;
72 this->zoneFilter = other.zoneFilter;
73 this->timeout = other.timeout;
78 virtual ~AsyncPropertyRequest() { }
81 * \brief property property to request.
83 VehicleProperty::Property property;
86 * \brief sourceUuidFilter the requesting sink should use this to filter on a specific source or leave blank to use any source
88 std::string sourceUuidFilter;
91 * \brief zoneFilter the requesting sink should use this if he wants to filter on a specific zone
93 Zone::Type zoneFilter;
96 * \brief completed the callback when the request has been completed.
98 GetPropertyCompletedSignal completed;
101 * \brief use to specify a timeout in ms for the request. When a timeout occurs, the 'completed' callback
102 * will be called with an error. @see AsyncPropertyReply
103 * default value is: 10000 ms
109 * \brief The AsyncPropertyReply class is used by sources to reply to Get and Set operations. The source should
110 * set success to true if the call is successful or 'false' if the request was not successful and set 'error'
111 * to the appropriate error.
112 * \see AbstractRoutingEngine::getPropertyAsync
113 * \see AsyncPropertyReply
114 * \see AbstractSource::Operations
115 * \see AbstractSource::getPropertyAsync
117 class AsyncPropertyReply: public AsyncPropertyRequest
120 AsyncPropertyReply();
122 AsyncPropertyReply(const AsyncPropertyRequest &request);
124 AsyncPropertyReply(const AsyncSetPropertyRequest &request);
126 virtual ~AsyncPropertyReply()
130 g_source_destroy(timeoutSource);
131 g_source_unref(timeoutSource);
136 * \brief The Error enum
147 * \brief value of the reply. This may be null if success = false. This is owned by the source.
149 AbstractPropertyType* value;
152 * \brief success indicates if the request was successfull or not. True means success. False means fail and the 'error'
153 * member should be set.
158 * \brief error contains the error if the request was not successful.\
165 GSource* timeoutSource;
169 * \brief The AsyncSetPropertyRequest class is used by sinks to set a property to the 'value'. The source will reply
170 * with a AsyncPropertyReply containing the new value or an error.
171 * \see AbstractRoutingEngine::setProperty
172 * \see AsyncPropertyReply
174 class AsyncSetPropertyRequest: public AsyncPropertyRequest
177 AsyncSetPropertyRequest()
183 AsyncSetPropertyRequest(const AsyncPropertyRequest &request)
184 :AsyncPropertyRequest(request), value(NULL)
189 virtual ~AsyncSetPropertyRequest()
195 * \brief value the new value to set the property to.
197 AbstractPropertyType* value;
201 * \brief The AsyncRangePropertyRequest class is used by sinks to request values within a time or sequence range
202 * \see AbstractRoutingEngine::getRangePropertyAsync
204 class AsyncRangePropertyRequest
207 AsyncRangePropertyRequest()
208 :zone(Zone::None), timeBegin(0), timeEnd(0), sequenceBegin(-1), sequenceEnd(-1)
213 AsyncRangePropertyRequest(const AsyncRangePropertyRequest &request)
215 this->properties = request.properties;
216 this->completed = request.completed;
217 this->timeBegin = request.timeBegin;
218 this->timeEnd = request.timeEnd;
219 this->sequenceBegin = request.sequenceBegin;
220 this->sequenceEnd = request.sequenceEnd;
221 this->sourceUuid = request.sourceUuid;
222 this->zone = request.zone;
225 virtual ~AsyncRangePropertyRequest() {}
228 * \brief properties list of properties to request
230 PropertyList properties;
233 * \brief sourceUuid if the sink wishes to request a specific source, this should be set to the uuid of the source.
235 std::string sourceUuid;
238 * \brief zone if the sink wishes to request a specific zone, this should be set to the desired zone .
243 * \brief completed callback that is called when the ranged request is complete. The reply from this request is passed
244 * into the completed call. The completed callback must free the reply before it returns or there will be a leak.
246 GetRangedPropertyCompletedSignal completed;
249 * \brief timeBegin set this to request values for the specified property beggining at this time. Time is seconds\
250 * since the unix epoc. Set this to '0' if you do not want values within a time range.
255 * \brief timeEnd set this to request values for the specified property beggining at this time. Time is seconds\
256 * since the unix epoc. Set this to '0' if you do not want values within a time range.
261 * \brief sequenceBegin set this to request values with a sequence >= to the sequenceBegin value. Set to -1 if
262 * you don't want values within a sequence ranges.
264 int32_t sequenceBegin;
267 * \brief sequenceEnd set this to request values with a sequence <= to the sequenceEnd value. Set to -1 if
268 * you don't want values within a sequence ranges.
274 * \brief The AsyncRangePropertyReply class is used by a source to reply to an AsyncRangePropertyRequest.
275 * the source should set success to 'true' and populate the 'values' member if the request was successful.
276 * If the request is not successful, 'success' should be set to 'false' and the 'error' member should be set.
278 class AsyncRangePropertyReply: public AsyncRangePropertyRequest
281 AsyncRangePropertyReply(AsyncRangePropertyRequest request)
282 :AsyncRangePropertyRequest(request), success(false)
287 ~AsyncRangePropertyReply()
289 for(auto itr = values.begin(); itr != values.end(); itr++)
298 * \brief error this is set if there was an error in the request. "success" will also be set to false.
300 AsyncPropertyReply::Error error;
303 * \brief values if the request was successful, this will contain a list of values meeting the criteria of the request.
305 std::list<AbstractPropertyType*> values;
308 * \brief success this will be true if the request was successful. If not, this is false and error is set.
313 class AbstractRoutingEngine
316 virtual ~AbstractRoutingEngine();
318 virtual void registerSource(AbstractSource* src) = 0;
319 virtual void updateSupported(PropertyList added, PropertyList removed, AbstractSource* source) = 0;
323 void updateProperty(VehicleProperty::Property property, AbstractPropertyType* value, std::string uuid)
325 DebugOut(DebugOut::Warning)<<"updateProperty(VehicleProperty::Property,AbstractPropertyType*,std::string) is deprecated. use new updateProperty(AbstractPropertyType*, const std::string &)"<<endl;
326 updateProperty(value,uuid);
329 virtual void updateProperty(AbstractPropertyType* value, const std::string &uuid) = 0;
330 virtual PropertyList supported() = 0;
333 virtual void registerSink(AbstractSink* self) = 0;
334 virtual void unregisterSink(AbstractSink* self) = 0;
337 * /brief sourcesForProperty
339 * /return list of source uuid's that support the "property"
341 virtual std::list<std::string> sourcesForProperty(VehicleProperty::Property property) = 0;
344 * /brief getPropertyAsync requests a property value from a source. This call has a timeout and the callback specified in the request will always be called.
345 * /see AsyncPropertyRequest
346 * /see AsyncPropertyReply.
347 * /param request requested property.
348 * /return AsyncPropertyReply. The returned AsyncPropertyReply is owned by the caller of getPropertyAsync.
349 * /example AsyncPropertyRequest request;
350 * request.property = VehicleProperty::VehicleSpeed
351 * request.completed = [](AsyncPropertyReply* reply)
353 * //you own the reply
356 * routingEngine->getPropertyAsync(request);
358 virtual AsyncPropertyReply * getPropertyAsync(AsyncPropertyRequest request) = 0;
361 * \brief getRangePropertyAsync is used for getting a range of properties that are within the specified time or sequence parameters.
362 * \param request the request containing the property and other information required by the query
363 * \return a pointer to the reply.
364 * \example AsyncRangePropertyRequest vehicleSpeedFromLastWeek;
366 * vehicleSpeedFromLastWeek.timeBegin = amb::currentTime() - 10;
367 * vehicleSpeedFromLastWeek.timeEnd = amb::currentTime();
369 * PropertyList requestList;
370 * requestList.push_back(VehicleProperty::VehicleSpeed);
371 * requestList.push_back(VehicleProperty::EngineSpeed);
373 * vehicleSpeedFromLastWeek.properties = requestList;
374 * vehicleSpeedFromLastWeek.completed = [](AsyncRangePropertyReply* reply)
376 * std::list<AbstractPropertyType*> values = reply->values;
377 * for(auto itr = values.begin(); itr != values.end(); itr++)
380 * DebugOut(1)<<"Value from past: ("<<val->name<<"): "<<val->toString()<<" time: "<<val->timestamp<<endl;
386 * routingEngine->getRangePropertyAsync(vehicleSpeedFromLastWeek);
389 virtual AsyncRangePropertyReply * getRangePropertyAsync(AsyncRangePropertyRequest request) = 0;
392 * \brief setProperty sets a property to a value.
393 * \see AsyncSetPropertyRequest
394 * \see AsyncPropertyReply
395 * \param request the request containing the property and the value to set
396 * \return a pointer to the reply which is owned by the caller of this method
399 virtual AsyncPropertyReply * setProperty(AsyncSetPropertyRequest request) = 0;
402 * \brief subscribeToProperty subscribe to changes made to a property value.
403 * \param propertyName name of the property to request a subscription for.
404 * \param self pointer to the sink who is subscribing.
406 * //somewhere in the sink:
407 * routingEngine->subscribeToProperty(VehicleProperty::EngineSpeed, this);
409 * //... elsewhere in the sink, this will be called when a property changes:
410 * void MySink::propertyChanged(const AbstractPropertyType* property)
412 * if(property->name == VehicleProperty::EngineSpeed)
418 virtual bool subscribeToProperty(VehicleProperty::Property propertyName, AbstractSink* self) = 0;
421 * \brief subscribeToProperty subscribe to changes made to a property value.
422 * \param propertyName name of the property to request a subscription for.
423 * \param sourceUuidFilter source UUID to filter. Only property updates from this source will be sent to the sink.
424 * \param self pointer to the sink who is subscribing.
426 virtual bool subscribeToProperty(VehicleProperty::Property propertyName, std::string sourceUuidFilter, AbstractSink *self) = 0;
429 * \brief subscribeToProperty subscribe to changes made to a property value.
430 * \param propertyName name of the property to request a subscription for.
431 * \param sourceUuidFilter source UUID to filter. Only property updates from this source will be sent to the sink.
432 * \param zoneFilter zone to filter. Only updates from this zone will be passed to the sink.
433 * \param self pointer to the sink who is subscribing.
435 virtual bool subscribeToProperty(VehicleProperty::Property propertyName, std::string sourceUuidFilter, Zone::Type zoneFilter, AbstractSink *self) = 0;
437 virtual bool unsubscribeToProperty(VehicleProperty::Property, AbstractSink* self) = 0;
439 virtual PropertyInfo getPropertyInfo(VehicleProperty::Property, std::string sourceUuid) = 0;
442 #endif // ABSTRACTROUTINGENGINE_H