EasyTherm_LPP/ETCPLPP.cpp

158 lines
2.9 KiB
C++
Raw Normal View History

2018-07-30 14:40:44 +02:00
// Adapted from https://developer.mbed.org/teams/myDevicesIoT/code/Cayenne-LPP/
// Copyright © 2017 The Things Network
// Use of this source code is governed by the MIT license that can be found in the LICENSE file.
#include "ETCPLPP.h"
ETCPLPP::ETCPLPP(uint8_t size) : maxsize(size)
{
buffer = (uint8_t *)malloc(size);
cursor = 0;
}
ETCPLPP::~ETCPLPP(void)
{
if (buffer)
free(buffer);
}
void ETCPLPP::reset(void)
{
cursor = 0;
}
uint8_t ETCPLPP::getSize(void)
{
return cursor;
}
uint8_t *ETCPLPP::getBuffer(void)
{
return buffer;
}
uint8_t ETCPLPP::copy(uint8_t *dst)
{
memcpy(dst, buffer, cursor);
return cursor;
}
uint8_t ETCPLPP::addDigitalInput(uint8_t channel, uint8_t value)
{
if ((cursor + LPP_DIGITAL_INPUT_SIZE) > maxsize)
{
return 0;
}
buffer[cursor++] = channel;
buffer[cursor++] = LPP_DIGITAL_INPUT;
buffer[cursor++] = value;
return cursor;
}
uint8_t ETCPLPP::addDigitalOutput(uint8_t channel, uint8_t value)
{
if ((cursor + LPP_DIGITAL_OUTPUT_SIZE) > maxsize)
{
return 0;
}
buffer[cursor++] = channel;
buffer[cursor++] = LPP_DIGITAL_OUTPUT;
buffer[cursor++] = value;
return cursor;
}
uint8_t ETCPLPP::addAnalogInput(uint8_t channel, float value)
{
if ((cursor + LPP_ANALOG_INPUT_SIZE) > maxsize)
{
return 0;
}
int16_t val = value * 100;
buffer[cursor++] = channel;
buffer[cursor++] = LPP_ANALOG_INPUT;
buffer[cursor++] = val >> 8;
buffer[cursor++] = val;
return cursor;
}
uint8_t ETCPLPP::addAnalogOutput(uint8_t channel, float value)
{
if ((cursor + LPP_ANALOG_OUTPUT_SIZE) > maxsize)
{
return 0;
}
int16_t val = value * 100;
buffer[cursor++] = channel;
buffer[cursor++] = LPP_ANALOG_OUTPUT;
buffer[cursor++] = val >> 8;
buffer[cursor++] = val;
return cursor;
}
uint8_t ETCPLPP::addLuminosity(uint8_t channel, uint16_t lux)
{
if ((cursor + LPP_LUMINOSITY_SIZE) > maxsize)
{
return 0;
}
buffer[cursor++] = channel;
buffer[cursor++] = LPP_LUMINOSITY;
buffer[cursor++] = lux >> 8;
buffer[cursor++] = lux;
return cursor;
}
2018-07-31 11:00:46 +02:00
uint8_t ETCPLPP::addTemperature(uint8_t channel, float celsius)
2018-07-30 14:40:44 +02:00
{
if ((cursor + LPP_TEMPERATURE_SIZE) > maxsize)
{
return 0;
}
int16_t val = celsius * 10;
buffer[cursor++] = channel;
buffer[cursor++] = LPP_TEMPERATURE;
buffer[cursor++] = val >> 8;
buffer[cursor++] = val;
return cursor;
}
2018-07-31 11:00:46 +02:00
uint8_t ETCPLPP::addRelativeHumidity(uint8_t channel, float rh)
2018-07-30 14:40:44 +02:00
{
if ((cursor + LPP_RELATIVE_HUMIDITY_SIZE) > maxsize)
{
return 0;
}
buffer[cursor++] = channel;
buffer[cursor++] = LPP_RELATIVE_HUMIDITY;
buffer[cursor++] = rh * 2;
return cursor;
}
2018-07-31 11:00:46 +02:00
uint8_t ETCPLPP::addBarometricPressure(uint8_t channel, float hpa)
2018-07-30 14:40:44 +02:00
{
if ((cursor + LPP_BAROMETRIC_PRESSURE_SIZE) > maxsize)
{
return 0;
}
int16_t val = hpa * 10;
buffer[cursor++] = channel;
buffer[cursor++] = LPP_BAROMETRIC_PRESSURE;
buffer[cursor++] = val >> 8;
buffer[cursor++] = val;
return cursor;
}