blob: 750b7f98a230525a525db20fc0e39ee63caac87d [file] [log] [blame]
/*
* Copyright (c) 2022 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
#define LOG_MODULE_NAME app_led
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#include "modules.h"
#include <zephyr/drivers/gpio.h>
#include <zephyr/net/lwm2m.h>
#define LIGHT_NAME "Test light"
/* If led0 gpios doesn't exist the relevant IPSO object will simply not be created. */
static const struct gpio_dt_spec led_gpio = GPIO_DT_SPEC_GET_OR(DT_ALIAS(led0), gpios, {});
static uint32_t led_state;
/* TODO: Move to a pre write hook that can handle ret codes once available */
static int led_on_off_cb(uint16_t obj_inst_id, uint16_t res_id, uint16_t res_inst_id, uint8_t *data,
uint16_t data_len, bool last_block, size_t total_size)
{
int ret = 0;
uint32_t led_val;
led_val = *(uint8_t *)data;
if (led_val != led_state) {
ret = gpio_pin_set_dt(&led_gpio, (int)led_val);
if (ret) {
/*
* We need an extra hook in LWM2M to better handle
* failures before writing the data value and not in
* post_write_cb, as there is not much that can be
* done here.
*/
LOG_ERR("Fail to write to GPIO %d", led_gpio.pin);
return ret;
}
led_state = led_val;
/* TODO: Move to be set by an internal post write function */
lwm2m_set_s32(&LWM2M_OBJ(3311, 0, 5852), 0);
}
return ret;
}
int init_led_device(void)
{
int ret;
if (!device_is_ready(led_gpio.port)) {
return -ENODEV;
}
ret = gpio_pin_configure_dt(&led_gpio, GPIO_OUTPUT_INACTIVE);
if (ret) {
return ret;
}
lwm2m_create_object_inst(&LWM2M_OBJ(3311, 0));
lwm2m_register_post_write_callback(&LWM2M_OBJ(3311, 0, 5850), led_on_off_cb);
lwm2m_set_res_buf(&LWM2M_OBJ(3311, 0, 5750), LIGHT_NAME, sizeof(LIGHT_NAME),
sizeof(LIGHT_NAME), LWM2M_RES_DATA_FLAG_RO);
return 0;
}