xref: /nrf52832-nimble/packages/NimBLE-latest/apps/blemesh_models_example_2/src/main.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero /* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
2*042d53a7SEvalZero  *
3*042d53a7SEvalZero  * Copyright (c) 2018 Vikrant More
4*042d53a7SEvalZero  *
5*042d53a7SEvalZero  * SPDX-License-Identifier: Apache-2.0
6*042d53a7SEvalZero  */
7*042d53a7SEvalZero 
8*042d53a7SEvalZero #include "bsp/bsp.h"
9*042d53a7SEvalZero #include "console/console.h"
10*042d53a7SEvalZero #include "hal/hal_gpio.h"
11*042d53a7SEvalZero 
12*042d53a7SEvalZero #include "common.h"
13*042d53a7SEvalZero #include "ble_mesh.h"
14*042d53a7SEvalZero #include "device_composition.h"
15*042d53a7SEvalZero #include "publisher.h"
16*042d53a7SEvalZero #include "state_binding.h"
17*042d53a7SEvalZero #include "transition.h"
18*042d53a7SEvalZero 
19*042d53a7SEvalZero int button_device[] = {
20*042d53a7SEvalZero 	BUTTON_1,
21*042d53a7SEvalZero 	BUTTON_2,
22*042d53a7SEvalZero 	BUTTON_3,
23*042d53a7SEvalZero 	BUTTON_4,
24*042d53a7SEvalZero };
25*042d53a7SEvalZero 
26*042d53a7SEvalZero int led_device[] = {
27*042d53a7SEvalZero 	LED_1,
28*042d53a7SEvalZero 	LED_2,
29*042d53a7SEvalZero 	LED_3,
30*042d53a7SEvalZero 	LED_4,
31*042d53a7SEvalZero };
32*042d53a7SEvalZero 
33*042d53a7SEvalZero static struct ble_npl_callout button_work;
34*042d53a7SEvalZero 
button_pressed(struct os_event * ev)35*042d53a7SEvalZero static void button_pressed(struct os_event *ev)
36*042d53a7SEvalZero {
37*042d53a7SEvalZero 	k_work_submit(&button_work);
38*042d53a7SEvalZero }
39*042d53a7SEvalZero 
40*042d53a7SEvalZero static struct os_event button_event;
41*042d53a7SEvalZero 
42*042d53a7SEvalZero static void
gpio_irq_handler(void * arg)43*042d53a7SEvalZero gpio_irq_handler(void *arg)
44*042d53a7SEvalZero {
45*042d53a7SEvalZero 	button_event.ev_arg = arg;
46*042d53a7SEvalZero 	os_eventq_put(os_eventq_dflt_get(), &button_event);
47*042d53a7SEvalZero }
48*042d53a7SEvalZero 
gpio_init(void)49*042d53a7SEvalZero static void gpio_init(void)
50*042d53a7SEvalZero {
51*042d53a7SEvalZero 	/* LEDs configiuratin & setting */
52*042d53a7SEvalZero 
53*042d53a7SEvalZero 	hal_gpio_init_out(led_device[0], 1);
54*042d53a7SEvalZero 	hal_gpio_init_out(led_device[1], 1);
55*042d53a7SEvalZero 	hal_gpio_init_out(led_device[2], 1);
56*042d53a7SEvalZero 	hal_gpio_init_out(led_device[3], 1);
57*042d53a7SEvalZero 
58*042d53a7SEvalZero 	/* Buttons configiuratin & setting */
59*042d53a7SEvalZero 
60*042d53a7SEvalZero 	k_work_init(&button_work, publish);
61*042d53a7SEvalZero 
62*042d53a7SEvalZero 	button_event.ev_cb = button_pressed;
63*042d53a7SEvalZero 
64*042d53a7SEvalZero 	hal_gpio_irq_init(button_device[0], gpio_irq_handler, NULL,
65*042d53a7SEvalZero 			  HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
66*042d53a7SEvalZero 	hal_gpio_irq_enable(button_device[0]);
67*042d53a7SEvalZero 
68*042d53a7SEvalZero 	hal_gpio_irq_init(button_device[1], gpio_irq_handler, NULL,
69*042d53a7SEvalZero 			  HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
70*042d53a7SEvalZero 	hal_gpio_irq_enable(button_device[1]);
71*042d53a7SEvalZero 
72*042d53a7SEvalZero 	hal_gpio_irq_init(button_device[2], gpio_irq_handler, NULL,
73*042d53a7SEvalZero 			  HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
74*042d53a7SEvalZero 	hal_gpio_irq_enable(button_device[2]);
75*042d53a7SEvalZero 
76*042d53a7SEvalZero 	hal_gpio_irq_init(button_device[3], gpio_irq_handler, NULL,
77*042d53a7SEvalZero 			  HAL_GPIO_TRIG_FALLING, HAL_GPIO_PULL_UP);
78*042d53a7SEvalZero 	hal_gpio_irq_enable(button_device[3]);
79*042d53a7SEvalZero }
80*042d53a7SEvalZero 
light_default_status_init(void)81*042d53a7SEvalZero void light_default_status_init(void)
82*042d53a7SEvalZero {
83*042d53a7SEvalZero 	/* Assume vaules are retrived from Persistence Storage (Start).
84*042d53a7SEvalZero 	 * These had saved by respective Setup Servers.
85*042d53a7SEvalZero 	 */
86*042d53a7SEvalZero 	gen_power_onoff_srv_user_data.onpowerup = STATE_DEFAULT;
87*042d53a7SEvalZero 
88*042d53a7SEvalZero 	light_lightness_srv_user_data.light_range_min = LIGHTNESS_MIN;
89*042d53a7SEvalZero 	light_lightness_srv_user_data.light_range_max = LIGHTNESS_MAX;
90*042d53a7SEvalZero 	light_lightness_srv_user_data.def = LIGHTNESS_MAX;
91*042d53a7SEvalZero 
92*042d53a7SEvalZero 	/* Following 2 values are as per specification */
93*042d53a7SEvalZero 	light_ctl_srv_user_data.temp_range_min = TEMP_MIN;
94*042d53a7SEvalZero 	light_ctl_srv_user_data.temp_range_max = TEMP_MAX;
95*042d53a7SEvalZero 
96*042d53a7SEvalZero 	light_ctl_srv_user_data.temp_def = TEMP_MIN;
97*042d53a7SEvalZero 	/* (End) */
98*042d53a7SEvalZero 
99*042d53a7SEvalZero 	/* Assume following values are retrived from Persistence
100*042d53a7SEvalZero 	 * Storage (Start).
101*042d53a7SEvalZero 	 * These values had saved before power down.
102*042d53a7SEvalZero 	 */
103*042d53a7SEvalZero 	light_lightness_srv_user_data.last = LIGHTNESS_MAX;
104*042d53a7SEvalZero 	light_ctl_srv_user_data.temp_last = TEMP_MIN;
105*042d53a7SEvalZero 	/* (End) */
106*042d53a7SEvalZero 
107*042d53a7SEvalZero 	light_ctl_srv_user_data.temp = light_ctl_srv_user_data.temp_def;
108*042d53a7SEvalZero 
109*042d53a7SEvalZero 	if (gen_power_onoff_srv_user_data.onpowerup == STATE_OFF) {
110*042d53a7SEvalZero 		gen_onoff_srv_root_user_data.onoff = STATE_OFF;
111*042d53a7SEvalZero 		state_binding(ONOFF, ONOFF_TEMP);
112*042d53a7SEvalZero 	} else if (gen_power_onoff_srv_user_data.onpowerup == STATE_DEFAULT) {
113*042d53a7SEvalZero 		gen_onoff_srv_root_user_data.onoff = STATE_ON;
114*042d53a7SEvalZero 		state_binding(ONOFF, ONOFF_TEMP);
115*042d53a7SEvalZero 	} else if (gen_power_onoff_srv_user_data.onpowerup == STATE_RESTORE) {
116*042d53a7SEvalZero 		/* Assume following values is retrived from Persistence
117*042d53a7SEvalZero 		 * Storage (Start).
118*042d53a7SEvalZero 		 * This value had saved before power down.
119*042d53a7SEvalZero 		 */
120*042d53a7SEvalZero 		gen_onoff_srv_root_user_data.onoff = STATE_ON;
121*042d53a7SEvalZero 		/* (End) */
122*042d53a7SEvalZero 
123*042d53a7SEvalZero 		light_ctl_srv_user_data.temp =
124*042d53a7SEvalZero 			light_ctl_srv_user_data.temp_last;
125*042d53a7SEvalZero 
126*042d53a7SEvalZero 		state_binding(ONPOWERUP, ONOFF_TEMP);
127*042d53a7SEvalZero 	}
128*042d53a7SEvalZero }
129*042d53a7SEvalZero 
update_light_state(void)130*042d53a7SEvalZero void update_light_state(void)
131*042d53a7SEvalZero {
132*042d53a7SEvalZero 	u8_t power, color;
133*042d53a7SEvalZero 
134*042d53a7SEvalZero 	power = 100 * ((float) light_lightness_srv_user_data.actual / 65535);
135*042d53a7SEvalZero 	color = 100 * ((float) (gen_level_srv_s0_user_data.level + 32768)
136*042d53a7SEvalZero 		       / 65535);
137*042d53a7SEvalZero 
138*042d53a7SEvalZero 	printk("power-> %d, color-> %d\n", power, color);
139*042d53a7SEvalZero 
140*042d53a7SEvalZero 	if (gen_onoff_srv_root_user_data.onoff == STATE_ON) {
141*042d53a7SEvalZero 		/* LED1 On */
142*042d53a7SEvalZero 		hal_gpio_write(led_device[0], 0);
143*042d53a7SEvalZero 	} else {
144*042d53a7SEvalZero 		/* LED1 Off */
145*042d53a7SEvalZero 		hal_gpio_write(led_device[0], 1);
146*042d53a7SEvalZero 	}
147*042d53a7SEvalZero 
148*042d53a7SEvalZero 	if (power < 50) {
149*042d53a7SEvalZero 		/* LED3 On */
150*042d53a7SEvalZero 		hal_gpio_write(led_device[2], 0);
151*042d53a7SEvalZero 	} else {
152*042d53a7SEvalZero 		/* LED3 Off */
153*042d53a7SEvalZero 		hal_gpio_write(led_device[2], 1);
154*042d53a7SEvalZero 	}
155*042d53a7SEvalZero 
156*042d53a7SEvalZero 	if (color < 50) {
157*042d53a7SEvalZero 		/* LED4 On */
158*042d53a7SEvalZero 		hal_gpio_write(led_device[3], 0);
159*042d53a7SEvalZero 	} else {
160*042d53a7SEvalZero 		/* LED4 Off */
161*042d53a7SEvalZero 		hal_gpio_write(led_device[3], 1);
162*042d53a7SEvalZero 	}
163*042d53a7SEvalZero }
164*042d53a7SEvalZero 
main(void)165*042d53a7SEvalZero int main(void)
166*042d53a7SEvalZero {
167*042d53a7SEvalZero #ifdef ARCH_sim
168*042d53a7SEvalZero 	mcu_sim_parse_args(argc, argv);
169*042d53a7SEvalZero #endif
170*042d53a7SEvalZero 
171*042d53a7SEvalZero 	/* Initialize OS */
172*042d53a7SEvalZero 	sysinit();
173*042d53a7SEvalZero 
174*042d53a7SEvalZero 	light_default_status_init();
175*042d53a7SEvalZero 
176*042d53a7SEvalZero 	transition_timers_init();
177*042d53a7SEvalZero 
178*042d53a7SEvalZero 	gpio_init();
179*042d53a7SEvalZero 
180*042d53a7SEvalZero 	update_light_state();
181*042d53a7SEvalZero 
182*042d53a7SEvalZero 	init_pub();
183*042d53a7SEvalZero 
184*042d53a7SEvalZero 	printk("Initializing...\n");
185*042d53a7SEvalZero 
186*042d53a7SEvalZero 	/* Initialize the NimBLE host configuration. */
187*042d53a7SEvalZero 	ble_hs_cfg.reset_cb = blemesh_on_reset;
188*042d53a7SEvalZero 	ble_hs_cfg.sync_cb = blemesh_on_sync;
189*042d53a7SEvalZero 	ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
190*042d53a7SEvalZero 
191*042d53a7SEvalZero 	randomize_publishers_TID();
192*042d53a7SEvalZero 
193*042d53a7SEvalZero 	while (1) {
194*042d53a7SEvalZero 		os_eventq_run(os_eventq_dflt_get());
195*042d53a7SEvalZero 	}
196*042d53a7SEvalZero 
197*042d53a7SEvalZero 	return 0;
198*042d53a7SEvalZero }
199