1d62aa1c5SMilanka Ringwald /* 2d62aa1c5SMilanka Ringwald * Copyright (C) 2024 BlueKitchen GmbH 3d62aa1c5SMilanka Ringwald * 4d62aa1c5SMilanka Ringwald * Redistribution and use in source and binary forms, with or without 5d62aa1c5SMilanka Ringwald * modification, are permitted provided that the following conditions 6d62aa1c5SMilanka Ringwald * are met: 7d62aa1c5SMilanka Ringwald * 8d62aa1c5SMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 9d62aa1c5SMilanka Ringwald * notice, this list of conditions and the following disclaimer. 10d62aa1c5SMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11d62aa1c5SMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 12d62aa1c5SMilanka Ringwald * documentation and/or other materials provided with the distribution. 13d62aa1c5SMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 14d62aa1c5SMilanka Ringwald * contributors may be used to endorse or promote products derived 15d62aa1c5SMilanka Ringwald * from this software without specific prior written permission. 16d62aa1c5SMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 17d62aa1c5SMilanka Ringwald * personal benefit and not for any commercial purpose or for 18d62aa1c5SMilanka Ringwald * monetary gain. 19d62aa1c5SMilanka Ringwald * 20d62aa1c5SMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21d62aa1c5SMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22d62aa1c5SMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23d62aa1c5SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24d62aa1c5SMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25d62aa1c5SMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26d62aa1c5SMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27d62aa1c5SMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28d62aa1c5SMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29d62aa1c5SMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30d62aa1c5SMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31d62aa1c5SMilanka Ringwald * SUCH DAMAGE. 32d62aa1c5SMilanka Ringwald * 33d62aa1c5SMilanka Ringwald * Please inquire about commercial licensing options at 34d62aa1c5SMilanka Ringwald * [email protected] 35d62aa1c5SMilanka Ringwald * 36d62aa1c5SMilanka Ringwald */ 37d62aa1c5SMilanka Ringwald 38d62aa1c5SMilanka Ringwald /** 39d62aa1c5SMilanka Ringwald * @title Battery Service Server v1.1 40d62aa1c5SMilanka Ringwald * 41d62aa1c5SMilanka Ringwald */ 42d62aa1c5SMilanka Ringwald 43d62aa1c5SMilanka Ringwald #ifndef BATTERY_SERVICE_V1_SERVER_H 44d62aa1c5SMilanka Ringwald #define BATTERY_SERVICE_V1_SERVER_H 45d62aa1c5SMilanka Ringwald 46d62aa1c5SMilanka Ringwald #include <stdint.h> 47d62aa1c5SMilanka Ringwald 48d62aa1c5SMilanka Ringwald #if defined __cplusplus 49d62aa1c5SMilanka Ringwald extern "C" { 50d62aa1c5SMilanka Ringwald #endif 51d62aa1c5SMilanka Ringwald 52d62aa1c5SMilanka Ringwald /** 53d62aa1c5SMilanka Ringwald * @text The Battery Service allows to query your device's battery level in a standardized way. 54d62aa1c5SMilanka Ringwald * 55d62aa1c5SMilanka Ringwald * To use with your application, add `#import <battery_service.gatt>` to your .gatt file. 56d62aa1c5SMilanka Ringwald * After adding it to your .gatt file, you call *battery_service_server_init(value)* with the 57d62aa1c5SMilanka Ringwald * current value of your battery. The valid range for the battery level is 0-100. 58d62aa1c5SMilanka Ringwald * 59d62aa1c5SMilanka Ringwald * If the battery level changes, you can call *battery_service_server_set_battery_value(value)*. 60d62aa1c5SMilanka Ringwald * The service supports sending Notifications if the client enables them. 61d62aa1c5SMilanka Ringwald */ 62e5ae30daSMilanka Ringwald 63e5ae30daSMilanka Ringwald typedef enum { 64e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_LEVEL = 0, 65e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_LEVEL_STATUS, 66e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_ESTIMATED_SERVICE_DATE, 67e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_CRITCAL_STATUS, 68e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_ENERGY_STATUS, 69e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_TIME_STATUS, 70e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_HEALTH_STATUS, 71e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_HEALTH_INFORMATION, 72e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_BATTERY_INFORMATION, 73e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_MANUFACTURER_NAME_STRING, 74e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_MODEL_NUMBER_STRING, 75e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_SERIAL_NUMBER_STRING, 76e5ae30daSMilanka Ringwald BAS_CHARACTERISTIC_INDEX_NUM 77e5ae30daSMilanka Ringwald } bas_characteristic_index_t; 78e5ae30daSMilanka Ringwald 79e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_ENERGY_STATUS flags: 80e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_EXTERNAL_SOURCE_POWER_PRESENT 0x01 81e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_PRESENT_VOLTAGE_PRESENT 0x02 82e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_ENERGY_PRESENT 0x04 83e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_BATTERY_CAPACITY_PRESENT 0x08 84e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_CHARGE_RATE_PRESENT 0x10 85e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_ENERGY_AT_LAST_CHARGE_PRESENT 0x20 86de4a918bSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_RFU 0xC0 87e5ae30daSMilanka Ringwald 88e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_IDENTIFIER_PRESENT 0x01 89e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_BATTERY_LEVEL_PRESENT 0x02 90e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_ADDITIONAL_STATUS_PRESENT 0x04 91de4a918bSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_RFU 0xF8 92e5ae30daSMilanka Ringwald 93164aeebbSMilanka Ringwald #define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_SERVICE_REQUIRED 0x03 // 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU 94164aeebbSMilanka Ringwald #define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_BATTERY_FAULT 0x04 // 0 = No or Unknown, 1 = Yes 95164aeebbSMilanka Ringwald #define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_RFU 0xF8 96038930d0SMilanka Ringwald 97164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_EXTERNAL_BATTERY_PRESENT 0x0001 // (Bit 0) 0 = No, 1 = Yes 98164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_WIRED_EXTERNAL_POWER_SOURCE_CONNECTED 0x0006 // (Bit 1-2) 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU 99164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_WIRELESS_EXTERNAL_POWER_SOURCE_CONNECTED 0x0018 // (Bit 3-4) 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU 100164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_BATTERY_CHARGE_STATE 0x0060 // (Bit 5-6) 0 = Unknown, 1 = Charging, 2 = Discharging: Active 3 = Discharging: Inactive 101164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_BATTERY_CHARGE_LEVEL 0x0180 // (Bit 7-8) 0 = Unknown, 1 = Good, 2 = Low, 3 = Critical 102164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_TYPE 0x0E00 // (Bit 9-11) 0 = Unknown or Not Charging 1 = Constant Current, 2 = Constant Voltage, 3 = Trickle, 4 = Float, 5–7 = RFU 103164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_FAULT_REASON_BATTERY 0x1000 // (Bit 12) 104164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_FAULT_REASON_EXTERNAL_POWER 0x2000 // (Bit 13) 105164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_FAULT_REASON_OTHER 0x4000 // (Bit 14) 106164aeebbSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_RFU 0x8000 107e5ae30daSMilanka Ringwald 108e5ae30daSMilanka Ringwald #define BATTERY_CRITCAL_STATUS_BITMASK_CRITICAL_POWER_STATE 0x01 109e5ae30daSMilanka Ringwald #define BATTERY_CRITCAL_STATUS_BITMASK_IMMEDIATE_SERVICE_REQUIRED 0x02 110de4a918bSMilanka Ringwald #define BATTERY_CRITCAL_STATUS_BITMASK_RFU 0xFC 111e5ae30daSMilanka Ringwald 112e5ae30daSMilanka Ringwald #define BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_DISCHARGED_ON_STANDBY_PRESENT 0x01 113e5ae30daSMilanka Ringwald #define BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_RECHARGED_PRESENT 0x02 114de4a918bSMilanka Ringwald #define BATTERY_TIME_STATUS_BITMASK_RFU 0xFC 115e5ae30daSMilanka Ringwald 116e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_HEALTH_SUMMARY_PRESENT 0x01 117e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_CYCLE_COUNT_PRESENT 0x02 118e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_CURRENT_TEMPERATURE_PRESENT 0x04 119e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_DEEP_DISCHARGE_COUNT_PRESENT 0x08 120de4a918bSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_RFU 0xF0 121e5ae30daSMilanka Ringwald 122e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_INFORMATION_BITMASK_CYCLE_COUNT_DESIGNED_LIFETIME_PRESENT 0x01 123e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_INFORMATION_BITMASK_DESIGNED_OPERATING_TEMPERATURE_PRESENT 0x02 124de4a918bSMilanka Ringwald #define BATTERY_HEALTH_INFORMATION_BITMASK_RFU 0xFC 125e5ae30daSMilanka Ringwald 126e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_MANUFACTURE_DATE_PRESENT 0x0001 127e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_EXPIRATION_DATE_PRESENT 0x0002 128e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_DESIGNED_CAPACITY_PRESENT 0x0004 129e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_LOW_ENERGY_PRESENT 0x0008 130e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_CRITICAL_ENERGY_PRESENT 0x0010 131e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_CHEMISTRY_PRESENT 0x0020 132e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_NOMINAL_VOLTAGE_PRESENT 0x0040 133e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_AGGREGATION_GROUP_PRESENT 0x0080 134de4a918bSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_RFU 0xFF00 135e5ae30daSMilanka Ringwald 136e5ae30daSMilanka Ringwald #define BATTERY_INFROMATION_FEATURE_BITMASK_REPLACEABLE 0x01 137e5ae30daSMilanka Ringwald #define BATTERY_INFROMATION_FEATURE_BITMASK_RECHARGEABLE 0x02 138de4a918bSMilanka Ringwald #define BATTERY_INFROMATION_FEATURE_BITMASK_RFU 0xFC 139e5ae30daSMilanka Ringwald 140d62aa1c5SMilanka Ringwald struct battery_service_v1; 141d62aa1c5SMilanka Ringwald 142d62aa1c5SMilanka Ringwald typedef struct { 143d62aa1c5SMilanka Ringwald hci_con_handle_t con_handle; 144d62aa1c5SMilanka Ringwald 145d62aa1c5SMilanka Ringwald btstack_context_callback_registration_t scheduled_tasks_callback; 146038930d0SMilanka Ringwald uint16_t scheduled_tasks; 147e5ae30daSMilanka Ringwald uint16_t configurations[BAS_CHARACTERISTIC_INDEX_NUM]; 148d62aa1c5SMilanka Ringwald 149d62aa1c5SMilanka Ringwald struct battery_service_v1 * service; 150d62aa1c5SMilanka Ringwald } battery_service_v1_server_connection_t; 151d62aa1c5SMilanka Ringwald 152e5ae30daSMilanka Ringwald typedef struct { 153e5ae30daSMilanka Ringwald uint16_t value_handle; 154e5ae30daSMilanka Ringwald uint16_t client_configuration_handle; 155e5ae30daSMilanka Ringwald } bas_characteristic_t; 156e5ae30daSMilanka Ringwald 157db9fdd68SMilanka Ringwald typedef struct { 158db9fdd68SMilanka Ringwald uint8_t flags; 159db9fdd68SMilanka Ringwald uint16_t power_state_flags; 160db9fdd68SMilanka Ringwald 161db9fdd68SMilanka Ringwald uint16_t identifier; 162db9fdd68SMilanka Ringwald uint8_t battery_level; 163db9fdd68SMilanka Ringwald uint8_t additional_status_flags; 164db9fdd68SMilanka Ringwald } battery_level_status_t; 165db9fdd68SMilanka Ringwald 166db9fdd68SMilanka Ringwald typedef struct { 167db9fdd68SMilanka Ringwald uint8_t flags; 168db9fdd68SMilanka Ringwald uint16_t external_source_power_medfloat16; 169db9fdd68SMilanka Ringwald uint16_t present_voltage_medfloat16; 170db9fdd68SMilanka Ringwald uint16_t available_energy_medfloat16; 171db9fdd68SMilanka Ringwald uint16_t available_battery_capacity_medfloat16; 172db9fdd68SMilanka Ringwald uint16_t charge_rate_medfloat16; 173db9fdd68SMilanka Ringwald uint16_t available_energy_at_last_charge_medfloat16; 174db9fdd68SMilanka Ringwald } battery_energy_status_t; 175db9fdd68SMilanka Ringwald 176db9fdd68SMilanka Ringwald typedef struct { 177db9fdd68SMilanka Ringwald uint8_t flags; 178db9fdd68SMilanka Ringwald 179db9fdd68SMilanka Ringwald // A value of 0xFFFFFF represents: Unknown 180db9fdd68SMilanka Ringwald // A value of 0xFFFFFE represents: Greater than 0xFFFFFD 181db9fdd68SMilanka Ringwald uint32_t time_until_discharged_minutes; 182db9fdd68SMilanka Ringwald uint32_t time_until_discharged_on_standby_minutes; 183db9fdd68SMilanka Ringwald uint32_t time_until_recharged_minutes; 184db9fdd68SMilanka Ringwald } battery_time_status_t; 185db9fdd68SMilanka Ringwald 186db9fdd68SMilanka Ringwald typedef struct { 187db9fdd68SMilanka Ringwald uint8_t flags; 188db9fdd68SMilanka Ringwald 189db9fdd68SMilanka Ringwald uint8_t summary; // Allowed range is 0 to 100. 190db9fdd68SMilanka Ringwald uint16_t cycle_count; 191db9fdd68SMilanka Ringwald int8_t current_temperature_degree_celsius; 192db9fdd68SMilanka Ringwald uint16_t deep_discharge_count; 193db9fdd68SMilanka Ringwald } battery_health_status_t; 194db9fdd68SMilanka Ringwald 195db9fdd68SMilanka Ringwald typedef struct { 196db9fdd68SMilanka Ringwald uint8_t flags; 197db9fdd68SMilanka Ringwald uint16_t cycle_count_designed_lifetime; 198db9fdd68SMilanka Ringwald 199db9fdd68SMilanka Ringwald // A raw value of 0x7F represents: Greater than 126. 200db9fdd68SMilanka Ringwald // A raw value of 0x80 represents: Less than -127. 201db9fdd68SMilanka Ringwald int8_t min_designed_operating_temperature_degree_celsius; 202db9fdd68SMilanka Ringwald int8_t max_designed_operating_temperature_degree_celsius; 203db9fdd68SMilanka Ringwald } battery_health_information_t; 204db9fdd68SMilanka Ringwald 205de4a918bSMilanka Ringwald typedef enum { 206de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_UNKNOWN = 0, 207de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_ALKALINE, // (ZINC–MANGANESE DIOXIDE) 208de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_LEAD_ACID, 209de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_LITHIUM_LIFES2, // (LITHIUM-IRON DISULFIDE) 210de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_LITHIUM_LIMNO2, // (LITHIUM-MANGANESE DIOXIDE) 211de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_LITHIUM_ION_LI, 212de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_LITHIUM_POLYMER, 213de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_NICKEL_OXYHYDROXIDE_NIOX, // (ZINC-MANGANESE DIOXIDE/OXY NICKEL HYDROXIDE) 214de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_NICKEL_CADMIUM_NICD, 215de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_NICKEL_METAL_HYDRIDE_NIMH, 216de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_SILVER_OXIDE_AGZN, // (SILVER-ZINC) 217de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_ZINC_CHLORIDE, 218de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_ZINC_AIR, 219de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_ZINC_CARBON, 220de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_RFU_START = 14, 221de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_RFU_END = 254, 222de4a918bSMilanka Ringwald BATTERY_CHEMISTRY_OTHER = 255 223de4a918bSMilanka Ringwald } battery_chemistry_t; 224de4a918bSMilanka Ringwald 225db9fdd68SMilanka Ringwald typedef struct { 226db9fdd68SMilanka Ringwald uint16_t flags; 227db9fdd68SMilanka Ringwald uint8_t features; 228db9fdd68SMilanka Ringwald 229db9fdd68SMilanka Ringwald uint32_t manufacture_date_days; 230db9fdd68SMilanka Ringwald uint32_t expiration_date_days; 231db9fdd68SMilanka Ringwald 232db9fdd68SMilanka Ringwald uint16_t designed_capacity_kWh_medfloat16; 233db9fdd68SMilanka Ringwald uint16_t low_energy_kWh_medfloat16; 234db9fdd68SMilanka Ringwald uint16_t critical_energy_kWh_medfloat16; 235de4a918bSMilanka Ringwald battery_chemistry_t chemistry; 236db9fdd68SMilanka Ringwald uint16_t nominal_voltage_medfloat16; 237db9fdd68SMilanka Ringwald uint8_t aggregation_group; // 0: not in group, 255: RFU 238db9fdd68SMilanka Ringwald } battery_information_t; 239d62aa1c5SMilanka Ringwald 240d62aa1c5SMilanka Ringwald typedef struct battery_service_v1 { 241d62aa1c5SMilanka Ringwald btstack_linked_item_t item; 242d62aa1c5SMilanka Ringwald 243d62aa1c5SMilanka Ringwald // service 244d62aa1c5SMilanka Ringwald 245d62aa1c5SMilanka Ringwald att_service_handler_t service_handler; 246d62aa1c5SMilanka Ringwald 247f849ede7SMatthias Ringwald uint16_t service_id; 248f849ede7SMatthias Ringwald 249e5ae30daSMilanka Ringwald bas_characteristic_t characteristics[BAS_CHARACTERISTIC_INDEX_NUM]; 250164aeebbSMilanka Ringwald uint16_t battery_level_status_broadcast_configuration_handle; 251164aeebbSMilanka Ringwald uint16_t battery_level_status_broadcast_configuration; 252e5ae30daSMilanka Ringwald 253d62aa1c5SMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL 254e16068dbSMilanka Ringwald uint8_t battery_level; 255d62aa1c5SMilanka Ringwald 256e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL_STATUS 257db9fdd68SMilanka Ringwald const battery_level_status_t * level_status; 258e5ae30daSMilanka Ringwald 259e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_ESTIMATED_SERVICE_DATE 260e5ae30daSMilanka Ringwald uint32_t estimated_service_date_days; 261e5ae30daSMilanka Ringwald 262e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_CRITCAL_STATUS 263*6a9e015fSMatthias Ringwald uint8_t critical_status_flags; 264e5ae30daSMilanka Ringwald 265e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_ENERGY_STATUS 266db9fdd68SMilanka Ringwald const battery_energy_status_t * energy_status; 267e5ae30daSMilanka Ringwald 268e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_TIME_STATUS 269db9fdd68SMilanka Ringwald const battery_time_status_t * time_status; 270e5ae30daSMilanka Ringwald 271e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_HEALTH_STATUS 272db9fdd68SMilanka Ringwald const battery_health_status_t * health_status; 273e5ae30daSMilanka Ringwald 274e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_HEALTH_INFORMATION 275db9fdd68SMilanka Ringwald const battery_health_information_t * health_information; 276e5ae30daSMilanka Ringwald 277e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_INFORMATION 278db9fdd68SMilanka Ringwald const battery_information_t * information; 279e5ae30daSMilanka Ringwald 280e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_MANUFACTURER_NAME_STRING 281db9fdd68SMilanka Ringwald const char * manufacturer_name; 282e5ae30daSMilanka Ringwald 283e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_MODEL_NUMBER_STRING 284db9fdd68SMilanka Ringwald const char * model_number; 285e5ae30daSMilanka Ringwald 286e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_SERIAL_NUMBER_STRING 287db9fdd68SMilanka Ringwald const char * serial_number; 288e5ae30daSMilanka Ringwald 289d62aa1c5SMilanka Ringwald uint8_t connections_max_num; 290d62aa1c5SMilanka Ringwald battery_service_v1_server_connection_t * connections; 291d62aa1c5SMilanka Ringwald } battery_service_v1_t; 292d62aa1c5SMilanka Ringwald 293d62aa1c5SMilanka Ringwald /* API_START */ 294d62aa1c5SMilanka Ringwald 295d62aa1c5SMilanka Ringwald /** 296d62aa1c5SMilanka Ringwald * @brief Init Battery Service Server with ATT DB 297d62aa1c5SMilanka Ringwald */ 298d62aa1c5SMilanka Ringwald void battery_service_v1_server_init(void); 299d62aa1c5SMilanka Ringwald 300f368eb91SMatthias Ringwald /** 301f368eb91SMatthias Ringwald * @brief Register Battery Service 302f368eb91SMatthias Ringwald * @param service 303f368eb91SMatthias Ringwald * @param connections array of battery_service_v1_server_connection_t for storage 304f368eb91SMatthias Ringwald * @param connection_max_num 305f368eb91SMatthias Ringwald * @param out_service_id 306f368eb91SMatthias Ringwald */ 307f368eb91SMatthias Ringwald void battery_service_v1_server_register(battery_service_v1_t * service, battery_service_v1_server_connection_t * connections, uint8_t connection_max_num, uint16_t * out_service_id); 308d62aa1c5SMilanka Ringwald 309f368eb91SMatthias Ringwald /** 310f368eb91SMatthias Ringwald * @brief Deregister Battery Service Server 311f368eb91SMatthias Ringwald * @param service 312f368eb91SMatthias Ringwald */ 313d62aa1c5SMilanka Ringwald void battery_service_v1_server_deregister(battery_service_v1_t * service); 314ac8c27c4SMilanka Ringwald 315d62aa1c5SMilanka Ringwald /** 316feeb8459SMatthias Ringwald * @brief Set callback for broadcast updates. 317feeb8459SMatthias Ringwald * @param callback 318feeb8459SMatthias Ringwald */ 319feeb8459SMatthias Ringwald void battery_service_v1_server_set_packet_handler(btstack_packet_handler_t callback); 320feeb8459SMatthias Ringwald 321feeb8459SMatthias Ringwald /** 322e16068dbSMilanka Ringwald * @brief Update battery level 323e16068dbSMilanka Ringwald * @note Triggers notification if subscribed 324ac8c27c4SMilanka Ringwald * @param service 325e16068dbSMilanka Ringwald * @param battery_level in range 0-100 326e16068dbSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 327d62aa1c5SMilanka Ringwald */ 328e16068dbSMilanka Ringwald uint8_t battery_service_v1_server_set_battery_level(battery_service_v1_t * service,uint8_t battery_level); 329e16068dbSMilanka Ringwald 330e16068dbSMilanka Ringwald /** 331e16068dbSMilanka Ringwald * @brief Update battery level status 332e16068dbSMilanka Ringwald * @note Triggers notification or indication if subscribed 333e16068dbSMilanka Ringwald * @param service 334e16068dbSMilanka Ringwald * @param battery_level_status in range 0-100 335e16068dbSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 336e16068dbSMilanka Ringwald */ 337e16068dbSMilanka Ringwald uint8_t battery_service_v1_server_set_battery_level_status(battery_service_v1_t * service, const battery_level_status_t * battery_level_status); 338ac8c27c4SMilanka Ringwald 339e24f316cSMilanka Ringwald /** 340de4a918bSMilanka Ringwald * @brief Update battery estimated service date as days elapsed since the Epoch (Jan 1, 1970) 341e24f316cSMilanka Ringwald * @note Triggers notification or indication if subscribed 342e24f316cSMilanka Ringwald * @param service 343e24f316cSMilanka Ringwald * @param estimated_service_date_days 344e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 345e24f316cSMilanka Ringwald */ 346e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_estimated_service_date_days(battery_service_v1_t * service, uint32_t estimated_service_date_days); 347e24f316cSMilanka Ringwald 348e24f316cSMilanka Ringwald /** 349e24f316cSMilanka Ringwald * @brief Update battery critcal status flags 350e24f316cSMilanka Ringwald * @note Triggers indication if subscribed 351e24f316cSMilanka Ringwald * @param service 352e24f316cSMilanka Ringwald * @param critcal_status_flags 353e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 354e24f316cSMilanka Ringwald */ 355e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_critcal_status_flags(battery_service_v1_t * service, uint8_t critcal_status_flags); 356e24f316cSMilanka Ringwald 357e24f316cSMilanka Ringwald /** 358e24f316cSMilanka Ringwald * @brief Update battery energy status 359e24f316cSMilanka Ringwald * @note Triggers notification or indication if subscribed 360e24f316cSMilanka Ringwald * @param service 361e24f316cSMilanka Ringwald * @param energy_status 362e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 363e24f316cSMilanka Ringwald */ 364e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_energy_status(battery_service_v1_t * service, const battery_energy_status_t * energy_status); 365e24f316cSMilanka Ringwald 366e24f316cSMilanka Ringwald /** 367e24f316cSMilanka Ringwald * @brief Update battery time status 368e24f316cSMilanka Ringwald * @note Triggers notification or indication if subscribed 369e24f316cSMilanka Ringwald * @param service 370e24f316cSMilanka Ringwald * @param time_status 371e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 372e24f316cSMilanka Ringwald */ 373e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_time_status(battery_service_v1_t * service, const battery_time_status_t * time_status); 374e24f316cSMilanka Ringwald 375e24f316cSMilanka Ringwald /** 376e24f316cSMilanka Ringwald * @brief Update battery health status 377e24f316cSMilanka Ringwald * @note Triggers notification or indication if subscribed 378e24f316cSMilanka Ringwald * @param service 379e24f316cSMilanka Ringwald * @param health_status 380e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 381e24f316cSMilanka Ringwald */ 382e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_health_status(battery_service_v1_t * service, const battery_health_status_t * health_status); 383e24f316cSMilanka Ringwald 384e24f316cSMilanka Ringwald /** 385e24f316cSMilanka Ringwald * @brief Update battery health information 386e24f316cSMilanka Ringwald * @note Triggers indication if subscribed 387e24f316cSMilanka Ringwald * @param service 388e24f316cSMilanka Ringwald * @param health_information 389e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 390e24f316cSMilanka Ringwald */ 391e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_health_information(battery_service_v1_t * service, const battery_health_information_t * health_information); 392e24f316cSMilanka Ringwald 393e24f316cSMilanka Ringwald /** 394e24f316cSMilanka Ringwald * @brief Update battery information 395e24f316cSMilanka Ringwald * @note Triggers indication if subscribed 396e24f316cSMilanka Ringwald * @param service 397e24f316cSMilanka Ringwald * @param information 398e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 399e24f316cSMilanka Ringwald */ 400e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_information(battery_service_v1_t * service, const battery_information_t * information); 401e24f316cSMilanka Ringwald 402e24f316cSMilanka Ringwald /** 403e24f316cSMilanka Ringwald * @brief Update manufacturer name 404e24f316cSMilanka Ringwald * @note Triggers indication if subscribed 405e24f316cSMilanka Ringwald * @param service 406e24f316cSMilanka Ringwald * @param manufacturer_name 407e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 408e24f316cSMilanka Ringwald */ 409e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_manufacturer_name(battery_service_v1_t * service, const char * manufacturer_name); 410e24f316cSMilanka Ringwald 411e24f316cSMilanka Ringwald /** 412e24f316cSMilanka Ringwald * @brief Update model_number 413e24f316cSMilanka Ringwald * @note Triggers indication if subscribed 414e24f316cSMilanka Ringwald * @param service 415e24f316cSMilanka Ringwald * @param model number 416e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 417e24f316cSMilanka Ringwald */ 418e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_model_number(battery_service_v1_t * service, const char * model_number); 419e24f316cSMilanka Ringwald 420e24f316cSMilanka Ringwald /** 421e24f316cSMilanka Ringwald * @brief Update serial_number 422e24f316cSMilanka Ringwald * @note Triggers indication if subscribed 423e24f316cSMilanka Ringwald * @param service 424e24f316cSMilanka Ringwald * @param serial number 425e24f316cSMilanka Ringwald * @return ERROR_CODE_SUCCESS if value is valid, otherwise ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 426e24f316cSMilanka Ringwald */ 427e24f316cSMilanka Ringwald uint8_t battery_service_v1_server_set_serial_number(battery_service_v1_t * service, const char * serial_number); 428d62aa1c5SMilanka Ringwald 429*6a9e015fSMatthias Ringwald /** 430*6a9e015fSMatthias Ringwald * @brief Get Advertisement Data for all active Characteristic Broadcasts 431*6a9e015fSMatthias Ringwald * @param adv_interval 432*6a9e015fSMatthias Ringwald * @param adv_buffer 433*6a9e015fSMatthias Ringwald * @param adv_size 434*6a9e015fSMatthias Ringwald * @return 435*6a9e015fSMatthias Ringwald */ 436*6a9e015fSMatthias Ringwald uint16_t battery_service_v1_server_get_broadcast_advertisement(uint16_t adv_interval, uint8_t * adv_buffer, uint16_t adv_size); 437*6a9e015fSMatthias Ringwald 438*6a9e015fSMatthias Ringwald /** 439*6a9e015fSMatthias Ringwald * @brief Get Advertisement Data for single active Characteristic Broadcast 440*6a9e015fSMatthias Ringwald * @param adv_interval 441*6a9e015fSMatthias Ringwald * @param adv_buffer 442*6a9e015fSMatthias Ringwald * @param adv_size 443*6a9e015fSMatthias Ringwald * @return 444*6a9e015fSMatthias Ringwald */ 445*6a9e015fSMatthias Ringwald uint16_t battery_service_v1_server_get_broadcast_advertisement_single(battery_service_v1_t * service, uint16_t adv_interval, uint8_t * adv_buffer, uint16_t adv_size); 446*6a9e015fSMatthias Ringwald 447d62aa1c5SMilanka Ringwald void battery_service_v1_server_deinit(void); 448d62aa1c5SMilanka Ringwald 449d62aa1c5SMilanka Ringwald /* API_END */ 450d62aa1c5SMilanka Ringwald 451d62aa1c5SMilanka Ringwald #if defined __cplusplus 452d62aa1c5SMilanka Ringwald } 453d62aa1c5SMilanka Ringwald #endif 454d62aa1c5SMilanka Ringwald 455d62aa1c5SMilanka Ringwald #endif 456d62aa1c5SMilanka Ringwald 457