Use macros for adding models.

This commit is contained in:
h2zero 2022-04-15 12:44:14 -06:00
parent d47281f40f
commit 1dedff342b
7 changed files with 81 additions and 29 deletions

View file

@ -41,6 +41,7 @@ idf_component_register(
"src/NimBLEEddystoneURL.cpp" "src/NimBLEEddystoneURL.cpp"
"src/NimBLEExtAdvertising.cpp" "src/NimBLEExtAdvertising.cpp"
"src/NimBLEHIDDevice.cpp" "src/NimBLEHIDDevice.cpp"
"src/NimBLEMeshCreateModel.c"
"src/NimBLEMeshElement.cpp" "src/NimBLEMeshElement.cpp"
"src/NimBLEMeshModel.cpp" "src/NimBLEMeshModel.cpp"
"src/NimBLEMeshNode.cpp" "src/NimBLEMeshNode.cpp"

View file

@ -0,0 +1,30 @@
/*
* NimBLEMeshCreateModel.cpp
*
* Created: on April 27 2022
* Author H2zero
*
*/
#include "NimBLEMeshCreateModel.h"
static struct bt_mesh_model_cb mod_cb = {
//.init = modelInitCallback
};
struct bt_mesh_model createConfigSrvModel(struct bt_mesh_cfg_srv* cfg) {
struct bt_mesh_model cmod = BT_MESH_MODEL_CFG_SRV(cfg);
return cmod;
}
struct bt_mesh_model createHealthModel(struct bt_mesh_health_srv* hsrv,
struct bt_mesh_model_pub* hpub) {
struct bt_mesh_model hmod = BT_MESH_MODEL_HEALTH_SRV(hsrv, hpub);
return hmod;
}
struct bt_mesh_model createGenModel(int16_t _id, struct bt_mesh_model_op* op,
struct bt_mesh_model_pub* pub, void* udata) {
struct bt_mesh_model mod = BT_MESH_MODEL_CB(_id, op, pub, udata, &mod_cb);
return mod;
}

View file

@ -0,0 +1,35 @@
/*
* NimBLEMeshCreateModel.h
*
* Created: on April 27 2022
* Author H2zero
*
*/
#ifndef __NIMBLE_MESH_CREATE_MODEL_H
#define __NIMBLE_MESH_CREATE_MODEL_H
#include "nimconfig.h"
#if defined(CONFIG_NIMBLE_CPP_IDF)
# include "mesh/mesh.h"
# include "mesh/cfg_srv.h"
#else
# include "nimble/nimble/host/mesh/include/mesh/mesh.h"
# include "nimble/nimble/host/mesh/include/mesh/cfg_srv.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
//int modelInitCallback(struct bt_mesh_model *model);
struct bt_mesh_model createConfigSrvModel(struct bt_mesh_cfg_srv* cfg);
struct bt_mesh_model createHealthModel(struct bt_mesh_health_srv* hsrv,
struct bt_mesh_model_pub* hpub);
struct bt_mesh_model createGenModel(int16_t _id, struct bt_mesh_model_op* op,
struct bt_mesh_model_pub* pub, void* udata);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -8,18 +8,19 @@
#include "NimBLEMeshElement.h" #include "NimBLEMeshElement.h"
#include "NimBLELog.h" #include "NimBLELog.h"
#include "NimBLEMeshCreateModel.h"
static const char* LOG_TAG = "NimBLEMeshElement"; static const char* LOG_TAG = "NimBLEMeshElement";
NimBLEMeshElement::NimBLEMeshElement() { NimBLEMeshElement::NimBLEMeshElement() {
m_pElem_t = nullptr; m_pElem = nullptr;
m_pHealthModel = nullptr; m_pHealthModel = nullptr;
} }
NimBLEMeshElement::~NimBLEMeshElement() { NimBLEMeshElement::~NimBLEMeshElement() {
if(m_pElem_t != nullptr) { if(m_pElem != nullptr) {
delete m_pElem_t; delete m_pElem;
} }
if(m_pHealthModel != nullptr) { if(m_pHealthModel != nullptr) {
@ -64,7 +65,7 @@ NimBLEMeshModel* NimBLEMeshElement::createModel(uint16_t type, NimBLEMeshModelCa
case BT_MESH_MODEL_ID_HEALTH_SRV: case BT_MESH_MODEL_ID_HEALTH_SRV:
m_pHealthModel = new NimBLEHealthSrvModel(pCallbacks); m_pHealthModel = new NimBLEHealthSrvModel(pCallbacks);
pModel = m_pHealthModel; pModel = m_pHealthModel;
m_modelsVec.push_back(bt_mesh_model{{type},0,0,0,&pModel->m_opPub,{0},{0},bt_mesh_health_srv_op,&bt_mesh_health_cli_cb,&m_pHealthModel->m_healthSrv}); m_modelsVec.push_back(createHealthModel(&m_pHealthModel->m_healthSrv, &pModel->m_opPub));
return pModel; return pModel;
default: default:
@ -72,7 +73,7 @@ NimBLEMeshModel* NimBLEMeshElement::createModel(uint16_t type, NimBLEMeshModelCa
return nullptr; return nullptr;
} }
m_modelsVec.push_back(bt_mesh_model{{type},0,0,0, &pModel->m_opPub,{0},{0},pModel->m_opList,nullptr,pModel}); m_modelsVec.push_back(createGenModel(type, pModel->m_opList, &pModel->m_opPub, pModel));
return pModel; return pModel;
} }
@ -81,8 +82,8 @@ NimBLEMeshModel* NimBLEMeshElement::createModel(uint16_t type, NimBLEMeshModelCa
* @brief Adds a model created outside of element context to the elements model vector. * @brief Adds a model created outside of element context to the elements model vector.
* @param [in] model A pointer to the model instance to add. * @param [in] model A pointer to the model instance to add.
*/ */
void NimBLEMeshElement::addModel(bt_mesh_model *model) { void NimBLEMeshElement::addModel(const bt_mesh_model & model) {
m_modelsVec.push_back(*model); m_modelsVec.push_back(model);
} }
@ -134,8 +135,8 @@ NimBLEMeshModel* NimBLEMeshElement::getModelByIdx(uint8_t eidx, uint8_t midx, ui
* @details Must not be called until all models have been added. * @details Must not be called until all models have been added.
*/ */
bt_mesh_elem* NimBLEMeshElement::start() { bt_mesh_elem* NimBLEMeshElement::start() {
m_pElem_t = new bt_mesh_elem{0, 0, uint8_t(m_modelsVec.size()), 0, &m_modelsVec[0], NULL}; m_pElem = new bt_mesh_elem{0, 0, uint8_t(m_modelsVec.size()), 0, &m_modelsVec[0], NULL};
return m_pElem_t; return m_pElem;
} }

View file

@ -33,10 +33,10 @@ private:
NimBLEMeshElement(); NimBLEMeshElement();
~NimBLEMeshElement(); ~NimBLEMeshElement();
void addModel(bt_mesh_model* model); void addModel(const bt_mesh_model & model);
bt_mesh_elem* start(); bt_mesh_elem* start();
bt_mesh_elem *m_pElem_t; bt_mesh_elem *m_pElem;
NimBLEHealthSrvModel* m_pHealthModel; NimBLEHealthSrvModel* m_pHealthModel;
std::vector<bt_mesh_model> m_modelsVec; std::vector<bt_mesh_model> m_modelsVec;
}; };

View file

@ -12,6 +12,7 @@
#include "NimBLEMeshNode.h" #include "NimBLEMeshNode.h"
#include "NimBLELog.h" #include "NimBLELog.h"
#include "NimBLEDevice.h" #include "NimBLEDevice.h"
#include "NimBLEMeshCreateModel.h"
#if defined(CONFIG_NIMBLE_CPP_IDF) #if defined(CONFIG_NIMBLE_CPP_IDF)
# include "services/gap/ble_svc_gap.h" # include "services/gap/ble_svc_gap.h"
@ -66,8 +67,6 @@ NimBLEMeshNode::NimBLEMeshNode(const NimBLEUUID &uuid, uint8_t type) {
m_prov.complete = NimBLEMeshNode::provComplete; m_prov.complete = NimBLEMeshNode::provComplete;
m_prov.reset = NimBLEMeshNode::provReset; m_prov.reset = NimBLEMeshNode::provReset;
m_configSrvModel = nullptr;
// Create the primary element // Create the primary element
m_elemVec.push_back(new NimBLEMeshElement()); m_elemVec.push_back(new NimBLEMeshElement());
} }
@ -77,10 +76,6 @@ NimBLEMeshNode::NimBLEMeshNode(const NimBLEUUID &uuid, uint8_t type) {
* @brief Destructor, cleanup any resources created. * @brief Destructor, cleanup any resources created.
*/ */
NimBLEMeshNode::~NimBLEMeshNode() { NimBLEMeshNode::~NimBLEMeshNode() {
if(m_configSrvModel != nullptr) {
delete m_configSrvModel;
}
if(m_comp.elem != nullptr) { if(m_comp.elem != nullptr) {
free (m_comp.elem); free (m_comp.elem);
} }
@ -168,16 +163,7 @@ bool NimBLEMeshNode::start() {
// Config server and primary health models are required in the primary element // Config server and primary health models are required in the primary element
// create them here and add them as the first models. // create them here and add them as the first models.
m_configSrvModel = new bt_mesh_model{{BT_MESH_MODEL_ID_CFG_SRV},0,0,0,nullptr,{0},{0},bt_mesh_cfg_srv_op,&bt_mesh_cfg_srv_cb,&m_serverConfig}; m_elemVec[0]->addModel(createConfigSrvModel(&m_serverConfig));
for(int i = 0; i < CONFIG_BT_MESH_MODEL_KEY_COUNT; i++) {
m_configSrvModel->keys[i] = BT_MESH_KEY_UNUSED;
}
for(int i = 0; i < CONFIG_BT_MESH_MODEL_GROUP_COUNT; i++) {
m_configSrvModel->groups[i] = BT_MESH_ADDR_UNASSIGNED;
}
m_elemVec[0]->addModel(m_configSrvModel);
if(m_elemVec[0]->getModel(BT_MESH_MODEL_ID_HEALTH_SRV) == nullptr) { if(m_elemVec[0]->getModel(BT_MESH_MODEL_ID_HEALTH_SRV) == nullptr) {
m_elemVec[0]->createModel(BT_MESH_MODEL_ID_HEALTH_SRV); m_elemVec[0]->createModel(BT_MESH_MODEL_ID_HEALTH_SRV);

View file

@ -66,7 +66,6 @@ private:
bt_mesh_comp m_comp; bt_mesh_comp m_comp;
uint16_t m_primAddr; uint16_t m_primAddr;
uint16_t m_primNetIdx; uint16_t m_primNetIdx;
bt_mesh_model* m_configSrvModel;
NimBLEUUID m_uuid; NimBLEUUID m_uuid;
std::vector<NimBLEMeshElement*> m_elemVec; std::vector<NimBLEMeshElement*> m_elemVec;