123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #include <AP_HAL/AP_HAL.h>
- #include <AP_Common/AP_Common.h>
- #include <AP_Math/AP_Math.h>
- #include "RangeFinder.h"
- #include "AP_RangeFinder_Params.h"
- #include "AP_RangeFinder_analog.h"
- extern const AP_HAL::HAL& hal;
- AP_RangeFinder_analog::AP_RangeFinder_analog(RangeFinder::RangeFinder_State &_state, AP_RangeFinder_Params &_params) :
- AP_RangeFinder_Backend(_state, _params)
- {
- source = hal.analogin->channel(_params.pin);
- if (source == nullptr) {
-
- set_status(RangeFinder::RangeFinder_NotConnected);
- return;
- }
- set_status(RangeFinder::RangeFinder_NoData);
- }
- bool AP_RangeFinder_analog::detect(AP_RangeFinder_Params &_params)
- {
- if (_params.pin != -1) {
- return true;
- }
- return false;
- }
- void AP_RangeFinder_analog::update_voltage(void)
- {
- if (source == nullptr) {
- state.voltage_mv = 0;
- return;
- }
-
- source->set_pin(params.pin);
- if (params.ratiometric) {
- state.voltage_mv = source->voltage_average_ratiometric() * 1000U;
- } else {
- state.voltage_mv = source->voltage_average() * 1000U;
- }
- }
- void AP_RangeFinder_analog::update(void)
- {
- update_voltage();
- float v = state.voltage_mv * 0.001f;
- float dist_m = 0;
- float scaling = params.scaling;
- float offset = params.offset;
- RangeFinder::RangeFinder_Function function = (RangeFinder::RangeFinder_Function)params.function.get();
- int16_t _max_distance_cm = params.max_distance_cm;
- switch (function) {
- case RangeFinder::FUNCTION_LINEAR:
- dist_m = (v - offset) * scaling;
- break;
-
- case RangeFinder::FUNCTION_INVERTED:
- dist_m = (offset - v) * scaling;
- break;
- case RangeFinder::FUNCTION_HYPERBOLA:
- if (v <= offset) {
- dist_m = 0;
- } else {
- dist_m = scaling / (v - offset);
- }
- if (dist_m > _max_distance_cm * 0.01f) {
- dist_m = _max_distance_cm * 0.01f;
- }
- break;
- }
- if (dist_m < 0) {
- dist_m = 0;
- }
- state.distance_cm = dist_m * 100.0f;
- state.last_reading_ms = AP_HAL::millis();
-
- update_status();
- }
|