blob: b42fbff64670993c2e0d6404da6636a4f427734c [file] [log] [blame]
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
*
* Copyright (c) 2018 Vikrant More
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/drivers/gpio.h>
#include "app_gpio.h"
#include "ble_mesh.h"
#include "device_composition.h"
#include "no_transition_work_handler.h"
#include "state_binding.h"
#include "storage.h"
#include "transition.h"
#if defined(CONFIG_MCUMGR)
#include <zephyr/mgmt/mcumgr/smp_bt.h>
#include "smp_svr.h"
#endif
static bool reset;
static void light_default_var_init(void)
{
ctl->tt = 0x00;
ctl->onpowerup = STATE_DEFAULT;
ctl->light->range_min = LIGHTNESS_MIN;
ctl->light->range_max = LIGHTNESS_MAX;
ctl->light->last = LIGHTNESS_MAX;
ctl->light->def = LIGHTNESS_MAX;
ctl->light->target = ctl->light->def;
ctl->temp->range_min = TEMP_MIN;
ctl->temp->range_max = TEMP_MAX;
ctl->temp->def = TEMP_MAX;
ctl->temp->target = ctl->temp->def;
ctl->duv->def = DELTA_UV_DEF;
ctl->duv->target = ctl->duv->def;
}
/* This function should only get call after execution of settings_load() */
static void light_default_status_init(void)
{
/* Retrieve Range of Lightness */
if (ctl->light->range) {
ctl->light->range_max = (uint16_t) (ctl->light->range >> 16);
ctl->light->range_min = (uint16_t) ctl->light->range;
}
/* Retrieve Range of Temperature */
if (ctl->temp->range) {
ctl->temp->range_max = (uint16_t) (ctl->temp->range >> 16);
ctl->temp->range_min = (uint16_t) ctl->temp->range;
}
ctl->light->last = constrain_lightness(ctl->light->last);
ctl->light->def = constrain_lightness(ctl->light->def);
ctl->light->target = constrain_lightness(ctl->light->target);
ctl->temp->def = constrain_temperature(ctl->temp->def);
ctl->temp->target = constrain_temperature(ctl->temp->target);
ctl->temp->current = ctl->temp->def;
ctl->duv->current = ctl->duv->def;
switch (ctl->onpowerup) {
case STATE_OFF:
ctl->light->current = 0U;
break;
case STATE_DEFAULT:
if (ctl->light->def == 0U) {
ctl->light->current = ctl->light->last;
} else {
ctl->light->current = ctl->light->def;
}
break;
case STATE_RESTORE:
ctl->light->current = ctl->light->target;
ctl->temp->current = ctl->temp->target;
ctl->duv->current = ctl->duv->target;
break;
}
ctl->light->target = ctl->light->current;
ctl->temp->target = ctl->temp->current;
ctl->duv->target = ctl->duv->current;
}
void update_vnd_led_gpio(void)
{
#ifndef ONE_LED_ONE_BUTTON_BOARD
gpio_pin_set_dt(&led_device[1], vnd_user_data.current == STATE_ON);
#endif
}
void update_led_gpio(void)
{
uint8_t power, color;
power = 100 * ((float) ctl->light->current / 65535);
color = 100 * ((float) (ctl->temp->current - ctl->temp->range_min) /
(ctl->temp->range_max - ctl->temp->range_min));
printk("power-> %d, color-> %d\n", power, color);
gpio_pin_set_dt(&led_device[0], ctl->light->current);
#ifndef ONE_LED_ONE_BUTTON_BOARD
gpio_pin_set_dt(&led_device[2], power < 50);
gpio_pin_set_dt(&led_device[3], color < 50);
#endif
}
void update_light_state(void)
{
update_led_gpio();
if (ctl->transition->counter == 0 || reset == false) {
reset = true;
k_work_submit(&no_transition_work);
}
}
static void short_time_multireset_bt_mesh_unprovisioning(void)
{
if (reset_counter >= 4U) {
reset_counter = 0U;
printk("BT Mesh reset\n");
bt_mesh_reset();
} else {
printk("Reset Counter -> %d\n", reset_counter);
reset_counter++;
}
save_on_flash(RESET_COUNTER);
}
static void reset_counter_timer_handler(struct k_timer *dummy)
{
reset_counter = 0U;
save_on_flash(RESET_COUNTER);
printk("Reset Counter set to Zero\n");
}
K_TIMER_DEFINE(reset_counter_timer, reset_counter_timer_handler, NULL);
void main(void)
{
int err;
light_default_var_init();
app_gpio_init();
#if defined(CONFIG_MCUMGR)
smp_svr_init();
#endif
printk("Initializing...\n");
ps_settings_init();
/* Initialize the Bluetooth Subsystem */
err = bt_enable(NULL);
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return;
}
bt_ready();
light_default_status_init();
update_light_state();
short_time_multireset_bt_mesh_unprovisioning();
k_timer_start(&reset_counter_timer, K_MSEC(7000), K_NO_WAIT);
#if defined(CONFIG_MCUMGR)
/* Initialize the Bluetooth mcumgr transport. */
smp_bt_register();
k_timer_start(&smp_svr_timer, K_NO_WAIT, K_MSEC(1000));
#endif
}