| /* 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; |
| } |