Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 
    SOLVED

    BME680 driver bug

    BME680 driver bug

    jrlemieux
    New Poster

    In the file bme680.c on lines 1212 to 1215, we can read:

    rslt = null_ptr_check(dev);
    do {
        if (rslt == BME680_OK) {
            rslt = bme680_get_regs(((uint8_t) (BME680_FIELD0_ADDR)), buff, (uint16_t) BME680_FIELD_LENGTH,

    The issue is that the variable "rslt" is not altered further down the loop, so when there is an error the first time, "rslt" will be different than BME680_OK, so the "if" on line 1214 will always be false, and the bme680_get_regs function will never be called again.

    So at the end, this code will always try a maximum of 1 time.

    Thank you.

    JL, Clarity IoT


                                           

    5 REPLIES 5

    jrlemieux
    New Poster

    Also, this code fills in the output "struct bme680_field_data *data" variable even when an error occurs upon a call to bme680_get_regs. The "rslt" status code should be checked just after the call and the error condition should be properly handled.

    Minhwan
    Community Moderator
    Community Moderator

    Hello  jrlemieux, 

     

    Make sense.

    I will let our apps team know to fix this issue. 

    Thanks, 

    Minhwan
    Community Moderator
    Community Moderator

    Hello jrlemieux, 

     

    We have updated version source code as below. 

    GitHub - BoschSensortec/BME68x-Sensor-API: Common Sensor API for the BME680 and BME688 sensors

    Could you use this one? 

    It fixed your comment already. 

    Thanks, 

    jrlemieux
    New Poster

    The bug is not fixed. 

    Line 1141 reads:

    while ((tries) && (rslt == BME68X_OK))

    This test is wrong, because the loop will not be performed if there was an error the first time the loop is executed.

    Lines 1207 to 1209 read:

    if (rslt == BME68X_OK)
    {
      dev->delay_us(BME68X_PERIOD_POLL, dev->intf_ptr);

    This is wrong because the wait should be done between the attemps when there is a failure, not a success.

    Finally, the rslt that is captured on line 1143 is checked too late. All the processing between lins 1153 to 1175 should not be execued when an error happens on line 1143. 

    The check on line 1147 should be done at the start of the function, not in the loop.

    I feel that the current code has never neeb tested under a failure test case.

    Thank you.

    JL

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist