23 #define KELLER_DEBUG 0 26 # define Debug(fmt, args ...) do {printf(fmt "\n", ## args);} while(0) 28 # define Debug(fmt, args ...) 44 , _dev(
std::move(dev))
55 if (!sensor || !sensor->
_init()) {
71 AP_HAL::panic(
"PANIC: AP_Baro_KellerLD: failed to take serial semaphore for init");
77 bool cal_read_ok =
true;
80 uint16_t ms_word, ls_word;
93 ms_word = (data[1] << 8) | data[2];
94 Debug(
"0x13: %d [%d, %d, %d]", ms_word, data[0], data[1], data[2]);
101 ls_word = (data[1] << 8) | data[2];
102 Debug(
"0x14: %d [%d, %d, %d]", ls_word, data[0], data[1], data[2]);
104 uint32_t cal_data = (ms_word << 16) | ls_word;
113 ms_word = (data[1] << 8) | data[2];
114 Debug(
"0x15: %d [%d, %d, %d]", ms_word, data[0], data[1], data[2]);
121 ls_word = (data[1] << 8) | data[2];
122 Debug(
"0x16: %d [%d, %d, %d]", ls_word, data[0], data[1], data[2]);
124 cal_data = (ms_word << 16) | ls_word;
133 printf(
"Cal read bad!\n");
169 Debug(
"Keller LD read failed!");
174 uint16_t pressure_raw = (data[1] << 8) | data[2];
175 uint16_t temperature_raw = (data[3] << 8) | data[4];
178 static uint8_t samples = 0;
181 Debug(
"data: [%d, %d, %d, %d, %d]", data[0], data[1], data[2], data[3], data[4]);
182 Debug(
"pressure_raw: %d\ttemperature_raw: %d", pressure_raw, temperature_raw);
186 if (pressure_raw == 0 || temperature_raw == 0) {
187 Debug(
"Keller: bad read");
216 _accum.sum_pressure += pressure;
220 if (
_accum.num_samples == max_count) {
222 _accum.sum_temperature /= 2;
237 if (
_accum.num_samples == 0) {
242 sum_pressure =
_accum.sum_pressure;
243 sum_temperature =
_accum.sum_temperature;
244 num_samples =
_accum.num_samples;
249 uint16_t raw_pressure_avg = sum_pressure /
num_samples;
250 uint16_t raw_temperature_avg = sum_temperature /
num_samples;
256 float temperature = ((raw_temperature_avg >> 4) - 24) * 0.05f - 50;
int printf(const char *fmt,...)
virtual PeriodicHandle register_periodic_callback(uint32_t period_usec, PeriodicCb)=0
AP_Baro_KellerLD(AP_Baro &baro, AP_HAL::OwnPtr< AP_HAL::Device > dev)
void _copy_to_frontend(uint8_t instance, float pressure, float temperature)
uint8_t register_sensor(void)
virtual AP_HAL::Semaphore * get_semaphore()=0
virtual void set_retries(uint8_t retries)
AP_HAL::OwnPtr< AP_HAL::Device > _dev
uint8_t get_bus_address(void) const
#define HAL_SEMAPHORE_BLOCK_FOREVER
virtual bool take(uint32_t timeout_ms) WARN_IF_UNUSED=0
struct AP_Baro_KellerLD::@9 _accum
static const uint8_t CMD_PRANGE_MAX_MSB
uint8_t bus_num(void) const
virtual void delay(uint16_t ms)=0
static AP_HAL::OwnPtr< AP_HAL::Device > dev
#define Debug(fmt, args ...)
void _update_and_wrap_accumulator(uint16_t pressure, uint16_t temperature, uint8_t max_count)
static const uint8_t CMD_PRANGE_MIN_LSB
static const uint8_t CMD_PRANGE_MIN_MSB
bool pressure_ok(float press)
static const uint8_t CMD_PRANGE_MAX_LSB
static const uint8_t CMD_REQUEST_MEASUREMENT
virtual bool transfer(const uint8_t *send, uint32_t send_len, uint8_t *recv, uint32_t recv_len)=0
void set_type(uint8_t instance, baro_type_t type)
static AP_Baro_Backend * probe(AP_Baro &baro, AP_HAL::OwnPtr< AP_HAL::Device > dev)
#define FUNCTOR_BIND_MEMBER(func, rettype,...)
void panic(const char *errormsg,...) FMT_PRINTF(1
AP_HAL::Scheduler * scheduler