mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-03 06:51:36 +08:00
switch measurement trigger scheduling
This commit is contained in:
@@ -123,7 +123,6 @@ void AFBRS50::processMeasurement()
|
|||||||
quality = 0;
|
quality = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: I don't think we need this..
|
|
||||||
if (distance > _max_distance) {
|
if (distance > _max_distance) {
|
||||||
distance = 0.0;
|
distance = 0.0;
|
||||||
quality = 0;
|
quality = 0;
|
||||||
@@ -264,49 +263,51 @@ void AFBRS50::Run()
|
|||||||
|
|
||||||
// Enable interrupt on falling edge
|
// Enable interrupt on falling edge
|
||||||
px4_arch_configgpio(BROADCOM_AFBR_S50_S2PI_IRQ);
|
px4_arch_configgpio(BROADCOM_AFBR_S50_S2PI_IRQ);
|
||||||
_state = STATE::TRIGGER;
|
|
||||||
// TODO: delay after configure?
|
// TODO: delay after configure?
|
||||||
ScheduleNow();
|
_state = STATE::TRIGGER;
|
||||||
// ScheduleDelayed(50_ms);
|
ScheduleDelayed(_measurement_inverval);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE::TRIGGER: {
|
case STATE::TRIGGER: {
|
||||||
if (Argus_GetStatus(_hnd) != STATUS_IDLE) {
|
if (Argus_GetStatus(_hnd) != STATUS_IDLE) {
|
||||||
perf_count(_not_ready_perf);
|
perf_count(_not_ready_perf);
|
||||||
ScheduleDelayed(10_ms);
|
ScheduleDelayed(_measurement_inverval / 4);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trigger continuous measurement mode. An hrt_call_after will trigger
|
_trigger_time = hrt_absolute_time();
|
||||||
// measurements periodically -- see API/Src/timer.c
|
status_t status = Argus_TriggerMeasurement(_hnd, measurementReadyCallback);
|
||||||
status_t status = Argus_StartMeasurementTimer(_hnd, measurementReadyCallback);
|
|
||||||
|
|
||||||
if (status != STATUS_OK) {
|
if (status != STATUS_OK) {
|
||||||
PX4_ERR("Argus_TriggerMeasurement status not okay: %i", (int)status);
|
// PX4_ERR("Argus_TriggerMeasurement status not okay: %i", (int)status);
|
||||||
perf_count(_not_ready_perf);
|
perf_count(_not_ready_perf);
|
||||||
ScheduleDelayed(50_ms);
|
// Reschedule another trigger
|
||||||
|
_state = STATE::TRIGGER;
|
||||||
|
ScheduleDelayed(_measurement_inverval / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We don't reschedule, the trigger callback will schedule a collect
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE::COLLECT: {
|
case STATE::COLLECT: {
|
||||||
|
// Process and publish the measurement
|
||||||
processMeasurement();
|
processMeasurement();
|
||||||
|
|
||||||
// Change measurement rate and mode based on range
|
// Change measurement rate and mode based on range
|
||||||
updateMeasurementRateFromRange();
|
updateMeasurementRateFromRange();
|
||||||
|
|
||||||
// Rechedule watchdog, push back by 2x measurement rate
|
|
||||||
_state = STATE::WATCHDOG;
|
|
||||||
ScheduleDelayed(_measurement_inverval * 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE::WATCHDOG: {
|
|
||||||
PX4_WARN("watchdog triggered, rescheduling");
|
|
||||||
_state = STATE::TRIGGER;
|
_state = STATE::TRIGGER;
|
||||||
// When this occurs the device locks up for ~160ms
|
|
||||||
ScheduleDelayed(160_ms);
|
auto elapsed = hrt_elapsed_time(&_trigger_time);
|
||||||
|
|
||||||
|
if (elapsed > _measurement_inverval) {
|
||||||
|
ScheduleNow();
|
||||||
|
} else {
|
||||||
|
ScheduleDelayed(_measurement_inverval - elapsed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -315,6 +316,9 @@ void AFBRS50::Run()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: fix this logic
|
||||||
|
// Require 3 readings on same side of fence to mode switch
|
||||||
|
// Require 3_s after ground_contact in vehicle_land_detected before switching to long range mode
|
||||||
void AFBRS50::updateMeasurementRateFromRange()
|
void AFBRS50::updateMeasurementRateFromRange()
|
||||||
{
|
{
|
||||||
// only update mode if _current_distance is a valid measurement and if the last rate switch was more than 1 second ago
|
// only update mode if _current_distance is a valid measurement and if the last rate switch was more than 1 second ago
|
||||||
|
|||||||
@@ -74,7 +74,6 @@ private:
|
|||||||
CONFIGURE,
|
CONFIGURE,
|
||||||
TRIGGER,
|
TRIGGER,
|
||||||
COLLECT,
|
COLLECT,
|
||||||
WATCHDOG
|
|
||||||
} _state{STATE::CONFIGURE};
|
} _state{STATE::CONFIGURE};
|
||||||
|
|
||||||
PX4Rangefinder _px4_rangefinder;
|
PX4Rangefinder _px4_rangefinder;
|
||||||
@@ -90,6 +89,8 @@ private:
|
|||||||
float _max_distance{30.f};
|
float _max_distance{30.f};
|
||||||
uint32_t _current_rate{0};
|
uint32_t _current_rate{0};
|
||||||
|
|
||||||
|
hrt_abstime _trigger_time{0};
|
||||||
|
|
||||||
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
|
uORB::Subscription _parameter_update_sub{ORB_ID(parameter_update)};
|
||||||
|
|
||||||
uint32_t _measurement_inverval {1000000 / 50}; // 50Hz
|
uint32_t _measurement_inverval {1000000 / 50}; // 50Hz
|
||||||
|
|||||||
Reference in New Issue
Block a user