From 6b7630020406f58bd9dd21818626adca2717e3c7 Mon Sep 17 00:00:00 2001 From: Allysson Lukas Date: Mon, 5 Nov 2018 16:48:01 -0300 Subject: [PATCH] Update registerDefaultConfig() This patch changes the registerDefaultConfig() function to receive events as optional parameters and adds a new function to get value type from sensor id. --- examples/BeamSensor/BeamSensor.ino | 4 +- examples/HelloWorld/HelloWorld.ino | 4 +- examples/Light/Light.ino | 2 +- examples/WaterDispenser/WaterDispenser.ino | 2 +- src/KNoTThing.cpp | 70 ++++++++++++++++++---- src/KNoTThing.h | 4 +- src/knot_thing_main.c | 10 ++++ src/knot_thing_main.h | 3 + 8 files changed, 79 insertions(+), 20 deletions(-) diff --git a/examples/BeamSensor/BeamSensor.ino b/examples/BeamSensor/BeamSensor.ino index 0434540..32ac655 100644 --- a/examples/BeamSensor/BeamSensor.ino +++ b/examples/BeamSensor/BeamSensor.ino @@ -57,9 +57,9 @@ void setup() beam_read_2, NULL); /*Every time the Beam sensor changes its value, it send data*/ - thing.registerDefaultConfig(BEAM_SENSOR_1_ID, KNOT_EVT_FLAG_CHANGE, 0, 0, 0, 0, 0); + thing.registerDefaultConfig(BEAM_SENSOR_1_ID, KNOT_EVT_FLAG_CHANGE, NULL); - thing.registerDefaultConfig(BEAM_SENSOR_2_ID, KNOT_EVT_FLAG_CHANGE, 0, 0, 0, 0, 0); + thing.registerDefaultConfig(BEAM_SENSOR_2_ID, KNOT_EVT_FLAG_CHANGE, NULL); Serial.println(F("Beam Sensor KNoT Demo")); } diff --git a/examples/HelloWorld/HelloWorld.ino b/examples/HelloWorld/HelloWorld.ino index 7be5f88..6da2e45 100644 --- a/examples/HelloWorld/HelloWorld.ino +++ b/examples/HelloWorld/HelloWorld.ino @@ -116,8 +116,8 @@ void setup(void) /* Send data every 30 seconds */ thing.registerDefaultConfig(LED_ID, - KNOT_EVT_FLAG_TIME | KNOT_EVT_FLAG_CHANGE, - 30,0, 0, 0, 0); + KNOT_EVT_FLAG_TIME, 30, + KNOT_EVT_FLAG_CHANGE, NULL); /* Print thing name via Serial */ Serial.println(F(THING_NAME)); diff --git a/examples/Light/Light.ino b/examples/Light/Light.ino index 261a795..37128d3 100644 --- a/examples/Light/Light.ino +++ b/examples/Light/Light.ino @@ -55,7 +55,7 @@ void setup() KNOT_UNIT_NOT_APPLICABLE, light_read, light_write); /* Send data every 10 seconds*/ - thing.registerDefaultConfig(LIGHT_BULB_ID, KNOT_EVT_FLAG_TIME, 10, 0, 0, 0, 0); + thing.registerDefaultConfig(LIGHT_BULB_ID, KNOT_EVT_FLAG_TIME, 10, NULL); Serial.println(F("Remote Light Bulb KNoT Demo")); } diff --git a/examples/WaterDispenser/WaterDispenser.ino b/examples/WaterDispenser/WaterDispenser.ino index c906da9..f6df8a6 100644 --- a/examples/WaterDispenser/WaterDispenser.ino +++ b/examples/WaterDispenser/WaterDispenser.ino @@ -127,7 +127,7 @@ void setup(void) KNOT_UNIT_MASS_G, scale_read, scale_write); /*Send data when value is less than 1000*/ - thing.registerDefaultConfig(SCALE_ID, KNOT_EVT_FLAG_LOWER_THRESHOLD, 0, 0, 0, 1000, 0); + thing.registerDefaultConfig(SCALE_ID, KNOT_EVT_FLAG_LOWER_THRESHOLD, 1000, NULL); /* Read offset from EEPROM */ EEPROM.get(OFFSET_ADDR, offset); diff --git a/src/KNoTThing.cpp b/src/KNoTThing.cpp index 3173208..4544f9f 100644 --- a/src/KNoTThing.cpp +++ b/src/KNoTThing.cpp @@ -8,6 +8,7 @@ */ #include +#include #include "KNoTThing.h" @@ -81,18 +82,65 @@ void KNoTThing::run() knot_thing_run(); } -int KNoTThing::registerDefaultConfig(uint8_t sensor_id, uint8_t event_flags, - uint16_t time_sec, int32_t upper_int, uint32_t upper_dec, - int32_t lower_int, uint32_t lower_dec) +int KNoTThing::registerDefaultConfig(uint8_t sensor_id, ...) { - knot_value_type lower; - knot_value_type upper; - - lower.val_f.value_int = lower_int; - lower.val_f.value_dec = lower_dec; - upper.val_f.value_int = upper_int; - upper.val_f.value_dec = upper_dec; + va_list event_args; + + uint8_t event; + uint8_t value_type; + uint8_t event_flags = KNOT_EVT_FLAG_NONE; + uint16_t time_sec = 0; + knot_value_type lower_limit; + knot_value_type upper_limit; + + lower_limit.val_i = 0; + upper_limit.val_i = 0; + + value_type = knot_thing_get_value_type(sensor_id); + + if(value_type < 0) + return -1; + + /* Read arguments and set event_flags */ + va_start(event_args, sensor_id); + do { + event = (uint8_t) va_arg(event_args, int); + switch(event) { + case KNOT_EVT_FLAG_NONE: + break; + case KNOT_EVT_FLAG_CHANGE: + event_flags |= KNOT_EVT_FLAG_CHANGE; + break; + case KNOT_EVT_FLAG_TIME: + time_sec = (uint16_t) va_arg(event_args, int); + event_flags |= KNOT_EVT_FLAG_TIME; + break; + case KNOT_EVT_FLAG_UPPER_THRESHOLD: + if(value_type == KNOT_VALUE_TYPE_INT) + upper_limit.val_i = (int32_t) va_arg(event_args, + int); + if(value_type == KNOT_VALUE_TYPE_FLOAT) + upper_limit.val_f = (float) va_arg(event_args, + double); + event_flags |= KNOT_EVT_FLAG_UPPER_THRESHOLD; + break; + case KNOT_EVT_FLAG_LOWER_THRESHOLD: + if(value_type == KNOT_VALUE_TYPE_INT) + lower_limit.val_i = (int32_t) va_arg(event_args, + int); + if(value_type == KNOT_VALUE_TYPE_FLOAT) + lower_limit.val_f = (float) va_arg(event_args, + double); + event_flags |= KNOT_EVT_FLAG_LOWER_THRESHOLD; + break; + default: + va_end(event_args); + return -1; + } + + } while(event); + va_end(event_args); return knot_thing_config_data_item(sensor_id, event_flags, time_sec, - &lower, &upper); + &lower_limit, &upper_limit); } diff --git a/src/KNoTThing.h b/src/KNoTThing.h index e80ca9c..28f3739 100644 --- a/src/KNoTThing.h +++ b/src/KNoTThing.h @@ -43,9 +43,7 @@ class KNoTThing { uint16_t type_id, uint8_t unit, rawReadFunction read, rawWriteFunction write); - int registerDefaultConfig(uint8_t sensor_id, uint8_t event_flags, - uint16_t time_sec, int32_t upper_int, uint32_t upper_dec, - int32_t lower_int, uint32_t lower_dec); + int registerDefaultConfig(uint8_t sensor_id, ...); void run(); private: diff --git a/src/knot_thing_main.c b/src/knot_thing_main.c index c3d4f71..2befe53 100644 --- a/src/knot_thing_main.c +++ b/src/knot_thing_main.c @@ -509,3 +509,13 @@ uint8_t knot_thing_get_sensor_id(const uint8_t index) } return data_items[index].id; } + +uint8_t knot_thing_get_value_type(const uint8_t sensor_id) +{ + struct _data_items *item = find_item(sensor_id); + + if(!item) + return -1; + + return item->value_type; +} diff --git a/src/knot_thing_main.h b/src/knot_thing_main.h index dac78a1..10ed3df 100644 --- a/src/knot_thing_main.h +++ b/src/knot_thing_main.h @@ -87,6 +87,9 @@ int knot_thing_config_data_item(uint8_t id, uint8_t evflags, uint16_t time_sec, /* Find id for item in given index. Returns 0 if index is out of boundaries */ uint8_t knot_thing_get_sensor_id(const uint8_t index); +/* Get value type for given sensor id. Returns -1 if id is not registered */ +uint8_t knot_thing_get_value_type(const uint8_t sensor_id); + #ifdef __cplusplus } #endif