xref: /btstack/src/ble/gatt-service/battery_service_v1_server.h (revision e5ae30da29801115ce97cecb190e3c1ba8e1c9d8)
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  */
62*e5ae30daSMilanka Ringwald #define BATTERY_SERVICE_MAX_STRING_LEN 32
63*e5ae30daSMilanka Ringwald 
64*e5ae30daSMilanka Ringwald typedef enum {
65*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_LEVEL = 0,
66*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_LEVEL_STATUS,
67*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_ESTIMATED_SERVICE_DATE,
68*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_CRITCAL_STATUS,
69*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_ENERGY_STATUS,
70*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_TIME_STATUS,
71*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_HEALTH_STATUS,
72*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_HEALTH_INFORMATION,
73*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_BATTERY_INFORMATION,
74*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_MANUFACTURER_NAME_STRING,
75*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_MODEL_NUMBER_STRING,
76*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_SERIAL_NUMBER_STRING,
77*e5ae30daSMilanka Ringwald     BAS_CHARACTERISTIC_INDEX_NUM
78*e5ae30daSMilanka Ringwald } bas_characteristic_index_t;
79*e5ae30daSMilanka Ringwald 
80*e5ae30daSMilanka Ringwald // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_ENERGY_STATUS flags:
81*e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_EXTERNAL_SOURCE_POWER_PRESENT                0x01
82*e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_PRESENT_VOLTAGE_PRESENT                      0x02
83*e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_ENERGY_PRESENT                     0x04
84*e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_BATTERY_CAPACITY_PRESENT           0x08
85*e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_CHARGE_RATE_PRESENT                          0x10
86*e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_ENERGY_AT_LAST_CHARGE_PRESENT      0x20
87*e5ae30daSMilanka Ringwald #define BATTERY_ENERGY_STATUS_BITMASK_RFU                                          0x40
88*e5ae30daSMilanka Ringwald 
89*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_IDENTIFIER_PRESENT                            0x01
90*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_BATTERY_LEVEL_PRESENT                         0x02
91*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_ADDITIONAL_STATUS_PRESENT                     0x04
92*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_STATUS_BITMASK_RFU                                           0x08
93*e5ae30daSMilanka Ringwald 
94*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_EXTERNAL_BATTERY_PRESENT                 0x0001    // 0 = No, 1 = Yes
95*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_WIRED_EXTERNAL_POWER_SOURCE_CONNECTED    0x0004    // 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU
96*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_WIRELESS_EXTERNAL_POWER_SOURCE_CONNECTED 0x0010    // 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU
97*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_BATTERY_CHARGE_STATE                     0x0040    // 0 = Unknown, 1 = Charging, 2 = Discharging: Active 3 = Discharging: Inactive
98*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_BATTERY_CHARGE_LEVEL                     0x0100    // 0 = Unknown, 1 = Good, 2 = Low, 3 = Critical
99*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_TYPE                            0x0400    // 0 = Unknown or Not Charging 1 = Constant Current, 2 = Constant Voltage, 3 = Trickle, 4 = Float, 5–7 = RFU
100*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_FAULT_REASON                    0x2000    // Bit 12: Battery, Bit 13: External Power source, Bit 14: Other
101*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_POWER_STATE_BITMASK_RFU                                      0x4000
102*e5ae30daSMilanka Ringwald 
103*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_SERVICE_REQUIRED                   0x01       // 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU
104*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_BATTERY_FAULT                      0x02       // 0 = No or Unknown, 1 = Yes
105*e5ae30daSMilanka Ringwald #define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_RFU                                0x04
106*e5ae30daSMilanka Ringwald 
107*e5ae30daSMilanka Ringwald #define BATTERY_CRITCAL_STATUS_BITMASK_CRITICAL_POWER_STATE                        0x01
108*e5ae30daSMilanka Ringwald #define BATTERY_CRITCAL_STATUS_BITMASK_IMMEDIATE_SERVICE_REQUIRED                  0x02
109*e5ae30daSMilanka Ringwald #define BATTERY_CRITCAL_STATUS_BITMASK_RFU                                         0x04
110*e5ae30daSMilanka Ringwald 
111*e5ae30daSMilanka Ringwald #define BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_DISCHARGED_ON_STANDBY_PRESENT       0x01
112*e5ae30daSMilanka Ringwald #define BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_RECHARGED_PRESENT                   0x02
113*e5ae30daSMilanka Ringwald #define BATTERY_TIME_STATUS_BITMASK_RFU                                            0x04
114*e5ae30daSMilanka Ringwald 
115*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_HEALTH_SUMMARY_PRESENT                       0x01
116*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_CYCLE_COUNT_PRESENT                          0x02
117*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_CURRENT_TEMPERATURE_PRESENT                  0x04
118*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_DEEP_DISCHARGE_COUNT_PRESENT                 0x08
119*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_STATUS_BITMASK_RFU                                          0x10
120*e5ae30daSMilanka Ringwald 
121*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_INFORMATION_BITMASK_CYCLE_COUNT_DESIGNED_LIFETIME_PRESENT   0x01
122*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_INFORMATION_BITMASK_DESIGNED_OPERATING_TEMPERATURE_PRESENT  0x02
123*e5ae30daSMilanka Ringwald #define BATTERY_HEALTH_INFORMATION_BITMASK_RFU                                     0x04
124*e5ae30daSMilanka Ringwald 
125*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_MANUFACTURE_DATE_PRESENT                       0x0001
126*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_EXPIRATION_DATE_PRESENT                        0x0002
127*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_DESIGNED_CAPACITY_PRESENT                      0x0004
128*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_LOW_ENERGY_PRESENT                             0x0008
129*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_CRITICAL_ENERGY_PRESENT                        0x0010
130*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_CHEMISTRY_PRESENT                              0x0020
131*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_NOMINAL_VOLTAGE_PRESENT                        0x0040
132*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_AGGREGATION_GROUP_PRESENT                      0x0080
133*e5ae30daSMilanka Ringwald #define BATTERY_INFORMATION_BITMASK_RFU                                            0x0100
134*e5ae30daSMilanka Ringwald 
135*e5ae30daSMilanka Ringwald #define BATTERY_INFROMATION_FEATURE_BITMASK_REPLACEABLE                             0x01
136*e5ae30daSMilanka Ringwald #define BATTERY_INFROMATION_FEATURE_BITMASK_RECHARGEABLE                            0x02
137*e5ae30daSMilanka Ringwald #define BATTERY_INFROMATION_FEATURE_BITMASK_RFU                                     0x04
138*e5ae30daSMilanka Ringwald 
139d62aa1c5SMilanka Ringwald struct battery_service_v1;
140d62aa1c5SMilanka Ringwald 
141d62aa1c5SMilanka Ringwald typedef struct {
142*e5ae30daSMilanka Ringwald     uint16_t year;
143*e5ae30daSMilanka Ringwald     uint8_t  month;
144*e5ae30daSMilanka Ringwald     uint8_t  day;
145*e5ae30daSMilanka Ringwald } btstack_utc_date_t;
146*e5ae30daSMilanka Ringwald 
147*e5ae30daSMilanka Ringwald typedef struct {
148*e5ae30daSMilanka Ringwald     uint8_t  hours;
149*e5ae30daSMilanka Ringwald     uint8_t  minutes;
150*e5ae30daSMilanka Ringwald     uint8_t  seconds;
151*e5ae30daSMilanka Ringwald } btstack_utc_time_t;
152*e5ae30daSMilanka Ringwald 
153*e5ae30daSMilanka Ringwald typedef struct {
154d62aa1c5SMilanka Ringwald     hci_con_handle_t con_handle;
155d62aa1c5SMilanka Ringwald 
156d62aa1c5SMilanka Ringwald     btstack_context_callback_registration_t  scheduled_tasks_callback;
157d62aa1c5SMilanka Ringwald     uint8_t scheduled_tasks;
158*e5ae30daSMilanka Ringwald     uint16_t configurations[BAS_CHARACTERISTIC_INDEX_NUM];
159d62aa1c5SMilanka Ringwald 
160d62aa1c5SMilanka Ringwald     struct battery_service_v1 * service;
161d62aa1c5SMilanka Ringwald } battery_service_v1_server_connection_t;
162d62aa1c5SMilanka Ringwald 
163*e5ae30daSMilanka Ringwald typedef struct {
164*e5ae30daSMilanka Ringwald     uint16_t value_handle;
165*e5ae30daSMilanka Ringwald     uint16_t client_configuration_handle;
166*e5ae30daSMilanka Ringwald } bas_characteristic_t;
167*e5ae30daSMilanka Ringwald 
168d62aa1c5SMilanka Ringwald 
169d62aa1c5SMilanka Ringwald typedef struct battery_service_v1 {
170d62aa1c5SMilanka Ringwald     btstack_linked_item_t item;
171d62aa1c5SMilanka Ringwald 
172d62aa1c5SMilanka Ringwald     // service
173d62aa1c5SMilanka Ringwald     uint16_t start_handle;
174d62aa1c5SMilanka Ringwald     uint16_t end_handle;
175d62aa1c5SMilanka Ringwald     uint8_t index;
176d62aa1c5SMilanka Ringwald 
177d62aa1c5SMilanka Ringwald     att_service_handler_t    service_handler;
178d62aa1c5SMilanka Ringwald 
179*e5ae30daSMilanka Ringwald     bas_characteristic_t  characteristics[BAS_CHARACTERISTIC_INDEX_NUM];
180*e5ae30daSMilanka Ringwald 
181d62aa1c5SMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL
182d62aa1c5SMilanka Ringwald     uint8_t  battery_value;
183d62aa1c5SMilanka Ringwald 
184*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL_STATUS
185*e5ae30daSMilanka Ringwald     struct {
186*e5ae30daSMilanka Ringwald         uint8_t  flags;
187*e5ae30daSMilanka Ringwald         uint16_t power_state_flags;
188*e5ae30daSMilanka Ringwald 
189*e5ae30daSMilanka Ringwald         uint16_t identifier;
190*e5ae30daSMilanka Ringwald         uint8_t  battery_level;
191*e5ae30daSMilanka Ringwald         uint8_t  additional_status_flags;
192*e5ae30daSMilanka Ringwald     } battery_level;
193*e5ae30daSMilanka Ringwald 
194*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_ESTIMATED_SERVICE_DATE
195*e5ae30daSMilanka Ringwald     uint32_t estimated_service_date_days;
196*e5ae30daSMilanka Ringwald 
197*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_CRITCAL_STATUS
198*e5ae30daSMilanka Ringwald     uint8_t battery_critcal_status_flags;
199*e5ae30daSMilanka Ringwald 
200*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_ENERGY_STATUS
201*e5ae30daSMilanka Ringwald     struct {
202*e5ae30daSMilanka Ringwald         uint8_t  flags;
203*e5ae30daSMilanka Ringwald         uint16_t external_source_power_medfloat16;
204*e5ae30daSMilanka Ringwald         uint16_t present_voltage_medfloat16;
205*e5ae30daSMilanka Ringwald         uint16_t available_energy_medfloat16;
206*e5ae30daSMilanka Ringwald         uint16_t available_battery_capacity_medfloat16;
207*e5ae30daSMilanka Ringwald         uint16_t charge_rate_medfloat16;
208*e5ae30daSMilanka Ringwald         uint16_t available_energy_at_last_charge_medfloat16;
209*e5ae30daSMilanka Ringwald     } energy_status;
210*e5ae30daSMilanka Ringwald 
211*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_TIME_STATUS
212*e5ae30daSMilanka Ringwald     struct {
213*e5ae30daSMilanka Ringwald         uint8_t flags;
214*e5ae30daSMilanka Ringwald 
215*e5ae30daSMilanka Ringwald         // A value of 0xFFFFFF represents: Unknown
216*e5ae30daSMilanka Ringwald         // A value of 0xFFFFFE represents: Greater than 0xFFFFFD
217*e5ae30daSMilanka Ringwald         uint32_t time_until_discharged_minutes;
218*e5ae30daSMilanka Ringwald         uint32_t time_until_discharged_on_standby_minutes;
219*e5ae30daSMilanka Ringwald         uint32_t time_until_recharged_minutes;
220*e5ae30daSMilanka Ringwald     } time_status;
221*e5ae30daSMilanka Ringwald 
222*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_HEALTH_STATUS
223*e5ae30daSMilanka Ringwald     struct {
224*e5ae30daSMilanka Ringwald         uint8_t  flags;
225*e5ae30daSMilanka Ringwald         uint8_t  summary;                 // Allowed range is 0 to 100.
226*e5ae30daSMilanka Ringwald         uint16_t cycle_count;
227*e5ae30daSMilanka Ringwald         int8_t   current_temperature_degree_celsius;
228*e5ae30daSMilanka Ringwald         uint16_t deep_discharge_count;
229*e5ae30daSMilanka Ringwald     } health_status;
230*e5ae30daSMilanka Ringwald 
231*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_HEALTH_INFORMATION
232*e5ae30daSMilanka Ringwald     struct {
233*e5ae30daSMilanka Ringwald         uint8_t  flags;
234*e5ae30daSMilanka Ringwald         uint16_t cycle_count_designed_lifetime;
235*e5ae30daSMilanka Ringwald 
236*e5ae30daSMilanka Ringwald         // A raw value of 0x7F represents: Greater than 126.
237*e5ae30daSMilanka Ringwald         // A raw value of 0x80 represents: Less than -127.
238*e5ae30daSMilanka Ringwald         int8_t   min_designed_operating_temperature_degree_celsius;
239*e5ae30daSMilanka Ringwald         int8_t   max_designed_operating_temperature_degree_celsius;
240*e5ae30daSMilanka Ringwald     } health_information;
241*e5ae30daSMilanka Ringwald 
242*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_INFORMATION
243*e5ae30daSMilanka Ringwald     struct {
244*e5ae30daSMilanka Ringwald         uint16_t flags;
245*e5ae30daSMilanka Ringwald         uint8_t  features;
246*e5ae30daSMilanka Ringwald 
247*e5ae30daSMilanka Ringwald         uint32_t manufacture_date_days;
248*e5ae30daSMilanka Ringwald         uint32_t expiration_date_days;
249*e5ae30daSMilanka Ringwald 
250*e5ae30daSMilanka Ringwald         uint16_t designed_capacity_kWh_medfloat16;
251*e5ae30daSMilanka Ringwald         uint16_t low_energy_kWh_medfloat16;
252*e5ae30daSMilanka Ringwald         uint16_t critical_energy_kWh_medfloat16;
253*e5ae30daSMilanka Ringwald         uint8_t  chemistry;
254*e5ae30daSMilanka Ringwald         uint16_t nominal_voltage_medfloat16;
255*e5ae30daSMilanka Ringwald         uint8_t  aggregation_group; // 0: not in group, 255: RFU
256*e5ae30daSMilanka Ringwald     } information;
257*e5ae30daSMilanka Ringwald 
258*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_MANUFACTURER_NAME_STRING
259*e5ae30daSMilanka Ringwald     uint8_t manufacturer_name[BATTERY_SERVICE_MAX_STRING_LEN];
260*e5ae30daSMilanka Ringwald     uint8_t manufacturer_name_len;
261*e5ae30daSMilanka Ringwald 
262*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_MODEL_NUMBER_STRING
263*e5ae30daSMilanka Ringwald     uint8_t model_number[BATTERY_SERVICE_MAX_STRING_LEN];
264*e5ae30daSMilanka Ringwald     uint8_t model_number_len;
265*e5ae30daSMilanka Ringwald 
266*e5ae30daSMilanka Ringwald     // ORG_BLUETOOTH_CHARACTERISTIC_SERIAL_NUMBER_STRING
267*e5ae30daSMilanka Ringwald     uint8_t serial_number[BATTERY_SERVICE_MAX_STRING_LEN];
268*e5ae30daSMilanka Ringwald     uint8_t serial_number_len;
269*e5ae30daSMilanka Ringwald 
270d62aa1c5SMilanka Ringwald     uint8_t connections_max_num;
271d62aa1c5SMilanka Ringwald     battery_service_v1_server_connection_t * connections;
272d62aa1c5SMilanka Ringwald } battery_service_v1_t;
273d62aa1c5SMilanka Ringwald 
274d62aa1c5SMilanka Ringwald /* API_START */
275d62aa1c5SMilanka Ringwald 
276d62aa1c5SMilanka Ringwald /**
277d62aa1c5SMilanka Ringwald  * @brief Init Battery Service Server with ATT DB
278d62aa1c5SMilanka Ringwald  */
279d62aa1c5SMilanka Ringwald void battery_service_v1_server_init(void);
280d62aa1c5SMilanka Ringwald 
281d62aa1c5SMilanka Ringwald void battery_service_v1_server_register(battery_service_v1_t *service, battery_service_v1_server_connection_t *connections, uint8_t connection_max_num);
282d62aa1c5SMilanka Ringwald 
283d62aa1c5SMilanka Ringwald void battery_service_v1_server_deregister(battery_service_v1_t *service);
284d62aa1c5SMilanka Ringwald /**
285d62aa1c5SMilanka Ringwald  * @brief Update battery value
286d62aa1c5SMilanka Ringwald  * @note triggers notifications if subscribed
287d62aa1c5SMilanka Ringwald  * @param battery_value in range 0-100
288d62aa1c5SMilanka Ringwald  */
289d62aa1c5SMilanka Ringwald void battery_service_v1_server_set_battery_value(battery_service_v1_t * service, uint8_t value);
290d62aa1c5SMilanka Ringwald 
291d62aa1c5SMilanka Ringwald void battery_service_v1_server_deinit(void);
292d62aa1c5SMilanka Ringwald 
293d62aa1c5SMilanka Ringwald /* API_END */
294d62aa1c5SMilanka Ringwald 
295d62aa1c5SMilanka Ringwald #if defined __cplusplus
296d62aa1c5SMilanka Ringwald }
297d62aa1c5SMilanka Ringwald #endif
298d62aa1c5SMilanka Ringwald 
299d62aa1c5SMilanka Ringwald #endif
300d62aa1c5SMilanka Ringwald 
301