xref: /btstack/src/ble/gatt-service/battery_service_v1_server.h (revision 6a9e015f96ec6181ec6ae007b4edce03b52dde02)
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