blob: 10fc8dae82350de9cab346bb7714f60060b2eaa7 [file] [log] [blame]
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
*
* Copyright (c) 2018 Vikrant More
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "bsp/bsp.h"
#include "console/console.h"
#include "hal/hal_gpio.h"
#include "common.h"
#include "ble_mesh.h"
#include "device_composition.h"
#include "publisher.h"
#include "state_binding.h"
#include "transition.h"
int button_device[] = {
BUTTON_1,
BUTTON_2,
BUTTON_3,
BUTTON_4,
};
int led_device[] = {
LED_1,
LED_2,
LED_3,
LED_4,
};
static struct ble_npl_callout button_work;
static void button_pressed(struct os_event *ev)
{
k_work_submit(&button_work);
}
static struct os_event button_event;
static void
gpio_irq_handler(void *arg)
{
button_event.ev_arg = arg;
os_eventq_put(os_eventq_dflt_get(), &button_event);
}
static void gpio_init(void)
{
/* LEDs configiuratin & setting */
hal_gpio_init_out(led_device[0], 1);
hal_gpio_init_out(led_device[1], 1);
hal_gpio_init_out(led_device[2], 1);
hal_gpio_init_out(led_device[3], 1);
/* Buttons configiuratin & setting */
k_work_init(&button_work, publish);
button_event.ev_cb = button_pressed;
hal_gpio_irq_init(button_device[0], gpio_irq_handler, NULL,
HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
hal_gpio_irq_enable(button_device[0]);
hal_gpio_irq_init(button_device[1], gpio_irq_handler, NULL,
HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
hal_gpio_irq_enable(button_device[1]);
hal_gpio_irq_init(button_device[2], gpio_irq_handler, NULL,
HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
hal_gpio_irq_enable(button_device[2]);
hal_gpio_irq_init(button_device[3], gpio_irq_handler, NULL,
HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
hal_gpio_irq_enable(button_device[3]);
}
void light_default_status_init(void)
{
/* Assume vaules are retrived from Persistence Storage (Start).
* These had saved by respective Setup Servers.
*/
gen_power_onoff_srv_user_data.onpowerup = STATE_DEFAULT;
light_lightness_srv_user_data.light_range_min = LIGHTNESS_MIN;
light_lightness_srv_user_data.light_range_max = LIGHTNESS_MAX;
light_lightness_srv_user_data.def = LIGHTNESS_MAX;
/* Following 2 values are as per specification */
light_ctl_srv_user_data.temp_range_min = TEMP_MIN;
light_ctl_srv_user_data.temp_range_max = TEMP_MAX;
light_ctl_srv_user_data.temp_def = TEMP_MIN;
/* (End) */
/* Assume following values are retrived from Persistence
* Storage (Start).
* These values had saved before power down.
*/
light_lightness_srv_user_data.last = LIGHTNESS_MAX;
light_ctl_srv_user_data.temp_last = TEMP_MIN;
/* (End) */
light_ctl_srv_user_data.temp = light_ctl_srv_user_data.temp_def;
if (gen_power_onoff_srv_user_data.onpowerup == STATE_OFF) {
gen_onoff_srv_root_user_data.onoff = STATE_OFF;
state_binding(ONOFF, ONOFF_TEMP);
} else if (gen_power_onoff_srv_user_data.onpowerup == STATE_DEFAULT) {
gen_onoff_srv_root_user_data.onoff = STATE_ON;
state_binding(ONOFF, ONOFF_TEMP);
} else if (gen_power_onoff_srv_user_data.onpowerup == STATE_RESTORE) {
/* Assume following values is retrived from Persistence
* Storage (Start).
* This value had saved before power down.
*/
gen_onoff_srv_root_user_data.onoff = STATE_ON;
/* (End) */
light_ctl_srv_user_data.temp =
light_ctl_srv_user_data.temp_last;
state_binding(ONPOWERUP, ONOFF_TEMP);
}
}
void update_light_state(void)
{
u8_t power, color;
power = 100 * ((float) light_lightness_srv_user_data.actual / 65535);
color = 100 * ((float) (gen_level_srv_s0_user_data.level + 32768)
/ 65535);
printk("power-> %d, color-> %d\n", power, color);
if (gen_onoff_srv_root_user_data.onoff == STATE_ON) {
/* LED1 On */
hal_gpio_write(led_device[0], 0);
} else {
/* LED1 Off */
hal_gpio_write(led_device[0], 1);
}
if (power < 50) {
/* LED3 On */
hal_gpio_write(led_device[2], 0);
} else {
/* LED3 Off */
hal_gpio_write(led_device[2], 1);
}
if (color < 50) {
/* LED4 On */
hal_gpio_write(led_device[3], 0);
} else {
/* LED4 Off */
hal_gpio_write(led_device[3], 1);
}
}
int main(void)
{
#ifdef ARCH_sim
mcu_sim_parse_args(argc, argv);
#endif
/* Initialize OS */
sysinit();
light_default_status_init();
transition_timers_init();
gpio_init();
update_light_state();
init_pub();
printk("Initializing...\n");
/* Initialize the NimBLE host configuration. */
ble_hs_cfg.reset_cb = blemesh_on_reset;
ble_hs_cfg.sync_cb = blemesh_on_sync;
ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
randomize_publishers_TID();
while (1) {
os_eventq_run(os_eventq_dflt_get());
}
return 0;
}