correct handling for grove based iic sensors
This commit is contained in:
parent
99d7484afb
commit
b091d9aee4
|
@ -2,8 +2,6 @@
|
|||
#ifdef _GWIIC
|
||||
#if defined(GWBME280) || defined(GWBME28011) || defined(GWBME28012)|| defined(GWBME28021)|| defined(GWBME28022)
|
||||
#define _GWBME280
|
||||
#else
|
||||
#undef _GWBME280
|
||||
#endif
|
||||
#else
|
||||
#undef _GWBME280
|
||||
|
@ -17,10 +15,11 @@
|
|||
#include <Adafruit_BME280.h>
|
||||
#endif
|
||||
#ifdef _GWBME280
|
||||
#define PRFX1 "BME28011"
|
||||
#define PRFX2 "BME28012"
|
||||
#define PRFX3 "BME28021"
|
||||
#define PRFX4 "BME28022"
|
||||
#define TYPE "BME280"
|
||||
#define PRFX1 TYPE "11"
|
||||
#define PRFX2 TYPE "12"
|
||||
#define PRFX3 TYPE "21"
|
||||
#define PRFX4 TYPE "22"
|
||||
class BME280Config : public IICSensorBase{
|
||||
public:
|
||||
bool prAct=true;
|
||||
|
@ -36,7 +35,7 @@ class BME280Config : public IICSensorBase{
|
|||
float prOff=0;
|
||||
Adafruit_BME280 *device=nullptr;
|
||||
uint32_t sensorId=-1;
|
||||
BME280Config(GwApi * api, const String &prfx):SensorBase(api,prfx){
|
||||
BME280Config(GwApi * api, const String &prfx):SensorBase(TYPE,api,prfx){
|
||||
}
|
||||
virtual bool isActive(){return prAct||huAct||tmAct;}
|
||||
virtual bool initDevice(GwApi *api,TwoWire *wire){
|
||||
|
@ -106,6 +105,7 @@ class BME280Config : public IICSensorBase{
|
|||
|
||||
virtual void readConfig(GwConfigHandler *cfg) override
|
||||
{
|
||||
if (ok) return;
|
||||
if (prefix == PRFX1)
|
||||
{
|
||||
busId = 1;
|
||||
|
@ -137,11 +137,13 @@ class BME280Config : public IICSensorBase{
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
void registerBME280(GwApi *api,IICSensorList &sensors){
|
||||
static IICSensorBase::Creator creator([](GwApi *api, const String &prfx){
|
||||
return new BME280Config(api,prfx);
|
||||
});
|
||||
IICSensorBase::Creator registerBME280(GwApi *api,IICSensorList &sensors){
|
||||
#if defined(GWBME280) || defined(GWBME28011)
|
||||
{
|
||||
BME280Config *cfg=new BME280Config(api,PRFX1);
|
||||
auto *cfg=creator(api,PRFX1);
|
||||
sensors.add(api,cfg);
|
||||
CHECK_IIC1();
|
||||
#pragma message "GWBME28011 defined"
|
||||
|
@ -149,7 +151,7 @@ void registerBME280(GwApi *api,IICSensorList &sensors){
|
|||
#endif
|
||||
#if defined(GWBME28012)
|
||||
{
|
||||
BME280Config *cfg=new BME280Config(api,PRFX2);
|
||||
auto *cfg=creator(api,PRFX2);
|
||||
sensors.add(api,cfg);
|
||||
CHECK_IIC1();
|
||||
#pragma message "GWBME28012 defined"
|
||||
|
@ -157,7 +159,7 @@ void registerBME280(GwApi *api,IICSensorList &sensors){
|
|||
#endif
|
||||
#if defined(GWBME28021)
|
||||
{
|
||||
BME280Config *cfg=new BME280Config(api,PRFX3);
|
||||
auto *cfg=creator(api,PRFX3);
|
||||
sensors.add(api,cfg);
|
||||
CHECK_IIC2();
|
||||
#pragma message "GWBME28021 defined"
|
||||
|
@ -165,15 +167,17 @@ void registerBME280(GwApi *api,IICSensorList &sensors){
|
|||
#endif
|
||||
#if defined(GWBME28022)
|
||||
{
|
||||
BME280Config *cfg=new BME280Config(api,PRFX4);
|
||||
auto *cfg=creator(api,PRFX4);
|
||||
sensors.add(api,cfg);
|
||||
CHECK_IIC1();
|
||||
#pragma message "GWBME28022 defined"
|
||||
}
|
||||
#endif
|
||||
return creator;
|
||||
}
|
||||
#else
|
||||
void registerBME280(GwApi *api,IICSensorList &sensors){
|
||||
IICSensorBase::Creator registerBME280(GwApi *api,IICSensorList &sensors){
|
||||
return IICSensorBase::Creator();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef _GWBME280_H
|
||||
#define _GWBME280_H
|
||||
#include "GwIicSensors.h"
|
||||
void registerBME280(GwApi *api,IICSensorList &sensors);
|
||||
IICSensorBase::Creator registerBME280(GwApi *api,IICSensorList &sensors);
|
||||
#endif
|
|
@ -103,8 +103,15 @@ void sendN2kTemperature(GwApi *api,CFG &cfg,double value, int counterId){
|
|||
}
|
||||
|
||||
|
||||
|
||||
#ifndef _GWI_IIC1
|
||||
#define CHECK_IIC1() checkDef(GWIIC_SCL,GWIIC_SDA)
|
||||
#else
|
||||
#define CHECK_IIC1()
|
||||
#endif
|
||||
#ifndef _GWI_IIC2
|
||||
#define CHECK_IIC2() checkDef(GWIIC_SCL2,GWIIC_SDA2)
|
||||
#else
|
||||
#define CHECK_IIC2()
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -43,31 +43,41 @@ static std::vector<IICGrove> iicGroveList;
|
|||
void runIicTask(GwApi *api);
|
||||
|
||||
static IICSensorList sensors;
|
||||
static void addGroveItems(IICSensorBase::Creator creator,GwApi *api, IICSensorList &sensors, const String &bus,const String &grove, int, int)
|
||||
static void addGroveItems(std::vector<IICSensorBase::Creator> &creators,GwApi *api, IICSensorList &sensors, const String &bus,const String &grove, int, int)
|
||||
{
|
||||
GwLog *logger=api->getLogger();
|
||||
for (auto &&init : iicGroveList)
|
||||
{
|
||||
LOG_DEBUG(GwLog::LOG, "trying grove item %s:%s:%s for grove %s, bus %s",
|
||||
LOG_DEBUG(GwLog::DEBUG, "trying grove item %s:%s:%s for grove %s, bus %s",
|
||||
init.base.c_str(),init.grove.c_str(),
|
||||
init.suffix.c_str(),grove.c_str(),bus.c_str()
|
||||
);
|
||||
String prfx = init.item(grove, bus);
|
||||
if (!prfx.isEmpty())
|
||||
{
|
||||
bool found=false;
|
||||
for (auto &&creator : creators)
|
||||
{
|
||||
if (! creator) continue;
|
||||
auto *scfg = creator(api, prfx);
|
||||
scfg->readConfig(api->getConfig());
|
||||
if (scfg->ok)
|
||||
{
|
||||
LOG_DEBUG(GwLog::LOG, "adding %s from grove config", prfx.c_str());
|
||||
sensors.add(api, scfg);
|
||||
found=true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_DEBUG(GwLog::ERROR, "invalid grove sensor config %s", prfx.c_str());
|
||||
LOG_DEBUG(GwLog::DEBUG, "unmatched grove sensor config %s for %s", prfx.c_str(), scfg->type.c_str());
|
||||
delete scfg;
|
||||
}
|
||||
}
|
||||
if (! found){
|
||||
LOG_DEBUG(GwLog::ERROR,"no iic sensor found for %s",prfx.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -78,21 +88,16 @@ void initIicTask(GwApi *api){
|
|||
#else
|
||||
bool addTask=false;
|
||||
GwConfigHandler *config=api->getConfig();
|
||||
IICSensorBase::Creator sht3xCreator=registerSHT3X(api,sensors);
|
||||
std::vector<IICSensorBase::Creator> creators;
|
||||
creators.push_back(registerSHT3X(api,sensors));
|
||||
creators.push_back(registerQMP6988(api,sensors));
|
||||
creators.push_back(registerBME280(api,sensors));
|
||||
#ifdef _GWI_IIC1
|
||||
addGroveItems(sht3xCreator,api,sensors,"1",_GWI_IIC1);
|
||||
addGroveItems(creators,api,sensors,"1",_GWI_IIC1);
|
||||
#endif
|
||||
#ifdef _GWI_IIC2
|
||||
addGroveItems(sht3xCreator,api,sensors,"2",_GWI_IIC2);
|
||||
addGroveItems(creators,api,sensors,"2",_GWI_IIC2);
|
||||
#endif
|
||||
IICSensorBase::Creator qmp6988Creator=registerQMP6988(api,sensors);
|
||||
#ifdef _GWI_IIC1
|
||||
addGroveItems(qmp6988Creator,api,sensors,"1",_GWI_IIC1);
|
||||
#endif
|
||||
#ifdef _GWI_IIC2
|
||||
addGroveItems(qmp6988Creator,api,sensors,"2",_GWI_IIC2);
|
||||
#endif
|
||||
registerBME280(api,sensors);
|
||||
for (auto it=sensors.begin();it != sensors.end();it++){
|
||||
if ((*it)->preinit(api)) addTask=true;
|
||||
}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
#define _IIC_GROOVE_LIST
|
||||
#include "GwQMP6988.h"
|
||||
#ifdef _GWQMP6988
|
||||
#define PRFX1 "QMP698811"
|
||||
#define PRFX2 "QMP698812"
|
||||
#define PRFX3 "QMP698821"
|
||||
#define PRFX4 "QMP698822"
|
||||
#define TYPE "QMP6988"
|
||||
#define PRFX1 TYPE "11"
|
||||
#define PRFX2 TYPE "12"
|
||||
#define PRFX3 TYPE "21"
|
||||
#define PRFX4 TYPE "22"
|
||||
class QMP6988Config : public IICSensorBase{
|
||||
public:
|
||||
String prNam="Pressure";
|
||||
|
@ -12,7 +13,7 @@ class QMP6988Config : public IICSensorBase{
|
|||
tN2kPressureSource prSrc=tN2kPressureSource::N2kps_Atmospheric;
|
||||
float prOff=0;
|
||||
QMP6988 *device=nullptr;
|
||||
QMP6988Config(GwApi* api,const String &prefix):SensorBase(api,prefix){}
|
||||
QMP6988Config(GwApi* api,const String &prefix):SensorBase(TYPE,api,prefix){}
|
||||
virtual bool isActive(){return prAct;};
|
||||
virtual bool initDevice(GwApi *api,TwoWire *wire){
|
||||
if (!isActive()) return false;
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
#include "GwSHT3X.h"
|
||||
#ifdef _GWSHT3X
|
||||
#define PRFX1 "SHT3X11"
|
||||
#define PRFX2 "SHT3X12"
|
||||
#define PRFX3 "SHT3X21"
|
||||
#define PRFX4 "SHT3X22"
|
||||
#define TYPE "SHT3X"
|
||||
#define PRFX1 TYPE "11"
|
||||
#define PRFX2 TYPE "12"
|
||||
#define PRFX3 TYPE "21"
|
||||
#define PRFX4 TYPE "22"
|
||||
|
||||
class SHT3XConfig : public IICSensorBase{
|
||||
public:
|
||||
|
@ -15,7 +16,7 @@ class SHT3XConfig : public IICSensorBase{
|
|||
tN2kTempSource tmSrc;
|
||||
SHT3X *device=nullptr;
|
||||
SHT3XConfig(GwApi *api,const String &prefix):
|
||||
SensorBase(api,prefix){}
|
||||
SensorBase(TYPE,api,prefix){}
|
||||
virtual bool isActive(){
|
||||
return tmAct || huAct;
|
||||
}
|
||||
|
@ -147,7 +148,7 @@ IICSensorBase::Creator registerSHT3X(GwApi *api,IICSensorList &sensors){
|
|||
|
||||
#else
|
||||
IICSensorBase::Creator registerSHT3X(GwApi *api,IICSensorList &sensors){
|
||||
|
||||
return IICSensorBase::Creator();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -22,11 +22,12 @@ class SensorBase{
|
|||
int busId=0;
|
||||
int iid=99; //N2K instanceId
|
||||
int addr=-1;
|
||||
String prefix;
|
||||
const String prefix;
|
||||
const String type;
|
||||
long intv=0;
|
||||
bool ok=false;
|
||||
virtual void readConfig(GwConfigHandler *cfg)=0;
|
||||
SensorBase(GwApi *api,const String &prfx):prefix(prfx){
|
||||
SensorBase(const String &tn,GwApi *api,const String &prfx):type(tn),prefix(prfx){
|
||||
}
|
||||
using Creator=std::function<SensorBase<BUS> *(GwApi *api,const String &prfx)>;
|
||||
virtual bool isActive(){return false;};
|
||||
|
|
|
@ -125,7 +125,7 @@ class SSISensor : public SensorBase<BusType>{
|
|||
}
|
||||
|
||||
public:
|
||||
SSISensor(GwApi *api,const String &prfx, int host):SensorBase(api,prfx)
|
||||
SSISensor(const String &type,GwApi *api,const String &prfx, int host):SensorBase(type,api,prfx)
|
||||
{
|
||||
busId=host;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue