@@ -20,6 +20,7 @@ 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"
23
24
24
25
const int MAX_CHANNEL_ARRAY_SIZE = 4 ;
25
26
@@ -162,30 +163,6 @@ class CayenneArduinoMQTTClient
162
163
publishData (DATA_TOPIC, channel, data, type, unit);
163
164
}
164
165
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
-
189
166
/* *
190
167
* Sends a response after processing a command
191
168
*
@@ -290,6 +267,40 @@ class CayenneArduinoMQTTClient
290
267
virtualWrite (channel, value, F (TYPE_DIGITAL_SENSOR), F (UNIT_DIGITAL));
291
268
}
292
269
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
+
293
304
/* *
294
305
* Requests Server to re-send current values for all widgets.
295
306
*/
@@ -343,9 +354,9 @@ class CayenneArduinoMQTTClient
343
354
*/
344
355
template <typename T>
345
356
static void publishData (CayenneTopic topic, unsigned int channel, const T& data, const char * key = NULL , const char * subkey = NULL ) {
346
- CayenneDataArray values ;
347
- values .add (subkey, data);
348
- publishData (topic, channel, values. getArray (), values. getCount (), key );
357
+ CayenneDataArray value ;
358
+ value .add (data);
359
+ publishData (topic, channel, value. getString (), key, subkey );
349
360
}
350
361
351
362
/* *
@@ -358,39 +369,42 @@ class CayenneArduinoMQTTClient
358
369
*/
359
370
template <typename T>
360
371
static void publishData (CayenneTopic topic, unsigned int channel, const T& data, const __FlashStringHelper* key, const __FlashStringHelper* subkey = NULL ) {
361
- char keyBuffer[MAX_TYPE_LENGTH + 1 ];
362
- CayenneDataArray values;
363
- values.add (subkey, data);
372
+ char keyBuffer[MAX_TYPE_LENGTH + 1 ] = { 0 };
373
+ char subkeyBuffer[MAX_UNIT_LENGTH + 1 ] = { 0 };
374
+ CayenneDataArray value;
375
+ value.add (data);
364
376
CAYENNE_MEMCPY (keyBuffer, reinterpret_cast <const char *>(key), CAYENNE_STRLEN (reinterpret_cast <const char *>(key)) + 1 );
365
- publishData (topic, channel, values.getArray (), values.getCount (), keyBuffer);
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);
366
380
}
367
381
368
382
/* *
369
383
* Publish value array using specified topic suffix
370
384
* @param topic Cayenne topic
371
385
* @param channel Cayenne channel number
372
- * @param values Array of values to be sent
373
- * @param valueCount Count of values in array
386
+ * @param data Data to send
374
387
* @param key Optional key to use for a key=data pair
388
+ * @param subkey Optional subkey to use for a key,subkey=data pair
375
389
*/
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 );
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 );
379
393
}
380
394
381
395
/* *
382
396
* Publish value array using specified topic suffix
383
397
* @param topic Cayenne topic
384
398
* @param channel Cayenne channel number
385
- * @param values Array of values to be sent
386
- * @param valueCount Count of values in array
399
+ * @param data Data to send
387
400
* @param key Optional key to use for a key=data pair
401
+ * @param subkey Optional subkey to use for a key,subkey=data pair
388
402
*/
389
- static void publishData (CayenneTopic topic, unsigned int channel, const CayenneValuePair values[], size_t valueCount , const __FlashStringHelper* key ) {
403
+ static void publishData (CayenneTopic topic, unsigned int channel, const char * data, const __FlashStringHelper* key , const char * subkey ) {
390
404
char keyBuffer[MAX_TYPE_LENGTH + 1 ];
391
405
CAYENNE_MEMCPY (keyBuffer, reinterpret_cast <const char *>(key), CAYENNE_STRLEN (reinterpret_cast <const char *>(key)) + 1 );
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 );
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 );
394
408
}
395
409
396
410
/* *
@@ -468,8 +482,8 @@ void handleMessage(CayenneMessageData* messageData) {
468
482
Request request = { messageData->channel };
469
483
const char * response = NULL ;
470
484
CayenneMessage message (messageData);
471
- if (strlen (messageData->values [ 0 ]. value )) {
472
- CAYENNE_LOG_DEBUG (" In: value %s, channel %d" , messageData->values [ 0 ]. value , request.channel );
485
+ if (strlen (messageData->value )) {
486
+ CAYENNE_LOG_DEBUG (" In: value %s, channel %d" , messageData->value , request.channel );
473
487
InputHandlerFunction handler = GetInputHandler (request.channel );
474
488
if (handler && handler != InputHandler) {
475
489
handler (request, message);
@@ -483,14 +497,14 @@ void handleMessage(CayenneMessageData* messageData) {
483
497
}
484
498
if (response == NULL ) {
485
499
// If there was no error, we send the new channel state, which should be the command value we received.
486
- CayenneArduinoMQTTClient::publishState (DATA_TOPIC, messageData->channel , messageData->values [ 0 ]. value );
500
+ CayenneArduinoMQTTClient::publishState (DATA_TOPIC, messageData->channel , messageData->value );
487
501
}
488
502
CayenneArduinoMQTTClient::responseWrite (response, messageData->id );
489
503
}
490
504
491
505
#ifdef DIGITAL_AND_ANALOG_SUPPORT
492
506
void handleAnalogMessage (CayenneMessageData* messageData) {
493
- float value = atof (messageData->values [ 0 ]. value );
507
+ float value = atof (messageData->value );
494
508
char * response = NULL ;
495
509
if (value >= 0 && value <= 1 ) {
496
510
double test = value * 255 ;
@@ -501,18 +515,18 @@ void handleAnalogMessage(CayenneMessageData* messageData) {
501
515
else {
502
516
response = ERROR_INCORRECT_PARAM;
503
517
}
504
- CayenneArduinoMQTTClient::responseWrite (messageData-> channel , response, messageData->id );
518
+ CayenneArduinoMQTTClient::responseWrite (response, messageData->id );
505
519
}
506
520
507
521
void handleDigitalMessage (CayenneMessageData* messageData) {
508
522
char * response = NULL ;
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' ) {
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' ) {
512
526
digitalWrite (messageData->channel , LOW);
513
527
CayenneArduinoMQTTClient::publishState (DIGITAL_TOPIC, messageData->channel , LOW);
514
528
}
515
- else if (messageData->values [ 0 ]. value [0 ] == ' 1' ) {
529
+ else if (messageData->value [0 ] == ' 1' ) {
516
530
digitalWrite (messageData->channel , HIGH);
517
531
CayenneArduinoMQTTClient::publishState (DIGITAL_TOPIC, messageData->channel , HIGH);
518
532
}
@@ -523,7 +537,7 @@ void handleDigitalMessage(CayenneMessageData* messageData) {
523
537
else {
524
538
response = ERROR_INCORRECT_PARAM;
525
539
}
526
- CayenneArduinoMQTTClient::responseWrite (messageData-> channel , response, messageData->id );
540
+ CayenneArduinoMQTTClient::responseWrite (response, messageData->id );
527
541
}
528
542
#endif
529
543
@@ -539,13 +553,13 @@ void CayenneMessageArrived(CayenneMessageData* message) {
539
553
handleDigitalMessage (message);
540
554
break ;
541
555
case DIGITAL_CONFIG_TOPIC:
542
- configChannel (CayenneArduinoMQTTClient::digitalChannels, message->channel , message->values [ 0 ]. value );
556
+ configChannel (CayenneArduinoMQTTClient::digitalChannels, message->channel , message->value );
543
557
break ;
544
558
case ANALOG_COMMAND_TOPIC:
545
559
handleAnalogMessage (message);
546
560
break ;
547
561
case ANALOG_CONFIG_TOPIC:
548
- configChannel (CayenneArduinoMQTTClient::analogChannels, message->channel , message->values [ 0 ]. value );
562
+ configChannel (CayenneArduinoMQTTClient::analogChannels, message->channel , message->value );
549
563
break ;
550
564
#endif
551
565
default :
@@ -555,14 +569,11 @@ void CayenneMessageArrived(CayenneMessageData* message) {
555
569
// CAYENNE_PRINT.print(message->type);
556
570
// CAYENNE_PRINT.print(", ");
557
571
// }
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(" ");
572
+ // if (message->unit) {
573
+ // CAYENNE_PRINT.print(message->unit);
574
+ // CAYENNE_PRINT.print("=");
565
575
// }
576
+ // CAYENNE_PRINT.print(message->value);
566
577
// CAYENNE_PRINT.println();
567
578
// #endif
568
579
break ;
0 commit comments