From 99d7484afb9b219d3fd1ed45c71b5336a64e90a0 Mon Sep 17 00:00:00 2001 From: andreas Date: Wed, 20 Mar 2024 18:30:40 +0100 Subject: [PATCH] handle multiple groves for iic --- lib/hardware/GwHardware.h | 20 +++++++----- lib/iictask/GwIicSensors.h | 17 ---------- lib/iictask/GwIicTask.cpp | 64 ++++++++++++++++++++++++++++++++++++-- lib/iictask/GwQMP6988.cpp | 12 +++++-- lib/iictask/GwQMP6988.h | 4 +-- lib/iictask/GwSHT3X.cpp | 48 +++++++--------------------- lib/iictask/GwSHT3X.h | 2 +- lib/sensors/GwSensor.h | 2 ++ 8 files changed, 98 insertions(+), 71 deletions(-) diff --git a/lib/hardware/GwHardware.h b/lib/hardware/GwHardware.h index c80cb57..5188212 100644 --- a/lib/hardware/GwHardware.h +++ b/lib/hardware/GwHardware.h @@ -306,33 +306,37 @@ #ifndef M5_GROOVEIIC #define M5_GROOVEIIC #endif - GROOVE_IIC(GWSHT3X,Z,1) - GROOVE_IIC(GWQMP6988,Z,1) + GROOVE_IIC(SHT3X,Z,1) + GROOVE_IIC(QMP6988,Z,1) #define _GWSHT3X + #define _GWQMP6988 #endif #ifdef M5_ENV3_A #ifndef M5_GROOVEIIC_A #define M5_GROOVEIIC_A #endif - GROOVE_IIC(GWSHT3X,A,1) - GROOVE_IIC(GWQMP6988,A,1) + GROOVE_IIC(SHT3X,A,1) + GROOVE_IIC(QMP6988,A,1) #define _GWSHT3X + #define _GWQMP6988 #endif #ifdef M5_ENV3_B #ifndef M5_GROOVEIIC_B #define M5_GROOVEIIC_B #endif - GROOVE_IIC(GWSHT3X,B,1) - GROOVE_IIC(GWQMP6988,B,1) + GROOVE_IIC(SHT3X,B,1) + GROOVE_IIC(QMP6988,B,1) #define _GWSHT3X + #define _GWQMP6988 #endif #ifdef M5_ENV3_C #ifndef M5_GROOVEIIC_C #define M5_GROOVEIIC_C #endif - GROOVE_IIC(GWSHT3X,C,1) - GROOVE_IIC(GWQMP6988,C,1) + GROOVE_IIC(SHT3X,C,1) + GROOVE_IIC(QMP6988,C,1) #define _GWSHT3X + #define _GWQMP6988 #endif #ifdef M5_GROOVEIIC diff --git a/lib/iictask/GwIicSensors.h b/lib/iictask/GwIicSensors.h index dda38b9..c3d21b4 100644 --- a/lib/iictask/GwIicSensors.h +++ b/lib/iictask/GwIicSensors.h @@ -3,23 +3,6 @@ #include "GwApi.h" #include "N2kMessages.h" #include "GwXdrTypeMappings.h" -#ifdef _IIC_GROOVE_LIST - class IICGrove{ - public: - String base; - String grove; - String suffix; - IICGrove(const String &b,const String &g,const String &s): - base(b),grove(g),suffix(s){} - String item(const String &grove, const String &bus){ - if (grove == this->grove) return base+bus+suffix; - return ""; - } - }; - static std::vector iicGroveList; - #define GROOVE_IIC(base,grove,suffix) \ - static GwInitializer base ## grove ## suffix(iicGroveList,IICGrove(#base,#grove,#suffix)); -#endif #include "GwHardware.h" #include "GwSensor.h" #ifdef _GWIIC diff --git a/lib/iictask/GwIicTask.cpp b/lib/iictask/GwIicTask.cpp index a9982ec..ea39c0f 100644 --- a/lib/iictask/GwIicTask.cpp +++ b/lib/iictask/GwIicTask.cpp @@ -1,4 +1,23 @@ #include "GwIicTask.h" +class IICGrove +{ +public: + String base; + String grove; + String suffix; + IICGrove(const String &b, const String &g, const String &s) : base(b), grove(g), suffix(s) {} + String item(const String &grove, const String &bus) + { + if (grove == this->grove) + return base + bus + suffix; + return ""; + } +}; +static std::vector iicGroveList; +#define GROOVE_IIC(base, grove, suffix) \ + static GwInitializer base##grove##suffix(iicGroveList, IICGrove(#base, #grove, #suffix)); + + #include "GwIicSensors.h" #include "GwHardware.h" #include "GwBME280.h" @@ -7,7 +26,6 @@ #include #include "GwTimer.h" -#include "GwHardware.h" #ifndef GWIIC_SDA #define GWIIC_SDA -1 @@ -25,6 +43,33 @@ 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) +{ + GwLog *logger=api->getLogger(); + for (auto &&init : iicGroveList) + { + LOG_DEBUG(GwLog::LOG, "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) + { + LOG_DEBUG(GwLog::LOG, "adding %s from grove config", prfx.c_str()); + sensors.add(api, scfg); + } + else + { + LOG_DEBUG(GwLog::ERROR, "invalid grove sensor config %s", prfx.c_str()); + delete scfg; + } + } + } +} void initIicTask(GwApi *api){ GwLog *logger=api->getLogger(); @@ -33,8 +78,20 @@ void initIicTask(GwApi *api){ #else bool addTask=false; GwConfigHandler *config=api->getConfig(); - registerSHT3X(api,sensors); - registerQMP6988(api,sensors); + IICSensorBase::Creator sht3xCreator=registerSHT3X(api,sensors); + #ifdef _GWI_IIC1 + addGroveItems(sht3xCreator,api,sensors,"1",_GWI_IIC1); + #endif + #ifdef _GWI_IIC2 + addGroveItems(sht3xCreator,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; @@ -84,6 +141,7 @@ bool initWire(GwLog *logger, TwoWire &wire, int num){ #endif return initWireDo(logger,wire,num,"",GWIIC_SDA2,GWIIC_SCL2); } + return false; } void runIicTask(GwApi *api){ GwLog *logger=api->getLogger(); diff --git a/lib/iictask/GwQMP6988.cpp b/lib/iictask/GwQMP6988.cpp index 638bf0e..0dc8ebd 100644 --- a/lib/iictask/GwQMP6988.cpp +++ b/lib/iictask/GwQMP6988.cpp @@ -1,3 +1,4 @@ +#define _IIC_GROOVE_LIST #include "GwQMP6988.h" #ifdef _GWQMP6988 #define PRFX1 "QMP698811" @@ -48,6 +49,7 @@ class QMP6988Config : public IICSensorBase{ CFG_GET(prOff,prefix); virtual void readConfig(GwConfigHandler *cfg){ + if (ok) return; if (prefix == PRFX1){ busId=1; addr=86; @@ -76,7 +78,10 @@ class QMP6988Config : public IICSensorBase{ } }; -void registerQMP6988(GwApi *api,IICSensorList &sensors){ +static IICSensorBase::Creator creator=[](GwApi *api,const String &prfx){ + return new QMP6988Config(api,prfx); +}; +IICSensorBase::Creator registerQMP6988(GwApi *api,IICSensorList &sensors){ GwLog *logger=api->getLogger(); #if defined(GWQMP6988) || defined(GWQMP698811) { @@ -110,8 +115,11 @@ void registerQMP6988(GwApi *api,IICSensorList &sensors){ #pragma message "GWQMP698822 defined" } #endif + return creator; } #else - void registerQMP6988(GwApi *api,IICSensorList &sensors){} + IICSensorBase::Creator registerQMP6988(GwApi *api,IICSensorList &sensors){ + return IICSensorBase::Creator(); + } #endif \ No newline at end of file diff --git a/lib/iictask/GwQMP6988.h b/lib/iictask/GwQMP6988.h index 5d64454..cb6a881 100644 --- a/lib/iictask/GwQMP6988.h +++ b/lib/iictask/GwQMP6988.h @@ -4,8 +4,6 @@ #ifdef _GWIIC #if defined(GWQMP6988) || defined(GWQMP698811) || defined(GWQMP698812) || defined(GWQMP698821) || defined(GWQMP698822) #define _GWQMP6988 - #else - #undef _GWQMP6988 #endif #else #undef _GWQMP6988 @@ -18,5 +16,5 @@ #ifdef _GWQMP6988 #include "QMP6988.h" #endif -void registerQMP6988(GwApi *api,IICSensorList &sensors); +IICSensorBase::Creator registerQMP6988(GwApi *api,IICSensorList &sensors); #endif \ No newline at end of file diff --git a/lib/iictask/GwSHT3X.cpp b/lib/iictask/GwSHT3X.cpp index 705012a..9a6f3df 100644 --- a/lib/iictask/GwSHT3X.cpp +++ b/lib/iictask/GwSHT3X.cpp @@ -1,12 +1,9 @@ -#define _IIC_GROOVE_LIST #include "GwSHT3X.h" - #ifdef _GWSHT3X #define PRFX1 "SHT3X11" #define PRFX2 "SHT3X12" #define PRFX3 "SHT3X21" #define PRFX4 "SHT3X22" -static void addGroveItems(GwApi *api, IICSensorList &sensors, const String &bus,const String &grove, int, int); class SHT3XConfig : public IICSensorBase{ public: @@ -108,11 +105,14 @@ class SHT3XConfig : public IICSensorBase{ intv*=1000; } }; -void registerSHT3X(GwApi *api,IICSensorList &sensors){ +IICSensorBase::Creator creator=[](GwApi *api,const String &prfx){ + return new SHT3XConfig(api,prfx); +}; +IICSensorBase::Creator registerSHT3X(GwApi *api,IICSensorList &sensors){ GwLog *logger=api->getLogger(); #if defined(GWSHT3X) || defined (GWSHT3X11) { - SHT3XConfig *scfg=new SHT3XConfig(api,PRFX1); + auto *scfg=creator(api,PRFX1); sensors.add(api,scfg); CHECK_IIC1(); #pragma message "GWSHT3X11 defined" @@ -120,7 +120,7 @@ void registerSHT3X(GwApi *api,IICSensorList &sensors){ #endif #if defined(GWSHT3X12) { - SHT3XConfig *scfg=new SHT3XConfig(api,PRFX2); + auto *scfg=creator(api,PRFX2); sensors.add(api,scfg); CHECK_IIC1(); #pragma message "GWSHT3X12 defined" @@ -128,7 +128,7 @@ void registerSHT3X(GwApi *api,IICSensorList &sensors){ #endif #if defined(GWSHT3X21) { - SHT3XConfig *scfg=new SHT3XConfig(api,PRFX3); + auto *scfg=creator(api,PRFX3); sensors.add(api,scfg); CHECK_IIC2(); #pragma message "GWSHT3X21 defined" @@ -136,43 +136,17 @@ void registerSHT3X(GwApi *api,IICSensorList &sensors){ #endif #if defined(GWSHT3X22) { - SHT3XConfig *scfg=new SHT3XConfig(api,PRFX4); + auto *scfg=creator(api,PRFX4); sensors.add(api,scfg); CHECK_IIC2(); #pragma message "GWSHT3X22 defined" } #endif - #ifdef _GWI_IIC1 - addGroveItems(api,sensors,"1",_GWI_IIC1); - #endif - #ifdef _GWI_IIC2 - addGroveItems(api,sensors,"2",_GWI_IIC2); - #endif + return creator; }; -static void addGroveItems(GwApi *api, IICSensorList &sensors, const String &bus,const String &grove, int, int) -{ - GwLog *logger=api->getLogger(); - for (auto &&init : iicGroveList) - { - String prfx = init.item(grove, bus); - if (!prfx.isEmpty()) - { - SHT3XConfig *scfg = new SHT3XConfig(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); - } - else - { - LOG_DEBUG(GwLog::ERROR, "invalid grove sensor config %s", prfx.c_str()); - } - } - } -} + #else -void registerSHT3X(GwApi *api,IICSensorList &sensors){ +IICSensorBase::Creator registerSHT3X(GwApi *api,IICSensorList &sensors){ } diff --git a/lib/iictask/GwSHT3X.h b/lib/iictask/GwSHT3X.h index b1926af..f59d51f 100644 --- a/lib/iictask/GwSHT3X.h +++ b/lib/iictask/GwSHT3X.h @@ -16,5 +16,5 @@ #ifdef _GWSHT3X #include "SHT3X.h" #endif -void registerSHT3X(GwApi *api,IICSensorList &sensors); +IICSensorBase::Creator registerSHT3X(GwApi *api,IICSensorList &sensors); #endif \ No newline at end of file diff --git a/lib/sensors/GwSensor.h b/lib/sensors/GwSensor.h index e33aef3..e336163 100644 --- a/lib/sensors/GwSensor.h +++ b/lib/sensors/GwSensor.h @@ -28,6 +28,7 @@ class SensorBase{ virtual void readConfig(GwConfigHandler *cfg)=0; SensorBase(GwApi *api,const String &prfx):prefix(prfx){ } + using Creator=std::function *(GwApi *api,const String &prfx)>; virtual bool isActive(){return false;}; virtual bool initDevice(GwApi *api,BUS *wire){return false;}; virtual bool preinit(GwApi * api){return false;} @@ -46,6 +47,7 @@ class SensorList : public std::vector*>{ using std::vector*>::vector; }; + #define CFG_GET(name,prefix) \ cfg->getValue(name, GwConfigDefinitions::prefix ## name)