mirror of
https://github.com/meshtastic/firmware.git
synced 2026-10-09 14:41:19 -04:00
* thinknode-m9 variant * move lora to SPI1 device * enable SDcard * use HSPI * BaseUI tft -> HSPI * buzzer, webdav lib * fix build issues * M9 default to MUI, no BT, short ringtone * add keyboard long-press config * update variant * add ThingNode-M9 GPS string * GPS 115200 baud * Basic BaseUI support * Fixup power detection * Compass and KB fixes for M9 * add timed Lock::lock() * add SD card * point device-ui to thinknode m9 draft branch * trunk fmt * fix FusionCompass * Fix t-deck-tft linker arg list overflow in CI * SDcard/lora fix: SPI1 must not be declared twice in arduino 3.x -> reuse SPI1 defined in FSCommon.cpp * update battery parameters * reinit SD card when updating; fix PSRAM size * update lib versions * fix wakeup on key press (KB_INT) * fix default nag_timeout for TFT/MUI devices with buzzer * increase PSRAM and SD freq * trunk fmt * update lovyanGFX 1.2.26 * update device-ui commit reference * fix screen definition * remove DONE; maybe a keyword or other used identifier * fixed CI error nag_timeout * fix prepareSleep initialization * trunk fmt * reduce SD SPI frequency * update device-ui * fix SDcard issue * stage * fix device-ui commit reference * fix device-ui commit * update device-ui commit (fixed keyboard lag) * fix QMI8658 * trunk fmt * update .ini meta information, align SD freq * fix device-ui reference to target (ready to merge) * device-ui for all other targets * make the rabbit happy * trunk fmt * fixed lock screen * fix compile error * SPI lock timeout * apply device-ui fix * revert bad RadioLib commit hash in platformio.ini Co-authored-by: mverch67 <71137295+mverch67@users.noreply.github.com> * fix wrong commit hash change * fix fix commit fix * I love changing random numbers in random files --------- Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz> Co-authored-by: Ben Meadors <benmmeadors@gmail.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
124 lines
2.9 KiB
C++
124 lines
2.9 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"
|
|
#include "QMC6309Sensor.h"
|
|
|
|
#include <memory>
|
|
|
|
extern ScanI2C::DeviceAddress magnetometer_found;
|
|
|
|
class MagnetometerThread : public concurrency::OSThread
|
|
{
|
|
private:
|
|
std::unique_ptr<MotionSensor> sensor;
|
|
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) {
|
|
#if __has_include(<SparkFun_MMC5983MA_Arduino_Library.h>)
|
|
case ScanI2C::DeviceType::MMC5983MA:
|
|
sensor.reset(new MMC5983MASensor(device));
|
|
break;
|
|
#endif
|
|
#if __has_include(<SensorQMC6309.hpp>)
|
|
case ScanI2C::DeviceType::QMC6309:
|
|
sensor.reset(new QMC6309Sensor(device));
|
|
break;
|
|
#endif
|
|
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;
|
|
sensor.reset();
|
|
}
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif
|