LidarLite: Added collect phase to PWM

This commit is contained in:
Johan Jansen 2015-03-24 12:57:22 +01:00
parent 4e7fa5aade
commit c4bc9d19cb
3 changed files with 49 additions and 16 deletions

View File

@ -94,6 +94,7 @@ protected:
uint32_t getMeasureTicks() const;
virtual int measure() = 0;
virtual int collect() = 0;
virtual int reset_sensor() = 0;

View File

@ -48,6 +48,7 @@ static const int ERROR = -1;
#endif
LidarLitePWM::LidarLitePWM() :
_terminateRequested(false),
_pwmSub(-1),
_pwm{},
_rangePub(-1),
@ -74,6 +75,8 @@ int LidarLitePWM::init()
void LidarLitePWM::print_info()
{
printf("poll interval: %u ticks\n", getMeasureTicks());
printf("distance: %ucm (0x%04x)\n",
(unsigned)_range.distance, (unsigned)_range.distance);
}
void LidarLitePWM::print_registers()
@ -83,33 +86,57 @@ void LidarLitePWM::print_registers()
void LidarLitePWM::start()
{
//TODO: start measurement task
}
void LidarLitePWM::stop()
{
//TODO: stop measurement task
_terminateRequested = true;
}
int LidarLitePWM::measure()
{
bool update;
orb_check(_pwmSub, &update);
int result = OK;
if(update) {
orb_copy(ORB_ID(pwm_input), _pwmSub, &_pwm);
_range.error_count = _pwm.error_count;
_range.maximum_distance = get_maximum_distance();
_range.minimum_distance = get_minimum_distance();
_range.distance = _pwm.pulse_width / 1000.0f; //10 usec = 1 cm distance for LIDAR-Lite
_range.distance_vector[0] = _range.distance;
_range.just_updated = 0;
_range.valid = true;
_range.timestamp = hrt_absolute_time();
_range.error_count = _pwm.error_count;
_range.valid = true;
_range.maximum_distance = get_maximum_distance();
_range.minimum_distance = get_minimum_distance();
_range.distance = _pwm.pulse_width / 1000.0f; //10 usec = 1 cm distance for LIDAR-Lite
_range.distance_vector[0] = _range.distance;
_range.just_updated = 0;
orb_publish(ORB_ID(sensor_range_finder), _rangePub, &_range);
//TODO: due to a bug in older versions of the LidarLite firmware, we have to reset sensor on (distance == 0)
if(_range.distance <= 0.0f) {
_range.valid = false;
_range.error_count++;
result = ERROR;
}
return OK;
orb_publish(ORB_ID(sensor_range_finder), _rangePub, &_range);
return result;
}
int LidarLitePWM::collect()
{
//Check PWM
bool update;
orb_check(_pwmSub, &update);
if(update) {
orb_copy(ORB_ID(pwm_input), _pwmSub, &_pwm);
_range.timestamp = hrt_absolute_time();
return OK;
}
//Timeout readings after 0.2 seconds and mark as invalid
if(hrt_absolute_time() - _range.timestamp > LL40LS_CONVERSION_TIMEOUT*2) {
_range.timestamp = hrt_absolute_time();
_range.valid = false;
orb_publish(ORB_ID(sensor_range_finder), _rangePub, &_range);
return ERROR;
}
return EAGAIN;
}

View File

@ -70,7 +70,12 @@ public:
protected:
int measure() override;
int collect() override;
void task_main_trampoline(int argc, char *argv[]);
private:
bool _terminateRequested;
int _pwmSub;
pwm_input_s _pwm;
orb_advert_t _rangePub;