@@ -20,7 +20,6 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL
20
20
21
21
#include " CayenneArduinoDefines.h"
22
22
#include " CayenneMQTTClient/CayenneMQTTClient.h"
23
- #include " CayenneUtils/CayenneDataArray.h"
24
23
25
24
const int MAX_CHANNEL_ARRAY_SIZE = 4 ;
26
25
@@ -163,6 +162,30 @@ class CayenneArduinoMQTTClient
163
162
publishData (DATA_TOPIC, channel, data, type, unit);
164
163
}
165
164
165
+ /* *
166
+ * Sends an array of measurements to a Cayenne channel
167
+ *
168
+ * @param channel Cayenne channel number
169
+ * @param values Array of values to be sent
170
+ * @param type Measurement type
171
+ */
172
+ void virtualWrite (unsigned int channel, const CayenneDataArray& values, const char * type)
173
+ {
174
+ publishData (DATA_TOPIC, channel, values.getArray (), values.getCount (), type);
175
+ }
176
+
177
+ /* *
178
+ * Sends an array of measurements to a Cayenne channel
179
+ *
180
+ * @param channel Cayenne channel number
181
+ * @param values Array of values to be sent
182
+ * @param type Measurement type
183
+ */
184
+ void virtualWrite (unsigned int channel, const CayenneDataArray& values, const __FlashStringHelper* type)
185
+ {
186
+ publishData (DATA_TOPIC, channel, values.getArray (), values.getCount (), type);
187
+ }
188
+
166
189
/* *
167
190
* Sends a response after processing a command
168
191
*
@@ -267,40 +290,6 @@ class CayenneArduinoMQTTClient
267
290
virtualWrite (channel, value, F (TYPE_DIGITAL_SENSOR), F (UNIT_DIGITAL));
268
291
}
269
292
270
- /* *
271
- * Sends an acceleration value array to a Cayenne channel
272
- *
273
- * @param channel Cayenne channel number
274
- * @param x Acceration on the X-axis
275
- * @param y Acceration on the Y-axis
276
- * @param z Acceration on the Z-axis
277
- */
278
- void accelWrite (unsigned int channel, float x, float y, float z)
279
- {
280
- CayenneDataArray values;
281
- values.add (x, 1 );
282
- values.add (y, 1 );
283
- values.add (z, 1 );
284
- virtualWrite (channel, values.getString (), F (TYPE_ACCELERATION), F (UNIT_G));
285
- }
286
-
287
- /* *
288
- * Sends a GPS value array to a Cayenne channel
289
- *
290
- * @param channel Cayenne channel number
291
- * @param latitude Latitude in degrees
292
- * @param longitude Longitude in degrees
293
- * @param altitude Altitude in meters
294
- */
295
- void gpsWrite (unsigned int channel, float latitude, float longitude, float altitude)
296
- {
297
- CayenneDataArray values;
298
- values.add (latitude, 5 );
299
- values.add (longitude, 5 );
300
- values.add (altitude, 1 );
301
- virtualWrite (channel, values.getString (), F (TYPE_GPS), F (UNIT_METER));
302
- }
303
-
304
293
/* *
305
294
* Requests Server to re-send current values for all widgets.
306
295
*/
@@ -354,9 +343,9 @@ class CayenneArduinoMQTTClient
354
343
*/
355
344
template <typename T>
356
345
static void publishData (CayenneTopic topic, unsigned int channel, const T& data, const char * key = NULL , const char * subkey = NULL ) {
357
- CayenneDataArray value ;
358
- value .add (data);
359
- publishData (topic, channel, value. getString (), key, subkey );
346
+ CayenneDataArray values ;
347
+ values .add (subkey, data);
348
+ publishData (topic, channel, values. getArray (), values. getCount (), key );
360
349
}
361
350
362
351
/* *
@@ -369,42 +358,39 @@ class CayenneArduinoMQTTClient
369
358
*/
370
359
template <typename T>
371
360
static void publishData (CayenneTopic topic, unsigned int channel, const T& data, const __FlashStringHelper* key, const __FlashStringHelper* subkey = NULL ) {
372
- char keyBuffer[MAX_TYPE_LENGTH + 1 ] = { 0 };
373
- char subkeyBuffer[MAX_UNIT_LENGTH + 1 ] = { 0 };
374
- CayenneDataArray value;
375
- value.add (data);
361
+ char keyBuffer[MAX_TYPE_LENGTH + 1 ];
362
+ CayenneDataArray values;
363
+ values.add (subkey, data);
376
364
CAYENNE_MEMCPY (keyBuffer, reinterpret_cast <const char *>(key), CAYENNE_STRLEN (reinterpret_cast <const char *>(key)) + 1 );
377
- if (subkey)
378
- CAYENNE_MEMCPY (subkeyBuffer, reinterpret_cast <const char *>(subkey), CAYENNE_STRLEN (reinterpret_cast <const char *>(subkey)) + 1 );
379
- publishData (topic, channel, value.getString (), keyBuffer, subkeyBuffer);
365
+ publishData (topic, channel, values.getArray (), values.getCount (), keyBuffer);
380
366
}
381
367
382
368
/* *
383
369
* Publish value array using specified topic suffix
384
370
* @param topic Cayenne topic
385
371
* @param channel Cayenne channel number
386
- * @param data Data to send
372
+ * @param values Array of values to be sent
373
+ * @param valueCount Count of values in array
387
374
* @param key Optional key to use for a key=data pair
388
- * @param subkey Optional subkey to use for a key,subkey=data pair
389
375
*/
390
- static void publishData (CayenneTopic topic, unsigned int channel, const char * data, const char * key , const char * subkey ) {
391
- CAYENNE_LOG_DEBUG (" Publish: topic %d, channel %u, key %s, subkey %s, data %s" , topic, channel, key, subkey, data );
392
- CayenneMQTTPublishData (&_mqttClient, NULL , topic, channel, key, subkey, data );
376
+ static void publishData (CayenneTopic topic, unsigned int channel, const CayenneValuePair values[], size_t valueCount , const char * key ) {
377
+ CAYENNE_LOG_DEBUG (" Publish: topic %d, channel %u, value %s, subkey %s, key %s" , topic, channel, values[ 0 ]. value , values[ 0 ]. unit , key );
378
+ CayenneMQTTPublishDataArray (&_mqttClient, NULL , topic, channel, key, values, valueCount );
393
379
}
394
380
395
381
/* *
396
382
* Publish value array using specified topic suffix
397
383
* @param topic Cayenne topic
398
384
* @param channel Cayenne channel number
399
- * @param data Data to send
385
+ * @param values Array of values to be sent
386
+ * @param valueCount Count of values in array
400
387
* @param key Optional key to use for a key=data pair
401
- * @param subkey Optional subkey to use for a key,subkey=data pair
402
388
*/
403
- static void publishData (CayenneTopic topic, unsigned int channel, const char * data, const __FlashStringHelper* key , const char * subkey ) {
389
+ static void publishData (CayenneTopic topic, unsigned int channel, const CayenneValuePair values[], size_t valueCount , const __FlashStringHelper* key ) {
404
390
char keyBuffer[MAX_TYPE_LENGTH + 1 ];
405
391
CAYENNE_MEMCPY (keyBuffer, reinterpret_cast <const char *>(key), CAYENNE_STRLEN (reinterpret_cast <const char *>(key)) + 1 );
406
- CAYENNE_LOG_DEBUG (" Publish: topic %d, channel %u, key %s, subkey %s, data %s" , topic, channel, keyBuffer, subkey, data );
407
- CayenneMQTTPublishData (&_mqttClient, NULL , topic, channel, keyBuffer, subkey, data );
392
+ CAYENNE_LOG_DEBUG (" Publish: topic %d, channel %u, value %s, subkey %s, key %s" , topic, channel, values[ 0 ]. value , values[ 0 ]. unit , keyBuffer );
393
+ CayenneMQTTPublishDataArray (&_mqttClient, NULL , topic, channel, keyBuffer, values, valueCount );
408
394
}
409
395
410
396
/* *
@@ -482,8 +468,8 @@ void handleMessage(CayenneMessageData* messageData) {
482
468
Request request = { messageData->channel };
483
469
const char * response = NULL ;
484
470
CayenneMessage message (messageData);
485
- if (strlen (messageData->value )) {
486
- CAYENNE_LOG_DEBUG (" In: value %s, channel %d" , messageData->value , request.channel );
471
+ if (strlen (messageData->values [ 0 ]. value )) {
472
+ CAYENNE_LOG_DEBUG (" In: value %s, channel %d" , messageData->values [ 0 ]. value , request.channel );
487
473
InputHandlerFunction handler = GetInputHandler (request.channel );
488
474
if (handler && handler != InputHandler) {
489
475
handler (request, message);
@@ -497,14 +483,14 @@ void handleMessage(CayenneMessageData* messageData) {
497
483
}
498
484
if (response == NULL ) {
499
485
// If there was no error, we send the new channel state, which should be the command value we received.
500
- CayenneArduinoMQTTClient::publishState (DATA_TOPIC, messageData->channel , messageData->value );
486
+ CayenneArduinoMQTTClient::publishState (DATA_TOPIC, messageData->channel , messageData->values [ 0 ]. value );
501
487
}
502
488
CayenneArduinoMQTTClient::responseWrite (response, messageData->id );
503
489
}
504
490
505
491
#ifdef DIGITAL_AND_ANALOG_SUPPORT
506
492
void handleAnalogMessage (CayenneMessageData* messageData) {
507
- float value = atof (messageData->value );
493
+ float value = atof (messageData->values [ 0 ]. value );
508
494
char * response = NULL ;
509
495
if (value >= 0 && value <= 1 ) {
510
496
double test = value * 255 ;
@@ -515,18 +501,18 @@ void handleAnalogMessage(CayenneMessageData* messageData) {
515
501
else {
516
502
response = ERROR_INCORRECT_PARAM;
517
503
}
518
- CayenneArduinoMQTTClient::responseWrite (response, messageData->id );
504
+ CayenneArduinoMQTTClient::responseWrite (messageData-> channel , response, messageData->id );
519
505
}
520
506
521
507
void handleDigitalMessage (CayenneMessageData* messageData) {
522
508
char * response = NULL ;
523
- if (messageData->value && strlen (messageData->value ) == 1 ) {
524
- CAYENNE_LOG_DEBUG (" dw %s, channel %d" , messageData->value , messageData->channel );
525
- if (messageData->value [0 ] == ' 0' ) {
509
+ if (messageData->values [ 0 ]. value && strlen (messageData->values [ 0 ]. value ) == 1 ) {
510
+ CAYENNE_LOG_DEBUG (" dw %s, channel %d" , messageData->values [ 0 ]. value , messageData->channel );
511
+ if (messageData->values [ 0 ]. value [0 ] == ' 0' ) {
526
512
digitalWrite (messageData->channel , LOW);
527
513
CayenneArduinoMQTTClient::publishState (DIGITAL_TOPIC, messageData->channel , LOW);
528
514
}
529
- else if (messageData->value [0 ] == ' 1' ) {
515
+ else if (messageData->values [ 0 ]. value [0 ] == ' 1' ) {
530
516
digitalWrite (messageData->channel , HIGH);
531
517
CayenneArduinoMQTTClient::publishState (DIGITAL_TOPIC, messageData->channel , HIGH);
532
518
}
@@ -537,7 +523,7 @@ void handleDigitalMessage(CayenneMessageData* messageData) {
537
523
else {
538
524
response = ERROR_INCORRECT_PARAM;
539
525
}
540
- CayenneArduinoMQTTClient::responseWrite (response, messageData->id );
526
+ CayenneArduinoMQTTClient::responseWrite (messageData-> channel , response, messageData->id );
541
527
}
542
528
#endif
543
529
@@ -553,13 +539,13 @@ void CayenneMessageArrived(CayenneMessageData* message) {
553
539
handleDigitalMessage (message);
554
540
break ;
555
541
case DIGITAL_CONFIG_TOPIC:
556
- configChannel (CayenneArduinoMQTTClient::digitalChannels, message->channel , message->value );
542
+ configChannel (CayenneArduinoMQTTClient::digitalChannels, message->channel , message->values [ 0 ]. value );
557
543
break ;
558
544
case ANALOG_COMMAND_TOPIC:
559
545
handleAnalogMessage (message);
560
546
break ;
561
547
case ANALOG_CONFIG_TOPIC:
562
- configChannel (CayenneArduinoMQTTClient::analogChannels, message->channel , message->value );
548
+ configChannel (CayenneArduinoMQTTClient::analogChannels, message->channel , message->values [ 0 ]. value );
563
549
break ;
564
550
#endif
565
551
default :
@@ -569,11 +555,14 @@ void CayenneMessageArrived(CayenneMessageData* message) {
569
555
// CAYENNE_PRINT.print(message->type);
570
556
// CAYENNE_PRINT.print(", ");
571
557
// }
572
- // if (message->unit) {
573
- // CAYENNE_PRINT.print(message->unit);
574
- // CAYENNE_PRINT.print("=");
558
+ // for (int i = 0; i < message->valueCount; ++i) {
559
+ // if (message->values[i].unit) {
560
+ // CAYENNE_PRINT.print(message->values[i].unit);
561
+ // CAYENNE_PRINT.print("=");
562
+ // }
563
+ // CAYENNE_PRINT.print(message->values[i].value);
564
+ // CAYENNE_PRINT.print(" ");
575
565
// }
576
- // CAYENNE_PRINT.print(message->value);
577
566
// CAYENNE_PRINT.println();
578
567
// #endif
579
568
break ;
0 commit comments