Example

Dependencies:   FXAS21002 FXOS8700Q

Revision:
0:11cc2b7889af
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simple-mbed-cloud-client/mbed-cloud-client/mbed-client/source/include/m2mreporthandler.h	Tue Nov 19 09:49:38 2019 +0000
@@ -0,0 +1,321 @@
+/*
+ * Copyright (c) 2015 ARM Limited. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef M2MREPORTHANDLER_H
+#define M2MREPORTHANDLER_H
+
+// Support for std args
+#include <stdint.h>
+#include "mbed-client/m2mconfig.h"
+#include "mbed-client/m2mbase.h"
+#include "mbed-client/m2mtimerobserver.h"
+#include "mbed-client/m2mresourceinstance.h"
+#include "mbed-client/m2mvector.h"
+#include "mbed-client/m2mtimer.h"
+
+//FORWARD DECLARATION
+class M2MReportObserver;
+class M2MTimer;
+class M2MResourceInstance;
+
+typedef union current_value_u {
+    float   float_value;
+    int64_t int_value;
+} current_value_t;
+
+typedef union last_value_u {
+    float   float_value;
+    int64_t int_value;
+} last_value_t;
+
+typedef union high_step_u {
+    float   float_value;
+    int64_t int_value;
+} high_step_t;
+
+typedef union low_step_u {
+    float   float_value;
+    int64_t int_value;
+} low_step_t;
+
+/**
+ *  @brief M2MReportHandler.
+ *  This class is handles all the observation related operations.
+ */
+class M2MReportHandler: public M2MTimerObserver
+{
+private:
+    // Prevents the use of assignment operator by accident.
+    M2MReportHandler& operator=( const M2MReportHandler& /*other*/ );
+
+public:
+
+    M2MReportHandler(M2MReportObserver &observer, M2MBase::DataType type);
+
+public:
+
+    /**
+     * Enum defining which write attributes are set.
+    */
+    enum {
+        Cancel = 1,
+        Pmin = 2,
+        Pmax = 4,
+        Lt = 8,
+        Gt = 16,
+        St = 32
+    };
+
+    /**
+     * Destructor
+     */
+    virtual ~M2MReportHandler();
+
+    /**
+     * @brief Sets that object is under observation.
+     * @param Value for the observation.
+     * @param handler, Handler object for sending
+     * observation callbacks.
+     */
+    void set_under_observation(bool observed);
+
+    /**
+     * @brief Sets the float value of the given resource.
+     * @param value, Value of the observed resource.
+     */
+    void set_value_float(float value);
+
+    /**
+     * @brief Sets the integer value of the given resource.
+     * @param value, Value of the observed resource.
+     */
+    void set_value_int(int64_t value);
+
+    /**
+     * @brief Sets notification trigger.
+     * @param obj_instance_id, Object instance id that has changed
+     */
+    void set_notification_trigger(uint16_t obj_instance_id = 0);
+
+    /**
+     * @brief Parses the received query for notification
+     * attribute.
+     * @param query Query to be parsed for attributes.
+     * @param type Type of the Base Object.
+     * @param resource_type Type of the Resource.
+     * @return true if required attributes are present else false.
+     */
+    bool parse_notification_attribute(const char *query,
+                                              M2MBase::BaseType type,
+                                              M2MResourceInstance::ResourceType resource_type = M2MResourceInstance::OPAQUE);
+
+    /**
+    * @brief Set back to default values.
+    */
+    void set_default_values();
+
+    /**
+     * @brief Return write attribute flags.
+     */
+    uint8_t attribute_flags() const;
+
+    /**
+     * \brief Sets the observation token value.
+     * \param token A pointer to the token of the resource.
+     * \param length The length of the token pointer.
+     */
+    void set_observation_token(const uint8_t *token, const uint8_t length);
+
+    /**
+     * \brief Provides a copy of the observation token of the object.
+     * \param value[OUT] A pointer to the value of the token.
+     * \param value_length[OUT] The length of the token pointer.
+     */
+    void get_observation_token(uint8_t *token, uint8_t &token_length) const;
+
+    /**
+     * \brief Returns the observation number.
+     * \return The observation number of the object.
+     */
+    uint16_t observation_number() const;
+
+    /**
+     * \brief Adds the observation level for the object.
+     * \param observation_level The level of observation.
+     */
+    void add_observation_level(M2MBase::Observation obs_level);
+
+    /**
+     * \brief Removes the observation level for the object.
+     * \param observation_level The level of observation.
+     */
+    void remove_observation_level(M2MBase::Observation obs_level);
+
+    /**
+     * \brief Returns the observation level of the object.
+     * \return The observation level of the object.
+     */
+    M2MBase::Observation observation_level() const;
+
+    /**
+     * @brief Returns whether this resource is under observation or not.
+     * @return True if the resource is under observation, else false,
+     */
+    bool is_under_observation() const;
+
+    /**
+     * @brief Schedule a report, if the pmin is exceeded
+     * report immediately, otherwise store the state to be
+     * reported once the time fires.
+     *
+     * @param in_queue If the message is queued message then it must be send even if
+     * current and last values are the same.
+     */
+    void schedule_report(bool in_queue = false);
+
+    /**
+     * @brief Set flag that new notification needs to be send.
+     *
+     * @param to_queue If True then notification is marked to be send
+     */
+    void set_notification_in_queue(bool to_queue);
+
+    /**
+     * @brief Returns whether notification needs to be send or not.
+     *
+     * @return Is notification sending needed or not.
+     */
+    bool notification_in_queue() const;
+
+    /**
+     * @brief Set flag that new notification needs to be send.
+     *
+     * @param to_queue If True then notification is marked to be send
+     */
+    void set_notification_send_in_progress(bool progress);
+
+    /**
+     * @brief Returns whether notification send is in progress or not.
+     *
+     * @return Is notification sending ongoing or not.
+     */
+    bool notification_send_in_progress() const;
+
+    /**
+     * @brief Sets whether notification will be sent using blockwise or not.
+     *
+     * @param blockwise_notify If True then notification is sent using blockwise.
+     */
+    void set_blockwise_notify(bool blockwise_notify);
+
+    /**
+     * @brief Returns whether notification is sent using blockwise or not.
+     *
+     * @return Is notification sent using blockwise.
+     */
+    bool blockwise_notify() const;
+
+protected : // from M2MTimerObserver
+
+    virtual void timer_expired(M2MTimerObserver::Type type =
+                               M2MTimerObserver::Notdefined);
+
+private:
+
+    bool set_notification_attribute(const char* option,
+            M2MBase::BaseType type,
+            M2MResourceInstance::ResourceType resource_type);
+
+    /**
+    * @brief Reports a sample that satisfies the reporting criteria.
+    *
+    * @param in_queue If the message is queued message then it must be send even
+    * current and last values are the same.
+    */
+    void report(bool in_queue = false);
+
+    /**
+    * @brief Manage timers for pmin and pmax.
+    */
+    void handle_timers();
+
+    /**
+    * @brief Check whether notification params can be accepted.
+    */
+    bool check_attribute_validity() const;
+
+    /**
+    * @brief Stop pmin & pmax timers.
+    */
+    void stop_timers();
+
+    /**
+     * @brief Check if current value match threshold values.
+     * @return True if notify can be send otherwise false.
+     */
+    bool check_threshold_values() const;
+
+    /**
+     * @brief Check whether current value matches with GT & LT.
+     * @return True if current value match with GT or LT values.
+     */
+    bool check_gt_lt_params() const;
+
+    /**
+     * \brief Allocate size amount of memory, copy size bytes into it
+     * \param source The source data to copy, may not be NULL.
+     * \param size The size of memory to be reserved.
+    */
+    static uint8_t* alloc_copy(const uint8_t* source, uint32_t size);
+
+    /**
+     * \brief New value is ready to be sent.
+    */
+    void send_value();
+
+private:
+    M2MReportObserver           &_observer;
+    bool                        _is_under_observation : 1;
+    M2MBase::Observation        _observation_level : 3;
+    uint8_t                     _attribute_state;
+    unsigned                    _token_length : 8;
+    M2MBase::DataType           _resource_type : 3;
+    bool                        _notify : 1;
+    bool                        _pmin_exceeded : 1;
+    bool                        _pmax_exceeded : 1;
+    unsigned                    _observation_number : 24;
+    M2MTimer                    _pmin_timer;
+    M2MTimer                    _pmax_timer;
+    uint8_t                     *_token;
+    int32_t                     _pmax;
+    int32_t                     _pmin;
+    current_value_t             _current_value;
+    high_step_t                 _high_step;
+    low_step_t                  _low_step;
+    last_value_t                _last_value;
+    float                       _gt;
+    float                       _lt;
+    float                       _st;
+    m2m::Vector<uint16_t>       _changed_instance_ids;
+    bool                        _notification_send_in_progress : 1;
+    bool                        _notification_in_queue : 1;
+    bool                        _blockwise_notify : 1;
+    bool                        _pmin_quiet_period : 1;
+
+friend class Test_M2MReportHandler;
+
+};
+
+#endif // M2MREPORTHANDLER_H