restructure SensorBase

This commit is contained in:
andreas 2024-11-16 15:12:21 +01:00
parent 70fb1b3633
commit 85e1a0e5f0
5 changed files with 43 additions and 22 deletions

View File

@ -33,7 +33,7 @@ class BMP280Config : public IICSensorBase{
float prOff=0; float prOff=0;
Adafruit_BMP280 *device=nullptr; Adafruit_BMP280 *device=nullptr;
uint32_t sensorId=-1; uint32_t sensorId=-1;
BMP280Config(GwApi * api, const String &prfx):SensorBase(TYPE,api,prfx){ BMP280Config(GwApi * api, const String &prfx):IICSensorBase(TYPE,api,prfx){
} }
virtual bool isActive(){return prAct||tmAct;} virtual bool isActive(){return prAct||tmAct;}
virtual bool initDevice(GwApi *api,TwoWire *wire){ virtual bool initDevice(GwApi *api,TwoWire *wire){

View File

@ -11,9 +11,9 @@
class TwoWire; class TwoWire;
#endif #endif
using BusType=TwoWire; using BUSTYPE=TwoWire;
using IICSensorList=SensorList<BusType>; using IICSensorList=SensorList;
using IICSensorBase=SensorBase<BusType>; using IICSensorBase=SensorTemplate<BUSTYPE,SensorBase::IIC>;
template <class CFG> template <class CFG>

View File

@ -184,8 +184,8 @@ void runIicTask(GwApi *api){
bool runLoop=false; bool runLoop=false;
GwIntervalRunner timers; GwIntervalRunner timers;
int counterId=api->addCounter("iicsensors"); int counterId=api->addCounter("iicsensors");
for (auto it=sensors.begin();it != sensors.end();it++){ for (auto &&cfg:sensors){
IICSensorBase *cfg=*it; if (cfg->busType != SensorBase::IIC) continue;
auto bus=buses.find(cfg->busId); auto bus=buses.find(cfg->busId);
if (! cfg->isActive()) continue; if (! cfg->isActive()) continue;
if (bus == buses.end()){ if (bus == buses.end()){

View File

@ -16,9 +16,14 @@
#define _GWSENSORS_H #define _GWSENSORS_H
#include "GwApi.h" #include "GwApi.h"
#include "GwLog.h" #include "GwLog.h"
template<typename BUS>
class SensorBase{ class SensorBase{
public: public:
using BusType=enum{
IIC=0,
SPI=1,
UNKNOWN=-1
};
BusType busType=BusType::UNKNOWN;
int busId=0; int busId=0;
int iid=99; //N2K instanceId int iid=99; //N2K instanceId
int addr=-1; int addr=-1;
@ -27,25 +32,41 @@ class SensorBase{
long intv=0; long intv=0;
bool ok=false; bool ok=false;
virtual void readConfig(GwConfigHandler *cfg)=0; virtual void readConfig(GwConfigHandler *cfg)=0;
SensorBase(const String &tn,GwApi *api,const String &prfx):type(tn),prefix(prfx){ SensorBase(BusType bt,const String &tn,GwApi *api,const String &prfx)
:busType(bt),type(tn),prefix(prfx){
} }
using Creator=std::function<SensorBase<BUS> *(GwApi *api,const String &prfx)>; using Creator=std::function<SensorBase *(GwApi *api,const String &prfx)>;
virtual bool isActive(){return false;}; virtual bool isActive(){return false;};
virtual bool initDevice(GwApi *api,BUS *wire){return false;}; virtual bool initDevice(GwApi *api,void *bus){return false;};
virtual bool preinit(GwApi * api){return false;} virtual bool preinit(GwApi * api){return false;}
virtual void measure(GwApi * api,BUS *wire, int counterId){}; virtual void measure(GwApi * api,void *bus, int counterId){};
virtual ~SensorBase(){} virtual ~SensorBase(){}
}; };
template<typename BUS,SensorBase::BusType bt>
template<typename BUS> class SensorTemplate : public SensorBase{
class SensorList : public std::vector<SensorBase<BUS>*>{
public: public:
void add(GwApi *api, SensorBase<BUS> *sensor){ SensorTemplate(const String &tn,GwApi *api,const String &prfx)
:SensorBase(bt,tn,api,prfx){}
virtual bool initDevice(GwApi *api,BUS *bus){return false;};
virtual bool initDevice(GwApi *api,void *bus){
if (busType != bt) return false;
return initDevice(api,(BUS*)bus);
}
virtual void measure(GwApi * api,void *bus, int counterId){
if (busType != bt) return;
measure(api,(BUS*)bus,counterId);
};
};
class SensorList : public std::vector<SensorBase*>{
public:
void add(GwApi *api, SensorBase *sensor){
sensor->readConfig(api->getConfig()); sensor->readConfig(api->getConfig());
api->getLogger()->logDebug(GwLog::LOG,"configured sensor %s, status %d",sensor->prefix.c_str(),(int)sensor->ok); api->getLogger()->logDebug(GwLog::LOG,"configured sensor %s, status %d",sensor->prefix.c_str(),(int)sensor->ok);
this->push_back(sensor); this->push_back(sensor);
} }
using std::vector<SensorBase<BUS>*>::vector; using std::vector<SensorBase*>::vector;
}; };

View File

@ -48,7 +48,7 @@ class SPIBus{
spi_host_device_t host() const { return hd;} spi_host_device_t host() const { return hd;}
}; };
using BusType=SPIBus; using BUSTYPE=SPIBus;
class SSIDevice{ class SSIDevice{
spi_device_handle_t spi; spi_device_handle_t spi;
@ -90,7 +90,7 @@ class SSIDevice{
}; };
class SSISensor : public SensorBase<BusType>{ class SSISensor : public SensorTemplate<BUSTYPE,SensorBase::SPI>{
std::unique_ptr<SSIDevice> device; std::unique_ptr<SSIDevice> device;
protected: protected:
int bits=12; int bits=12;
@ -125,17 +125,17 @@ class SSISensor : public SensorBase<BusType>{
} }
public: public:
SSISensor(const String &type,GwApi *api,const String &prfx, int host):SensorBase(type,api,prfx) SSISensor(const String &type,GwApi *api,const String &prfx, int host):SensorTemplate<BUSTYPE,SensorBase::SPI>(type,api,prfx)
{ {
busId=host; busId=host;
} }
virtual bool isActive(){return act;}; virtual bool isActive(){return act;};
virtual bool initDevice(GwApi *api,BusType *bus){ virtual bool initDevice(GwApi *api,BUSTYPE *bus){
return initSSI(api->getLogger(),bus, clock,cs,bits); return initSSI(api->getLogger(),bus, clock,cs,bits);
}; };
}; };
using SpiSensorList=SensorList<BusType>; using SpiSensorList=SensorList;
#define GWSPI1_HOST SPI2_HOST #define GWSPI1_HOST SPI2_HOST
#define GWSPI2_HOST SPI3_HOST #define GWSPI2_HOST SPI3_HOST
#endif #endif