1
1
#include < QFile>
2
- #include < QJsonDocument>
3
2
#include < QJsonObject>
4
3
#include < QJsonArray>
5
4
#include < QJsonValue>
6
5
#include < QJsonParseError>
7
- #include < sensor.h>
8
- #include < deconz.h>
6
+ #include < deconz/dbg_trace.h>
7
+ #include " read_files.h"
8
+ #include " sensor.h"
9
9
10
10
QJsonDocument readButtonMapJson (const QString &path)
11
11
{
@@ -142,46 +142,51 @@ QMap<QString, QMap<QString, quint16>> loadButtonMapCommadsJson(const QJsonDocume
142
142
143
143
/* ! Reads the associated modelIDs from all available button maps in JSON file.
144
144
*/
145
- QMap<QString, QString > loadButtonMapModelIdsJson (const QJsonDocument &buttonMaps)
145
+ std::vector<ButtonProduct > loadButtonMapModelIdsJson (const QJsonDocument &buttonMapsDoc, const std::vector<ButtonMap> &buttonMaps)
146
146
{
147
- // Load ModelIDs
148
- QMap<QString, QString> buttonMapForModelId;
149
- QJsonObject allMapsObj = buttonMaps.object ().value (QLatin1String (" maps" )).toObject (); // Get all button maps
147
+ std::vector<ButtonProduct> result;
148
+ result.reserve (128 );
149
+
150
+ const QJsonObject allMapsObj = buttonMapsDoc.object ().value (QLatin1String (" maps" )).toObject (); // Get all button maps
150
151
151
152
for (auto i = allMapsObj.constBegin (); i != allMapsObj.constEnd (); ++i) // Loop through button maps
152
153
{
153
- QString buttonMapName = i.key (); // Individual button map name
154
+ const QString buttonMapName = i.key (); // Individual button map name
155
+
156
+ ButtonProduct item;
157
+ item.buttonMapRef = BM_ButtonMapRefForHash (qHash (i.key ()), buttonMaps);
154
158
155
- if (i.value ().isObject ()) // Check if individual button map is an object
159
+ if (isValid (item. buttonMapRef ) && i.value ().isObject ()) // Check if individual button map is an object
156
160
{
157
- QJsonObject buttonMapObj = i.value ().toObject ();
161
+ const QJsonObject buttonMapObj = i.value ().toObject ();
158
162
if (buttonMapObj.value (QString (" modelids" )).isArray ())
159
163
{
160
- QJsonArray buttonMapModelIds = buttonMapObj.value (QString (" modelids" )).toArray ();
164
+ const QJsonArray buttonMapModelIds = buttonMapObj.value (QString (" modelids" )).toArray ();
161
165
162
166
if (buttonMapModelIds.size () == 0 )
163
167
{
164
168
DBG_Printf (DBG_INFO, " [WARNING] - Button map '%s' in JSON file has no assigned ModelIDs. Skip loading button map...\n " , qPrintable (buttonMapName));
165
169
continue ; // Skip button map
166
170
}
167
171
168
- for (auto i = buttonMapModelIds.constBegin (); i != buttonMapModelIds.constEnd (); ++i) // Loop through modelIDs
172
+ const auto jend = buttonMapModelIds.constEnd ();
173
+ for (auto j = buttonMapModelIds.constBegin (); j != jend; ++j) // Loop through modelIDs
169
174
{
170
- QJsonValue val = *i ;
175
+ const QString modelId = j-> toString () ;
171
176
172
- if (val. isString () && val. toString () .size () <= 32 )
177
+ if (j-> isString () && !modelId. isEmpty () && modelId .size () <= 32 )
173
178
{
174
- buttonMapForModelId.insert (val.toString (), buttonMapName); // Assign button map to modelIDs
179
+ item.productHash = qHash (modelId);
180
+ result.push_back (item);
175
181
}
176
- else if (val. isString () && val. toString () .size () > 32 )
182
+ else if (j-> isString () && modelId .size () > 32 )
177
183
{
178
184
DBG_Printf (DBG_INFO, " [ERROR] - Entry of 'modelids', button map '%s' in JSON file is too long. Skipping entry...\n " , qPrintable (buttonMapName));
179
185
continue ;
180
186
}
181
187
else
182
188
{
183
189
DBG_Printf (DBG_INFO, " [ERROR] - Expected entry of 'modelids', button map '%s' in JSON file to be a string, but isn't. Skipping entry...\n " , qPrintable (buttonMapName));
184
- continue ;
185
190
}
186
191
}
187
192
}
@@ -197,19 +202,23 @@ QMap<QString, QString> loadButtonMapModelIdsJson(const QJsonDocument &buttonMaps
197
202
continue ; // Skip button map
198
203
}
199
204
}
200
- return buttonMapForModelId ;
205
+ return result ;
201
206
}
202
207
203
208
204
209
/* ! Reads all available button maps from JSON file.
205
210
*/
206
- QMap<QString, std::vector<Sensor:: ButtonMap> > loadButtonMapsJson (const QJsonDocument &buttonMaps, const QMap<QString, quint16> &btnMapClusters,
211
+ std::vector<ButtonMap> loadButtonMapsJson (const QJsonDocument &buttonMaps, const QMap<QString, quint16> &btnMapClusters,
207
212
const QMap<QString, QMap<QString, quint16>> &btnMapClusterCommands)
208
213
{
214
+ std::vector<ButtonMap> result;
215
+ result.reserve (128 );
216
+
209
217
QMap<QString, quint16> buttons;
210
218
QMap<QString, quint8> actions;
211
219
quint8 counter = 0 ;
212
220
221
+
213
222
// Load button map buttons
214
223
QJsonObject buttonsObj = buttonMaps.object ().value (QLatin1String (" buttons" )).toObject ();
215
224
@@ -258,7 +267,6 @@ QMap<QString, std::vector<Sensor::ButtonMap>> loadButtonMapsJson(const QJsonDocu
258
267
}
259
268
260
269
// Load button maps
261
- QMap<QString, std::vector<Sensor::ButtonMap>> buttonMapData;
262
270
QJsonObject allMapsObj = buttonMaps.object ().value (QLatin1String (" maps" )).toObject (); // Get all button maps
263
271
264
272
for (auto i = allMapsObj.constBegin (); i != allMapsObj.constEnd (); ++i) // Loop through button maps
@@ -273,7 +281,7 @@ QMap<QString, std::vector<Sensor::ButtonMap>> loadButtonMapsJson(const QJsonDocu
273
281
274
282
if (buttonMapObj.value (QString (" map" )).isArray ()) // Check if button map is an array of arrays
275
283
{
276
- std::vector<Sensor::ButtonMap > btnMapVec;
284
+ std::vector<ButtonMap::Item > btnMapVec;
277
285
QJsonArray buttonMapArr = buttonMapObj.value (QString (" map" )).toArray ();
278
286
// DBG_Printf(DBG_INFO, "[INFO] - Button map size: %d\n", i.value().toArray().size());
279
287
@@ -294,7 +302,7 @@ QMap<QString, std::vector<Sensor::ButtonMap>> loadButtonMapsJson(const QJsonDocu
294
302
{
295
303
bool ok;
296
304
quint16 btn = 0 ;
297
- Sensor::ButtonMap btnMap;
305
+ ButtonMap::Item btnMap;
298
306
299
307
// Initialize with defaults
300
308
btnMap.mode = Sensor::ModeNone;
@@ -458,6 +466,7 @@ QMap<QString, std::vector<Sensor::ButtonMap>> loadButtonMapsJson(const QJsonDocu
458
466
continue ;
459
467
}
460
468
469
+
461
470
// DBG_Printf(DBG_INFO, "[INFO] - btnMap item #6: %d\n", btnMap.button);
462
471
// DBG_Printf(DBG_INFO, "[INFO] - btnMap item #7: %s\n", qPrintable(btnMap.name));
463
472
btnMapVec.push_back (btnMap);
@@ -471,7 +480,21 @@ QMap<QString, std::vector<Sensor::ButtonMap>> loadButtonMapsJson(const QJsonDocu
471
480
}
472
481
}
473
482
474
- buttonMapData.insert (buttonMapName, btnMapVec); // Assign vector of button maps to QMap
483
+ ButtonMapRef buttonMapRef;
484
+ buttonMapRef.hash = qHash (buttonMapName);
485
+ buttonMapRef.index = result.size ();
486
+
487
+ #ifdef QT_DEBUG
488
+ {
489
+ ButtonMapRef ref = BM_ButtonMapRefForHash (buttonMapRef.hash , result);
490
+ if (isValid (ref))
491
+ {
492
+ DBG_Printf (DBG_INFO, " [ERROR] - Button map duplicated hash for %s\n " , qPrintable (buttonMapName));
493
+ }
494
+ }
495
+ #endif
496
+
497
+ result.emplace_back (ButtonMap{std::move (btnMapVec), buttonMapRef});
475
498
}
476
499
else
477
500
{
@@ -488,5 +511,73 @@ QMap<QString, std::vector<Sensor::ButtonMap>> loadButtonMapsJson(const QJsonDocu
488
511
489
512
DBG_Printf (DBG_INFO, " [INFO] - Button maps loaded.\n " );
490
513
491
- return buttonMapData;
514
+ return result;
515
+ }
516
+
517
+ std::vector<ButtonMeta> loadButtonMetaJson (const QJsonDocument &buttonMapsDoc, const std::vector<ButtonMap> &buttonMaps)
518
+ {
519
+ std::vector<ButtonMeta> result;
520
+
521
+ const QLatin1String buttonPrefix (" S_BUTTON_" );
522
+ const QJsonObject mapsObj = buttonMapsDoc.object ().value (QLatin1String (" maps" )).toObject (); // Get all button maps
523
+
524
+ for (auto i = mapsObj.constBegin (); i != mapsObj.constEnd (); ++i) // Loop through button maps
525
+ {
526
+ ButtonMeta meta;
527
+ meta.buttons .reserve (4 );
528
+ meta.buttonMapRef = BM_ButtonMapRefForHash (qHash (i.key ()), buttonMaps); // Individual button map name
529
+
530
+ if (!isValid (meta.buttonMapRef ))
531
+ {
532
+ continue ;
533
+ }
534
+
535
+ if (!i.value ().isObject ())
536
+ {
537
+ continue ;
538
+ }
539
+
540
+ const QJsonObject buttonMapObj = i.value ().toObject ();
541
+ if (!buttonMapObj.value (QLatin1String (" buttons" )).isArray ())
542
+ {
543
+ continue ;
544
+ }
545
+
546
+ const QJsonArray buttons = buttonMapObj.value (QLatin1String (" buttons" )).toArray ();
547
+
548
+ for (auto j = buttons.constBegin (); j != buttons.constEnd (); ++j)
549
+ {
550
+ if (!j->isObject ())
551
+ {
552
+ continue ;
553
+ }
554
+
555
+ const QJsonObject buttonObj = j->toObject ();
556
+ const auto keys = buttonObj.keys ();
557
+ for (const auto &k : keys)
558
+ {
559
+ if (!k.startsWith (buttonPrefix))
560
+ {
561
+ continue ;
562
+ }
563
+
564
+ bool ok = false ;
565
+ ButtonMeta::Button b;
566
+ b.button = k.midRef (buttonPrefix.size ()).toInt (&ok);
567
+
568
+ if (ok)
569
+ {
570
+ b.name = buttonObj.value (k).toString ();
571
+ meta.buttons .push_back (b);
572
+ }
573
+ }
574
+ }
575
+
576
+ if (!meta.buttons .empty ())
577
+ {
578
+ result.push_back (std::move (meta));
579
+ }
580
+ }
581
+
582
+ return result;
492
583
}
0 commit comments