From 85078a0c436dd88773074335572e6a5d918f0dd3 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Tue, 25 Feb 2020 08:18:17 +0100 Subject: [PATCH] Adding a function to register a callback function for retrieving a global timestamp. This is necessary because right now we are relying on the RTC within the SAMD MCU which is instantiated (RTCZero) within the ArduinoIoTCloud library and reference within ArduinoCloudThing via extern devlaration. Due to the extern binding this is a very brittle dependency which can be easily destroyed, it is therefore better to explicitly register a function which provides the time (this can be serviced by the TimeService class available in ArduinoIoTCloud --- src/ArduinoCloudProperty.cpp | 10 ++++++++-- src/ArduinoCloudProperty.h | 4 +++- src/ArduinoCloudThing.cpp | 7 ++++++- src/ArduinoCloudThing.h | 2 ++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/ArduinoCloudProperty.cpp b/src/ArduinoCloudProperty.cpp index 91be622..e740639 100644 --- a/src/ArduinoCloudProperty.cpp +++ b/src/ArduinoCloudProperty.cpp @@ -39,6 +39,7 @@ ArduinoCloudProperty::ArduinoCloudProperty() _min_delta_property(0.0f), _min_time_between_updates_millis(0), _permission(Permission::Read), + _get_time_func{nullptr}, _update_callback_func(nullptr), _sync_callback_func(nullptr), _has_been_updated_once(false), @@ -56,9 +57,10 @@ ArduinoCloudProperty::ArduinoCloudProperty() /****************************************************************************** PUBLIC MEMBER FUNCTIONS ******************************************************************************/ -void ArduinoCloudProperty::init(String const name, Permission const permission) { +void ArduinoCloudProperty::init(String const name, Permission const permission, GetTimeCallbackFunc func) { _name = name; _permission = permission; + _get_time_func = func; } ArduinoCloudProperty & ArduinoCloudProperty::onUpdate(UpdateCallbackFunc func) { @@ -259,7 +261,11 @@ String ArduinoCloudProperty::getAttributeName(String propertyName, char separato void ArduinoCloudProperty::updateLocalTimestamp() { if (isReadableByCloud()) { - _last_local_change_timestamp = getTimestamp(); + if (_get_time_func) { + _last_local_change_timestamp = _get_time_func(); + } else { + _last_local_change_timestamp = getTimestamp(); + } } } diff --git a/src/ArduinoCloudProperty.h b/src/ArduinoCloudProperty.h index d2c1991..7144fbf 100644 --- a/src/ArduinoCloudProperty.h +++ b/src/ArduinoCloudProperty.h @@ -122,6 +122,7 @@ enum class UpdatePolicy { }; typedef void(*UpdateCallbackFunc)(void); +typedef unsigned long(*GetTimeCallbackFunc)(); /****************************************************************************** CLASS DECLARATION @@ -131,7 +132,7 @@ class ArduinoCloudProperty { typedef void(*SyncCallbackFunc)(ArduinoCloudProperty &property); public: ArduinoCloudProperty(); - void init(String const name, Permission const permission); + void init(String const name, Permission const permission, GetTimeCallbackFunc func); /* Composable configuration of the ArduinoCloudProperty class */ ArduinoCloudProperty & onUpdate(UpdateCallbackFunc func); @@ -192,6 +193,7 @@ class ArduinoCloudProperty { private: Permission _permission; + GetTimeCallbackFunc _get_time_func; UpdateCallbackFunc _update_callback_func; void (*_sync_callback_func)(ArduinoCloudProperty &property); diff --git a/src/ArduinoCloudThing.cpp b/src/ArduinoCloudThing.cpp index 32dd596..ec3830c 100644 --- a/src/ArduinoCloudThing.cpp +++ b/src/ArduinoCloudThing.cpp @@ -44,6 +44,7 @@ void PrintFreeRam(void) { ******************************************************************************/ ArduinoCloudThing::ArduinoCloudThing() : + _get_time_func{nullptr}, _numPrimitivesProperties(0), _numProperties(0), _isSyncMessage(false), @@ -59,6 +60,10 @@ ArduinoCloudThing::ArduinoCloudThing() : void ArduinoCloudThing::begin() { } +void ArduinoCloudThing::registerGetTimeCallbackFunc(GetTimeCallbackFunc func) { + _get_time_func = func; +} + int ArduinoCloudThing::encode(uint8_t * data, size_t const size, bool lightPayload) { // check if backing storage and cloud has diverged @@ -87,7 +92,7 @@ int ArduinoCloudThing::encode(uint8_t * data, size_t const size, bool lightPaylo } ArduinoCloudProperty& ArduinoCloudThing::addPropertyReal(ArduinoCloudProperty & property, String const & name, Permission const permission, int propertyIdentifier) { - property.init(name, permission); + property.init(name, permission, _get_time_func); if (isPropertyInContainer(name)) { return (*getProperty(name)); } else { diff --git a/src/ArduinoCloudThing.h b/src/ArduinoCloudThing.h index c44eea6..3bd6b31 100644 --- a/src/ArduinoCloudThing.h +++ b/src/ArduinoCloudThing.h @@ -77,6 +77,7 @@ class ArduinoCloudThing { ArduinoCloudThing(); void begin(); + void registerGetTimeCallbackFunc(GetTimeCallbackFunc func); //if propertyIdentifier is different from -1, an integer identifier is associated to the added property to be use instead of the property name when the parameter lightPayload is true in the encode method ArduinoCloudProperty & addPropertyReal(ArduinoCloudProperty & property, String const & name, Permission const permission, int propertyIdentifier = -1); @@ -93,6 +94,7 @@ class ArduinoCloudThing { String getPropertyNameByIdentifier(int propertyIdentifier); private: + GetTimeCallbackFunc _get_time_func; LinkedList _property_list; /* Keep track of the number of primitive properties in the Thing. If 0 it allows the early exit in updateTimestampOnLocallyChangedProperties() */ int _numPrimitivesProperties;