159 lines
3.4 KiB
C++
159 lines
3.4 KiB
C++
//
|
|
// Adafruit invests time and resources providing this open source code.
|
|
// Please support Adafruit and open source hardware by purchasing
|
|
// products from Adafruit!
|
|
//
|
|
// Copyright (c) 2015-2016 Adafruit Industries
|
|
// Authors: Tony DiCola, Todd Treece
|
|
// Licensed under the MIT license.
|
|
//
|
|
// All text above must be included in any redistribution.
|
|
//
|
|
#include "AdafruitIO_Feed.h"
|
|
#include "AdafruitIO.h"
|
|
|
|
AdafruitIO_Feed::AdafruitIO_Feed(AdafruitIO *io, const char *n)
|
|
{
|
|
_io = io;
|
|
name = n;
|
|
_sub = 0;
|
|
_pub = 0;
|
|
_dataCallback = 0;
|
|
|
|
_init();
|
|
}
|
|
|
|
AdafruitIO_Feed::AdafruitIO_Feed(AdafruitIO *io, const __FlashStringHelper *n)
|
|
{
|
|
_io = io;
|
|
name = (const char*)n;
|
|
_sub = 0;
|
|
_pub = 0;
|
|
_dataCallback = 0;
|
|
|
|
_init();
|
|
}
|
|
|
|
AdafruitIO_Feed::~AdafruitIO_Feed()
|
|
{
|
|
if(_sub)
|
|
delete _sub;
|
|
|
|
if(_pub)
|
|
delete _pub;
|
|
|
|
if(data)
|
|
delete data;
|
|
|
|
if(_topic)
|
|
free(_topic);
|
|
}
|
|
|
|
void AdafruitIO_Feed::onMessage(AdafruitIODataCallbackType cb)
|
|
{
|
|
_dataCallback = cb;
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(char *value, double lat, double lon, double ele)
|
|
{
|
|
data->setValue(value, lat, lon, ele);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(bool value, double lat, double lon, double ele)
|
|
{
|
|
data->setValue(value, lat, lon, ele);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(String value, double lat, double lon, double ele)
|
|
{
|
|
data->setValue(value, lat, lon, ele);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(int value, double lat, double lon, double ele)
|
|
{
|
|
data->setValue(value, lat, lon, ele);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(unsigned int value, double lat, double lon, double ele)
|
|
{
|
|
data->setValue(value, lat, lon, ele);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(long value, double lat, double lon, double ele)
|
|
{
|
|
data->setValue(value, lat, lon, ele);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(unsigned long value, double lat, double lon, double ele)
|
|
{
|
|
data->setValue(value, lat, lon, ele);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(float value, double lat, double lon, double ele, int precision)
|
|
{
|
|
data->setValue(value, lat, lon, ele, precision);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
bool AdafruitIO_Feed::save(double value, double lat, double lon, double ele, int precision)
|
|
{
|
|
data->setValue(value, lat, lon, ele, precision);
|
|
return _pub->publish(data->toCSV());
|
|
}
|
|
|
|
void AdafruitIO_Feed::setLocation(double lat, double lon, double ele)
|
|
{
|
|
data->setLocation(lat, lon, ele);
|
|
}
|
|
|
|
void AdafruitIO_Feed::subCallback(char *val, uint16_t len)
|
|
{
|
|
data->setCSV(val);
|
|
|
|
// call callback with data
|
|
if(_dataCallback)
|
|
_dataCallback(data);
|
|
}
|
|
|
|
void AdafruitIO_Feed::_init()
|
|
{
|
|
|
|
// dynamically allocate memory for topic
|
|
_topic = (char *) malloc(sizeof(char) * (strlen(_io->_username) + strlen(name) + 8)); // 8 extra chars for /f/, /csv & null termination
|
|
|
|
// init feed data
|
|
data = new AdafruitIO_Data(this);
|
|
|
|
if(_topic) {
|
|
|
|
// build topic string
|
|
strcpy(_topic, _io->_username);
|
|
strcat(_topic, "/f/");
|
|
strcat(_topic, name);
|
|
strcat(_topic, "/csv");
|
|
|
|
// setup subscription
|
|
_sub = new Adafruit_MQTT_Subscribe(_io->_mqtt, _topic);
|
|
_pub = new Adafruit_MQTT_Publish(_io->_mqtt, _topic);
|
|
_io->_mqtt->subscribe(_sub);
|
|
|
|
_sub->setCallback(this, &AdafruitIO_Feed::subCallback);
|
|
|
|
} else {
|
|
|
|
// malloc failed
|
|
_topic = 0;
|
|
_sub = 0;
|
|
_pub = 0;
|
|
data = 0;
|
|
|
|
}
|
|
|
|
}
|