correct handling for grove based iic sensors

This commit is contained in:
andreas 2024-03-21 11:51:10 +01:00
parent 99d7484afb
commit b091d9aee4
8 changed files with 73 additions and 54 deletions

View File

@ -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

View File

@ -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

View File

@ -103,8 +103,15 @@ void sendN2kTemperature(GwApi *api,CFG &cfg,double value, int counterId){
}
#define CHECK_IIC1() checkDef(GWIIC_SCL,GWIIC_SDA)
#define CHECK_IIC2() checkDef(GWIIC_SCL2,GWIIC_SDA2)
#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

View File

@ -43,29 +43,39 @@ 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())
{
auto *scfg = creator(api, prfx);
scfg->readConfig(api->getConfig());
if (scfg->ok)
bool found=false;
for (auto &&creator : creators)
{
LOG_DEBUG(GwLog::LOG, "adding %s from grove config", prfx.c_str());
sensors.add(api, scfg);
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::DEBUG, "unmatched grove sensor config %s for %s", prfx.c_str(), scfg->type.c_str());
delete scfg;
}
}
else
{
LOG_DEBUG(GwLog::ERROR, "invalid grove sensor config %s", prfx.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;
}

View File

@ -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;

View File

@ -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

View File

@ -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;};

View File

@ -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;
}