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