// read latest values from sensor and fill in x,y and totals bool AP_OpticalFlow_ADNS3080::update() { byte motion_reg; surface_quality = (unsigned int)read_register(ADNS3080_SQUAL); delayMicroseconds(50); // small delay // check for movement, update x,y values motion_reg = read_register(ADNS3080_MOTION); _overflow = ((motion_reg & 0x10) != 0); // check if we've had an overflow if( (motion_reg & 0x80) != 0 ) { raw_dx = ((char)read_register(ADNS3080_DELTA_X)); delayMicroseconds(50); // small delay raw_dy = ((char)read_register(ADNS3080_DELTA_Y)); _motion = true; }else{ raw_dx = 0; raw_dy = 0; } last_update = millis(); apply_orientation_matrix(); return true; }
// read latest values from sensor and fill in x,y and totals void AP_OpticalFlow_ADNS3080::update(uint32_t now) { uint8_t motion_reg; surface_quality = read_register(ADNS3080_SQUAL); hal.scheduler->delay_microseconds(50); // check for movement, update x,y values motion_reg = read_register(ADNS3080_MOTION); // check if we've had an overflow _overflow = ((motion_reg & 0x10) != 0); if( (motion_reg & 0x80) != 0 ) { raw_dx = ((int8_t)read_register(ADNS3080_DELTA_X)); hal.scheduler->delay_microseconds(50); raw_dy = ((int8_t)read_register(ADNS3080_DELTA_Y)); _motion = true; }else{ raw_dx = 0; raw_dy = 0; } last_update = hal.scheduler->millis(); apply_orientation_matrix(); }