mirror of
https://github.com/meshtastic/firmware.git
synced 2026-09-17 09:01:47 -04:00
* Fixes * Remove BATTERY_LPCOMP_THRESHOLD BATTERY_LPCOMP_THRESHOLD is dead code — in main-nrf52.cpp it's inside #ifdef BATTERY_LPCOMP_INPUT, which this board intentionally doesn't define. The threshold value is never reached. * Trunk fix * Update MotionSensor.cpp * fix --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com> Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
115 lines
2.7 KiB
C++
115 lines
2.7 KiB
C++
#pragma once
|
|
#ifndef _MAGNETOMETER_THREAD_H_
|
|
#define _MAGNETOMETER_THREAD_H_
|
|
|
|
#include "configuration.h"
|
|
|
|
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_I2C && !MESHTASTIC_EXCLUDE_MAGNETOMETER
|
|
|
|
#include "../concurrency/OSThread.h"
|
|
#include "MMC5983MASensor.h"
|
|
#include "MotionSensor.h"
|
|
|
|
extern ScanI2C::DeviceAddress magnetometer_found;
|
|
|
|
class MagnetometerThread : public concurrency::OSThread
|
|
{
|
|
private:
|
|
MotionSensor *sensor = nullptr;
|
|
ScanI2C::FoundDevice device;
|
|
bool isInitialised = false;
|
|
|
|
public:
|
|
explicit MagnetometerThread(ScanI2C::FoundDevice foundDevice) : OSThread("Magnetometer")
|
|
{
|
|
device = foundDevice;
|
|
init();
|
|
}
|
|
|
|
explicit MagnetometerThread(ScanI2C::DeviceType type) : MagnetometerThread(ScanI2C::FoundDevice{type, magnetometer_found}) {}
|
|
|
|
void start()
|
|
{
|
|
init();
|
|
setIntervalFromNow(0);
|
|
};
|
|
|
|
void calibrate(uint16_t forSeconds)
|
|
{
|
|
if (sensor) {
|
|
sensor->calibrate(forSeconds);
|
|
setIntervalFromNow(0);
|
|
}
|
|
}
|
|
|
|
protected:
|
|
int32_t runOnce() override
|
|
{
|
|
canSleep = true;
|
|
|
|
if (isInitialised)
|
|
return sensor->runOnce();
|
|
|
|
return MOTION_SENSOR_CHECK_INTERVAL_MS;
|
|
}
|
|
|
|
private:
|
|
void init()
|
|
{
|
|
if (isInitialised) {
|
|
return;
|
|
}
|
|
|
|
if (device.address.port == ScanI2C::I2CPort::NO_I2C || device.address.address == 0 || device.type == ScanI2C::NONE) {
|
|
LOG_DEBUG("MagnetometerThread Disable due to no sensors found");
|
|
disable();
|
|
return;
|
|
}
|
|
|
|
switch (device.type) {
|
|
case ScanI2C::DeviceType::MMC5983MA:
|
|
sensor = new MMC5983MASensor(device);
|
|
break;
|
|
default:
|
|
disable();
|
|
return;
|
|
}
|
|
|
|
isInitialised = sensor->init();
|
|
if (!isInitialised) {
|
|
clean();
|
|
}
|
|
LOG_DEBUG("MagnetometerThread::init %s", isInitialised ? "ok" : "failed");
|
|
}
|
|
|
|
MagnetometerThread(const MagnetometerThread &other) : OSThread::OSThread("Magnetometer") { this->copy(other); }
|
|
|
|
virtual ~MagnetometerThread() { clean(); }
|
|
|
|
MagnetometerThread &operator=(const MagnetometerThread &other)
|
|
{
|
|
this->copy(other);
|
|
return *this;
|
|
}
|
|
|
|
void copy(const MagnetometerThread &other)
|
|
{
|
|
if (this != &other) {
|
|
clean();
|
|
this->device = ScanI2C::FoundDevice(other.device.type,
|
|
ScanI2C::DeviceAddress(other.device.address.port, other.device.address.address));
|
|
}
|
|
}
|
|
|
|
void clean()
|
|
{
|
|
isInitialised = false;
|
|
delete sensor;
|
|
sensor = nullptr;
|
|
}
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif
|