This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

BLE CSCS cadence value problem

HI

I am working with BLE CSCS example, and I found some problem during read cadence value. Simulator is changing values and I am observing situation: if cadence value is less than 50rpm occasionally shows 0rpm. I think that it occured when cumulative_crank_revs is not incerement during 1 seceond (BICYCLE_POWER_MEAS_INTERVAL).

Have anyone meet the same problem ?

  • No, I only hardcode Crank Revolution value ex. 40rpm.

  • Can you provide the code so I can see what you have done?

  • #define RPM_TO_DEGREES_PER_SEC 6

    #define BICYCLE_POWER_MEAS_INTERVAL 1000

    static void cp_sim_measurement(ble_cp_meas_t * p_measurement)  
    {
        static uint16_t cumulative_crank_revs = 0;
        static uint16_t event_time            = 0;
        static uint16_t crank_rev_degrees     = 0;
        
        uint16_t degrees_per_sec;
        uint16_t event_time_inc;

        // Per specification event time is in 1/1024th's of a second.
        event_time_inc = (1024 * BICYCLE_POWER_MEAS_INTERVAL) / 1000;

        // Calculate simulated cadence values.
        p_measurement->is_crank_rev_data_present = true;

        degrees_per_sec = RPM_TO_DEGREES_PER_SEC * 40;
            
        crank_rev_degrees     += degrees_per_sec * BICYCLE_POWER_MEAS_INTERVAL / 1000;
        cumulative_crank_revs += crank_rev_degrees  / DEGREES_PER_REVOLUTION ;
        crank_rev_degrees     %= DEGREES_PER_REVOLUTION;

        p_measurement->cumulative_crank_revs = cumulative_crank_revs;
        p_measurement->last_crank_event_time =
                event_time + (event_time_inc * (degrees_per_sec - crank_rev_degrees) / degrees_per_sec);
            
        event_time += event_time_inc;
    }

  • My code (using SDK version 12.1.0) looks like this;

    static void csc_sim_measurement(ble_cscs_meas_t * p_measurement)
    {
        static uint16_t cumulative_crank_revs = 0;
        static uint16_t event_time            = 0;
        static uint16_t wheel_revolution_mm   = 0;
        static uint16_t crank_rev_degrees     = 0;

        uint16_t mm_per_sec;
        uint16_t degrees_per_sec;
        uint16_t event_time_inc;

        // Per specification event time is in 1/1024th's of a second.
        event_time_inc = (1024 * SPEED_AND_CADENCE_MEAS_INTERVAL) / 1000;

        // Calculate simulated wheel revolution values.
        p_measurement->is_wheel_rev_data_present = true;

        mm_per_sec = KPH_TO_MM_PER_SEC * sensorsim_measure(&m_speed_kph_sim_state,
                                                           &m_speed_kph_sim_cfg);

        wheel_revolution_mm     += mm_per_sec * SPEED_AND_CADENCE_MEAS_INTERVAL / 1000;
        m_cumulative_wheel_revs += wheel_revolution_mm / WHEEL_CIRCUMFERENCE_MM;
        wheel_revolution_mm     %= WHEEL_CIRCUMFERENCE_MM;

        p_measurement->cumulative_wheel_revs = m_cumulative_wheel_revs;
        p_measurement->last_wheel_event_time =
            event_time + (event_time_inc * (mm_per_sec - wheel_revolution_mm) / mm_per_sec);

        // Calculate simulated cadence values.
        p_measurement->is_crank_rev_data_present = true;

        degrees_per_sec = RPM_TO_DEGREES_PER_SEC * 40;

        crank_rev_degrees     += degrees_per_sec * SPEED_AND_CADENCE_MEAS_INTERVAL / 1000;
        cumulative_crank_revs += crank_rev_degrees / DEGREES_PER_REVOLUTION;
        crank_rev_degrees     %= DEGREES_PER_REVOLUTION;

        p_measurement->cumulative_crank_revs = cumulative_crank_revs;
        p_measurement->last_crank_event_time =
            event_time + (event_time_inc * (degrees_per_sec - crank_rev_degrees) / degrees_per_sec);

        event_time += event_time_inc;
    }

    Perhaps you could try replace your code with the code above.

  • Now I am using stock examle from SDK15. Just hardoce crank revolution = 40;

     // Calculate simulated cadence values.
        p_measurement->is_crank_rev_data_present = true;

        degrees_per_sec = RPM_TO_DEGREES_PER_SEC * 23; //sensorsim_measure(&m_crank_rpm_sim_state, &m_crank_rpm_sim_cfg);

        crank_rev_degrees     += degrees_per_sec * SPEED_AND_CADENCE_MEAS_INTERVAL / 1000;
        cumulative_crank_revs += crank_rev_degrees / DEGREES_PER_REVOLUTION;
        crank_rev_degrees     %= DEGREES_PER_REVOLUTION;

        p_measurement->cumulative_crank_revs = cumulative_crank_revs;
        p_measurement->last_crank_event_time =
            event_time + (event_time_inc * (degrees_per_sec - crank_rev_degrees) / degrees_per_sec);

        event_time += event_time_inc;

    Plese look for screen recorder from Android app:

    https://youtu.be/YAJQy5uj--E

Related