handle multiple groves for iic

This commit is contained in:
andreas 2024-03-20 18:30:40 +01:00
parent e806971713
commit 99d7484afb
8 changed files with 98 additions and 71 deletions

View File

@ -306,33 +306,37 @@
#ifndef M5_GROOVEIIC #ifndef M5_GROOVEIIC
#define M5_GROOVEIIC #define M5_GROOVEIIC
#endif #endif
GROOVE_IIC(GWSHT3X,Z,1) GROOVE_IIC(SHT3X,Z,1)
GROOVE_IIC(GWQMP6988,Z,1) GROOVE_IIC(QMP6988,Z,1)
#define _GWSHT3X #define _GWSHT3X
#define _GWQMP6988
#endif #endif
#ifdef M5_ENV3_A #ifdef M5_ENV3_A
#ifndef M5_GROOVEIIC_A #ifndef M5_GROOVEIIC_A
#define M5_GROOVEIIC_A #define M5_GROOVEIIC_A
#endif #endif
GROOVE_IIC(GWSHT3X,A,1) GROOVE_IIC(SHT3X,A,1)
GROOVE_IIC(GWQMP6988,A,1) GROOVE_IIC(QMP6988,A,1)
#define _GWSHT3X #define _GWSHT3X
#define _GWQMP6988
#endif #endif
#ifdef M5_ENV3_B #ifdef M5_ENV3_B
#ifndef M5_GROOVEIIC_B #ifndef M5_GROOVEIIC_B
#define M5_GROOVEIIC_B #define M5_GROOVEIIC_B
#endif #endif
GROOVE_IIC(GWSHT3X,B,1) GROOVE_IIC(SHT3X,B,1)
GROOVE_IIC(GWQMP6988,B,1) GROOVE_IIC(QMP6988,B,1)
#define _GWSHT3X #define _GWSHT3X
#define _GWQMP6988
#endif #endif
#ifdef M5_ENV3_C #ifdef M5_ENV3_C
#ifndef M5_GROOVEIIC_C #ifndef M5_GROOVEIIC_C
#define M5_GROOVEIIC_C #define M5_GROOVEIIC_C
#endif #endif
GROOVE_IIC(GWSHT3X,C,1) GROOVE_IIC(SHT3X,C,1)
GROOVE_IIC(GWQMP6988,C,1) GROOVE_IIC(QMP6988,C,1)
#define _GWSHT3X #define _GWSHT3X
#define _GWQMP6988
#endif #endif
#ifdef M5_GROOVEIIC #ifdef M5_GROOVEIIC

View File

@ -3,23 +3,6 @@
#include "GwApi.h" #include "GwApi.h"
#include "N2kMessages.h" #include "N2kMessages.h"
#include "GwXdrTypeMappings.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<IICGrove> iicGroveList;
#define GROOVE_IIC(base,grove,suffix) \
static GwInitializer<IICGrove> base ## grove ## suffix(iicGroveList,IICGrove(#base,#grove,#suffix));
#endif
#include "GwHardware.h" #include "GwHardware.h"
#include "GwSensor.h" #include "GwSensor.h"
#ifdef _GWIIC #ifdef _GWIIC

View File

@ -1,4 +1,23 @@
#include "GwIicTask.h" #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<IICGrove> iicGroveList;
#define GROOVE_IIC(base, grove, suffix) \
static GwInitializer<IICGrove> base##grove##suffix(iicGroveList, IICGrove(#base, #grove, #suffix));
#include "GwIicSensors.h" #include "GwIicSensors.h"
#include "GwHardware.h" #include "GwHardware.h"
#include "GwBME280.h" #include "GwBME280.h"
@ -7,7 +26,6 @@
#include <map> #include <map>
#include "GwTimer.h" #include "GwTimer.h"
#include "GwHardware.h"
#ifndef GWIIC_SDA #ifndef GWIIC_SDA
#define GWIIC_SDA -1 #define GWIIC_SDA -1
@ -25,6 +43,33 @@
void runIicTask(GwApi *api); void runIicTask(GwApi *api);
static IICSensorList sensors; 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){ void initIicTask(GwApi *api){
GwLog *logger=api->getLogger(); GwLog *logger=api->getLogger();
@ -33,8 +78,20 @@ void initIicTask(GwApi *api){
#else #else
bool addTask=false; bool addTask=false;
GwConfigHandler *config=api->getConfig(); GwConfigHandler *config=api->getConfig();
registerSHT3X(api,sensors); IICSensorBase::Creator sht3xCreator=registerSHT3X(api,sensors);
registerQMP6988(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); registerBME280(api,sensors);
for (auto it=sensors.begin();it != sensors.end();it++){ for (auto it=sensors.begin();it != sensors.end();it++){
if ((*it)->preinit(api)) addTask=true; if ((*it)->preinit(api)) addTask=true;
@ -84,6 +141,7 @@ bool initWire(GwLog *logger, TwoWire &wire, int num){
#endif #endif
return initWireDo(logger,wire,num,"",GWIIC_SDA2,GWIIC_SCL2); return initWireDo(logger,wire,num,"",GWIIC_SDA2,GWIIC_SCL2);
} }
return false;
} }
void runIicTask(GwApi *api){ void runIicTask(GwApi *api){
GwLog *logger=api->getLogger(); GwLog *logger=api->getLogger();

View File

@ -1,3 +1,4 @@
#define _IIC_GROOVE_LIST
#include "GwQMP6988.h" #include "GwQMP6988.h"
#ifdef _GWQMP6988 #ifdef _GWQMP6988
#define PRFX1 "QMP698811" #define PRFX1 "QMP698811"
@ -48,6 +49,7 @@ class QMP6988Config : public IICSensorBase{
CFG_GET(prOff,prefix); CFG_GET(prOff,prefix);
virtual void readConfig(GwConfigHandler *cfg){ virtual void readConfig(GwConfigHandler *cfg){
if (ok) return;
if (prefix == PRFX1){ if (prefix == PRFX1){
busId=1; busId=1;
addr=86; 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(); GwLog *logger=api->getLogger();
#if defined(GWQMP6988) || defined(GWQMP698811) #if defined(GWQMP6988) || defined(GWQMP698811)
{ {
@ -110,8 +115,11 @@ void registerQMP6988(GwApi *api,IICSensorList &sensors){
#pragma message "GWQMP698822 defined" #pragma message "GWQMP698822 defined"
} }
#endif #endif
return creator;
} }
#else #else
void registerQMP6988(GwApi *api,IICSensorList &sensors){} IICSensorBase::Creator registerQMP6988(GwApi *api,IICSensorList &sensors){
return IICSensorBase::Creator();
}
#endif #endif

View File

@ -4,8 +4,6 @@
#ifdef _GWIIC #ifdef _GWIIC
#if defined(GWQMP6988) || defined(GWQMP698811) || defined(GWQMP698812) || defined(GWQMP698821) || defined(GWQMP698822) #if defined(GWQMP6988) || defined(GWQMP698811) || defined(GWQMP698812) || defined(GWQMP698821) || defined(GWQMP698822)
#define _GWQMP6988 #define _GWQMP6988
#else
#undef _GWQMP6988
#endif #endif
#else #else
#undef _GWQMP6988 #undef _GWQMP6988
@ -18,5 +16,5 @@
#ifdef _GWQMP6988 #ifdef _GWQMP6988
#include "QMP6988.h" #include "QMP6988.h"
#endif #endif
void registerQMP6988(GwApi *api,IICSensorList &sensors); IICSensorBase::Creator registerQMP6988(GwApi *api,IICSensorList &sensors);
#endif #endif

View File

@ -1,12 +1,9 @@
#define _IIC_GROOVE_LIST
#include "GwSHT3X.h" #include "GwSHT3X.h"
#ifdef _GWSHT3X #ifdef _GWSHT3X
#define PRFX1 "SHT3X11" #define PRFX1 "SHT3X11"
#define PRFX2 "SHT3X12" #define PRFX2 "SHT3X12"
#define PRFX3 "SHT3X21" #define PRFX3 "SHT3X21"
#define PRFX4 "SHT3X22" #define PRFX4 "SHT3X22"
static void addGroveItems(GwApi *api, IICSensorList &sensors, const String &bus,const String &grove, int, int);
class SHT3XConfig : public IICSensorBase{ class SHT3XConfig : public IICSensorBase{
public: public:
@ -108,11 +105,14 @@ class SHT3XConfig : public IICSensorBase{
intv*=1000; 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(); GwLog *logger=api->getLogger();
#if defined(GWSHT3X) || defined (GWSHT3X11) #if defined(GWSHT3X) || defined (GWSHT3X11)
{ {
SHT3XConfig *scfg=new SHT3XConfig(api,PRFX1); auto *scfg=creator(api,PRFX1);
sensors.add(api,scfg); sensors.add(api,scfg);
CHECK_IIC1(); CHECK_IIC1();
#pragma message "GWSHT3X11 defined" #pragma message "GWSHT3X11 defined"
@ -120,7 +120,7 @@ void registerSHT3X(GwApi *api,IICSensorList &sensors){
#endif #endif
#if defined(GWSHT3X12) #if defined(GWSHT3X12)
{ {
SHT3XConfig *scfg=new SHT3XConfig(api,PRFX2); auto *scfg=creator(api,PRFX2);
sensors.add(api,scfg); sensors.add(api,scfg);
CHECK_IIC1(); CHECK_IIC1();
#pragma message "GWSHT3X12 defined" #pragma message "GWSHT3X12 defined"
@ -128,7 +128,7 @@ void registerSHT3X(GwApi *api,IICSensorList &sensors){
#endif #endif
#if defined(GWSHT3X21) #if defined(GWSHT3X21)
{ {
SHT3XConfig *scfg=new SHT3XConfig(api,PRFX3); auto *scfg=creator(api,PRFX3);
sensors.add(api,scfg); sensors.add(api,scfg);
CHECK_IIC2(); CHECK_IIC2();
#pragma message "GWSHT3X21 defined" #pragma message "GWSHT3X21 defined"
@ -136,43 +136,17 @@ void registerSHT3X(GwApi *api,IICSensorList &sensors){
#endif #endif
#if defined(GWSHT3X22) #if defined(GWSHT3X22)
{ {
SHT3XConfig *scfg=new SHT3XConfig(api,PRFX4); auto *scfg=creator(api,PRFX4);
sensors.add(api,scfg); sensors.add(api,scfg);
CHECK_IIC2(); CHECK_IIC2();
#pragma message "GWSHT3X22 defined" #pragma message "GWSHT3X22 defined"
} }
#endif #endif
#ifdef _GWI_IIC1 return creator;
addGroveItems(api,sensors,"1",_GWI_IIC1);
#endif
#ifdef _GWI_IIC2
addGroveItems(api,sensors,"2",_GWI_IIC2);
#endif
}; };
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 #else
void registerSHT3X(GwApi *api,IICSensorList &sensors){ IICSensorBase::Creator registerSHT3X(GwApi *api,IICSensorList &sensors){
} }

View File

@ -16,5 +16,5 @@
#ifdef _GWSHT3X #ifdef _GWSHT3X
#include "SHT3X.h" #include "SHT3X.h"
#endif #endif
void registerSHT3X(GwApi *api,IICSensorList &sensors); IICSensorBase::Creator registerSHT3X(GwApi *api,IICSensorList &sensors);
#endif #endif

View File

@ -28,6 +28,7 @@ class SensorBase{
virtual void readConfig(GwConfigHandler *cfg)=0; virtual void readConfig(GwConfigHandler *cfg)=0;
SensorBase(GwApi *api,const String &prfx):prefix(prfx){ SensorBase(GwApi *api,const String &prfx):prefix(prfx){
} }
using Creator=std::function<SensorBase<BUS> *(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,BUS *wire){return false;};
virtual bool preinit(GwApi * api){return false;} virtual bool preinit(GwApi * api){return false;}
@ -46,6 +47,7 @@ class SensorList : public std::vector<SensorBase<BUS>*>{
using std::vector<SensorBase<BUS>*>::vector; using std::vector<SensorBase<BUS>*>::vector;
}; };
#define CFG_GET(name,prefix) \ #define CFG_GET(name,prefix) \
cfg->getValue(name, GwConfigDefinitions::prefix ## name) cfg->getValue(name, GwConfigDefinitions::prefix ## name)