You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

608 lines
16 KiB

/*
THIS IS GENERATED CODE
DO NOT EDIT
Developer: Max Reble
Copyright Notice: hse-electronics GmbH, Max Reble (2020)
License: MIT License (see LICENSE.txt)
*/
#include "HseSensorProtocol.h"
#include <stdlib.h> //malloc
#include <string.h> //memcpy
#define __HSESP_VERSION buffer[0]
HseSP::HseSP(uint8_t version, uint8_t size) : maxsize(size)
{
buffer = (uint8_t*) malloc(size);
buffer[0] = version;
buffer[1] = 255 - version;
dataCursor = 4;
}
HseSP::~HseSP(void){free(buffer);}
uint8_t HseSP::getSize(void)
{
return dataCursor;
}
uint8_t *HseSP::getBuffer(void)
{
generateCRC();
return buffer;
}
void HseSP::reset(){
dataCursor = 4;
}
void HseSP::generateCRC()
{
uint16_t uiCRC16 = 0;
uint8_t nElement, nBitPos;
//Skip first four elements as its the header
for (nElement = 4; nElement < dataCursor; nElement++)
for (nBitPos = 0; nBitPos < 8; nBitPos++)
if ((uiCRC16 ^ (buffer[nElement] >> nBitPos)) & 1)
uiCRC16 = (uiCRC16 >> 1) ^ 0xA001;
else
uiCRC16 >>= 1;
memcpy(buffer + 2, &uiCRC16, 2);
}
bool HseSP::addDataHeader(uint8_t type, uint8_t dataSize, uint8_t dataLen) {
if (dataCursor + (__HSESP_VERSION == 1 ? (dataSize + 1) * dataLen : (dataSize * dataLen) + 2) > maxsize)
return false;
buffer[dataCursor++] = type;
if (__HSESP_VERSION == 2)
buffer[dataCursor++] = dataLen;
return true;
}
bool HseSP::addDigitalInput(uint8_t value)
{
return addDigitalInput(&value, 1);
}
bool HseSP::addDigitalInput(uint8_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_DIGITAL_INPUT, HSESP_DIGITAL_INPUT_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_DIGITAL_INPUT;
memcpy(buffer + dataCursor, &values[i], sizeof(uint8_t));
dataCursor += sizeof(uint8_t);
}
return true;
}
bool HseSP::addDigitalOutput(uint8_t value)
{
return addDigitalOutput(&value, 1);
}
bool HseSP::addDigitalOutput(uint8_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_DIGITAL_OUTPUT, HSESP_DIGITAL_OUTPUT_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_DIGITAL_OUTPUT;
memcpy(buffer + dataCursor, &values[i], sizeof(uint8_t));
dataCursor += sizeof(uint8_t);
}
return true;
}
bool HseSP::addAnalogInput(float value)
{
return addAnalogInput(&value, 1);
}
bool HseSP::addAnalogInput(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_ANALOG_INPUT, HSESP_ANALOG_INPUT_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_ANALOG_INPUT;
int16_t val = values[i] * 100;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addAnalogOutput(float value)
{
return addAnalogOutput(&value, 1);
}
bool HseSP::addAnalogOutput(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_ANALOG_OUTPUT, HSESP_ANALOG_OUTPUT_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_ANALOG_OUTPUT;
int16_t val = values[i] * 100;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addTemperature(float value)
{
return addTemperature(&value, 1);
}
bool HseSP::addTemperature(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_TEMPERATURE, HSESP_TEMPERATURE_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_TEMPERATURE;
int16_t val = values[i] * 100;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addHumidity(float value)
{
return addHumidity(&value, 1);
}
bool HseSP::addHumidity(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_HUMIDITY, HSESP_HUMIDITY_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_HUMIDITY;
uint8_t val = values[i] * 2;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addPressure(float value)
{
return addPressure(&value, 1);
}
bool HseSP::addPressure(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_PRESSURE, HSESP_PRESSURE_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_PRESSURE;
uint16_t val = values[i] * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addIlluminance(uint16_t value)
{
return addIlluminance(&value, 1);
}
bool HseSP::addIlluminance(uint16_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_ILLUMINANCE, HSESP_ILLUMINANCE_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_ILLUMINANCE;
memcpy(buffer + dataCursor, &values[i], sizeof(uint16_t));
dataCursor += sizeof(uint16_t);
}
return true;
}
bool HseSP::addConcentration(float value)
{
return addConcentration(&value, 1);
}
bool HseSP::addConcentration(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_CONCENTRATION, HSESP_CONCENTRATION_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_CONCENTRATION;
uint16_t val = values[i] * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addDirection(float value)
{
return addDirection(&value, 1);
}
bool HseSP::addDirection(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_DIRECTION, HSESP_DIRECTION_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_DIRECTION;
int16_t val = values[i] * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addRSSI(int16_t value)
{
return addRSSI(&value, 1);
}
bool HseSP::addRSSI(int16_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_RSSI, HSESP_RSSI_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_RSSI;
uint8_t val = values[i] * -1;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addLoudness(uint8_t value)
{
return addLoudness(&value, 1);
}
bool HseSP::addLoudness(uint8_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_LOUDNESS, HSESP_LOUDNESS_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_LOUDNESS;
memcpy(buffer + dataCursor, &values[i], sizeof(uint8_t));
dataCursor += sizeof(uint8_t);
}
return true;
}
bool HseSP::addDistance(float value)
{
return addDistance(&value, 1);
}
bool HseSP::addDistance(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_DISTANCE, HSESP_DISTANCE_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_DISTANCE;
uint16_t val = values[i] * 1000;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addCounter(int16_t value)
{
return addCounter(&value, 1);
}
bool HseSP::addCounter(int16_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_COUNTER, HSESP_COUNTER_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_COUNTER;
memcpy(buffer + dataCursor, &values[i], sizeof(int16_t));
dataCursor += sizeof(int16_t);
}
return true;
}
bool HseSP::addVoltage(float value)
{
return addVoltage(&value, 1);
}
bool HseSP::addVoltage(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_VOLTAGE, HSESP_VOLTAGE_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_VOLTAGE;
int16_t val = values[i] * 1000;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addConductivity(uint16_t value)
{
return addConductivity(&value, 1);
}
bool HseSP::addConductivity(uint16_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_CONDUCTIVITY, HSESP_CONDUCTIVITY_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_CONDUCTIVITY;
memcpy(buffer + dataCursor, &values[i], sizeof(uint16_t));
dataCursor += sizeof(uint16_t);
}
return true;
}
bool HseSP::addLevel(uint8_t value)
{
return addLevel(&value, 1);
}
bool HseSP::addLevel(uint8_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_LEVEL, HSESP_LEVEL_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_LEVEL;
memcpy(buffer + dataCursor, &values[i], sizeof(uint8_t));
dataCursor += sizeof(uint8_t);
}
return true;
}
bool HseSP::addPrecipitation(float value)
{
return addPrecipitation(&value, 1);
}
bool HseSP::addPrecipitation(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_PRECIPITATION, HSESP_PRECIPITATION_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_PRECIPITATION;
uint16_t val = values[i] * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
return true;
}
bool HseSP::addLocation(float value)
{
return addLocation(&value, 1);
}
bool HseSP::addLocation(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_LOCATION, HSESP_LOCATION_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_LOCATION;
memcpy(buffer + dataCursor, &values[i], sizeof(float));
dataCursor += sizeof(float);
}
return true;
}
bool HseSP::addGenericUInt8(uint8_t value)
{
return addGenericUInt8(&value, 1);
}
bool HseSP::addGenericUInt8(uint8_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_UINT8, HSESP_GENERIC_UINT8_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_UINT8;
memcpy(buffer + dataCursor, &values[i], sizeof(uint8_t));
dataCursor += sizeof(uint8_t);
}
return true;
}
bool HseSP::addGenericUInt16(uint16_t value)
{
return addGenericUInt16(&value, 1);
}
bool HseSP::addGenericUInt16(uint16_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_UINT16, HSESP_GENERIC_UINT16_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_UINT16;
memcpy(buffer + dataCursor, &values[i], sizeof(uint16_t));
dataCursor += sizeof(uint16_t);
}
return true;
}
bool HseSP::addGenericInt16(int16_t value)
{
return addGenericInt16(&value, 1);
}
bool HseSP::addGenericInt16(int16_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_INT16, HSESP_GENERIC_INT16_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_INT16;
memcpy(buffer + dataCursor, &values[i], sizeof(int16_t));
dataCursor += sizeof(int16_t);
}
return true;
}
bool HseSP::addGenericUInt32(uint32_t value)
{
return addGenericUInt32(&value, 1);
}
bool HseSP::addGenericUInt32(uint32_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_UINT32, HSESP_GENERIC_UINT32_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_UINT32;
memcpy(buffer + dataCursor, &values[i], sizeof(uint32_t));
dataCursor += sizeof(uint32_t);
}
return true;
}
bool HseSP::addGenericInt32(int32_t value)
{
return addGenericInt32(&value, 1);
}
bool HseSP::addGenericInt32(int32_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_INT32, HSESP_GENERIC_INT32_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_INT32;
memcpy(buffer + dataCursor, &values[i], sizeof(int32_t));
dataCursor += sizeof(int32_t);
}
return true;
}
bool HseSP::addGenericFloat(float value)
{
return addGenericFloat(&value, 1);
}
bool HseSP::addGenericFloat(float *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_FLOAT, HSESP_GENERIC_FLOAT_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_FLOAT;
memcpy(buffer + dataCursor, &values[i], sizeof(float));
dataCursor += sizeof(float);
}
return true;
}
bool HseSP::addGenericANSIChar(char value)
{
return addGenericANSIChar(&value, 1);
}
bool HseSP::addGenericANSIChar(char *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_A_N_S_I_CHAR, HSESP_GENERIC_A_N_S_I_CHAR_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_A_N_S_I_CHAR;
memcpy(buffer + dataCursor, &values[i], sizeof(char));
dataCursor += sizeof(char);
}
return true;
}
bool HseSP::addGenericUTF16Char(wchar_t value)
{
return addGenericUTF16Char(&value, 1);
}
bool HseSP::addGenericUTF16Char(wchar_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_U_T_F16_CHAR, HSESP_GENERIC_U_T_F16_CHAR_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_U_T_F16_CHAR;
memcpy(buffer + dataCursor, &values[i], sizeof(wchar_t));
dataCursor += sizeof(wchar_t);
}
return true;
}
bool HseSP::addGenericBoolean(bool value)
{
return addGenericBoolean(&value, 1);
}
bool HseSP::addGenericBoolean(bool *values, uint8_t len)
{
if (!addDataHeader(HSESP_GENERIC_BOOLEAN, HSESP_GENERIC_BOOLEAN_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GENERIC_BOOLEAN;
memcpy(buffer + dataCursor, &values[i], sizeof(bool));
dataCursor += sizeof(bool);
}
return true;
}
bool HseSP::addClimateSensor(ClimateSensor_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_ClimateSensor, HSESP_ClimateSensor_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_ClimateSensor;
{
int16_t val = values->Temperature * 100;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
uint8_t val = values->Humidity * 2;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
uint16_t val = values->Pressure * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
memcpy(buffer + dataCursor, &values->Illuminance, sizeof(values->Illuminance));
dataCursor += sizeof(values->Illuminance);
}
}
return true;
}
bool HseSP::addGPSSensor(GPSSensor_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_GPSSensor, HSESP_GPSSensor_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_GPSSensor;
{
float val = values->Latitude * 1;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
float val = values->Longitude * 1;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
uint8_t val = values->SignalStrength * -1;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
}
return true;
}
bool HseSP::addPositionSensor(PositionSensor_t *values, uint8_t len)
{
if (!addDataHeader(HSESP_PositionSensor, HSESP_PositionSensor_SIZE, len))
return false;
for (uint8_t i = 0; i < len; i++) {
if (__HSESP_VERSION == 1 && i > 0)
buffer[dataCursor++] = HSESP_PositionSensor;
{
int16_t val = values->GSensorX * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
int16_t val = values->GSensorY * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
int16_t val = values->GSensorZ * 10;
memcpy(buffer + dataCursor, &val, sizeof(val));
dataCursor += sizeof(val);
}
{
memcpy(buffer + dataCursor, &values->Totalofshocks, sizeof(values->Totalofshocks));
dataCursor += sizeof(values->Totalofshocks);
}
{
memcpy(buffer + dataCursor, &values->Maxshocks, sizeof(values->Maxshocks));
dataCursor += sizeof(values->Maxshocks);
}
}
return true;
}