From 6b492d666ed1faeeec5f761105f473956b426cc9 Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Tue, 26 Sep 2017 18:38:44 +0200 Subject: Introduce retention setting in place of class Be able to tweak retention value for each signal in seconds Change-Id: I1cabe48a2660cdeb2e9b32b277e7c819c6b49bd9 Signed-off-by: Romain Forlot --- signal-composer-binding/signal-composer.cpp | 16 +++++++------- signal-composer-binding/signal-composer.hpp | 7 ------ signal-composer-binding/signal.cpp | 34 ++++++++++++++++++++--------- signal-composer-binding/signal.hpp | 11 +++++----- signal-composer-binding/source.cpp | 4 ++-- signal-composer-binding/source.hpp | 2 +- 6 files changed, 41 insertions(+), 33 deletions(-) (limited to 'signal-composer-binding') diff --git a/signal-composer-binding/signal-composer.cpp b/signal-composer-binding/signal-composer.cpp index 89d442d..2247ba9 100644 --- a/signal-composer-binding/signal-composer.cpp +++ b/signal-composer-binding/signal-composer.cpp @@ -214,30 +214,30 @@ int Composer::loadOneSignal(json_object* signalJ) CtlActionT* onReceivedCtl; const char *id = nullptr, *event = nullptr, - *sClass = nullptr, *unit = nullptr; + int retention; double frequency=0.0; std::string api; std::vector dependsV; ssize_t sep; - int err = wrap_json_unpack(signalJ, "{ss,s?s,s?o,s?o,s?s,s?s,s?F,s?o !}", + int err = wrap_json_unpack(signalJ, "{ss,s?s,s?o,s?o,s?F,s?s,s?F,s?o !}", "id", &id, "event", &event, "depends", &dependsJ, "getSignalsArgs", &getSignalsArgs, - "class", &sClass, + "retention", &retention, "unit", &unit, "frequency", &frequency, "onReceived", &onReceivedJ); if (err) { - AFB_ERROR("Missing something id|[event|depends]|[getSignalsArgs]|[class]|[unit]|[frequency]|[onReceived] in %s", json_object_get_string(signalJ)); + AFB_ERROR("Missing something id|[event|depends]|[getSignalsArgs]|[retention]|[unit]|[frequency]|[onReceived] in %s", json_object_get_string(signalJ)); return err; } - // Set default sClass is not specified - sClass = !sClass ? "state" : sClass; + // Set default retention is not specified + retention = !retention ? 30 : retention; unit = !unit ? "" : unit; // Get an action handler @@ -246,7 +246,7 @@ int Composer::loadOneSignal(json_object* signalJ) // event or depends field manadatory if( (!event && !dependsJ) || (event && dependsJ) ) { - AFB_ERROR("Missing something id|[event|depends]|[getSignalsArgs]|[class]|[unit]|[frequency]|[onReceived] in %s. Or you declare event AND depends, only one of them is needed.", json_object_get_string(signalJ)); + AFB_ERROR("Missing something id|[event|depends]|[getSignalsArgs]|[retention]|[unit]|[frequency]|[onReceived] in %s. Or you declare event AND depends, only one of them is needed.", json_object_get_string(signalJ)); return -1; } @@ -299,7 +299,7 @@ int Composer::loadOneSignal(json_object* signalJ) SourceAPI* src = getSourceAPI(api) ? getSourceAPI(api):getSourceAPI("signal-composer"); if(src != nullptr) - {src->addSignal(id, event, dependsV, sClass, unit, frequency, onReceivedCtl, getSignalsArgs);} + {src->addSignal(id, event, dependsV, retention, unit, frequency, onReceivedCtl, getSignalsArgs);} else {err = -1;} diff --git a/signal-composer-binding/signal-composer.hpp b/signal-composer-binding/signal-composer.hpp index a5ee0f1..de7a799 100644 --- a/signal-composer-binding/signal-composer.hpp +++ b/signal-composer-binding/signal-composer.hpp @@ -60,10 +60,3 @@ public: int execSignalsSubscription(); }; - -struct pluginCBT -{ - void (*setsignalValue)(const char* aName, long long int timestamp, struct signalValue value); -}; - -extern "C" void setsignalValueHandle(const char* aName, long long int timestamp, struct signalValue value); diff --git a/signal-composer-binding/signal.cpp b/signal-composer-binding/signal.cpp index 51e16f9..2ec9908 100644 --- a/signal-composer-binding/signal.cpp +++ b/signal-composer-binding/signal.cpp @@ -20,7 +20,7 @@ #include "signal.hpp" #include "signal-composer.hpp" -#define MICRO 1000000 +#define MICRO 1000000000 Signal::Signal() :id_(""), @@ -28,6 +28,7 @@ Signal::Signal() dependsSigV_(), timestamp_(0.0), value_({0,0,0,0,0,""}), + retention_(0), frequency_(0), unit_(""), onReceived_(nullptr), @@ -35,12 +36,13 @@ Signal::Signal() subscribed_(false) {} -Signal::Signal(const std::string& id, const std::string& event, std::vector& depends, const std::string& unit, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs) +Signal::Signal(const std::string& id, const std::string& event, std::vector& depends, const std::string& unit, int retention, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs) :id_(id), event_(event), dependsSigV_(depends), timestamp_(0.0), value_({0,0,0,0,0,""}), + retention_(retention), frequency_(frequency), unit_(unit), onReceived_(onReceived), @@ -51,6 +53,7 @@ Signal::Signal(const std::string& id, const std::string& event, std::vector& depends, const std::string& unit, + int retention, double frequency, CtlActionT* onReceived) :id_(id), @@ -58,6 +61,7 @@ Signal::Signal(const std::string& id, dependsSigV_(depends), timestamp_(0.0), value_({0,0,0,0,0,""}), + retention_(retention), frequency_(frequency), unit_(unit), onReceived_(onReceived), @@ -134,11 +138,21 @@ json_object* Signal::toJSON() const /// /// @param[in] timestamp - timestamp of occured signal /// @param[in] value - value of change -void Signal::set(long long int timestamp, struct signalValue& value) +/// @param[in] unit - optionnal string to change the signal unit +void Signal::set(uint64_t timestamp, struct signalValue& value) { - timestamp_ = timestamp; + uint64_t diff = retention_+1; value_ = value; + timestamp_ = timestamp; history_[timestamp_] = value_; + + while(diff > retention_) + { + uint64_t first = history_.begin()->first; + diff = (timestamp_ - first)/MICRO; + if(diff > retention_) + {history_.erase(history_.cbegin());} + } } /// @brief Observer method called when a Observable Signal has changes. @@ -191,8 +205,8 @@ void Signal::attachToSourceSignals(Composer& composer) /// @return Average value double Signal::average(int seconds) const { - long long int begin = history_.begin()->first; - long long int end = !seconds ? + uint64_t begin = history_.begin()->first; + uint64_t end = !seconds ? begin+(seconds*MICRO) : history_.rbegin()->first; double total = 0.0; @@ -228,8 +242,8 @@ double Signal::average(int seconds) const /// @return Minimum value contained in the history double Signal::minimum(int seconds) const { - long long int begin = history_.begin()->first; - long long int end = !seconds ? + uint64_t begin = history_.begin()->first; + uint64_t end = !seconds ? begin+(seconds*MICRO) : history_.rbegin()->first; @@ -260,8 +274,8 @@ double Signal::minimum(int seconds) const /// @return Maximum value contained in the history double Signal::maximum(int seconds) const { - long long int begin = history_.begin()->first; - long long int end = !seconds ? + uint64_t begin = history_.begin()->first; + uint64_t end = !seconds ? begin+(seconds*MICRO) : history_.rbegin()->first; diff --git a/signal-composer-binding/signal.hpp b/signal-composer-binding/signal.hpp index aa974da..36479f6 100644 --- a/signal-composer-binding/signal.hpp +++ b/signal-composer-binding/signal.hpp @@ -52,9 +52,10 @@ private: std::string id_; std::string event_; std::vector dependsSigV_; - long long int timestamp_; + uint64_t timestamp_; struct signalValue value_; - std::map history_; ///< history_ - Hold signal value history in map with + std::map history_; ///< history_ - Hold signal value history in map with + int retention_; double frequency_; std::string unit_; CtlActionT* onReceived_; @@ -63,8 +64,8 @@ private: public: bool subscribed_; ///< subscribed_ - boolean value telling if yes or no the signal has been subcribed to the low level binding. Signal(); - Signal(const std::string& id, const std::string& event, std::vector& depends, const std::string& unit, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs); - Signal(const std::string& id, std::vector& depends, const std::string& unit, double frequency, CtlActionT* onReceived); + Signal(const std::string& id, const std::string& event, std::vector& depends, const std::string& unit, int retention, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs); + Signal(const std::string& id, std::vector& depends, const std::string& unit, int retention, double frequency, CtlActionT* onReceived); explicit operator bool() const; bool operator==(const Signal& other) const; @@ -73,7 +74,7 @@ public: const std::string id() const; json_object* toJSON() const; - void set(long long int timestamp, struct signalValue& value); + void set(uint64_t timestamp, struct signalValue& value); void update(Signal* sig); int onReceivedCB(json_object *queryJ); void attachToSourceSignals(Composer& composer); diff --git a/signal-composer-binding/source.cpp b/signal-composer-binding/source.cpp index 63709a1..5989dac 100644 --- a/signal-composer-binding/source.cpp +++ b/signal-composer-binding/source.cpp @@ -40,9 +40,9 @@ std::string SourceAPI::api() const return api_; } -void SourceAPI::addSignal(const std::string& id, const std::string& event, std::vector& depends, const std::string& sClass, const std::string& unit, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs) +void SourceAPI::addSignal(const std::string& id, const std::string& event, std::vector& depends, int retention, const std::string& unit, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs) { - std::shared_ptr sig = std::make_shared(id, event, depends, unit, frequency, onReceived, getSignalsArgs); + std::shared_ptr sig = std::make_shared(id, event, depends, unit, retention, frequency, onReceived, getSignalsArgs); signalsMap_[id] = sig; } diff --git a/signal-composer-binding/source.hpp b/signal-composer-binding/source.hpp index 57836e7..01bb08d 100644 --- a/signal-composer-binding/source.hpp +++ b/signal-composer-binding/source.hpp @@ -34,7 +34,7 @@ public: int init(); std::string api() const; - void addSignal(const std::string& id, const std::string& event, std::vector& sources, const std::string& sClass, const std::string& unit, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs); + void addSignal(const std::string& id, const std::string& event, std::vector& sources, int retention, const std::string& unit, double frequency, CtlActionT* onReceived, json_object* getSignalsArgs); std::vector> getSignals() const; std::vector> searchSignals(const std::string& name); -- cgit 1.2.3-korg