1 /**
2 ****************************************************************************************
3 *
4 * @file app.c
5 *
6 * @brief Application entry point
7 *
8 * Copyright (C) RivieraWaves 2009-2015
9 *
10 *
11 ****************************************************************************************
12 */
13
14 /**
15 ****************************************************************************************
16 * @addtogroup APP
17 * @{
18 ****************************************************************************************
19 */
20
21 /*
22 * INCLUDE FILES
23 ****************************************************************************************
24 */
25
26 #include "rwip_config.h" // SW configuration
27 #include "stdio.h"
28 #if (BLE_APP_PRESENT)
29 #include <string.h>
30
31 #include "app_task.h" // Application task Definition
32 #include "app.h" // Application Definition
33 #include "gap.h" // GAP Definition
34 #include "gapm_task.h" // GAP Manager Task API
35 #include "gapc_task.h" // GAP Controller Task API
36 #include "gapm.h"
37 #include "co_bt.h" // Common BT Definition
38 #include "co_math.h" // Common Maths Definition
39 #include "interface.h"
40 #include "gattc_task.h"
41
42 #if (BLE_APP_SEC)
43 #include "app_sec.h" // Application security Definition
44 #endif // (BLE_APP_SEC)
45
46 #if (NVDS_SUPPORT)
47 #include "nvds.h" // NVDS Definitions
48 #endif //(NVDS_SUPPORT)
49
50 #if (BLE_APP_USER)
51 #include "app_user.h" // Health Thermometer Application Definitions
52 #endif
53 //#include "BtDrv.h"
54 #include "n32wb452_ble_api.h"
55
56 /*
57 * DEFINES
58 ****************************************************************************************
59 */
60
61 /// Default Device Name if no value can be found in NVDS
62 #define APP_DFLT_DEVICE_NAME app_env.dev_name//
63 #define APP_DFLT_DEVICE_NAME_LEN (sizeof(APP_DFLT_DEVICE_NAME))
64
65
66 #if (BLE_APP_HID)
67 // HID Mouse
68 #define DEVICE_NAME "Hid Mouse"
69 #else
70 #define DEVICE_NAME "NZ DEVICE"
71 #endif
72
73 #define DEVICE_NAME_SIZE sizeof(DEVICE_NAME)
74
75 /**
76 * UUID List part of ADV Data
77 * --------------------------------------------------------------------------------------
78 * x03 - Length
79 * x03 - Complete list of 16-bit UUIDs available
80 * x09\x18 - Health Thermometer Service UUID
81 * or
82 * x12\x18 - HID Service UUID
83 * --------------------------------------------------------------------------------------
84 */
85
86 #if (BLE_APP_HT)
87 #define APP_HT_ADV_DATA_UUID "\x03\x03\x09\x18"
88 #define APP_HT_ADV_DATA_UUID_LEN (4)
89 #endif //(BLE_APP_HT)
90
91 #if (BLE_APP_HID)
92 #define APP_HID_ADV_DATA_UUID "\x03\x03\x12\x18"
93 #define APP_HID_ADV_DATA_UUID_LEN (4)
94 #endif //(BLE_APP_HID)
95
96
97 #if (BLE_APP_USER)
98 #define APP_USER_ADV_DATA_UUID "\x03\x03\x00\xaa"
99 #define APP_USER_ADV_DATA_UUID_LEN (4)
100 #endif //(BLE_APP_HT)
101
102
103 /*
104 * TYPE DEFINITIONS
105 ****************************************************************************************
106 */
107
108 typedef void (*appm_add_svc_func_t)(void);
109
110 /*
111 * ENUMERATIONS
112 ****************************************************************************************
113 */
114
115 /// List of service to add in the database
116 enum appm_svc_list
117 {
118
119 #if (BLE_APP_BATT)
120 APPM_SVC_BATT,
121 #endif //(BLE_APP_BATT)
122
123 #if (BLE_APP_USER)
124 APPM_SVC_USER,
125 #endif //(BLE_APP_USER)
126 APPM_SVC_LIST_STOP,
127 };
128
129 /*
130 * LOCAL VARIABLES DEFINITIONS
131 ****************************************************************************************
132 */
133
134 /// Application Task Descriptor
135 static const struct ke_task_desc TASK_DESC_APP = {NULL, &appm_default_handler,
136 appm_state, APPM_STATE_MAX, APP_IDX_MAX
137 };
138
139 /// List of functions used to create the database
140 static const appm_add_svc_func_t appm_add_svc_func_list[APPM_SVC_LIST_STOP] =
141 {
142
143 #if (BLE_APP_USER)
144 (appm_add_svc_func_t)app_user_add_users,
145 #endif //(BLE_APP_USER)
146
147 };
148
149 /*
150 * GLOBAL VARIABLE DEFINITIONS
151 ****************************************************************************************
152 */
153
154 /// Application Environment Structure
155 struct app_env_tag app_env;
156
157 /*
158 * FUNCTION DEFINITIONS
159 ****************************************************************************************
160 */
app_default_feature_init(void)161 void app_default_feature_init(void)
162 {
163 //wait to fill in the features
164 app_env.max_mtu = 251;
165
166 }
167
appm_init()168 void appm_init()
169 {
170
171 // Reset the application manager environment
172 memset(&app_env, 0, sizeof(app_env));
173 // Create APP task
174 ke_task_create(TASK_APP, &TASK_DESC_APP);
175 // Initialize Task state
176 ke_state_set(TASK_APP, APPM_INIT);
177
178 app_default_feature_init();
179 interface_sys.user_feature_init();
180
181 // user Module init
182 #if (BLE_APP_USER)
183 // Health Thermometer Module
184 app_user_init();
185 #endif //(BLE_APP_USER)
186 }
187
appm_add_svc(void)188 bool appm_add_svc(void)
189 {
190 // Indicate if more services need to be added in the database
191 bool more_svc = false;
192 // Check if another should be added in the database
193 if (app_env.next_svc != APPM_SVC_LIST_STOP)
194 {
195 // ble_log(BLE_DEBUG,"",app_env.next_svc)
196 ASSERT_INFO(appm_add_svc_func_list[app_env.next_svc] != NULL, app_env.next_svc, 1);
197
198 // Call the function used to add the required service
199 appm_add_svc_func_list[app_env.next_svc]();
200 // Select following service to add
201 app_env.next_svc++;
202 more_svc = true;
203 }
204 return more_svc;
205 }
206
appm_disconnect(void)207 void appm_disconnect(void)
208 {
209 struct gapc_disconnect_cmd *cmd = KE_MSG_ALLOC(GAPC_DISCONNECT_CMD,KE_BUILD_ID(TASK_GAPC, app_env.conidx), TASK_APP,gapc_disconnect_cmd);
210 cmd->operation = GAPC_DISCONNECT;
211 cmd->reason = CO_ERROR_REMOTE_USER_TERM_CON;
212 ke_msg_send(cmd); // Send the message
213 }
214
appm_start_advertising(void)215 void appm_start_advertising(void)
216 {
217 if (ke_state_get(TASK_APP) == APPM_READY)
218 {
219 // Prepare the GAPM_START_ADVERTISE_CMD message
220 struct gapm_start_advertise_cmd *cmd = KE_MSG_ALLOC(GAPM_START_ADVERTISE_CMD,TASK_GAPM, TASK_APP,gapm_start_advertise_cmd);
221 cmd->op.code = app_env.adv_para.adv_type;
222 cmd->op.addr_src = GAPM_STATIC_ADDR; // app_env.adv_para.addr_type_own; //public static addr private static addr
223 cmd->channel_map = app_env.adv_para.channel_map; // BTstack_data.user_config.adv_para.channel_map;//
224 cmd->intv_min = app_env.adv_para.adv_int_min;
225 cmd->intv_max = app_env.adv_para.adv_int_max;
226 cmd->info.host.mode = app_env.adv_para.discover_mode;
227
228 //ASSERT_ERR( app_env.adv_data_len > (GAP_ADV_DATA_LEN-3) );
229
230 memcpy(cmd->info.host.adv_data, app_env.adv_data_buf, app_env.adv_data_len);
231 cmd->info.host.adv_data_len = app_env.adv_data_len;
232
233
234
235 //ASSERT_ERR(app_env.adv_data_len > GAP_SCAN_RSP_DATA_LEN);
236
237 memcpy(cmd->info.host.scan_rsp_data, app_env.scan_rsp_data_buf, app_env.scan_rsp_data_len);
238 cmd->info.host.scan_rsp_data_len = app_env.scan_rsp_data_len;
239
240 // Send the message
241 ke_msg_send(cmd);
242 ke_state_set(TASK_APP, APPM_ADVERTISING);
243 if (g_pcallback) {
244 g_pcallback(BT_EVENT_DISCONNECTD, NULL, 0, 0);
245 }
246 g_connnet_start = 0;
247 }
248
249 }
250
appm_stop_advertising(void)251 void appm_stop_advertising(void)
252 {
253 if (ke_state_get(TASK_APP) == APPM_ADVERTISING)
254 {
255 // Go in ready state
256 ke_state_set(TASK_APP, APPM_READY);
257 // Prepare the GAPM_CANCEL_CMD message
258 struct gapm_cancel_cmd *cmd = KE_MSG_ALLOC(GAPM_CANCEL_CMD,TASK_GAPM, TASK_APP,gapm_cancel_cmd);
259 cmd->operation = GAPM_CANCEL;
260 // Send the message
261 ke_msg_send(cmd);
262 }
263 }
264
appm_set_mtu(void)265 void appm_set_mtu(void)
266 {
267 // Prepare the GAPC_PARAM_UPDATE_CMD message
268 struct gattc_exc_mtu_cmd *cmd = KE_MSG_ALLOC(GATTC_EXC_MTU_CMD,KE_BUILD_ID(TASK_GATTC, app_env.conidx), TASK_APP,gattc_exc_mtu_cmd);
269 cmd->operation = GATTC_MTU_EXCH;
270 cmd->seq_num = 0;
271 // Send the message
272 ke_msg_send(cmd);
273 }
274
BT_set_mtu(uint16_t mtu)275 void BT_set_mtu(uint16_t mtu)
276 {
277 app_env.max_mtu = mtu;
278
279 gapm_set_max_mtu(mtu);
280
281 appm_set_mtu();
282 }
283
appm_update_param(struct gapc_conn_param * conn_param)284 void appm_update_param(struct gapc_conn_param *conn_param)
285 {
286 // Prepare the GAPC_PARAM_UPDATE_CMD message
287
288 struct gapc_param_update_cmd *cmd = KE_MSG_ALLOC(GAPC_PARAM_UPDATE_CMD,KE_BUILD_ID(TASK_GAPC, app_env.conidx), TASK_APP,gapc_param_update_cmd);
289 cmd->operation = GAPC_UPDATE_PARAMS;
290 cmd->intv_min = conn_param->intv_min;
291 cmd->intv_max = conn_param->intv_max;
292 cmd->latency = conn_param->latency;
293 cmd->time_out = conn_param->time_out;
294 // not used by a slave device
295 cmd->ce_len_min = 0xFFFF;
296 cmd->ce_len_max = 0xFFFF;
297 // Send the message
298 ke_msg_send(cmd);
299 }
300
appm_get_dev_name(uint8_t * name)301 uint8_t appm_get_dev_name(uint8_t *name)
302 {
303 // copy name to provided pointer
304 memcpy(name, app_env.dev_name, app_env.dev_name_len);
305 // return name length
306 return app_env.dev_name_len;
307 }
308
309 #endif //(BLE_APP_PRESENT)
310
311
312