Skip to content

Commit

Permalink
pkg/wakaama/objects: add Voltmeter
Browse files Browse the repository at this point in the history
  • Loading branch information
leandrolanzieri committed May 8, 2024
1 parent e2c38a4 commit 527cab6
Show file tree
Hide file tree
Showing 4 changed files with 245 additions and 0 deletions.
4 changes: 4 additions & 0 deletions pkg/wakaama/Makefile.dep
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ ifneq (,$(filter wakaama_objects_temperature,$(USEMODULE)))
USEMODULE += wakaama_objects_ipso_sensor_base
endif

ifneq (,$(filter wakaama_objects_voltage,$(USEMODULE)))
USEMODULE += wakaama_objects_ipso_sensor_base
endif

USEMODULE += ztimer
USEMODULE += ztimer_sec
USEPKG += tlsf
Expand Down
9 changes: 9 additions & 0 deletions pkg/wakaama/contrib/objects/Kconfig.ipso
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,13 @@ config LWM2M_TEMPERATURE_INSTANCES_MAX

endmenu

menu "IPSO voltage object"
depends on USEMODULE_WAKAAMA_OBJECTS_VOLTAGE

config LWM2M_VOLTAGE_INSTANCES_MAX
int "Maximum number of voltage object instances"
default 1

endmenu

endmenu # "IPSO objects"
70 changes: 70 additions & 0 deletions pkg/wakaama/contrib/objects/voltage.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (C) 2024 HAW Hamburg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @{
* @ingroup lwm2m_objects_voltage
*
* @file
* @brief Voltmeter object implementation for LwM2M client using Wakaama
*
* @author Leandro Lanzieri <[email protected]>
* @}
*/

#include "mutex.h"
#include "liblwm2m.h"
#include "lwm2m_client.h"
#include "objects/voltage.h"
#include "objects/ipso_sensor_base.h"

#define ENABLE_DEBUG 0
#include "debug.h"

/**
* @brief Voltage Sensor object implementation descriptor.
*/
static lwm2m_obj_ipso_sensor_base_t _voltage_object;

/**
* @brief Pool of object instances.
*/
static lwm2m_obj_ipso_sensor_base_inst_t _instances[CONFIG_LWM2M_VOLTAGE_INSTANCES_MAX];

lwm2m_object_t *lwm2m_object_voltage_init(lwm2m_client_data_t *client_data)
{
assert(client_data);
int res = lwm2m_object_ipso_sensor_base_init_derived(client_data, &_voltage_object,
LWM2M_VOLTAGE_OBJECT_ID,
_instances,
CONFIG_LWM2M_VOLTAGE_INSTANCES_MAX);

if (res) {
DEBUG("[lwm2m:voltage]: failed to create object\n");
return NULL;
}

return &_voltage_object.object;
}


Check warning on line 54 in pkg/wakaama/contrib/objects/voltage.c

View workflow job for this annotation

GitHub Actions / static-tests

too many consecutive empty lines
int32_t lwm2m_object_voltage_instance_create(const lwm2m_obj_voltage_args_t *args)
{
int32_t result = lwm2m_object_ipso_sensor_base_instance_create(&_voltage_object, args);

if (result) {
DEBUG("[lwm2m:voltage]: failed to create instance\n");
}

return result;
}

void lwm2m_object_voltage_update_value(const lwm2m_client_data_t *client_data, uint16_t instance_id,
int16_t value)
{
lwm2m_object_ipso_sensor_base_update_value(client_data, &_voltage_object, instance_id, value);
}
162 changes: 162 additions & 0 deletions pkg/wakaama/include/objects/voltage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/*
* Copyright (C) 2024 HAW Hamburg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @ingroup lwm2m_objects
* @defgroup lwm2m_objects_voltage Voltage
* @brief Voltmeter object implementation for LwM2M client using Wakaama
*
* @experimental
*
* This implements the LwM2M Voltage Sensor object (ID 3316) as specified in the LwM2M registry.
* This IPSO object should be used with voltmeter sensor to report measured voltage between two
* points. It also provides resources for minimum and maximum measured values, as well as the
* minimum and maximum range that can be measured by the sensor. An example measurement unit is
* volts.
*
* The sensor value can be updated by the application using the
* @ref lwm2m_object_voltage_update_value function, or polled when required if a callback is
* registered upon object instantiation via @ref lwm2m_obj_voltage_args_t::read_cb.
*
* To use this object add `USEMODULE += wakaama_objects_voltage` to the application Makefile.
*
* ## Resources
*
* For an XML description of the object see
* https://raw.githubusercontent.com/OpenMobileAlliance/lwm2m-registry/prod/version_history/3316-1_0.xml
*
* This object is based on the @ref lwm2m_objects_ipso_sensor_base, therefore it shares the same
* resources. Note that the optional resources "Current Calibration" (ID 5821) and
* "Application Type" (ID 5750) are not implemented.
*
* ## Usage
*
* 1. Initialize the LwM2M object with an initialized client pointer.
*
* ~~~~~~~~~~~~~~~{.c}
* lwm2m_object_t *obj = lwm2m_object_voltage_init(&client_data);
* ~~~~~~~~~~~~~~~
*
* 2. Create a new instance of the object with a given configuration (@ref lwm2m_obj_voltage_args_t).
* Here, you can decide the way of updating the sensor values: polling or pushing. In this case,
* we register a callback function that is called whenever the sensor value is read.
*
* ~~~~~~~~~~~~~~~{.c}
*
* // callback function to read the sensor value
* int _read_cb(void *arg, int16_t *value)
* {
* (void)arg;
*
* // generate new value
* *value = 100;
*
* return 0;
* }
*
* // initialize an instance of voltage sensor object
* const lwm2m_obj_voltage_args_t voltage_args = {
* .min_range_value = -50.0,
* .max_range_value = 200.0,
* .units = "V",
* .units_len = sizeof("V") - 1,
* .instance_id = 0,
* .read_cb = _read_cb,
* .read_cb_arg = NULL
* };
*
* int res = lwm2m_object_voltage_instance_create(&voltage_args);
*
* if (res < 0) {
* puts("Could not create voltage object instance");
* }
* ~~~~~~~~~~~~~~~
*
* 3. You can now update the sensor values using the @ref lwm2m_object_voltage_update_value function.
*
* ~~~~~~~~~~~~~~~{.c}
* lwm2m_object_voltage_update_value(&client_data, 0, new_value);
* ~~~~~~~~~~~~~~~
* @{
*
* @file
*
* @author Leandro Lanzieri <[email protected]>
*/

#ifndef OBJECTS_VOLTAGE_H
#define OBJECTS_VOLTAGE_H

#ifdef __cplusplus
extern "C" {
#endif

#include "liblwm2m.h"
#include "lwm2m_client.h"
#include "objects/ipso_sensor_base.h"

/**
* @defgroup lwm2m_objects_voltage_config LwM2M Voltage Sensor object compile configurations
* @ingroup lwm2m_client_config
* @{
*/
/**
* @brief Maximum number of instances of the object
*/
#ifndef CONFIG_LWM2M_VOLTAGE_INSTANCES_MAX
#define CONFIG_LWM2M_VOLTAGE_INSTANCES_MAX (1U)
#endif
/** @} */

/**
* @brief LwM2M Voltage Sensor object ID
*/
#define LWM2M_VOLTAGE_OBJECT_ID 3316

/**
* @brief Arguments for the creation of a Voltage Sensor object instance.
*/
typedef lwm2m_obj_ipso_base_sensor_args_t lwm2m_obj_voltage_args_t;

/**
* @brief Initialize the Voltage Sensor object handle
*
* @param[in] client_data Pointer to the LwM2M client data.
*
* @return Pointer to the global handle of the Voltage Sensor object.
*/
lwm2m_object_t *lwm2m_object_voltage_init(lwm2m_client_data_t *client_data);

/**
* @brief Create a new Voltage Sensor instance.
*
* @param[in] args Initialize structure with the parameter for the instance. May
* not be NULL.
*
* @return > 0 value representing the instance ID if the instance was created successfully.
* @return <0 otherwise
*/
int32_t lwm2m_object_voltage_instance_create(const lwm2m_obj_voltage_args_t *args);

/**
* @brief Update the value of the voltage sensor and trigger a notification
* to the observing servers, if any.
*
* @param[in] client_data Pointer to the LwM2M client.
* @param[in] instance_id ID of the instance to update.
* @param[in] value New value for the sensor.
*/
void lwm2m_object_voltage_update_value(const lwm2m_client_data_t *client_data,
uint16_t instance_id, int16_t value);

#ifdef __cplusplus
}
#endif

#endif /* OBJECTS_VOLTAGE_H */
/** @} */

0 comments on commit 527cab6

Please sign in to comment.