From b091d9aee4bc6dbd1106c1afaf4109c6b2f0d917 Mon Sep 17 00:00:00 2001 From: andreas Date: Thu, 21 Mar 2024 11:51:10 +0100 Subject: [PATCH] correct handling for grove based iic sensors --- lib/iictask/GwBME280.cpp | 32 ++++++++++++++----------- lib/iictask/GwBME280.h | 2 +- lib/iictask/GwIicSensors.h | 13 +++++++--- lib/iictask/GwIicTask.cpp | 49 +++++++++++++++++++++----------------- lib/iictask/GwQMP6988.cpp | 11 +++++---- lib/iictask/GwSHT3X.cpp | 13 +++++----- lib/sensors/GwSensor.h | 5 ++-- lib/spitask/GwSpiSensor.h | 2 +- 8 files changed, 73 insertions(+), 54 deletions(-) diff --git a/lib/iictask/GwBME280.cpp b/lib/iictask/GwBME280.cpp index 498bf1e..12dcc7e 100644 --- a/lib/iictask/GwBME280.cpp +++ b/lib/iictask/GwBME280.cpp @@ -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 #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 diff --git a/lib/iictask/GwBME280.h b/lib/iictask/GwBME280.h index 5f2abb5..6da8c44 100644 --- a/lib/iictask/GwBME280.h +++ b/lib/iictask/GwBME280.h @@ -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 \ No newline at end of file diff --git a/lib/iictask/GwIicSensors.h b/lib/iictask/GwIicSensors.h index c3d21b4..dcb7f3f 100644 --- a/lib/iictask/GwIicSensors.h +++ b/lib/iictask/GwIicSensors.h @@ -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 \ No newline at end of file diff --git a/lib/iictask/GwIicTask.cpp b/lib/iictask/GwIicTask.cpp index ea39c0f..cf88d01 100644 --- a/lib/iictask/GwIicTask.cpp +++ b/lib/iictask/GwIicTask.cpp @@ -43,29 +43,39 @@ static std::vector 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 &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 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; } diff --git a/lib/iictask/GwQMP6988.cpp b/lib/iictask/GwQMP6988.cpp index 0dc8ebd..f3a7671 100644 --- a/lib/iictask/GwQMP6988.cpp +++ b/lib/iictask/GwQMP6988.cpp @@ -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; diff --git a/lib/iictask/GwSHT3X.cpp b/lib/iictask/GwSHT3X.cpp index 9a6f3df..40735e1 100644 --- a/lib/iictask/GwSHT3X.cpp +++ b/lib/iictask/GwSHT3X.cpp @@ -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 diff --git a/lib/sensors/GwSensor.h b/lib/sensors/GwSensor.h index e336163..da9b560 100644 --- a/lib/sensors/GwSensor.h +++ b/lib/sensors/GwSensor.h @@ -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 *(GwApi *api,const String &prfx)>; virtual bool isActive(){return false;}; diff --git a/lib/spitask/GwSpiSensor.h b/lib/spitask/GwSpiSensor.h index 80beabd..3d516a5 100644 --- a/lib/spitask/GwSpiSensor.h +++ b/lib/spitask/GwSpiSensor.h @@ -125,7 +125,7 @@ class SSISensor : public SensorBase{ } 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; }