xref: /btstack/src/ble/gatt-service/cycling_power_service_server.h (revision 8d92774245f4fc03b61f0cd7cd9c96fce9749545)
19fe70df8SMilanka Ringwald /*
29fe70df8SMilanka Ringwald  * Copyright (C) 2018 BlueKitchen GmbH
39fe70df8SMilanka Ringwald  *
49fe70df8SMilanka Ringwald  * Redistribution and use in source and binary forms, with or without
59fe70df8SMilanka Ringwald  * modification, are permitted provided that the following conditions
69fe70df8SMilanka Ringwald  * are met:
79fe70df8SMilanka Ringwald  *
89fe70df8SMilanka Ringwald  * 1. Redistributions of source code must retain the above copyright
99fe70df8SMilanka Ringwald  *    notice, this list of conditions and the following disclaimer.
109fe70df8SMilanka Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
119fe70df8SMilanka Ringwald  *    notice, this list of conditions and the following disclaimer in the
129fe70df8SMilanka Ringwald  *    documentation and/or other materials provided with the distribution.
139fe70df8SMilanka Ringwald  * 3. Neither the name of the copyright holders nor the names of
149fe70df8SMilanka Ringwald  *    contributors may be used to endorse or promote products derived
159fe70df8SMilanka Ringwald  *    from this software without specific prior written permission.
169fe70df8SMilanka Ringwald  * 4. Any redistribution, use, or modification is done solely for
179fe70df8SMilanka Ringwald  *    personal benefit and not for any commercial purpose or for
189fe70df8SMilanka Ringwald  *    monetary gain.
199fe70df8SMilanka Ringwald  *
209fe70df8SMilanka Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
219fe70df8SMilanka Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
229fe70df8SMilanka Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
232fca4dadSMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
242fca4dadSMilanka Ringwald  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
259fe70df8SMilanka Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
269fe70df8SMilanka Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
279fe70df8SMilanka Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
289fe70df8SMilanka Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
299fe70df8SMilanka Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
309fe70df8SMilanka Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
319fe70df8SMilanka Ringwald  * SUCH DAMAGE.
329fe70df8SMilanka Ringwald  *
339fe70df8SMilanka Ringwald  * Please inquire about commercial licensing options at
349fe70df8SMilanka Ringwald  * [email protected]
359fe70df8SMilanka Ringwald  *
369fe70df8SMilanka Ringwald  */
37fe5a6c4eSMilanka Ringwald 
38fe5a6c4eSMilanka Ringwald /**
39fe5a6c4eSMilanka Ringwald  * @title Cycling Power Service Server
40fe5a6c4eSMilanka Ringwald  *
41fe5a6c4eSMilanka Ringwald  */
42fe5a6c4eSMilanka Ringwald 
4380e33422SMatthias Ringwald #ifndef CYCLING_POWER_SERVICE_SERVER_H
4480e33422SMatthias Ringwald #define CYCLING_POWER_SERVICE_SERVER_H
459fe70df8SMilanka Ringwald 
469fe70df8SMilanka Ringwald #include <stdint.h>
479fe70df8SMilanka Ringwald 
489fe70df8SMilanka Ringwald #if defined __cplusplus
499fe70df8SMilanka Ringwald extern "C" {
509fe70df8SMilanka Ringwald #endif
519fe70df8SMilanka Ringwald 
529fe70df8SMilanka Ringwald /**
531ea30d1bSMilanka Ringwald  * @text The Cycling Power Service allows to query device's power- and
541ea30d1bSMilanka Ringwald  * force-related data and optionally speed- and cadence-related data for
551ea30d1bSMilanka Ringwald  * use in sports and fitness applications.
569fe70df8SMilanka Ringwald  *
571ea30d1bSMilanka Ringwald  * To use with your application, add `#import <cycling_power_service.gatt>`
581ea30d1bSMilanka Ringwald  * to your .gatt file.
599fe70df8SMilanka Ringwald  */
609fe70df8SMilanka Ringwald 
619fe70df8SMilanka Ringwald /* API_START */
629fe70df8SMilanka Ringwald #define CYCLING_POWER_MANUFACTURER_SPECIFIC_DATA_MAX_SIZE   16
639fe70df8SMilanka Ringwald 
649fe70df8SMilanka Ringwald typedef enum {
659fe70df8SMilanka Ringwald     CP_PEDAL_POWER_BALANCE_REFERENCE_UNKNOWN = 0,
669fe70df8SMilanka Ringwald     CP_PEDAL_POWER_BALANCE_REFERENCE_LEFT,
679fe70df8SMilanka Ringwald     CP_PEDAL_POWER_BALANCE_REFERENCE_NOT_SUPPORTED
689fe70df8SMilanka Ringwald } cycling_power_pedal_power_balance_reference_t;
699fe70df8SMilanka Ringwald 
709fe70df8SMilanka Ringwald typedef enum {
719fe70df8SMilanka Ringwald     CP_TORQUE_SOURCE_WHEEL = 0,
729fe70df8SMilanka Ringwald     CP_TORQUE_SOURCE_CRANK,
739fe70df8SMilanka Ringwald     CP_TORQUE_SOURCE_NOT_SUPPORTED
749fe70df8SMilanka Ringwald } cycling_power_torque_source_t;
759fe70df8SMilanka Ringwald 
769fe70df8SMilanka Ringwald typedef enum {
779fe70df8SMilanka Ringwald     CP_SENSOR_MEASUREMENT_CONTEXT_FORCE = 0,
789fe70df8SMilanka Ringwald     CP_SENSOR_MEASUREMENT_CONTEXT_TORQUE
799fe70df8SMilanka Ringwald } cycling_power_sensor_measurement_context_t;
809fe70df8SMilanka Ringwald 
819fe70df8SMilanka Ringwald typedef enum {
829fe70df8SMilanka Ringwald     CP_DISTRIBUTED_SYSTEM_UNSPECIFIED = 0,
839fe70df8SMilanka Ringwald     CP_DISTRIBUTED_SYSTEM_NOT_SUPPORTED,
849fe70df8SMilanka Ringwald     CP_DISTRIBUTED_SYSTEM_SUPPORTED
859fe70df8SMilanka Ringwald } cycling_power_distributed_system_t;
869fe70df8SMilanka Ringwald 
879fe70df8SMilanka Ringwald typedef enum {
889fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_PEDAL_POWER_BALANCE_PRESENT = 0,
899fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_PEDAL_POWER_BALANCE_REFERENCE, // 0 - unknown, 1 - left
909fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_ACCUMULATED_TORQUE_PRESENT,
919fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_ACCUMULATED_TORQUE_SOURCE, // 0 - wheel based, 1 - crank based
929fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_WHEEL_REVOLUTION_DATA_PRESENT,
939fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_CRANK_REVOLUTION_DATA_PRESENT,
949fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_EXTREME_FORCE_MAGNITUDES_PRESENT,
959fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_EXTREME_TORQUE_MAGNITUDES_PRESENT,
969fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_EXTREME_ANGLES_PRESENT,
979fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_TOP_DEAD_SPOT_ANGLE_PRESENT,
989fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_BOTTOM_DEAD_SPOT_ANGLE_PRESENT,
999fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_ACCUMULATED_ENERGY_PRESENT,
1009fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_OFFSET_COMPENSATION_INDICATOR,
1019fe70df8SMilanka Ringwald     CP_MEASUREMENT_FLAG_RESERVED
1029fe70df8SMilanka Ringwald } cycling_power_measurement_flag_t;
1039fe70df8SMilanka Ringwald 
1049fe70df8SMilanka Ringwald typedef enum {
1059fe70df8SMilanka Ringwald     CP_INSTANTANEOUS_MEASUREMENT_DIRECTION_UNKNOWN = 0,
1069fe70df8SMilanka Ringwald     CP_INSTANTANEOUS_MEASUREMENT_DIRECTION_TANGENTIAL_COMPONENT,
1079fe70df8SMilanka Ringwald     CP_INSTANTANEOUS_MEASUREMENT_DIRECTION_RADIAL_COMPONENT,
1089fe70df8SMilanka Ringwald     CP_INSTANTANEOUS_MEASUREMENT_DIRECTION_LATERAL_COMPONENT
1099fe70df8SMilanka Ringwald } cycling_power_instantaneous_measurement_direction_t;
1109fe70df8SMilanka Ringwald 
1119fe70df8SMilanka Ringwald typedef enum {
1129fe70df8SMilanka Ringwald     CP_VECTOR_FLAG_CRANK_REVOLUTION_DATA_PRESENT = 0,
1139fe70df8SMilanka Ringwald     CP_VECTOR_FLAG_FIRST_CRANK_MEASUREMENT_ANGLE_PRESENT,
1149fe70df8SMilanka Ringwald     CP_VECTOR_FLAG_INSTANTANEOUS_FORCE_MAGNITUDE_ARRAY_PRESENT,
1159fe70df8SMilanka Ringwald     CP_VECTOR_FLAG_INSTANTANEOUS_TORQUE_MAGNITUDE_ARRAY_PRESENT,
1169fe70df8SMilanka Ringwald     CP_VECTOR_FLAG_INSTANTANEOUS_MEASUREMENT_DIRECTION = 4, // 2 bit
1179fe70df8SMilanka Ringwald     CP_VECTOR_FLAG_RESERVED = 6
1189fe70df8SMilanka Ringwald } cycling_power_vector_flag_t;
1199fe70df8SMilanka Ringwald 
1209fe70df8SMilanka Ringwald typedef enum {
1219fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_OTHER,
1229fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_TOP_OF_SHOE,
1239fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_IN_SHOE,
1249fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_HIP,
1259fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_FRONT_WHEEL,
1269fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_LEFT_CRANK,
1279fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_RIGHT_CRANK,
1289fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_LEFT_PEDAL,
1299fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_RIGHT_PEDAL,
1309fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_FRONT_HUB,
1319fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_REAR_DROPOUT,
1329fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_CHAINSTAY,
1339fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_REAR_WHEEL,
1349fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_REAR_HUB,
1359fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_CHEST,
1369fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_SPIDER,
1379fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_CHAIN_RING,
1389fe70df8SMilanka Ringwald     CP_SENSOR_LOCATION_RESERVED
1399fe70df8SMilanka Ringwald } cycling_power_sensor_location_t;
1409fe70df8SMilanka Ringwald 
1419fe70df8SMilanka Ringwald typedef enum {
1429fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_PEDAL_POWER_BALANCE_SUPPORTED = 0,
1439fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_ACCUMULATED_TORQUE_SUPPORTED,
1449fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_WHEEL_REVOLUTION_DATA_SUPPORTED,
1459fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_CRANK_REVOLUTION_DATA_SUPPORTED,
1469fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_EXTREME_MAGNITUDES_SUPPORTED,
1479fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_EXTREME_ANGLES_SUPPORTED,
1489fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_TOP_AND_BOTTOM_DEAD_SPOT_ANGLE_SUPPORTED,
1499fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_ACCUMULATED_ENERGY_SUPPORTED,
1509fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_OFFSET_COMPENSATION_INDICATOR_SUPPORTED,
1519fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_OFFSET_COMPENSATION_SUPPORTED,
1529fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_CYCLING_POWER_MEASUREMENT_CHARACTERISTIC_CONTENT_MASKING_SUPPORTED,
1539fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_MULTIPLE_SENSOR_LOCATIONS_SUPPORTED,
1549fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_CRANK_LENGTH_ADJUSTMENT_SUPPORTED,
1559fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_CHAIN_LENGTH_ADJUSTMENT_SUPPORTED,
1569fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_CHAIN_WEIGHT_ADJUSTMENT_SUPPORTED,
1579fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_SPAN_LENGTH_ADJUSTMENT_SUPPORTED,
1589fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_SENSOR_MEASUREMENT_CONTEXT, // 0-force based, 1-torque based
1599fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_INSTANTANEOUS_MEASUREMENT_DIRECTION_SUPPORTED,
1609fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_FACTORY_CALIBRATION_DATE_SUPPORTED,
1619fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_ENHANCED_OFFSET_COMPENSATION_SUPPORTED,
1629fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_DISTRIBUTED_SYSTEM_SUPPORT = 20,  // 0-unspecified, 1-not for use in distr. system, 2-used in distr. system, 3-reserved
1639fe70df8SMilanka Ringwald     CP_FEATURE_FLAG_RESERVED = 22
1649fe70df8SMilanka Ringwald } cycling_power_feature_flag_t;
1659fe70df8SMilanka Ringwald 
1669fe70df8SMilanka Ringwald typedef enum {
1679fe70df8SMilanka Ringwald     CP_CALIBRATION_STATUS_INCORRECT_CALIBRATION_POSITION = 0x01,
1689fe70df8SMilanka Ringwald     CP_CALIBRATION_STATUS_MANUFACTURER_SPECIFIC_ERROR_FOLLOWS = 0xFF
1699fe70df8SMilanka Ringwald } cycling_power_calibration_status_t;
1709fe70df8SMilanka Ringwald 
1719fe70df8SMilanka Ringwald 
1729fe70df8SMilanka Ringwald /**
1739fe70df8SMilanka Ringwald  * @brief Init Server with ATT DB
174*8d927742SMilanka Ringwald  *
175*8d927742SMilanka Ringwald  * @param feature_flags
176*8d927742SMilanka Ringwald  * @param pedal_power_balance_reference
177*8d927742SMilanka Ringwald  * @param torque_source
178*8d927742SMilanka Ringwald  * @param supported_sensor_locations
179*8d927742SMilanka Ringwald  * @param num_supported_sensor_locations
180*8d927742SMilanka Ringwald  * @param current_sensor_location
1819fe70df8SMilanka Ringwald  */
1829fe70df8SMilanka Ringwald void cycling_power_service_server_init(uint32_t feature_flags,
183*8d927742SMilanka Ringwald                                        cycling_power_pedal_power_balance_reference_t pedal_power_balance_reference, cycling_power_torque_source_t torque_source,
1849fe70df8SMilanka Ringwald                                        cycling_power_sensor_location_t * supported_sensor_locations, uint16_t num_supported_sensor_locations,
1859fe70df8SMilanka Ringwald                                        cycling_power_sensor_location_t current_sensor_location);
186*8d927742SMilanka Ringwald 
1879fe70df8SMilanka Ringwald /**
188*8d927742SMilanka Ringwald  * @brief Setup measurement as advertisement data
189*8d927742SMilanka Ringwald  * @param adv_interval
190*8d927742SMilanka Ringwald  * @param adv_buffer
191*8d927742SMilanka Ringwald  * @param adv_size
192*8d927742SMilanka Ringwald  * @return
1939fe70df8SMilanka Ringwald  */
194*8d927742SMilanka Ringwald int cycling_power_get_measurement_adv(uint16_t adv_interval, uint8_t * adv_buffer, uint16_t adv_size);
1959fe70df8SMilanka Ringwald 
1969fe70df8SMilanka Ringwald /**
197*8d927742SMilanka Ringwald  * @brief Register callback for the calibration and broadcast updates.
198*8d927742SMilanka Ringwald  *
1999fe70df8SMilanka Ringwald  * @param callback
2009fe70df8SMilanka Ringwald  */
2019fe70df8SMilanka Ringwald void cycling_power_service_server_packet_handler(btstack_packet_handler_t callback);
2029fe70df8SMilanka Ringwald 
203*8d927742SMilanka Ringwald /**
204*8d927742SMilanka Ringwald  * @brief Report calibration done.
205*8d927742SMilanka Ringwald  * @param measurement_type
206*8d927742SMilanka Ringwald  * @param calibrated_value
207*8d927742SMilanka Ringwald  */
2089fe70df8SMilanka Ringwald void  cycling_power_server_calibration_done(cycling_power_sensor_measurement_context_t measurement_type, uint16_t calibrated_value);
2099fe70df8SMilanka Ringwald 
210*8d927742SMilanka Ringwald /**
211*8d927742SMilanka Ringwald  * @brief Report enhanced calibration done.
212*8d927742SMilanka Ringwald  *
213*8d927742SMilanka Ringwald  * @param measurement_type
214*8d927742SMilanka Ringwald  * @param calibrated_value
215*8d927742SMilanka Ringwald  * @param manufacturer_company_id
216*8d927742SMilanka Ringwald  * @param num_manufacturer_specific_data
217*8d927742SMilanka Ringwald  * @param manufacturer_specific_data
218*8d927742SMilanka Ringwald  */
219*8d927742SMilanka Ringwald void cycling_power_server_enhanced_calibration_done(cycling_power_sensor_measurement_context_t measurement_type,
220*8d927742SMilanka Ringwald                                                     uint16_t calibrated_value, uint16_t manufacturer_company_id,
221*8d927742SMilanka Ringwald                                                     uint8_t num_manufacturer_specific_data, uint8_t * manufacturer_specific_data);
2229fe70df8SMilanka Ringwald 
223*8d927742SMilanka Ringwald /**
224*8d927742SMilanka Ringwald  * @brief Set factory calibration date.
225*8d927742SMilanka Ringwald  * @param date
226*8d927742SMilanka Ringwald  * @return 1 if successful
227*8d927742SMilanka Ringwald  */
228*8d927742SMilanka Ringwald int  cycling_power_service_server_set_factory_calibration_date(gatt_date_time_t date);
229*8d927742SMilanka Ringwald 
230*8d927742SMilanka Ringwald /**
231*8d927742SMilanka Ringwald  * @brief Set sampling rate.
232*8d927742SMilanka Ringwald  * @param sampling_rate_Hz
233*8d927742SMilanka Ringwald  */
234*8d927742SMilanka Ringwald void cycling_power_service_server_set_sampling_rate(uint8_t sampling_rate_Hz);
235*8d927742SMilanka Ringwald 
236*8d927742SMilanka Ringwald /**
237*8d927742SMilanka Ringwald  * @brief Accumulate torque value.
238*8d927742SMilanka Ringwald  * @param torque_Nm
239*8d927742SMilanka Ringwald  */
240*8d927742SMilanka Ringwald void cycling_power_service_server_add_torque(int16_t torque_Nm);
241*8d927742SMilanka Ringwald 
242*8d927742SMilanka Ringwald /**
243*8d927742SMilanka Ringwald  * @brief Accumulate wheel revolution value and set the time of the last measurement.
244*8d927742SMilanka Ringwald  * @param wheel_revolution
245*8d927742SMilanka Ringwald  * @param wheel_event_time_s  unit: seconds
246*8d927742SMilanka Ringwald  */
2479fe70df8SMilanka Ringwald void cycling_power_service_server_add_wheel_revolution(int32_t wheel_revolution, uint16_t wheel_event_time_s);
248*8d927742SMilanka Ringwald 
249*8d927742SMilanka Ringwald /**
250*8d927742SMilanka Ringwald  * @brief Accumulate crank revolution value and set the time of the last measurement.
251*8d927742SMilanka Ringwald  * @param crank_revolution
252*8d927742SMilanka Ringwald  * @param crank_event_time_s  unit: seconds
253*8d927742SMilanka Ringwald  */
2549fe70df8SMilanka Ringwald void cycling_power_service_server_add_crank_revolution(uint16_t crank_revolution, uint16_t crank_event_time_s);
255*8d927742SMilanka Ringwald 
256*8d927742SMilanka Ringwald /**
257*8d927742SMilanka Ringwald  * @brief Accumulate energy.
258*8d927742SMilanka Ringwald  * @param energy_kJ  unit: kilo Joule
259*8d927742SMilanka Ringwald  */
2609fe70df8SMilanka Ringwald void cycling_power_service_add_energy(uint16_t energy_kJ);
2619fe70df8SMilanka Ringwald 
262*8d927742SMilanka Ringwald /**
263*8d927742SMilanka Ringwald  * @brief Set the value of the power. The Instantaneous Power field represents either
264*8d927742SMilanka Ringwald  * the total power the user is producing or a part of the total power depending on the
265*8d927742SMilanka Ringwald  * type of sensor (e.g., single sensor or distributed power sensor system).
266*8d927742SMilanka Ringwald  *
267*8d927742SMilanka Ringwald  * @param instantaneous_power_W  unit: watt
268*8d927742SMilanka Ringwald  */
269*8d927742SMilanka Ringwald void cycling_power_service_server_set_instantaneous_power(int16_t instantaneous_power_W);
2709fe70df8SMilanka Ringwald 
271*8d927742SMilanka Ringwald /**
272*8d927742SMilanka Ringwald  * @brief Set the pedal power balance value. The Pedal Power Balance field represents the ratio between
273*8d927742SMilanka Ringwald  * the total amount of power measured by the sensor and a reference (either unknown or left).
274*8d927742SMilanka Ringwald  *
275*8d927742SMilanka Ringwald  * @param pedal_power_balance_percentage
276*8d927742SMilanka Ringwald  */
277*8d927742SMilanka Ringwald void cycling_power_service_server_set_pedal_power_balance(uint8_t pedal_power_balance_percentage);
278*8d927742SMilanka Ringwald 
279*8d927742SMilanka Ringwald /**
280*8d927742SMilanka Ringwald  * @brief Set the minimum and maximum force value measured in a single crank revolution.
281*8d927742SMilanka Ringwald  *
282*8d927742SMilanka Ringwald  * This, so called, Extreme Force Magnitude field pair will be included in the Cycling Power Measurement
283*8d927742SMilanka Ringwald  * characteristic only if the device supports the Extreme Magnitudes feature and
284*8d927742SMilanka Ringwald  * the Sensor Measurement Context of the Cycling Power Feature characteristic is set to 0 (Force-based).
285*8d927742SMilanka Ringwald  *
286*8d927742SMilanka Ringwald  * @param min_force_magnitude_N  unit: newton
287*8d927742SMilanka Ringwald  * @param max_force_magnitude_N  unit: newton
288*8d927742SMilanka Ringwald  */
289*8d927742SMilanka Ringwald void cycling_power_service_server_set_force_magnitude(int16_t min_force_magnitude_N, int16_t max_force_magnitude_N);
290*8d927742SMilanka Ringwald 
291*8d927742SMilanka Ringwald /**
292*8d927742SMilanka Ringwald  * @brief Set the minimum and maximum torque value measured in a single crank revolution.
293*8d927742SMilanka Ringwald  *
294*8d927742SMilanka Ringwald  * This, so called, Extreme Torque Magnitude field pair will be included in the Cycling Power Measurement
295*8d927742SMilanka Ringwald  * characteristic only if the device supports the Extreme Magnitudes feature and
296*8d927742SMilanka Ringwald  * the Sensor Measurement Context of the Cycling Power Feature characteristic is set to 1 (Torque-based).
297*8d927742SMilanka Ringwald  *
298*8d927742SMilanka Ringwald  * @param min_torque_magnitude_Nm  unit: newton meter
299*8d927742SMilanka Ringwald  * @param max_torque_magnitude_Nm  unit: newton meter
300*8d927742SMilanka Ringwald  */
301*8d927742SMilanka Ringwald void cycling_power_service_server_set_torque_magnitude(int16_t min_torque_magnitude_Nm, int16_t max_torque_magnitude_Nm);
302*8d927742SMilanka Ringwald 
303*8d927742SMilanka Ringwald /**
304*8d927742SMilanka Ringwald  * @brief Set the minimum and maximum angle of the crank measured in a single crank revolution (unit: degree).
305*8d927742SMilanka Ringwald  *
306*8d927742SMilanka Ringwald  * This, so called, Extreme Angles Magnitude field pair will be included in the Cycling Power Measurement
307*8d927742SMilanka Ringwald  * characteristic only if the device supports the Extreme Angles feature.
308*8d927742SMilanka Ringwald  *
309*8d927742SMilanka Ringwald  * @param min_angle_degree
310*8d927742SMilanka Ringwald  * @param max_angle_degree
311*8d927742SMilanka Ringwald  */
312*8d927742SMilanka Ringwald void cycling_power_service_server_set_angle(uint16_t min_angle_degree, uint16_t max_angle_degree);
313*8d927742SMilanka Ringwald 
314*8d927742SMilanka Ringwald /**
315*8d927742SMilanka Ringwald  * @brief Set the value of the crank angle measured when the value of the Instantaneous Power value becomes positive.
316*8d927742SMilanka Ringwald  *
317*8d927742SMilanka Ringwald  * This field will be included in the Cycling Power Measurement characteristic
318*8d927742SMilanka Ringwald  * only if the device supports the Top and Bottom Dead Spot Angles feature.
319*8d927742SMilanka Ringwald  *
320*8d927742SMilanka Ringwald  * @param top_dead_spot_angle_degree
321*8d927742SMilanka Ringwald  */
322*8d927742SMilanka Ringwald void cycling_power_service_server_set_top_dead_spot_angle(uint16_t top_dead_spot_angle_degree);
323*8d927742SMilanka Ringwald 
324*8d927742SMilanka Ringwald /**
325*8d927742SMilanka Ringwald  * @brief Set the value of the crank angle measured when the value of the Instantaneous Power value becomes negative.
326*8d927742SMilanka Ringwald  *
327*8d927742SMilanka Ringwald  * This field will be included in the Cycling Power Measurement characteristic
328*8d927742SMilanka Ringwald  * only if the device supports the Top and Bottom Dead Spot Angles feature.
329*8d927742SMilanka Ringwald  *
330*8d927742SMilanka Ringwald  * @param bottom_dead_spot_angle_degree
331*8d927742SMilanka Ringwald  */
332*8d927742SMilanka Ringwald void cycling_power_service_server_set_bottom_dead_spot_angle(uint16_t bottom_dead_spot_angle_degree);
333*8d927742SMilanka Ringwald 
334*8d927742SMilanka Ringwald /**
335*8d927742SMilanka Ringwald  * @brief Set the raw sensor force magnitude measurements.
336*8d927742SMilanka Ringwald  *
337*8d927742SMilanka Ringwald  * @param force_magnitude_count
338*8d927742SMilanka Ringwald  * @param force_magnitude_N_array  unit: newton
339*8d927742SMilanka Ringwald  */
340*8d927742SMilanka Ringwald void cycling_power_service_server_set_force_magnitude_values(int force_magnitude_count, int16_t * force_magnitude_N_array);
341*8d927742SMilanka Ringwald 
342*8d927742SMilanka Ringwald /**
343*8d927742SMilanka Ringwald  * @brief Set the raw sensor torque magnitude measurements.
344*8d927742SMilanka Ringwald  *
345*8d927742SMilanka Ringwald  * @param force_magnitude_count
346*8d927742SMilanka Ringwald  * @param force_magnitude_N_array  unit: newton meter
347*8d927742SMilanka Ringwald  */
348*8d927742SMilanka Ringwald void cycling_power_service_server_set_torque_magnitude_values(int torque_magnitude_count, int16_t * torque_magnitude_Nm_array);
349*8d927742SMilanka Ringwald 
350*8d927742SMilanka Ringwald /**
351*8d927742SMilanka Ringwald  * @brief Set the instantaneous measurement direction. The field describes
352*8d927742SMilanka Ringwald  * the direction of the Instantaneous Magnitude values the Server measures
353*8d927742SMilanka Ringwald  * (e.g., Unknown, Tangential Component, Radial Component, or Lateral Component).
354*8d927742SMilanka Ringwald  *
355*8d927742SMilanka Ringwald  * @param direction
356*8d927742SMilanka Ringwald  */
357*8d927742SMilanka Ringwald void cycling_power_service_server_set_instantaneous_measurement_direction(cycling_power_instantaneous_measurement_direction_t direction);
358*8d927742SMilanka Ringwald 
359*8d927742SMilanka Ringwald /**
360*8d927742SMilanka Ringwald  * Set first crank measurement angle. The value will be present only in the first packet of
361*8d927742SMilanka Ringwald  * the Cycling Power Vector notification.
362*8d927742SMilanka Ringwald  *
363*8d927742SMilanka Ringwald  * @param first_crank_measurement_angle_degree
364*8d927742SMilanka Ringwald  */
365*8d927742SMilanka Ringwald void cycling_power_service_server_set_first_crank_measurement_angle(uint16_t first_crank_measurement_angle_degree);
366*8d927742SMilanka Ringwald 
367*8d927742SMilanka Ringwald /**
368*8d927742SMilanka Ringwald  * Get measurement flags bitmask.
369*8d927742SMilanka Ringwald  * @return measurement_flags_bitmask, see cycling_power_measurement_flag_t
370*8d927742SMilanka Ringwald  */
3719fe70df8SMilanka Ringwald uint16_t cycling_power_service_measurement_flags(void);
372*8d927742SMilanka Ringwald 
373*8d927742SMilanka Ringwald /**
374*8d927742SMilanka Ringwald  * Get vector flags bitmask.
375*8d927742SMilanka Ringwald  * @return vector_flags_bitmask, see cycling_power_vector_flag_t
376*8d927742SMilanka Ringwald  */
3779fe70df8SMilanka Ringwald uint8_t  cycling_power_service_vector_flags(void);
378*8d927742SMilanka Ringwald 
379*8d927742SMilanka Ringwald /**
380*8d927742SMilanka Ringwald  * @brief Trigger notification if subscribed
381*8d927742SMilanka Ringwald  */
382*8d927742SMilanka Ringwald void cycling_power_service_server_update_values(void);
383*8d927742SMilanka Ringwald 
3849fe70df8SMilanka Ringwald /* API_END */
3859fe70df8SMilanka Ringwald 
3869fe70df8SMilanka Ringwald #if defined __cplusplus
3879fe70df8SMilanka Ringwald }
3889fe70df8SMilanka Ringwald #endif
3899fe70df8SMilanka Ringwald 
3909fe70df8SMilanka Ringwald #endif
3919fe70df8SMilanka Ringwald 
392