Skip to content
Snippets Groups Projects
Commit ef803c50 authored by Aapo Torkkeli's avatar Aapo Torkkeli
Browse files

Basic version of ex7 that compiles.

parent 511b10af
No related branches found
No related tags found
No related merge requests found
...@@ -82,6 +82,10 @@ ...@@ -82,6 +82,10 @@
#include "nrf_log_ctrl.h" #include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h" #include "nrf_log_default_backends.h"
#include "nrf_temp.h"
#include "ble_hts.h"
#include "ble_bas.h"
#define DEVICE_NAME "Nordic_Template" /**< Name of device. Will be included in the advertising data. */ #define DEVICE_NAME "Nordic_Template" /**< Name of device. Will be included in the advertising data. */
#define MANUFACTURER_NAME "NordicSemiconductor" /**< Manufacturer. Will be passed to Device Information Service. */ #define MANUFACTURER_NAME "NordicSemiconductor" /**< Manufacturer. Will be passed to Device Information Service. */
...@@ -111,6 +115,9 @@ ...@@ -111,6 +115,9 @@
#define DEAD_BEEF 0xDEADBEEF /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */ #define DEAD_BEEF 0xDEADBEEF /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
// Determines if temperature type is given as characteristic (1) or as a field of measurement (0)
#define TEMP_TYPE_AS_CHARACTERISTIC 0
NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */ NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */
NRF_BLE_QWR_DEF(m_qwr); /**< Context for the Queued Write module.*/ NRF_BLE_QWR_DEF(m_qwr); /**< Context for the Queued Write module.*/
...@@ -118,6 +125,18 @@ BLE_ADVERTISING_DEF(m_advertising); ...@@ -118,6 +125,18 @@ BLE_ADVERTISING_DEF(m_advertising);
static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**< Handle of the current connection. */ static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**< Handle of the current connection. */
BLE_HTS_DEF(m_hts); // Macro for defining a ble_hts instance
BLE_BAS_DEF(m_bas); // Macro for defining a ble_bas instance
// Flag to keep track of when an indication confirmation is pending
static bool m_hts_meas_ind_conf_pending = false;
volatile uint32_t hts_counter; // hold dummy hts data
// Function declarations
static void on_hts_evt(ble_hts_t * p_hts, ble_hts_evt_t * p_evt);
static void temperature_measurement_send(void);
/* YOUR_JOB: Declare all services structure your application is using /* YOUR_JOB: Declare all services structure your application is using
* BLE_XYZ_DEF(m_xyz); * BLE_XYZ_DEF(m_xyz);
*/ */
...@@ -131,6 +150,79 @@ static ble_uuid_t m_adv_uuids[] = ...@@ -131,6 +150,79 @@ static ble_uuid_t m_adv_uuids[] =
static void advertising_start(bool erase_bonds); static void advertising_start(bool erase_bonds);
/*
* Function for generating a dummy temperature information packet.
*/
static void generate_temperature(ble_hts_meas_t * p_meas) {
static ble_date_time_t time_stamp = { 2018, 16, 10, 16, 15, 0 };
uint32_t celciusX100;
p_meas->temp_in_fahr_units = false;
p_meas->time_stamp_present = true;
p_meas->temp_type_present = (TEMP_TYPE_AS_CHARACTERISTIC ? false : true);
celciusX100 = 2000+hts_counter++; // one unit is 0.01 Celcius
p_meas->temp_in_celcius.exponent = -2;
p_meas->temp_in_celcius.mantissa = celciusX100;
p_meas->temp_in_fahr.exponent = -2;
p_meas->temp_in_fahr.mantissa = (32 * 100) + ((celciusX100 * 9) / 5);
p_meas->time_stamp = time_stamp;
p_meas->temp_type = BLE_HTS_TEMP_TYPE_FINGER;
// update simulated time stamp
time_stamp.seconds += 27;
if (time_stamp.seconds > 59){
time_stamp.seconds -= 60;
time_stamp.minutes++;
if (time_stamp.minutes > 59){
time_stamp.minutes = 0;
}
}
}
/*
* Function for handling the Health Thermometer Service events.
*/
static void on_hts_evt(ble_hts_t * p_hts, ble_hts_evt_t * p_evt) {
switch (p_evt->evt_type) {
case BLE_HTS_EVT_INDICATION_ENABLED:
// Indication has been enabled, send a single temperature measurement
temperature_measurement_send();
break;
case BLE_HTS_EVT_INDICATION_CONFIRMED:
m_hts_meas_ind_conf_pending = false;
break;
default:
// No implementation needed.
break;
}
}
static void temperature_measurement_send(void) {
ble_hts_meas_t hts_meas; //Health Thermometer Service measurement structure
ret_code_t
err_code;
if (!m_hts_meas_ind_conf_pending) {
generate_temperature(&hts_meas);
err_code = ble_hts_measurement_send(&m_hts, &hts_meas);
switch (err_code) {
case NRF_SUCCESS:
// Measurement was successfully sent, wait for confirmation.
m_hts_meas_ind_conf_pending = true;
break;
case NRF_ERROR_INVALID_STATE:
// Ignore error.
break;
default:
APP_ERROR_HANDLER(err_code);
break;
}
}
}
/**@brief Callback function for asserts in the SoftDevice. /**@brief Callback function for asserts in the SoftDevice.
* *
...@@ -278,15 +370,6 @@ static void on_yys_evt(ble_yy_service_t * p_yy_service, ...@@ -278,15 +370,6 @@ static void on_yys_evt(ble_yy_service_t * p_yy_service,
*/ */
static void services_init(void) static void services_init(void)
{ {
ret_code_t err_code;
nrf_ble_qwr_init_t qwr_init = {0};
// Initialize Queued Write Module.
qwr_init.error_handler = nrf_qwr_error_handler;
err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
APP_ERROR_CHECK(err_code);
/* YOUR_JOB: Add code to initialize the services used by the application. /* YOUR_JOB: Add code to initialize the services used by the application.
ble_xxs_init_t xxs_init; ble_xxs_init_t xxs_init;
ble_yys_init_t yys_init; ble_yys_init_t yys_init;
...@@ -309,6 +392,38 @@ static void services_init(void) ...@@ -309,6 +392,38 @@ static void services_init(void)
err_code = ble_yy_service_init(&yys_init, &yy_init); err_code = ble_yy_service_init(&yys_init, &yy_init);
APP_ERROR_CHECK(err_code); APP_ERROR_CHECK(err_code);
*/ */
ret_code_t err_code;
ble_hts_init_t hts_init;
ble_bas_init_t bas_init;
// Initialize Health Thermometer Service
memset(&hts_init, 0, sizeof(hts_init));
hts_init.evt_handler = on_hts_evt;
hts_init.temp_type_as_characteristic = TEMP_TYPE_AS_CHARACTERISTIC;
hts_init.temp_type = BLE_HTS_TEMP_TYPE_BODY;
// Here the sec level for the Health Thermometer Service can be changed/increased.
hts_init.ht_meas_cccd_wr_sec = SEC_JUST_WORKS;
hts_init.ht_type_rd_sec = SEC_OPEN;
err_code = ble_hts_init(&m_hts, &hts_init);
APP_ERROR_CHECK(err_code);
// Initialize Battery Service.
memset(&bas_init, 0, sizeof(bas_init));
// Here the sec level for the Battery Service can be changed/increased.
bas_init.bl_rd_sec = SEC_OPEN;
bas_init.bl_cccd_wr_sec = SEC_OPEN;
bas_init.bl_report_rd_sec = SEC_OPEN;
bas_init.evt_handler = NULL;
bas_init.support_notification = true;
bas_init.p_report_ref = NULL;
bas_init.initial_batt_level = 100;
err_code = ble_bas_init(&m_bas, &bas_init);
APP_ERROR_CHECK(err_code);
} }
...@@ -594,6 +709,12 @@ static void bsp_event_handler(bsp_event_t event) ...@@ -594,6 +709,12 @@ static void bsp_event_handler(bsp_event_t event)
} }
} }
break; // BSP_EVENT_KEY_0 break; // BSP_EVENT_KEY_0
case BSP_EVENT_KEY_0:
if (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
temperature_measurement_send();
}
break;
default: default:
break; break;
......
...@@ -245,7 +245,7 @@ ...@@ -245,7 +245,7 @@
// <e> BLE_BAS_ENABLED - ble_bas - Battery Service // <e> BLE_BAS_ENABLED - ble_bas - Battery Service
//========================================================== //==========================================================
#ifndef BLE_BAS_ENABLED #ifndef BLE_BAS_ENABLED
#define BLE_BAS_ENABLED 0 #define BLE_BAS_ENABLED 1
#endif #endif
// <e> BLE_BAS_CONFIG_LOG_ENABLED - Enables logging in the module. // <e> BLE_BAS_CONFIG_LOG_ENABLED - Enables logging in the module.
//========================================================== //==========================================================
...@@ -353,7 +353,7 @@ ...@@ -353,7 +353,7 @@
#ifndef BLE_HTS_ENABLED #ifndef BLE_HTS_ENABLED
#define BLE_HTS_ENABLED 0 #define BLE_HTS_ENABLED 1
#endif #endif
// <q> BLE_IAS_C_ENABLED - ble_ias_c - Immediate Alert Service Client // <q> BLE_IAS_C_ENABLED - ble_ias_c - Immediate Alert Service Client
......
...@@ -131,6 +131,8 @@ ...@@ -131,6 +131,8 @@
<file file_name="../../../../../nRF5_SDK_15.3.0_59ac345/components/softdevice/common/nrf_sdh_ble.c" /> <file file_name="../../../../../nRF5_SDK_15.3.0_59ac345/components/softdevice/common/nrf_sdh_ble.c" />
<file file_name="../../../../../nRF5_SDK_15.3.0_59ac345/components/softdevice/common/nrf_sdh_soc.c" /> <file file_name="../../../../../nRF5_SDK_15.3.0_59ac345/components/softdevice/common/nrf_sdh_soc.c" />
</folder> </folder>
<file file_name="../../../../../nRF5_SDK_15.3.0_59ac345/components/ble/ble_services/ble_hts/ble_hts.c" />
<file file_name="../../../../../nRF5_SDK_15.3.0_59ac345/components/ble/ble_services/ble_bas/ble_bas.c" />
</project> </project>
<configuration <configuration
Name="Release" Name="Release"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment