bluenrg_interface

Committer:
Ciesarik3
Date:
Mon Nov 12 18:36:18 2018 +0000
Revision:
0:fb1547f2354e
crc;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ciesarik3 0:fb1547f2354e 1 /**
Ciesarik3 0:fb1547f2354e 2 ******************************************************************************
Ciesarik3 0:fb1547f2354e 3 * @file sensor_service.c
Ciesarik3 0:fb1547f2354e 4 * @author MCD Application Team
Ciesarik3 0:fb1547f2354e 5 * @version V1.0.0
Ciesarik3 0:fb1547f2354e 6 * @date 04-July-2014
Ciesarik3 0:fb1547f2354e 7 * @brief Add a sample service using a vendor specific profile.
Ciesarik3 0:fb1547f2354e 8 ******************************************************************************
Ciesarik3 0:fb1547f2354e 9 * @attention
Ciesarik3 0:fb1547f2354e 10 *
Ciesarik3 0:fb1547f2354e 11 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
Ciesarik3 0:fb1547f2354e 12 *
Ciesarik3 0:fb1547f2354e 13 * Redistribution and use in source and binary forms, with or without modification,
Ciesarik3 0:fb1547f2354e 14 * are permitted provided that the following conditions are met:
Ciesarik3 0:fb1547f2354e 15 * 1. Redistributions of source code must retain the above copyright notice,
Ciesarik3 0:fb1547f2354e 16 * this list of conditions and the following disclaimer.
Ciesarik3 0:fb1547f2354e 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
Ciesarik3 0:fb1547f2354e 18 * this list of conditions and the following disclaimer in the documentation
Ciesarik3 0:fb1547f2354e 19 * and/or other materials provided with the distribution.
Ciesarik3 0:fb1547f2354e 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Ciesarik3 0:fb1547f2354e 21 * may be used to endorse or promote products derived from this software
Ciesarik3 0:fb1547f2354e 22 * without specific prior written permission.
Ciesarik3 0:fb1547f2354e 23 *
Ciesarik3 0:fb1547f2354e 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Ciesarik3 0:fb1547f2354e 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Ciesarik3 0:fb1547f2354e 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Ciesarik3 0:fb1547f2354e 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Ciesarik3 0:fb1547f2354e 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Ciesarik3 0:fb1547f2354e 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Ciesarik3 0:fb1547f2354e 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Ciesarik3 0:fb1547f2354e 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Ciesarik3 0:fb1547f2354e 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Ciesarik3 0:fb1547f2354e 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Ciesarik3 0:fb1547f2354e 34 *
Ciesarik3 0:fb1547f2354e 35 ******************************************************************************
Ciesarik3 0:fb1547f2354e 36 */
Ciesarik3 0:fb1547f2354e 37 #include "sensor_service.h"
Ciesarik3 0:fb1547f2354e 38
Ciesarik3 0:fb1547f2354e 39 /** @addtogroup X-CUBE-BLE1_Applications
Ciesarik3 0:fb1547f2354e 40 * @{
Ciesarik3 0:fb1547f2354e 41 */
Ciesarik3 0:fb1547f2354e 42
Ciesarik3 0:fb1547f2354e 43 /** @addtogroup SensorDemo
Ciesarik3 0:fb1547f2354e 44 * @{
Ciesarik3 0:fb1547f2354e 45 */
Ciesarik3 0:fb1547f2354e 46
Ciesarik3 0:fb1547f2354e 47 /** @defgroup SENSOR_SERVICE
Ciesarik3 0:fb1547f2354e 48 * @{
Ciesarik3 0:fb1547f2354e 49 */
Ciesarik3 0:fb1547f2354e 50
Ciesarik3 0:fb1547f2354e 51 /** @defgroup SENSOR_SERVICE_Private_Variables
Ciesarik3 0:fb1547f2354e 52 * @{
Ciesarik3 0:fb1547f2354e 53 */
Ciesarik3 0:fb1547f2354e 54 /* Private variables ---------------------------------------------------------*/
Ciesarik3 0:fb1547f2354e 55 volatile int connected = FALSE;
Ciesarik3 0:fb1547f2354e 56 volatile uint8_t set_connectable = 1;
Ciesarik3 0:fb1547f2354e 57 volatile uint16_t connection_handle = 0;
Ciesarik3 0:fb1547f2354e 58 volatile uint8_t notification_enabled = FALSE;
Ciesarik3 0:fb1547f2354e 59 volatile AxesRaw_t axes_data = {0, 0, 0};
Ciesarik3 0:fb1547f2354e 60 uint16_t sampleServHandle, TXCharHandle, RXCharHandle;
Ciesarik3 0:fb1547f2354e 61 uint16_t accServHandle, freeFallCharHandle, accCharHandle;
Ciesarik3 0:fb1547f2354e 62 uint16_t envSensServHandle, tempCharHandle, pressCharHandle, humidityCharHandle;
Ciesarik3 0:fb1547f2354e 63
Ciesarik3 0:fb1547f2354e 64 #if NEW_SERVICES
Ciesarik3 0:fb1547f2354e 65 uint16_t timeServHandle, secondsCharHandle, minuteCharHandle;
Ciesarik3 0:fb1547f2354e 66 uint16_t ledServHandle, ledButtonCharHandle;
Ciesarik3 0:fb1547f2354e 67 uint8_t ledState = 0;
Ciesarik3 0:fb1547f2354e 68 int previousMinuteValue = -1;
Ciesarik3 0:fb1547f2354e 69 extern uint8_t bnrg_expansion_board;
Ciesarik3 0:fb1547f2354e 70 #endif
Ciesarik3 0:fb1547f2354e 71 /**
Ciesarik3 0:fb1547f2354e 72 * @}
Ciesarik3 0:fb1547f2354e 73 */
Ciesarik3 0:fb1547f2354e 74
Ciesarik3 0:fb1547f2354e 75 /** @defgroup SENSOR_SERVICE_Private_Macros
Ciesarik3 0:fb1547f2354e 76 * @{
Ciesarik3 0:fb1547f2354e 77 */
Ciesarik3 0:fb1547f2354e 78 /* Private macros ------------------------------------------------------------*/
Ciesarik3 0:fb1547f2354e 79 #define COPY_UUID_128(uuid_struct, uuid_15, uuid_14, uuid_13, uuid_12, uuid_11, uuid_10, uuid_9, uuid_8, uuid_7, uuid_6, uuid_5, uuid_4, uuid_3, uuid_2, uuid_1, uuid_0) \
Ciesarik3 0:fb1547f2354e 80 do {\
Ciesarik3 0:fb1547f2354e 81 uuid_struct[0] = uuid_0; uuid_struct[1] = uuid_1; uuid_struct[2] = uuid_2; uuid_struct[3] = uuid_3; \
Ciesarik3 0:fb1547f2354e 82 uuid_struct[4] = uuid_4; uuid_struct[5] = uuid_5; uuid_struct[6] = uuid_6; uuid_struct[7] = uuid_7; \
Ciesarik3 0:fb1547f2354e 83 uuid_struct[8] = uuid_8; uuid_struct[9] = uuid_9; uuid_struct[10] = uuid_10; uuid_struct[11] = uuid_11; \
Ciesarik3 0:fb1547f2354e 84 uuid_struct[12] = uuid_12; uuid_struct[13] = uuid_13; uuid_struct[14] = uuid_14; uuid_struct[15] = uuid_15; \
Ciesarik3 0:fb1547f2354e 85 }while(0)
Ciesarik3 0:fb1547f2354e 86
Ciesarik3 0:fb1547f2354e 87 #if NEW_SERVICES
Ciesarik3 0:fb1547f2354e 88 #define COPY_ACC_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x02,0x36,0x6e,0x80, 0xcf,0x3a, 0x11,0xe1, 0x9a,0xb4, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 89 #define COPY_FREE_FALL_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0xe2,0x3e,0x78,0xa0, 0xcf,0x4a, 0x11,0xe1, 0x8f,0xfc, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 90 #define COPY_ACC_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x34,0x0a,0x1b,0x80, 0xcf,0x4b, 0x11,0xe1, 0xac,0x36, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 91
Ciesarik3 0:fb1547f2354e 92 #define COPY_ENV_SENS_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x42,0x82,0x1a,0x40, 0xe4,0x77, 0x11,0xe2, 0x82,0xd0, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 93 #define COPY_TEMP_CHAR_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0xa3,0x2e,0x55,0x20, 0xe4,0x77, 0x11,0xe2, 0xa9,0xe3, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 94 #define COPY_PRESS_CHAR_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0xcd,0x20,0xc4,0x80, 0xe4,0x8b, 0x11,0xe2, 0x84,0x0b, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 95 #define COPY_HUMIDITY_CHAR_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x01,0xc5,0x0b,0x60, 0xe4,0x8c, 0x11,0xe2, 0xa0,0x73, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 96
Ciesarik3 0:fb1547f2354e 97 // Time service: uuid = 0x08, 0x36, 0x6e, 0x80, 0xcf, 0x3a, 0x11, 0xe1, 0x9a, 0xb4, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b
Ciesarik3 0:fb1547f2354e 98 // straight uuid = 0x08366e80cf3a11e19ab40002a5d5c51b
Ciesarik3 0:fb1547f2354e 99 #define COPY_TIME_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x08,0x36,0x6e,0x80, 0xcf,0x3a, 0x11,0xe1, 0x9a,0xb4, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 100 #define COPY_TIME_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x09,0x36,0x6e,0x80, 0xcf,0x3a, 0x11,0xe1, 0x9a,0xb4, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 101 #define COPY_MINUTE_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x0a,0x36,0x6e,0x80, 0xcf,0x3a, 0x11,0xe1, 0x9a,0xb4, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 102
Ciesarik3 0:fb1547f2354e 103 // LED service
Ciesarik3 0:fb1547f2354e 104 #define COPY_LED_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x0b,0x36,0x6e,0x80, 0xcf,0x3a, 0x11,0xe1, 0x9a,0xb4, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 105 #define COPY_LED_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x0c,0x36,0x6e,0x80, 0xcf,0x3a, 0x11,0xe1, 0x9a,0xb4, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 106 #else
Ciesarik3 0:fb1547f2354e 107 #define COPY_ACC_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x02,0x36,0x6e,0x80, 0xcf,0x3a, 0x11,0xe1, 0x9a,0xb4, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 108 #define COPY_FREE_FALL_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0xe2,0x3e,0x78,0xa0, 0xcf,0x4a, 0x11,0xe1, 0x8f,0xfc, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 109 #define COPY_ACC_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x34,0x0a,0x1b,0x80, 0xcf,0x4b, 0x11,0xe1, 0xac,0x36, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 110
Ciesarik3 0:fb1547f2354e 111 #define COPY_ENV_SENS_SERVICE_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x42,0x82,0x1a,0x40, 0xe4,0x77, 0x11,0xe2, 0x82,0xd0, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 112 #define COPY_TEMP_CHAR_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0xa3,0x2e,0x55,0x20, 0xe4,0x77, 0x11,0xe2, 0xa9,0xe3, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 113 #define COPY_PRESS_CHAR_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0xcd,0x20,0xc4,0x80, 0xe4,0x8b, 0x11,0xe2, 0x84,0x0b, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 114 #define COPY_HUMIDITY_CHAR_UUID(uuid_struct) COPY_UUID_128(uuid_struct,0x01,0xc5,0x0b,0x60, 0xe4,0x8c, 0x11,0xe2, 0xa0,0x73, 0x00,0x02,0xa5,0xd5,0xc5,0x1b)
Ciesarik3 0:fb1547f2354e 115 #endif
Ciesarik3 0:fb1547f2354e 116
Ciesarik3 0:fb1547f2354e 117 /* Store Value into a buffer in Little Endian Format */
Ciesarik3 0:fb1547f2354e 118 #define STORE_LE_16(buf, val) ( ((buf)[0] = (uint8_t) (val) ) , \
Ciesarik3 0:fb1547f2354e 119 ((buf)[1] = (uint8_t) (val>>8) ) )
Ciesarik3 0:fb1547f2354e 120 /**
Ciesarik3 0:fb1547f2354e 121 * @}
Ciesarik3 0:fb1547f2354e 122 */
Ciesarik3 0:fb1547f2354e 123
Ciesarik3 0:fb1547f2354e 124 /** @defgroup SENSOR_SERVICE_Exported_Functions
Ciesarik3 0:fb1547f2354e 125 * @{
Ciesarik3 0:fb1547f2354e 126 */
Ciesarik3 0:fb1547f2354e 127 /**
Ciesarik3 0:fb1547f2354e 128 * @brief Add an accelerometer service using a vendor specific profile.
Ciesarik3 0:fb1547f2354e 129 *
Ciesarik3 0:fb1547f2354e 130 * @param None
Ciesarik3 0:fb1547f2354e 131 * @retval tBleStatus Status
Ciesarik3 0:fb1547f2354e 132 */
Ciesarik3 0:fb1547f2354e 133 tBleStatus Add_Acc_Service(void)
Ciesarik3 0:fb1547f2354e 134 {
Ciesarik3 0:fb1547f2354e 135 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 136
Ciesarik3 0:fb1547f2354e 137 uint8_t uuid[16];
Ciesarik3 0:fb1547f2354e 138
Ciesarik3 0:fb1547f2354e 139 COPY_ACC_SERVICE_UUID(uuid);
Ciesarik3 0:fb1547f2354e 140 ret = aci_gatt_add_serv(UUID_TYPE_128, uuid, PRIMARY_SERVICE, 7,
Ciesarik3 0:fb1547f2354e 141 &accServHandle);
Ciesarik3 0:fb1547f2354e 142 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 143
Ciesarik3 0:fb1547f2354e 144 COPY_FREE_FALL_UUID(uuid);
Ciesarik3 0:fb1547f2354e 145 ret = aci_gatt_add_char(accServHandle, UUID_TYPE_128, uuid, 1,
Ciesarik3 0:fb1547f2354e 146 CHAR_PROP_NOTIFY, ATTR_PERMISSION_NONE, 0,
Ciesarik3 0:fb1547f2354e 147 16, 0, &freeFallCharHandle);
Ciesarik3 0:fb1547f2354e 148 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 149
Ciesarik3 0:fb1547f2354e 150 COPY_ACC_UUID(uuid);
Ciesarik3 0:fb1547f2354e 151 ret = aci_gatt_add_char(accServHandle, UUID_TYPE_128, uuid, 6,
Ciesarik3 0:fb1547f2354e 152 CHAR_PROP_NOTIFY|CHAR_PROP_READ,
Ciesarik3 0:fb1547f2354e 153 ATTR_PERMISSION_NONE,
Ciesarik3 0:fb1547f2354e 154 GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP,
Ciesarik3 0:fb1547f2354e 155 16, 0, &accCharHandle);
Ciesarik3 0:fb1547f2354e 156 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 157
Ciesarik3 0:fb1547f2354e 158 PRINTF("Service ACC added. Handle 0x%04X, Free fall Charac handle: 0x%04X, Acc Charac handle: 0x%04X\n",accServHandle, freeFallCharHandle, accCharHandle);
Ciesarik3 0:fb1547f2354e 159 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 160
Ciesarik3 0:fb1547f2354e 161 fail:
Ciesarik3 0:fb1547f2354e 162 PRINTF("Error while adding ACC service.\n");
Ciesarik3 0:fb1547f2354e 163 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 164
Ciesarik3 0:fb1547f2354e 165 }
Ciesarik3 0:fb1547f2354e 166
Ciesarik3 0:fb1547f2354e 167 /**
Ciesarik3 0:fb1547f2354e 168 * @brief Send a notification for a Free Fall detection.
Ciesarik3 0:fb1547f2354e 169 *
Ciesarik3 0:fb1547f2354e 170 * @param None
Ciesarik3 0:fb1547f2354e 171 * @retval tBleStatus Status
Ciesarik3 0:fb1547f2354e 172 */
Ciesarik3 0:fb1547f2354e 173 tBleStatus Free_Fall_Notify(void)
Ciesarik3 0:fb1547f2354e 174 {
Ciesarik3 0:fb1547f2354e 175 uint8_t val;
Ciesarik3 0:fb1547f2354e 176 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 177
Ciesarik3 0:fb1547f2354e 178 val = 0x01;
Ciesarik3 0:fb1547f2354e 179 ret = aci_gatt_update_char_value(accServHandle, freeFallCharHandle, 0, 1,
Ciesarik3 0:fb1547f2354e 180 &val);
Ciesarik3 0:fb1547f2354e 181
Ciesarik3 0:fb1547f2354e 182 if (ret != BLE_STATUS_SUCCESS){
Ciesarik3 0:fb1547f2354e 183 PRINTF("Error while updating FFall characteristic.\n") ;
Ciesarik3 0:fb1547f2354e 184 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 185 }
Ciesarik3 0:fb1547f2354e 186 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 187 }
Ciesarik3 0:fb1547f2354e 188
Ciesarik3 0:fb1547f2354e 189 /**
Ciesarik3 0:fb1547f2354e 190 * @brief Update acceleration characteristic value.
Ciesarik3 0:fb1547f2354e 191 *
Ciesarik3 0:fb1547f2354e 192 * @param Structure containing acceleration value in mg
Ciesarik3 0:fb1547f2354e 193 * @retval Status
Ciesarik3 0:fb1547f2354e 194 */
Ciesarik3 0:fb1547f2354e 195 tBleStatus Acc_Update(AxesRaw_t *data)
Ciesarik3 0:fb1547f2354e 196 {
Ciesarik3 0:fb1547f2354e 197 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 198 uint8_t buff[6];
Ciesarik3 0:fb1547f2354e 199
Ciesarik3 0:fb1547f2354e 200 STORE_LE_16(buff,data->AXIS_X);
Ciesarik3 0:fb1547f2354e 201 STORE_LE_16(buff+2,data->AXIS_Y);
Ciesarik3 0:fb1547f2354e 202 STORE_LE_16(buff+4,data->AXIS_Z);
Ciesarik3 0:fb1547f2354e 203
Ciesarik3 0:fb1547f2354e 204 ret = aci_gatt_update_char_value(accServHandle, accCharHandle, 0, 6, buff);
Ciesarik3 0:fb1547f2354e 205
Ciesarik3 0:fb1547f2354e 206 if (ret != BLE_STATUS_SUCCESS){
Ciesarik3 0:fb1547f2354e 207 PRINTF("Error while updating ACC characteristic.\n") ;
Ciesarik3 0:fb1547f2354e 208 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 209 }
Ciesarik3 0:fb1547f2354e 210 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 211 }
Ciesarik3 0:fb1547f2354e 212
Ciesarik3 0:fb1547f2354e 213 /**
Ciesarik3 0:fb1547f2354e 214 * @brief Add the Environmental Sensor service.
Ciesarik3 0:fb1547f2354e 215 *
Ciesarik3 0:fb1547f2354e 216 * @param None
Ciesarik3 0:fb1547f2354e 217 * @retval Status
Ciesarik3 0:fb1547f2354e 218 */
Ciesarik3 0:fb1547f2354e 219 tBleStatus Add_Environmental_Sensor_Service(void)
Ciesarik3 0:fb1547f2354e 220 {
Ciesarik3 0:fb1547f2354e 221 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 222 uint8_t uuid[16];
Ciesarik3 0:fb1547f2354e 223 uint16_t uuid16;
Ciesarik3 0:fb1547f2354e 224 charactFormat charFormat;
Ciesarik3 0:fb1547f2354e 225 uint16_t descHandle;
Ciesarik3 0:fb1547f2354e 226
Ciesarik3 0:fb1547f2354e 227 COPY_ENV_SENS_SERVICE_UUID(uuid);
Ciesarik3 0:fb1547f2354e 228 ret = aci_gatt_add_serv(UUID_TYPE_128, uuid, PRIMARY_SERVICE, 10,
Ciesarik3 0:fb1547f2354e 229 &envSensServHandle);
Ciesarik3 0:fb1547f2354e 230 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 231
Ciesarik3 0:fb1547f2354e 232 /* Temperature Characteristic */
Ciesarik3 0:fb1547f2354e 233 COPY_TEMP_CHAR_UUID(uuid);
Ciesarik3 0:fb1547f2354e 234 ret = aci_gatt_add_char(envSensServHandle, UUID_TYPE_128, uuid, 2,
Ciesarik3 0:fb1547f2354e 235 CHAR_PROP_READ, ATTR_PERMISSION_NONE,
Ciesarik3 0:fb1547f2354e 236 GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP,
Ciesarik3 0:fb1547f2354e 237 16, 0, &tempCharHandle);
Ciesarik3 0:fb1547f2354e 238 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 239
Ciesarik3 0:fb1547f2354e 240 charFormat.format = FORMAT_SINT16;
Ciesarik3 0:fb1547f2354e 241 charFormat.exp = -1;
Ciesarik3 0:fb1547f2354e 242 charFormat.unit = UNIT_TEMP_CELSIUS;
Ciesarik3 0:fb1547f2354e 243 charFormat.name_space = 0;
Ciesarik3 0:fb1547f2354e 244 charFormat.desc = 0;
Ciesarik3 0:fb1547f2354e 245
Ciesarik3 0:fb1547f2354e 246 uuid16 = CHAR_FORMAT_DESC_UUID;
Ciesarik3 0:fb1547f2354e 247
Ciesarik3 0:fb1547f2354e 248 ret = aci_gatt_add_char_desc(envSensServHandle,
Ciesarik3 0:fb1547f2354e 249 tempCharHandle,
Ciesarik3 0:fb1547f2354e 250 UUID_TYPE_16,
Ciesarik3 0:fb1547f2354e 251 (uint8_t *)&uuid16,
Ciesarik3 0:fb1547f2354e 252 7,
Ciesarik3 0:fb1547f2354e 253 7,
Ciesarik3 0:fb1547f2354e 254 (void *)&charFormat,
Ciesarik3 0:fb1547f2354e 255 ATTR_PERMISSION_NONE,
Ciesarik3 0:fb1547f2354e 256 ATTR_ACCESS_READ_ONLY,
Ciesarik3 0:fb1547f2354e 257 0,
Ciesarik3 0:fb1547f2354e 258 16,
Ciesarik3 0:fb1547f2354e 259 FALSE,
Ciesarik3 0:fb1547f2354e 260 &descHandle);
Ciesarik3 0:fb1547f2354e 261 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 262
Ciesarik3 0:fb1547f2354e 263 /* Pressure Characteristic */
Ciesarik3 0:fb1547f2354e 264 if(1){ //FIXME
Ciesarik3 0:fb1547f2354e 265 COPY_PRESS_CHAR_UUID(uuid);
Ciesarik3 0:fb1547f2354e 266 ret = aci_gatt_add_char(envSensServHandle, UUID_TYPE_128, uuid, 3,
Ciesarik3 0:fb1547f2354e 267 CHAR_PROP_READ, ATTR_PERMISSION_NONE,
Ciesarik3 0:fb1547f2354e 268 GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP,
Ciesarik3 0:fb1547f2354e 269 16, 0, &pressCharHandle);
Ciesarik3 0:fb1547f2354e 270 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 271
Ciesarik3 0:fb1547f2354e 272 charFormat.format = FORMAT_SINT24;
Ciesarik3 0:fb1547f2354e 273 charFormat.exp = -5;
Ciesarik3 0:fb1547f2354e 274 charFormat.unit = UNIT_PRESSURE_BAR;
Ciesarik3 0:fb1547f2354e 275 charFormat.name_space = 0;
Ciesarik3 0:fb1547f2354e 276 charFormat.desc = 0;
Ciesarik3 0:fb1547f2354e 277
Ciesarik3 0:fb1547f2354e 278 uuid16 = CHAR_FORMAT_DESC_UUID;
Ciesarik3 0:fb1547f2354e 279
Ciesarik3 0:fb1547f2354e 280 ret = aci_gatt_add_char_desc(envSensServHandle,
Ciesarik3 0:fb1547f2354e 281 pressCharHandle,
Ciesarik3 0:fb1547f2354e 282 UUID_TYPE_16,
Ciesarik3 0:fb1547f2354e 283 (uint8_t *)&uuid16,
Ciesarik3 0:fb1547f2354e 284 7,
Ciesarik3 0:fb1547f2354e 285 7,
Ciesarik3 0:fb1547f2354e 286 (void *)&charFormat,
Ciesarik3 0:fb1547f2354e 287 ATTR_PERMISSION_NONE,
Ciesarik3 0:fb1547f2354e 288 ATTR_ACCESS_READ_ONLY,
Ciesarik3 0:fb1547f2354e 289 0,
Ciesarik3 0:fb1547f2354e 290 16,
Ciesarik3 0:fb1547f2354e 291 FALSE,
Ciesarik3 0:fb1547f2354e 292 &descHandle);
Ciesarik3 0:fb1547f2354e 293 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 294 }
Ciesarik3 0:fb1547f2354e 295 /* Humidity Characteristic */
Ciesarik3 0:fb1547f2354e 296 if(1){ //FIXME
Ciesarik3 0:fb1547f2354e 297 COPY_HUMIDITY_CHAR_UUID(uuid);
Ciesarik3 0:fb1547f2354e 298 ret = aci_gatt_add_char(envSensServHandle, UUID_TYPE_128, uuid, 2,
Ciesarik3 0:fb1547f2354e 299 CHAR_PROP_READ, ATTR_PERMISSION_NONE,
Ciesarik3 0:fb1547f2354e 300 GATT_NOTIFY_READ_REQ_AND_WAIT_FOR_APPL_RESP,
Ciesarik3 0:fb1547f2354e 301 16, 0, &humidityCharHandle);
Ciesarik3 0:fb1547f2354e 302 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 303
Ciesarik3 0:fb1547f2354e 304 charFormat.format = FORMAT_UINT16;
Ciesarik3 0:fb1547f2354e 305 charFormat.exp = -1;
Ciesarik3 0:fb1547f2354e 306 charFormat.unit = UNIT_UNITLESS;
Ciesarik3 0:fb1547f2354e 307 charFormat.name_space = 0;
Ciesarik3 0:fb1547f2354e 308 charFormat.desc = 0;
Ciesarik3 0:fb1547f2354e 309
Ciesarik3 0:fb1547f2354e 310 uuid16 = CHAR_FORMAT_DESC_UUID;
Ciesarik3 0:fb1547f2354e 311
Ciesarik3 0:fb1547f2354e 312 ret = aci_gatt_add_char_desc(envSensServHandle,
Ciesarik3 0:fb1547f2354e 313 humidityCharHandle,
Ciesarik3 0:fb1547f2354e 314 UUID_TYPE_16,
Ciesarik3 0:fb1547f2354e 315 (uint8_t *)&uuid16,
Ciesarik3 0:fb1547f2354e 316 7,
Ciesarik3 0:fb1547f2354e 317 7,
Ciesarik3 0:fb1547f2354e 318 (void *)&charFormat,
Ciesarik3 0:fb1547f2354e 319 ATTR_PERMISSION_NONE,
Ciesarik3 0:fb1547f2354e 320 ATTR_ACCESS_READ_ONLY,
Ciesarik3 0:fb1547f2354e 321 0,
Ciesarik3 0:fb1547f2354e 322 16,
Ciesarik3 0:fb1547f2354e 323 FALSE,
Ciesarik3 0:fb1547f2354e 324 &descHandle);
Ciesarik3 0:fb1547f2354e 325 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 326 }
Ciesarik3 0:fb1547f2354e 327 PRINTF("Service ENV_SENS added. Handle 0x%04X, TEMP Charac handle: 0x%04X, PRESS Charac handle: 0x%04X, HUMID Charac handle: 0x%04X\n",envSensServHandle, tempCharHandle, pressCharHandle, humidityCharHandle);
Ciesarik3 0:fb1547f2354e 328 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 329
Ciesarik3 0:fb1547f2354e 330 fail:
Ciesarik3 0:fb1547f2354e 331 PRINTF("Error while adding ENV_SENS service.\n");
Ciesarik3 0:fb1547f2354e 332 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 333
Ciesarik3 0:fb1547f2354e 334 }
Ciesarik3 0:fb1547f2354e 335
Ciesarik3 0:fb1547f2354e 336 /**
Ciesarik3 0:fb1547f2354e 337 * @brief Update temperature characteristic value.
Ciesarik3 0:fb1547f2354e 338 * @param Temperature in tenths of degree
Ciesarik3 0:fb1547f2354e 339 * @retval Status
Ciesarik3 0:fb1547f2354e 340 */
Ciesarik3 0:fb1547f2354e 341 tBleStatus Temp_Update(int16_t temp)
Ciesarik3 0:fb1547f2354e 342 {
Ciesarik3 0:fb1547f2354e 343 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 344
Ciesarik3 0:fb1547f2354e 345 ret = aci_gatt_update_char_value(envSensServHandle, tempCharHandle, 0, 2,
Ciesarik3 0:fb1547f2354e 346 (uint8_t*)&temp);
Ciesarik3 0:fb1547f2354e 347
Ciesarik3 0:fb1547f2354e 348 if (ret != BLE_STATUS_SUCCESS){
Ciesarik3 0:fb1547f2354e 349 PRINTF("Error while updating TEMP characteristic.\n") ;
Ciesarik3 0:fb1547f2354e 350 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 351 }
Ciesarik3 0:fb1547f2354e 352 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 353
Ciesarik3 0:fb1547f2354e 354 }
Ciesarik3 0:fb1547f2354e 355
Ciesarik3 0:fb1547f2354e 356 /**
Ciesarik3 0:fb1547f2354e 357 * @brief Update pressure characteristic value.
Ciesarik3 0:fb1547f2354e 358 * @param int32_t Pressure in mbar
Ciesarik3 0:fb1547f2354e 359 * @retval tBleStatus Status
Ciesarik3 0:fb1547f2354e 360 */
Ciesarik3 0:fb1547f2354e 361 tBleStatus Press_Update(int32_t press)
Ciesarik3 0:fb1547f2354e 362 {
Ciesarik3 0:fb1547f2354e 363 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 364
Ciesarik3 0:fb1547f2354e 365 ret = aci_gatt_update_char_value(envSensServHandle, pressCharHandle, 0, 3,
Ciesarik3 0:fb1547f2354e 366 (uint8_t*)&press);
Ciesarik3 0:fb1547f2354e 367
Ciesarik3 0:fb1547f2354e 368 if (ret != BLE_STATUS_SUCCESS){
Ciesarik3 0:fb1547f2354e 369 PRINTF("Error while updating TEMP characteristic.\n") ;
Ciesarik3 0:fb1547f2354e 370 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 371 }
Ciesarik3 0:fb1547f2354e 372 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 373
Ciesarik3 0:fb1547f2354e 374 }
Ciesarik3 0:fb1547f2354e 375
Ciesarik3 0:fb1547f2354e 376 /**
Ciesarik3 0:fb1547f2354e 377 * @brief Update humidity characteristic value.
Ciesarik3 0:fb1547f2354e 378 * @param uint16_thumidity RH (Relative Humidity) in thenths of %
Ciesarik3 0:fb1547f2354e 379 * @retval tBleStatus Status
Ciesarik3 0:fb1547f2354e 380 */
Ciesarik3 0:fb1547f2354e 381 tBleStatus Humidity_Update(uint16_t humidity)
Ciesarik3 0:fb1547f2354e 382 {
Ciesarik3 0:fb1547f2354e 383 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 384
Ciesarik3 0:fb1547f2354e 385 ret = aci_gatt_update_char_value(envSensServHandle, humidityCharHandle, 0, 2,
Ciesarik3 0:fb1547f2354e 386 (uint8_t*)&humidity);
Ciesarik3 0:fb1547f2354e 387
Ciesarik3 0:fb1547f2354e 388 if (ret != BLE_STATUS_SUCCESS){
Ciesarik3 0:fb1547f2354e 389 PRINTF("Error while updating TEMP characteristic.\n") ;
Ciesarik3 0:fb1547f2354e 390 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 391 }
Ciesarik3 0:fb1547f2354e 392 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 393
Ciesarik3 0:fb1547f2354e 394 }
Ciesarik3 0:fb1547f2354e 395
Ciesarik3 0:fb1547f2354e 396 /**
Ciesarik3 0:fb1547f2354e 397 * @brief Puts the device in connectable mode.
Ciesarik3 0:fb1547f2354e 398 * If you want to specify a UUID list in the advertising data, those data can
Ciesarik3 0:fb1547f2354e 399 * be specified as a parameter in aci_gap_set_discoverable().
Ciesarik3 0:fb1547f2354e 400 * For manufacture data, aci_gap_update_adv_data must be called.
Ciesarik3 0:fb1547f2354e 401 * @param None
Ciesarik3 0:fb1547f2354e 402 * @retval None
Ciesarik3 0:fb1547f2354e 403 */
Ciesarik3 0:fb1547f2354e 404 /* Ex.:
Ciesarik3 0:fb1547f2354e 405 *
Ciesarik3 0:fb1547f2354e 406 * tBleStatus ret;
Ciesarik3 0:fb1547f2354e 407 * const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME,'B','l','u','e','N','R','G'};
Ciesarik3 0:fb1547f2354e 408 * const uint8_t serviceUUIDList[] = {AD_TYPE_16_BIT_SERV_UUID,0x34,0x12};
Ciesarik3 0:fb1547f2354e 409 * const uint8_t manuf_data[] = {4, AD_TYPE_MANUFACTURER_SPECIFIC_DATA, 0x05, 0x02, 0x01};
Ciesarik3 0:fb1547f2354e 410 *
Ciesarik3 0:fb1547f2354e 411 * ret = aci_gap_set_discoverable(ADV_IND, 0, 0, PUBLIC_ADDR, NO_WHITE_LIST_USE,
Ciesarik3 0:fb1547f2354e 412 * 8, local_name, 3, serviceUUIDList, 0, 0);
Ciesarik3 0:fb1547f2354e 413 * ret = aci_gap_update_adv_data(5, manuf_data);
Ciesarik3 0:fb1547f2354e 414 *
Ciesarik3 0:fb1547f2354e 415 */
Ciesarik3 0:fb1547f2354e 416 void setConnectable(void)
Ciesarik3 0:fb1547f2354e 417 {
Ciesarik3 0:fb1547f2354e 418 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 419
Ciesarik3 0:fb1547f2354e 420 const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME,'B','l','u','e','N','R','G'};
Ciesarik3 0:fb1547f2354e 421
Ciesarik3 0:fb1547f2354e 422 /* disable scan response */
Ciesarik3 0:fb1547f2354e 423 hci_le_set_scan_resp_data(0,NULL);
Ciesarik3 0:fb1547f2354e 424 PRINTF("General Discoverable Mode.\n");
Ciesarik3 0:fb1547f2354e 425
Ciesarik3 0:fb1547f2354e 426 ret = aci_gap_set_discoverable(ADV_IND, 0, 0, PUBLIC_ADDR, NO_WHITE_LIST_USE,
Ciesarik3 0:fb1547f2354e 427 sizeof(local_name), local_name, 0, NULL, 0, 0);
Ciesarik3 0:fb1547f2354e 428 if (ret != BLE_STATUS_SUCCESS) {
Ciesarik3 0:fb1547f2354e 429 PRINTF("Error while setting discoverable mode (%d)\n", ret);
Ciesarik3 0:fb1547f2354e 430 }
Ciesarik3 0:fb1547f2354e 431 }
Ciesarik3 0:fb1547f2354e 432
Ciesarik3 0:fb1547f2354e 433 /**
Ciesarik3 0:fb1547f2354e 434 * @brief This function is called when there is a LE Connection Complete event.
Ciesarik3 0:fb1547f2354e 435 * @param uint8_t Address of peer device
Ciesarik3 0:fb1547f2354e 436 * @param uint16_t Connection handle
Ciesarik3 0:fb1547f2354e 437 * @retval None
Ciesarik3 0:fb1547f2354e 438 */
Ciesarik3 0:fb1547f2354e 439 void GAP_ConnectionComplete_CB(uint8_t addr[6], uint16_t handle)
Ciesarik3 0:fb1547f2354e 440 {
Ciesarik3 0:fb1547f2354e 441 connected = TRUE;
Ciesarik3 0:fb1547f2354e 442 connection_handle = handle;
Ciesarik3 0:fb1547f2354e 443
Ciesarik3 0:fb1547f2354e 444 PRINTF("Connected to device:");
Ciesarik3 0:fb1547f2354e 445 for(int i = 5; i > 0; i--){
Ciesarik3 0:fb1547f2354e 446 PRINTF("%02X-", addr[i]);
Ciesarik3 0:fb1547f2354e 447 }
Ciesarik3 0:fb1547f2354e 448 PRINTF("%02X\n", addr[0]);
Ciesarik3 0:fb1547f2354e 449 }
Ciesarik3 0:fb1547f2354e 450
Ciesarik3 0:fb1547f2354e 451 /**
Ciesarik3 0:fb1547f2354e 452 * @brief This function is called when the peer device gets disconnected.
Ciesarik3 0:fb1547f2354e 453 * @param None
Ciesarik3 0:fb1547f2354e 454 * @retval None
Ciesarik3 0:fb1547f2354e 455 */
Ciesarik3 0:fb1547f2354e 456 void GAP_DisconnectionComplete_CB(void)
Ciesarik3 0:fb1547f2354e 457 {
Ciesarik3 0:fb1547f2354e 458 connected = FALSE;
Ciesarik3 0:fb1547f2354e 459 PRINTF("Disconnected\n");
Ciesarik3 0:fb1547f2354e 460 /* Make the device connectable again. */
Ciesarik3 0:fb1547f2354e 461 set_connectable = TRUE;
Ciesarik3 0:fb1547f2354e 462 notification_enabled = FALSE;
Ciesarik3 0:fb1547f2354e 463 }
Ciesarik3 0:fb1547f2354e 464
Ciesarik3 0:fb1547f2354e 465 /**
Ciesarik3 0:fb1547f2354e 466 * @brief Read request callback.
Ciesarik3 0:fb1547f2354e 467 * @param uint16_t Handle of the attribute
Ciesarik3 0:fb1547f2354e 468 * @retval None
Ciesarik3 0:fb1547f2354e 469 */
Ciesarik3 0:fb1547f2354e 470 void Read_Request_CB(uint16_t handle)
Ciesarik3 0:fb1547f2354e 471 {
Ciesarik3 0:fb1547f2354e 472 if(handle == accCharHandle + 1){
Ciesarik3 0:fb1547f2354e 473 Acc_Update((AxesRaw_t*)&axes_data);
Ciesarik3 0:fb1547f2354e 474 }
Ciesarik3 0:fb1547f2354e 475 else if(handle == tempCharHandle + 1){
Ciesarik3 0:fb1547f2354e 476 int16_t data;
Ciesarik3 0:fb1547f2354e 477 data = 270 + ((uint64_t)rand()*15)/RAND_MAX; //sensor emulation
Ciesarik3 0:fb1547f2354e 478 Acc_Update((AxesRaw_t*)&axes_data); //FIXME: to overcome issue on Android App
Ciesarik3 0:fb1547f2354e 479 // If the user button is not pressed within
Ciesarik3 0:fb1547f2354e 480 // a short time after the connection,
Ciesarik3 0:fb1547f2354e 481 // a pop-up reports a "No valid characteristics found" error.
Ciesarik3 0:fb1547f2354e 482 Temp_Update(data);
Ciesarik3 0:fb1547f2354e 483 }
Ciesarik3 0:fb1547f2354e 484 else if(handle == pressCharHandle + 1){
Ciesarik3 0:fb1547f2354e 485 int32_t data;
Ciesarik3 0:fb1547f2354e 486 struct timer t;
Ciesarik3 0:fb1547f2354e 487 Timer_Set(&t, CLOCK_SECOND/10);
Ciesarik3 0:fb1547f2354e 488 data = 100000 + ((uint64_t)rand()*1000)/RAND_MAX;
Ciesarik3 0:fb1547f2354e 489 Press_Update(data);
Ciesarik3 0:fb1547f2354e 490 }
Ciesarik3 0:fb1547f2354e 491 else if(handle == humidityCharHandle + 1){
Ciesarik3 0:fb1547f2354e 492 uint16_t data;
Ciesarik3 0:fb1547f2354e 493
Ciesarik3 0:fb1547f2354e 494 data = 450 + ((uint64_t)rand()*100)/RAND_MAX;
Ciesarik3 0:fb1547f2354e 495
Ciesarik3 0:fb1547f2354e 496 Humidity_Update(data);
Ciesarik3 0:fb1547f2354e 497 }
Ciesarik3 0:fb1547f2354e 498
Ciesarik3 0:fb1547f2354e 499 //EXIT:
Ciesarik3 0:fb1547f2354e 500 if(connection_handle != 0)
Ciesarik3 0:fb1547f2354e 501 aci_gatt_allow_read(connection_handle);
Ciesarik3 0:fb1547f2354e 502 }
Ciesarik3 0:fb1547f2354e 503
Ciesarik3 0:fb1547f2354e 504 /**
Ciesarik3 0:fb1547f2354e 505 * @brief Callback processing the ACI events.
Ciesarik3 0:fb1547f2354e 506 * @note Inside this function each event must be identified and correctly
Ciesarik3 0:fb1547f2354e 507 * parsed.
Ciesarik3 0:fb1547f2354e 508 * @param void* Pointer to the ACI packet
Ciesarik3 0:fb1547f2354e 509 * @retval None
Ciesarik3 0:fb1547f2354e 510 */
Ciesarik3 0:fb1547f2354e 511 void HCI_Event_CB(void *pckt)
Ciesarik3 0:fb1547f2354e 512 {
Ciesarik3 0:fb1547f2354e 513 hci_uart_pckt *hci_pckt = pckt;
Ciesarik3 0:fb1547f2354e 514 /* obtain event packet */
Ciesarik3 0:fb1547f2354e 515 hci_event_pckt *event_pckt = (hci_event_pckt*)hci_pckt->data;
Ciesarik3 0:fb1547f2354e 516
Ciesarik3 0:fb1547f2354e 517 if(hci_pckt->type != HCI_EVENT_PKT)
Ciesarik3 0:fb1547f2354e 518 return;
Ciesarik3 0:fb1547f2354e 519
Ciesarik3 0:fb1547f2354e 520 switch(event_pckt->evt){
Ciesarik3 0:fb1547f2354e 521
Ciesarik3 0:fb1547f2354e 522 case EVT_DISCONN_COMPLETE:
Ciesarik3 0:fb1547f2354e 523 {
Ciesarik3 0:fb1547f2354e 524 GAP_DisconnectionComplete_CB();
Ciesarik3 0:fb1547f2354e 525 }
Ciesarik3 0:fb1547f2354e 526 break;
Ciesarik3 0:fb1547f2354e 527
Ciesarik3 0:fb1547f2354e 528 case EVT_LE_META_EVENT:
Ciesarik3 0:fb1547f2354e 529 {
Ciesarik3 0:fb1547f2354e 530 evt_le_meta_event *evt = (void *)event_pckt->data;
Ciesarik3 0:fb1547f2354e 531
Ciesarik3 0:fb1547f2354e 532 switch(evt->subevent){
Ciesarik3 0:fb1547f2354e 533 case EVT_LE_CONN_COMPLETE:
Ciesarik3 0:fb1547f2354e 534 {
Ciesarik3 0:fb1547f2354e 535 evt_le_connection_complete *cc = (void *)evt->data;
Ciesarik3 0:fb1547f2354e 536 GAP_ConnectionComplete_CB(cc->peer_bdaddr, cc->handle);
Ciesarik3 0:fb1547f2354e 537 }
Ciesarik3 0:fb1547f2354e 538 break;
Ciesarik3 0:fb1547f2354e 539 }
Ciesarik3 0:fb1547f2354e 540 }
Ciesarik3 0:fb1547f2354e 541 break;
Ciesarik3 0:fb1547f2354e 542
Ciesarik3 0:fb1547f2354e 543 case EVT_VENDOR:
Ciesarik3 0:fb1547f2354e 544 {
Ciesarik3 0:fb1547f2354e 545 evt_blue_aci *blue_evt = (void*)event_pckt->data;
Ciesarik3 0:fb1547f2354e 546 switch(blue_evt->ecode){
Ciesarik3 0:fb1547f2354e 547
Ciesarik3 0:fb1547f2354e 548 #if NEW_SERVICES
Ciesarik3 0:fb1547f2354e 549 case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED:
Ciesarik3 0:fb1547f2354e 550 {
Ciesarik3 0:fb1547f2354e 551 /* this callback is invoked when a GATT attribute is modified
Ciesarik3 0:fb1547f2354e 552 extract callback data and pass to suitable handler function */
Ciesarik3 0:fb1547f2354e 553 if (bnrg_expansion_board == IDB05A1) {
Ciesarik3 0:fb1547f2354e 554 evt_gatt_attr_modified_IDB05A1 *evt = (evt_gatt_attr_modified_IDB05A1*)blue_evt->data;
Ciesarik3 0:fb1547f2354e 555 Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data);
Ciesarik3 0:fb1547f2354e 556 }
Ciesarik3 0:fb1547f2354e 557 else {
Ciesarik3 0:fb1547f2354e 558 evt_gatt_attr_modified_IDB04A1 *evt = (evt_gatt_attr_modified_IDB04A1*)blue_evt->data;
Ciesarik3 0:fb1547f2354e 559 Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data);
Ciesarik3 0:fb1547f2354e 560 }
Ciesarik3 0:fb1547f2354e 561 }
Ciesarik3 0:fb1547f2354e 562 break;
Ciesarik3 0:fb1547f2354e 563 #endif
Ciesarik3 0:fb1547f2354e 564
Ciesarik3 0:fb1547f2354e 565 case EVT_BLUE_GATT_READ_PERMIT_REQ:
Ciesarik3 0:fb1547f2354e 566 {
Ciesarik3 0:fb1547f2354e 567 evt_gatt_read_permit_req *pr = (void*)blue_evt->data;
Ciesarik3 0:fb1547f2354e 568 Read_Request_CB(pr->attr_handle);
Ciesarik3 0:fb1547f2354e 569 }
Ciesarik3 0:fb1547f2354e 570 break;
Ciesarik3 0:fb1547f2354e 571 }
Ciesarik3 0:fb1547f2354e 572 }
Ciesarik3 0:fb1547f2354e 573 break;
Ciesarik3 0:fb1547f2354e 574 }
Ciesarik3 0:fb1547f2354e 575 }
Ciesarik3 0:fb1547f2354e 576
Ciesarik3 0:fb1547f2354e 577 #if NEW_SERVICES
Ciesarik3 0:fb1547f2354e 578 /**
Ciesarik3 0:fb1547f2354e 579 * @brief Add a time service using a vendor specific profile
Ciesarik3 0:fb1547f2354e 580 * @param None
Ciesarik3 0:fb1547f2354e 581 * @retval Status
Ciesarik3 0:fb1547f2354e 582 */
Ciesarik3 0:fb1547f2354e 583 tBleStatus Add_Time_Service(void)
Ciesarik3 0:fb1547f2354e 584 {
Ciesarik3 0:fb1547f2354e 585 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 586 uint8_t uuid[16];
Ciesarik3 0:fb1547f2354e 587
Ciesarik3 0:fb1547f2354e 588 /* copy "Timer service UUID" defined above to 'uuid' local variable */
Ciesarik3 0:fb1547f2354e 589 COPY_TIME_SERVICE_UUID(uuid);
Ciesarik3 0:fb1547f2354e 590
Ciesarik3 0:fb1547f2354e 591 /*
Ciesarik3 0:fb1547f2354e 592 * now add "Time service" to GATT server, service handle is returned
Ciesarik3 0:fb1547f2354e 593 * via 'timeServHandle' parameter of aci_gatt_add_serv() API.
Ciesarik3 0:fb1547f2354e 594 * Please refer to 'BlueNRG Application Command Interface.pdf' for detailed
Ciesarik3 0:fb1547f2354e 595 * API description
Ciesarik3 0:fb1547f2354e 596 */
Ciesarik3 0:fb1547f2354e 597 ret = aci_gatt_add_serv(UUID_TYPE_128, uuid, PRIMARY_SERVICE, 7,
Ciesarik3 0:fb1547f2354e 598 &timeServHandle);
Ciesarik3 0:fb1547f2354e 599 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 600
Ciesarik3 0:fb1547f2354e 601 /*
Ciesarik3 0:fb1547f2354e 602 * now add "Seconds characteristic" to Time service, characteristic handle
Ciesarik3 0:fb1547f2354e 603 * is returned via 'secondsCharHandle' parameter of aci_gatt_add_char() API.
Ciesarik3 0:fb1547f2354e 604 * This characteristic is read only, as specified by CHAR_PROP_READ parameter.
Ciesarik3 0:fb1547f2354e 605 * Please refer to 'BlueNRG Application Command Interface.pdf' for detailed
Ciesarik3 0:fb1547f2354e 606 * API description
Ciesarik3 0:fb1547f2354e 607 */
Ciesarik3 0:fb1547f2354e 608 COPY_TIME_UUID(uuid);
Ciesarik3 0:fb1547f2354e 609 ret = aci_gatt_add_char(timeServHandle, UUID_TYPE_128, uuid, 4,
Ciesarik3 0:fb1547f2354e 610 CHAR_PROP_READ, ATTR_PERMISSION_NONE, 0,
Ciesarik3 0:fb1547f2354e 611 16, 0, &secondsCharHandle);
Ciesarik3 0:fb1547f2354e 612
Ciesarik3 0:fb1547f2354e 613 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 614
Ciesarik3 0:fb1547f2354e 615 COPY_MINUTE_UUID(uuid);
Ciesarik3 0:fb1547f2354e 616 /*
Ciesarik3 0:fb1547f2354e 617 * Add "Minutes characteristic" to "Time service".
Ciesarik3 0:fb1547f2354e 618 * This characteristic is readable as well as notifiable only, as specified
Ciesarik3 0:fb1547f2354e 619 * by CHAR_PROP_NOTIFY|CHAR_PROP_READ parameter below.
Ciesarik3 0:fb1547f2354e 620 */
Ciesarik3 0:fb1547f2354e 621 ret = aci_gatt_add_char(timeServHandle, UUID_TYPE_128, uuid, 4,
Ciesarik3 0:fb1547f2354e 622 CHAR_PROP_NOTIFY|CHAR_PROP_READ, ATTR_PERMISSION_NONE, 0,
Ciesarik3 0:fb1547f2354e 623 16, 1, &minuteCharHandle);
Ciesarik3 0:fb1547f2354e 624 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 625
Ciesarik3 0:fb1547f2354e 626 PRINTF("Service TIME added. Handle 0x%04X, TIME Charac handle: 0x%04X\n",timeServHandle, secondsCharHandle);
Ciesarik3 0:fb1547f2354e 627 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 628
Ciesarik3 0:fb1547f2354e 629 /* return BLE_STATUS_ERROR if we reach this tag */
Ciesarik3 0:fb1547f2354e 630 fail:
Ciesarik3 0:fb1547f2354e 631 PRINTF("Error while adding Time service.\n");
Ciesarik3 0:fb1547f2354e 632 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 633 }
Ciesarik3 0:fb1547f2354e 634
Ciesarik3 0:fb1547f2354e 635 /**
Ciesarik3 0:fb1547f2354e 636 * @brief Update seconds characteristic value of Time service.
Ciesarik3 0:fb1547f2354e 637 * @param None
Ciesarik3 0:fb1547f2354e 638 * @retval Status
Ciesarik3 0:fb1547f2354e 639 */
Ciesarik3 0:fb1547f2354e 640 tBleStatus Seconds_Update(void)
Ciesarik3 0:fb1547f2354e 641 {
Ciesarik3 0:fb1547f2354e 642 uint32_t val;
Ciesarik3 0:fb1547f2354e 643 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 644
Ciesarik3 0:fb1547f2354e 645 /* Obtain system tick value in milliseconds, and convert it to seconds. */
Ciesarik3 0:fb1547f2354e 646 val = HAL_GetTick();
Ciesarik3 0:fb1547f2354e 647 val = val/1000;
Ciesarik3 0:fb1547f2354e 648
Ciesarik3 0:fb1547f2354e 649 /* create a time[] array to pass as last argument of aci_gatt_update_char_value() API*/
Ciesarik3 0:fb1547f2354e 650 const uint8_t time[4] = {(val >> 24)&0xFF, (val >> 16)&0xFF, (val >> 8)&0xFF, (val)&0xFF};
Ciesarik3 0:fb1547f2354e 651
Ciesarik3 0:fb1547f2354e 652 /*
Ciesarik3 0:fb1547f2354e 653 * Update value of "Seconds characteristic" using aci_gatt_update_char_value() API
Ciesarik3 0:fb1547f2354e 654 * Please refer to 'BlueNRG Application Command Interface.pdf' for detailed
Ciesarik3 0:fb1547f2354e 655 * API description
Ciesarik3 0:fb1547f2354e 656 */
Ciesarik3 0:fb1547f2354e 657 ret = aci_gatt_update_char_value(timeServHandle, secondsCharHandle, 0, 4,
Ciesarik3 0:fb1547f2354e 658 time);
Ciesarik3 0:fb1547f2354e 659
Ciesarik3 0:fb1547f2354e 660 if (ret != BLE_STATUS_SUCCESS){
Ciesarik3 0:fb1547f2354e 661 PRINTF("Error while updating TIME characteristic.\n") ;
Ciesarik3 0:fb1547f2354e 662 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 663 }
Ciesarik3 0:fb1547f2354e 664 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 665 }
Ciesarik3 0:fb1547f2354e 666
Ciesarik3 0:fb1547f2354e 667 /**
Ciesarik3 0:fb1547f2354e 668 * @brief Send a notification for a minute characteristic of time service.
Ciesarik3 0:fb1547f2354e 669 * @param None
Ciesarik3 0:fb1547f2354e 670 * @retval Status
Ciesarik3 0:fb1547f2354e 671 */
Ciesarik3 0:fb1547f2354e 672 tBleStatus Minutes_Notify(void)
Ciesarik3 0:fb1547f2354e 673 {
Ciesarik3 0:fb1547f2354e 674 uint32_t val;
Ciesarik3 0:fb1547f2354e 675 uint32_t minuteValue;
Ciesarik3 0:fb1547f2354e 676 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 677
Ciesarik3 0:fb1547f2354e 678 /* Obtain system tick value in milliseconds */
Ciesarik3 0:fb1547f2354e 679 val = HAL_GetTick();
Ciesarik3 0:fb1547f2354e 680
Ciesarik3 0:fb1547f2354e 681 /* update "Minutes characteristic" value if it has changed w.r.t. previous
Ciesarik3 0:fb1547f2354e 682 * "minute" value.
Ciesarik3 0:fb1547f2354e 683 */
Ciesarik3 0:fb1547f2354e 684 if((minuteValue=val/(60*1000))!=previousMinuteValue) {
Ciesarik3 0:fb1547f2354e 685 /* memorize this "minute" value for future usage */
Ciesarik3 0:fb1547f2354e 686 previousMinuteValue = minuteValue;
Ciesarik3 0:fb1547f2354e 687
Ciesarik3 0:fb1547f2354e 688 /* create a time[] array to pass as last argument of aci_gatt_update_char_value() API*/
Ciesarik3 0:fb1547f2354e 689 const uint8_t time[4] = {(minuteValue >> 24)&0xFF, (minuteValue >> 16)&0xFF, (minuteValue >> 8)&0xFF, (minuteValue)&0xFF};
Ciesarik3 0:fb1547f2354e 690
Ciesarik3 0:fb1547f2354e 691 /*
Ciesarik3 0:fb1547f2354e 692 * Update value of "Minutes characteristic" using aci_gatt_update_char_value() API
Ciesarik3 0:fb1547f2354e 693 * Please refer to 'BlueNRG Application Command Interface.pdf' for detailed
Ciesarik3 0:fb1547f2354e 694 * API description
Ciesarik3 0:fb1547f2354e 695 */
Ciesarik3 0:fb1547f2354e 696 ret = aci_gatt_update_char_value(timeServHandle, minuteCharHandle, 0, 4,
Ciesarik3 0:fb1547f2354e 697 time);
Ciesarik3 0:fb1547f2354e 698 if (ret != BLE_STATUS_SUCCESS){
Ciesarik3 0:fb1547f2354e 699 PRINTF("Error while updating TIME characteristic.\n") ;
Ciesarik3 0:fb1547f2354e 700 return BLE_STATUS_ERROR ;
Ciesarik3 0:fb1547f2354e 701 }
Ciesarik3 0:fb1547f2354e 702 }
Ciesarik3 0:fb1547f2354e 703 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 704 }
Ciesarik3 0:fb1547f2354e 705
Ciesarik3 0:fb1547f2354e 706 /**
Ciesarik3 0:fb1547f2354e 707 * @brief Updates "Seconds and Minutes characteristics" values.
Ciesarik3 0:fb1547f2354e 708 * @param None
Ciesarik3 0:fb1547f2354e 709 * @retval None
Ciesarik3 0:fb1547f2354e 710 */
Ciesarik3 0:fb1547f2354e 711 void Update_Time_Characteristics(void) {
Ciesarik3 0:fb1547f2354e 712 /* update "seconds and minutes characteristics" of time service */
Ciesarik3 0:fb1547f2354e 713 Seconds_Update();
Ciesarik3 0:fb1547f2354e 714 Minutes_Notify();
Ciesarik3 0:fb1547f2354e 715 }
Ciesarik3 0:fb1547f2354e 716
Ciesarik3 0:fb1547f2354e 717 /*
Ciesarik3 0:fb1547f2354e 718 * @brief Add LED button service using a vendor specific profile.
Ciesarik3 0:fb1547f2354e 719 * @param None
Ciesarik3 0:fb1547f2354e 720 * @retval Status
Ciesarik3 0:fb1547f2354e 721 */
Ciesarik3 0:fb1547f2354e 722 tBleStatus Add_LED_Service(void)
Ciesarik3 0:fb1547f2354e 723 {
Ciesarik3 0:fb1547f2354e 724 tBleStatus ret;
Ciesarik3 0:fb1547f2354e 725 uint8_t uuid[16];
Ciesarik3 0:fb1547f2354e 726
Ciesarik3 0:fb1547f2354e 727 /* copy "LED service UUID" defined above to 'uuid' local variable */
Ciesarik3 0:fb1547f2354e 728 COPY_LED_SERVICE_UUID(uuid);
Ciesarik3 0:fb1547f2354e 729 /*
Ciesarik3 0:fb1547f2354e 730 * now add "LED service" to GATT server, service handle is returned
Ciesarik3 0:fb1547f2354e 731 * via 'ledServHandle' parameter of aci_gatt_add_serv() API.
Ciesarik3 0:fb1547f2354e 732 * Please refer to 'BlueNRG Application Command Interface.pdf' for detailed
Ciesarik3 0:fb1547f2354e 733 * API description
Ciesarik3 0:fb1547f2354e 734 */
Ciesarik3 0:fb1547f2354e 735 ret = aci_gatt_add_serv(UUID_TYPE_128, uuid, PRIMARY_SERVICE, 7,
Ciesarik3 0:fb1547f2354e 736 &ledServHandle);
Ciesarik3 0:fb1547f2354e 737 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 738
Ciesarik3 0:fb1547f2354e 739 /* copy "LED button characteristic UUID" defined above to 'uuid' local variable */
Ciesarik3 0:fb1547f2354e 740 COPY_LED_UUID(uuid);
Ciesarik3 0:fb1547f2354e 741 /*
Ciesarik3 0:fb1547f2354e 742 * now add "LED button characteristic" to LED service, characteristic handle
Ciesarik3 0:fb1547f2354e 743 * is returned via 'ledButtonCharHandle' parameter of aci_gatt_add_char() API.
Ciesarik3 0:fb1547f2354e 744 * This characteristic is writable, as specified by 'CHAR_PROP_WRITE' parameter.
Ciesarik3 0:fb1547f2354e 745 * Please refer to 'BlueNRG Application Command Interface.pdf' for detailed
Ciesarik3 0:fb1547f2354e 746 * API description
Ciesarik3 0:fb1547f2354e 747 */
Ciesarik3 0:fb1547f2354e 748 ret = aci_gatt_add_char(ledServHandle, UUID_TYPE_128, uuid, 4,
Ciesarik3 0:fb1547f2354e 749 CHAR_PROP_WRITE | CHAR_PROP_WRITE_WITHOUT_RESP, ATTR_PERMISSION_NONE, GATT_NOTIFY_ATTRIBUTE_WRITE,
Ciesarik3 0:fb1547f2354e 750 16, 1, &ledButtonCharHandle);
Ciesarik3 0:fb1547f2354e 751 if (ret != BLE_STATUS_SUCCESS) goto fail;
Ciesarik3 0:fb1547f2354e 752
Ciesarik3 0:fb1547f2354e 753 PRINTF("Service LED BUTTON added. Handle 0x%04X, LED button Charac handle: 0x%04X\n",ledServHandle, ledButtonCharHandle);
Ciesarik3 0:fb1547f2354e 754 return BLE_STATUS_SUCCESS;
Ciesarik3 0:fb1547f2354e 755
Ciesarik3 0:fb1547f2354e 756 fail:
Ciesarik3 0:fb1547f2354e 757 PRINTF("Error while adding LED service.\n");
Ciesarik3 0:fb1547f2354e 758 return BLE_STATUS_ERROR;
Ciesarik3 0:fb1547f2354e 759 }
Ciesarik3 0:fb1547f2354e 760
Ciesarik3 0:fb1547f2354e 761 /**
Ciesarik3 0:fb1547f2354e 762 * @brief This function is called attribute value corresponding to
Ciesarik3 0:fb1547f2354e 763 * ledButtonCharHandle characteristic gets modified.
Ciesarik3 0:fb1547f2354e 764 * @param Handle of the attribute
Ciesarik3 0:fb1547f2354e 765 * @param Size of the modified attribute data
Ciesarik3 0:fb1547f2354e 766 * @param Pointer to the modified attribute data
Ciesarik3 0:fb1547f2354e 767 * @retval None
Ciesarik3 0:fb1547f2354e 768 */
Ciesarik3 0:fb1547f2354e 769 void Attribute_Modified_CB(uint16_t handle, uint8_t data_length, uint8_t *att_data)
Ciesarik3 0:fb1547f2354e 770 {
Ciesarik3 0:fb1547f2354e 771 /* If GATT client has modified 'LED button characteristic' value, toggle LED2 */
Ciesarik3 0:fb1547f2354e 772 if(handle == ledButtonCharHandle + 1){
Ciesarik3 0:fb1547f2354e 773 BSP_LED_Toggle(LED2);
Ciesarik3 0:fb1547f2354e 774 }
Ciesarik3 0:fb1547f2354e 775 }
Ciesarik3 0:fb1547f2354e 776 #endif /* NEW_SERVICES */
Ciesarik3 0:fb1547f2354e 777 /**
Ciesarik3 0:fb1547f2354e 778 * @}
Ciesarik3 0:fb1547f2354e 779 */
Ciesarik3 0:fb1547f2354e 780
Ciesarik3 0:fb1547f2354e 781 /**
Ciesarik3 0:fb1547f2354e 782 * @}
Ciesarik3 0:fb1547f2354e 783 */
Ciesarik3 0:fb1547f2354e 784
Ciesarik3 0:fb1547f2354e 785 /**
Ciesarik3 0:fb1547f2354e 786 * @}
Ciesarik3 0:fb1547f2354e 787 */
Ciesarik3 0:fb1547f2354e 788
Ciesarik3 0:fb1547f2354e 789 /**
Ciesarik3 0:fb1547f2354e 790 * @}
Ciesarik3 0:fb1547f2354e 791 */
Ciesarik3 0:fb1547f2354e 792
Ciesarik3 0:fb1547f2354e 793 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/