This flattens the C++ object tree into the format required by the BLE stack.
34 {
39 }
40
45
46
47 static_assert(sizeof(MESHX_MODEL) >= 40, "MESHX_MODEL size is too small!");
48
49 size_t total_elements =
elements.size();
50
51
55
56 MESHX_ELEMENT* p_elements =
reinterpret_cast<MESHX_ELEMENT*
>(
baked_elements.data());
57
58
59 for (
size_t i = 0; i <
elements.size(); ++i) {
60 size_t plat_idx = i;
62
63
64 el->get_sig_models().clear();
65 el->get_ven_models().clear();
66 el->list_sig_models();
67 el->list_ven_models();
68
69 auto& sig_models = el->get_sig_models();
70 auto& ven_models = el->get_ven_models();
71
72
73 size_t actual_sig_cnt = 0;
74 for (auto& m : sig_models) {
76 actual_sig_cnt++;
77 }
78 size_t actual_ven_cnt = ven_models.size();
79
80
83
85 (int)plat_idx, actual_sig_cnt, actual_ven_cnt, sizeof(MESHX_MODEL));
86
87
88 size_t baked_sig_idx = 0;
89 for (auto& m : sig_models) {
90 m->set_parent_element(el.get());
91
92
95 continue;
96 }
97
98
100 MESHX_MODEL* p_baked = p_baked_base + baked_sig_idx;
101
102
103 memset(static_cast<void*>(p_baked), 0, sizeof(MESHX_MODEL));
104
105
109 m->get_model_id(), (int)plat_idx, m_err);
110 continue;
111 }
112
113
114 m->set_plat_model(p_baked);
115
116
118 baked_sig_idx, p_baked->model_id, (void*)p_baked->pub, (void*)p_baked);
119
120 if (p_baked->pub) {
121 uint32_t pub_ptr_val = (uint32_t)p_baked->pub;
122 if (pub_ptr_val < 0x3f000000 || pub_ptr_val > 0x3fffffff) {
124 }
125 }
126
127 baked_sig_idx++;
128 }
129
130
131 size_t baked_ven_idx = 0;
132 for (auto& m : ven_models) {
133 m->set_parent_element(el.get());
134
135
136 MESHX_MODEL* p_baked =
reinterpret_cast<MESHX_MODEL*
>(
baked_ven_model_arrays[plat_idx].data()) + baked_ven_idx;
137 memset(static_cast<void*>(p_baked), 0, sizeof(MESHX_MODEL));
138
139
143 m->get_model_id(), (int)plat_idx, m_err);
144 continue;
145 }
146
147 m->set_plat_model(p_baked);
148 baked_ven_idx++;
149 }
150
151
152 uint16_t loc = 0;
153 uint8_t sig_cnt = (uint8_t)actual_sig_cnt;
154 uint8_t ven_cnt = (uint8_t)baked_ven_idx;
155 esp_ble_mesh_model_t* sig_ptr = (sig_cnt > 0) ?
reinterpret_cast<esp_ble_mesh_model_t*
>(
baked_sig_model_arrays[plat_idx].data()) :
nullptr;
156 esp_ble_mesh_model_t* ven_ptr = (ven_cnt > 0) ?
reinterpret_cast<esp_ble_mesh_model_t*
>(
baked_ven_model_arrays[plat_idx].data()) :
nullptr;
157
158 MESHX_ELEMENT* e = &p_elements[plat_idx];
159 memcpy((void*)&e->location, &loc, sizeof(e->location));
160 memcpy((void*)&e->sig_model_count, &sig_cnt, sizeof(e->sig_model_count));
161 memcpy((void*)&e->vnd_model_count, &ven_cnt, sizeof(e->vnd_model_count));
162 memcpy((void*)&e->sig_models, &sig_ptr, sizeof(e->sig_models));
163 memcpy((void*)&e->vnd_models, &ven_ptr, sizeof(e->vnd_models));
164
165
166 el->on_baked(plat_idx);
168 }
169
170
174 baked_comp.element_count = (uint16_t)total_elements;
176
179
180
181 pdev->elements = p_elements;
182 pdev->element_cnt = (uint16_t)total_elements;
183 pdev->element_idx = (uint16_t)total_elements;
185
187
188}
std::vector< uint8_t > baked_elements
Definition meshx_composition.hpp:112
std::vector< std::vector< uint8_t > > baked_ven_model_arrays
Definition meshx_composition.hpp:118
MESHX_COMPOSITION baked_comp
Definition meshx_composition.hpp:120
std::vector< std::vector< uint8_t > > baked_sig_model_arrays
Definition meshx_composition.hpp:117
void register_element(meshXElementIF *element)
Register an element instance.
Definition meshx_element_registry.hpp:43
static meshXElementRegistry & get_instance()
Definition meshx_element_registry.hpp:33
#define MESHX_MODEL_ID_CONFIG_SRV
Definition meshx_ble_mesh_cmn_def.h:46
meshx_err_t
MeshX Error Codes.
Definition meshx_err.h:43
@ MESHX_INVALID_STATE
Definition meshx_err.h:49
#define MESHX_LOGW(module_id, format,...)
Definition meshx_log.h:120
#define MESHX_LOGI(module_id, format,...)
Definition meshx_log.h:126
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:114
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:132
**This function is called by the parent element when a state change request *is received It validates the request and returns a result to the element not the model layer **return * MESHX_SUCCESS
Definition meshx_model_level.cpp:385
@ MODULE_ID_COMMON
Definition module_id.h:36
@ MODULE_ID_BLE_MESH_ELEMENT
Definition module_id.h:39