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