Example #1
0
/**@brief Function for decoding a received calibration data page from the ANT channel. 
 *
 * This function decodes the received calibration data page from the ANT channel. 
 * Only Calibration IDs 0xAC and 0xAF are supported by the implementation.
 *
 * @param[in] p_event_message_buffer ANT event message buffer.
 *
 * @return true if message contained valid data, false otherwise.
 */
static __INLINE bool calibration_data_page_decode(uint8_t const * const p_event_message_buffer)
{
    bool return_code = false;
    
    // We only process calibration messages when in correct state.
    if (m_calibration_process_state == CALIBRATION_ACTIVE)
    {
        bp_page1_response_data_t * p_page1_general_response_data;
    
        const uint32_t calibration_id = p_event_message_buffer[BUFFER_INDEX_MESG_DATA + 1u];    
       
        switch (calibration_id)
        {
            case BP_CID_172: 
                // Calibration ID 0xAC = calibration response manual zero success.
            case BP_CID_175: 
                // Calibration ID 0xAF = calibration response failure.
                p_page1_general_response_data = bp_rx_data_page1_response_get();
        
                p_page1_general_response_data->calibration_id = calibration_id;
                p_page1_general_response_data->auto_zero_status 
                    = p_event_message_buffer[BUFFER_INDEX_MESG_DATA + 2u]; 
                // Reset to zero prior bit-masking.            
                p_page1_general_response_data->calibration_data = 0;    
                // LSB. 
                p_page1_general_response_data->calibration_data 
                    = p_event_message_buffer[BUFFER_INDEX_MESG_DATA + 6u];
                // MSB.
                p_page1_general_response_data->calibration_data 
                    |= (p_event_message_buffer[BUFFER_INDEX_MESG_DATA + 7u]) << 8u; 
            
                return_code = true;
                break;
                
            default:
                // No implementation needed.
                break;
        }
        
        calibration_state_change(CALIBRATION_NOT_ACTIVE); 
    } 
    
    return return_code;
}
/**@brief Function for processing received profile page events.
 *
 * @param[in] p_event_return Profile page event to be processed.
 */
static __INLINE void profile_event_page_handle(const antplus_event_return_t * const p_event_return)
{
#if defined(TRACE_DATA_PAGE)
    const bp_page16_data_t * p_page16_data;
    const bp_page17_data_t * p_page17_data;
    const bp_page18_data_t * p_page18_data;
    const bp_page32_data_t * p_page32_data;
    const page80_data_t    * p_page80_data;
    const page81_data_t    * p_page81_data;
#endif // defined(TRACE_DATA_PAGE)
#if defined(TRACE_CALIBRATION)
    const bp_page1_response_data_t * p_page1_general_response_data;
#endif // defined(TRACE_CALIBRATION)

    switch (p_event_return->param1)
    {
        case BP_PAGE_1:
            // Calibration message main data page.
#if defined(TRACE_CALIBRATION)
            p_page1_general_response_data = bp_rx_data_page1_response_get();

            printf("page1:calibration_id %#x\n",
                   (uint8_t)p_page1_general_response_data->calibration_id);
            printf("page1:auto_zero_status %u\n",
                   (uint8_t)p_page1_general_response_data->auto_zero_status);
            printf("page1:calibration_data %i\n",
                   (uint16_t)p_page1_general_response_data->calibration_data);
#endif // defined(TRACE_CALIBRATION)
            break;

        case BP_PAGE_16:
            // Standard power only page.
#if defined(TRACE_DATA_PAGE)
            p_page16_data = bp_rx_data_page16_get();

            printf("Page16:event count %u\n", (unsigned int)p_page16_data->event_count);
            printf("Page16:pedal power %u\n", (unsigned int)p_page16_data->pedal_power);
            printf("Page16:instantaneous cadence %u\n", (unsigned int)p_page16_data->instantaneous_cadence);
            printf("Page16:accumulated power %u\n", (unsigned int)p_page16_data->accumulated_power);
            printf("Page16:instantaneous power %u\n", (unsigned int)p_page16_data->instantaneous_power);
#endif // defined(TRACE_DATA_PAGE)     
            break;

        case BP_PAGE_17:
            // Wheel Torque (WT) main data page.
#if defined(TRACE_DATA_PAGE)
            p_page17_data = bp_rx_data_page17_get();

            printf("Page17:update_event_counter %u\n", (unsigned int)p_page17_data->update_event_counter);
            printf("Page17:wheel_ticks %u\n", (unsigned int)p_page17_data->wheel_ticks);
            printf("Page17:instantaneous_cadence %u\n", (unsigned int)p_page17_data->instantaneous_cadence);
            printf("Page17:accumulated wheel_period %u\n", (unsigned int)p_page17_data->wheel_period);
            printf("Page17:accumulated_torgue %u\n", (unsigned int)p_page17_data->accumulated_torgue);
#endif // defined(TRACE_DATA_PAGE)                     
            break;

        case BP_PAGE_18:
            // Standard Crank Torque (CT) main data page.
#if defined(TRACE_DATA_PAGE)
            p_page18_data = bp_rx_data_page18_get();

            printf("Page18:update_event_counter %u\n", (unsigned int)p_page18_data->update_event_counter);
            printf("Page18:crank_ticks %u\n", (unsigned int)p_page18_data->crank_ticks);
            printf("Page18:instantaneous_cadence %u\n", (unsigned int)p_page18_data->instantaneous_cadence);
            printf("Page18:accumulated crank_period %u\n", (unsigned int)p_page18_data->crank_period);
            printf("Page18:accumulated_torgue %u\n", (unsigned int)p_page18_data->accumulated_torgue);
#endif // defined(TRACE_DATA_PAGE)
            break;

        case BP_PAGE_32:
            // Standard Crank Torque Frequency (CTF) main data page.
#if defined(TRACE_DATA_PAGE)
            p_page32_data = bp_rx_data_page32_get();

            printf("Page32:event_counter %u\n", (unsigned int)p_page32_data->update_event_counter);
            printf("Page32:slope %u\n", (unsigned int)p_page32_data->slope);
            printf("Page32:time_stamp %u\n", (unsigned int)p_page32_data->time_stamp);
            printf("Page32:torque_ticks_stamp %u\n", (unsigned int)p_page32_data->torque_ticks_stamp);
            printf("Page32:average_cadence %u\n", (unsigned int)p_page32_data->average_cadence);
#endif // defined(TRACE_DATA_PAGE)
            break;

        case COMMON_PAGE_80:
            // Manufacturer's identification common data page.
#if defined(TRACE_DATA_PAGE)
            p_page80_data = bp_rx_data_page80_get();

            printf("Page80:hw_revision %u\n", (unsigned int)p_page80_data->hw_revision);
            printf("Page80:manufacturing_id %u\n", (unsigned int)p_page80_data->manufacturing_id);
            printf("Page80:model_number %u\n", (unsigned int)p_page80_data->model_number);
#endif // defined(TRACE_DATA_PAGE)
            break;

        case COMMON_PAGE_81:
            // Product information common data page.
#if defined(TRACE_DATA_PAGE)
            p_page81_data = bp_rx_data_page81_get();

            printf("Page81:sw_revision %u\n", (unsigned int)p_page81_data->sw_revision);
            printf("Page81:serial_number %u\n", (unsigned int)p_page81_data->serial_number);
#endif // defined(TRACE_DATA_PAGE)
            break;

        default:
            APP_ERROR_HANDLER(p_event_return->param1);
            break;
    }
}