Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Adding a function to register a callback function for retrieving a global timestamp #55

Merged
merged 1 commit into from
Feb 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/ArduinoCloudProperty.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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) {
Expand Down Expand Up @@ -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();
}
}
}

Expand Down
4 changes: 3 additions & 1 deletion src/ArduinoCloudProperty.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ enum class UpdatePolicy {
};

typedef void(*UpdateCallbackFunc)(void);
typedef unsigned long(*GetTimeCallbackFunc)();

/******************************************************************************
CLASS DECLARATION
Expand All @@ -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);
Expand Down Expand Up @@ -192,6 +193,7 @@ class ArduinoCloudProperty {

private:
Permission _permission;
GetTimeCallbackFunc _get_time_func;
UpdateCallbackFunc _update_callback_func;
void (*_sync_callback_func)(ArduinoCloudProperty &property);

Expand Down
7 changes: 6 additions & 1 deletion src/ArduinoCloudThing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ void PrintFreeRam(void) {
******************************************************************************/

ArduinoCloudThing::ArduinoCloudThing() :
_get_time_func{nullptr},
_numPrimitivesProperties(0),
_numProperties(0),
_isSyncMessage(false),
Expand All @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 2 additions & 0 deletions src/ArduinoCloudThing.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -93,6 +94,7 @@ class ArduinoCloudThing {
String getPropertyNameByIdentifier(int propertyIdentifier);

private:
GetTimeCallbackFunc _get_time_func;
LinkedList<ArduinoCloudProperty *> _property_list;
/* Keep track of the number of primitive properties in the Thing. If 0 it allows the early exit in updateTimestampOnLocallyChangedProperties() */
int _numPrimitivesProperties;
Expand Down