bluenrg_interface
sensor_service.c@0:fb1547f2354e, 2018-11-12 (annotated)
- Committer:
- Ciesarik3
- Date:
- Mon Nov 12 18:36:18 2018 +0000
- Revision:
- 0:fb1547f2354e
crc;
Who changed what in which revision?
User | Revision | Line number | New 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>© 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****/ |