ESP32-PaxCounter/src/payload.cpp

476 lines
15 KiB
C++
Raw Normal View History

2018-06-16 13:18:36 +02:00
#include "globals.h"
#include "payload.h"
2018-07-19 22:33:37 +02:00
PayloadConvert::PayloadConvert(uint8_t size) {
2018-06-16 13:18:36 +02:00
buffer = (uint8_t *)malloc(size);
cursor = 0;
}
2018-07-19 22:33:37 +02:00
PayloadConvert::~PayloadConvert(void) { free(buffer); }
2018-06-16 13:18:36 +02:00
2018-07-19 22:33:37 +02:00
void PayloadConvert::reset(void) { cursor = 0; }
2018-06-16 13:18:36 +02:00
2018-07-19 22:33:37 +02:00
uint8_t PayloadConvert::getSize(void) { return cursor; }
2018-06-16 13:18:36 +02:00
2018-07-19 22:33:37 +02:00
uint8_t *PayloadConvert::getBuffer(void) { return buffer; }
2018-06-16 13:18:36 +02:00
2018-07-21 13:36:49 +02:00
/* ---------------- plain format without special encoding ---------- */
#if PAYLOAD_ENCODER == 1
2018-12-02 14:08:50 +01:00
void PayloadConvert::addCount(uint16_t value, uint8_t snifftype) {
buffer[cursor++] = highByte(value);
buffer[cursor++] = lowByte(value);
2018-06-16 13:18:36 +02:00
}
void PayloadConvert::addAlarm(int8_t rssi, uint8_t msg) {
buffer[cursor++] = rssi;
buffer[cursor++] = msg;
}
2018-11-27 11:21:20 +01:00
void PayloadConvert::addVoltage(uint16_t value) {
buffer[cursor++] = highByte(value);
buffer[cursor++] = lowByte(value);
}
2018-07-19 22:33:37 +02:00
void PayloadConvert::addConfig(configData_t value) {
2018-06-16 13:18:36 +02:00
buffer[cursor++] = value.lorasf;
buffer[cursor++] = value.txpower;
2018-06-16 13:18:36 +02:00
buffer[cursor++] = value.adrmode;
buffer[cursor++] = value.screensaver;
buffer[cursor++] = value.screenon;
buffer[cursor++] = value.countermode;
2018-07-22 16:12:46 +02:00
buffer[cursor++] = highByte(value.rssilimit);
buffer[cursor++] = lowByte(value.rssilimit);
2018-06-16 13:18:36 +02:00
buffer[cursor++] = value.sendcycle;
buffer[cursor++] = value.wifichancycle;
buffer[cursor++] = value.blescantime;
buffer[cursor++] = value.blescan;
buffer[cursor++] = value.wifiant;
buffer[cursor++] = value.vendorfilter;
buffer[cursor++] = value.rgblum;
2018-11-19 00:41:15 +01:00
buffer[cursor++] = value.payloadmask;
buffer[cursor++] = value.monitormode;
2018-06-16 13:18:36 +02:00
memcpy(buffer + cursor, value.version, 10);
2018-06-16 19:50:36 +02:00
cursor += 10;
2018-06-16 13:18:36 +02:00
}
2018-09-17 17:23:02 +02:00
void PayloadConvert::addStatus(uint16_t voltage, uint64_t uptime, float cputemp,
uint32_t mem, uint8_t reset1, uint8_t reset2) {
2018-07-22 16:12:46 +02:00
buffer[cursor++] = highByte(voltage);
buffer[cursor++] = lowByte(voltage);
2018-07-22 17:35:26 +02:00
buffer[cursor++] = (byte)((uptime & 0xFF00000000000000) >> 56);
buffer[cursor++] = (byte)((uptime & 0x00FF000000000000) >> 48);
buffer[cursor++] = (byte)((uptime & 0x0000FF0000000000) >> 40);
buffer[cursor++] = (byte)((uptime & 0x000000FF00000000) >> 32);
buffer[cursor++] = (byte)((uptime & 0x00000000FF000000) >> 24);
buffer[cursor++] = (byte)((uptime & 0x0000000000FF0000) >> 16);
buffer[cursor++] = (byte)((uptime & 0x000000000000FF00) >> 8);
buffer[cursor++] = (byte)((uptime & 0x00000000000000FF));
2018-08-11 21:47:51 +02:00
buffer[cursor++] = (byte)(cputemp);
buffer[cursor++] = (byte)((mem & 0xFF000000) >> 24);
buffer[cursor++] = (byte)((mem & 0x00FF0000) >> 16);
buffer[cursor++] = (byte)((mem & 0x0000FF00) >> 8);
buffer[cursor++] = (byte)((mem & 0x000000FF));
2018-08-12 15:42:58 +02:00
buffer[cursor++] = (byte)(reset1);
buffer[cursor++] = (byte)(reset2);
2018-06-16 19:50:36 +02:00
}
2018-07-21 18:25:03 +02:00
void PayloadConvert::addGPS(gpsStatus_t value) {
#ifdef HAS_GPS
2018-07-22 17:35:26 +02:00
buffer[cursor++] = (byte)((value.latitude & 0xFF000000) >> 24);
buffer[cursor++] = (byte)((value.latitude & 0x00FF0000) >> 16);
buffer[cursor++] = (byte)((value.latitude & 0x0000FF00) >> 8);
buffer[cursor++] = (byte)((value.latitude & 0x000000FF));
buffer[cursor++] = (byte)((value.longitude & 0xFF000000) >> 24);
buffer[cursor++] = (byte)((value.longitude & 0x00FF0000) >> 16);
buffer[cursor++] = (byte)((value.longitude & 0x0000FF00) >> 8);
buffer[cursor++] = (byte)((value.longitude & 0x000000FF));
2018-07-21 18:25:03 +02:00
buffer[cursor++] = value.satellites;
2018-07-22 16:12:46 +02:00
buffer[cursor++] = highByte(value.hdop);
buffer[cursor++] = lowByte(value.hdop);
buffer[cursor++] = highByte(value.altitude);
buffer[cursor++] = lowByte(value.altitude);
2018-07-21 18:25:03 +02:00
#endif
}
2018-07-21 18:25:03 +02:00
void PayloadConvert::addSensor(uint8_t buf[]) {
#ifdef HAS_SENSORS
uint8_t length = buf[0];
memcpy(buffer, buf + 1, length);
cursor += length; // length of buffer
#endif
}
2018-11-14 23:10:59 +01:00
void PayloadConvert::addBME(bmeStatus_t value) {
#ifdef HAS_BME
int16_t temperature = (int16_t)(value.temperature); // float -> int
uint16_t humidity = (uint16_t)(value.humidity); // float -> int
2018-11-25 19:16:31 +01:00
uint16_t pressure = (uint16_t)(value.pressure); // float -> int
2018-11-25 16:05:30 +01:00
uint16_t iaq = (uint16_t)(value.iaq); // float -> int
buffer[cursor++] = highByte(temperature);
buffer[cursor++] = lowByte(temperature);
2018-11-25 19:16:31 +01:00
buffer[cursor++] = highByte(pressure);
buffer[cursor++] = lowByte(pressure);
buffer[cursor++] = highByte(humidity);
buffer[cursor++] = lowByte(humidity);
2018-11-25 19:16:31 +01:00
buffer[cursor++] = highByte(iaq);
buffer[cursor++] = lowByte(iaq);
2018-11-14 23:10:59 +01:00
#endif
}
void PayloadConvert::addButton(uint8_t value) {
2018-07-21 18:25:03 +02:00
#ifdef HAS_BUTTON
buffer[cursor++] = value;
2018-07-21 18:25:03 +02:00
#endif
}
2018-07-21 18:25:03 +02:00
2019-02-24 13:35:22 +01:00
void PayloadConvert::addTime(time_t value) {
uint32_t time = (uint32_t)value;
buffer[cursor++] = (byte)((time & 0xFF000000) >> 24);
buffer[cursor++] = (byte)((time & 0x00FF0000) >> 16);
buffer[cursor++] = (byte)((time & 0x0000FF00) >> 8);
buffer[cursor++] = (byte)((time & 0x000000FF));
}
/* ---------------- packed format with LoRa serialization Encoder ----------
*/
2018-06-17 22:41:32 +02:00
// derived from
// https://github.com/thesolarnomad/lora-serialization/blob/master/src/LoraEncoder.cpp
2018-06-16 19:50:36 +02:00
2018-07-21 13:36:49 +02:00
#elif PAYLOAD_ENCODER == 2
2018-06-16 19:50:36 +02:00
2019-02-24 13:35:22 +01:00
void PayloadConvert::addCount(uint16_t value, uint8_t snifftype) {
writeUint16(value);
}
2018-06-16 19:50:36 +02:00
void PayloadConvert::addAlarm(int8_t rssi, uint8_t msg) {
writeUint8(rssi);
writeUint8(msg);
}
2018-11-27 11:21:20 +01:00
void PayloadConvert::addVoltage(uint16_t value) { writeUint16(value); }
2018-07-19 22:33:37 +02:00
void PayloadConvert::addConfig(configData_t value) {
2018-06-17 22:41:32 +02:00
writeUint8(value.lorasf);
writeUint8(value.txpower);
2018-06-17 22:41:32 +02:00
writeUint16(value.rssilimit);
writeUint8(value.sendcycle);
writeUint8(value.wifichancycle);
writeUint8(value.blescantime);
writeUint8(value.rgblum);
writeBitmap(value.adrmode ? true : false, value.screensaver ? true : false,
value.screenon ? true : false, value.countermode ? true : false,
value.blescan ? true : false, value.wifiant ? true : false,
2018-11-19 00:41:15 +01:00
value.vendorfilter ? true : false,
value.monitormode ? true : false);
writeBitmap(value.payloadmask && GPS_DATA ? true : false,
value.payloadmask && ALARM_DATA ? true : false,
value.payloadmask && MEMS_DATA ? true : false,
value.payloadmask && COUNT_DATA ? true : false,
value.payloadmask && SENSOR1_DATA ? true : false,
value.payloadmask && SENSOR2_DATA ? true : false,
value.payloadmask && SENSOR3_DATA ? true : false,
2018-11-27 11:21:20 +01:00
value.payloadmask && BATT_DATA ? true : false);
2018-09-17 17:23:02 +02:00
writeVersion(value.version);
2018-06-17 22:41:32 +02:00
}
2018-08-12 15:42:58 +02:00
void PayloadConvert::addStatus(uint16_t voltage, uint64_t uptime, float cputemp,
uint32_t mem, uint8_t reset1, uint8_t reset2) {
2018-06-17 22:41:32 +02:00
writeUint16(voltage);
2018-06-18 09:15:57 +02:00
writeUptime(uptime);
2018-08-11 21:47:51 +02:00
writeUint8((byte)cputemp);
writeUint32(mem);
2018-08-12 15:42:58 +02:00
writeUint8(reset1);
writeUint8(reset2);
2018-06-17 22:41:32 +02:00
}
2018-07-21 18:25:03 +02:00
void PayloadConvert::addGPS(gpsStatus_t value) {
#ifdef HAS_GPS
2018-07-21 18:25:03 +02:00
writeLatLng(value.latitude, value.longitude);
writeUint8(value.satellites);
writeUint16(value.hdop);
writeUint16(value.altitude);
#endif
}
2018-07-21 18:25:03 +02:00
void PayloadConvert::addSensor(uint8_t buf[]) {
#ifdef HAS_SENSORS
uint8_t length = buf[0];
memcpy(buffer, buf + 1, length);
cursor += length; // length of buffer
#endif
}
2018-11-14 23:10:59 +01:00
void PayloadConvert::addBME(bmeStatus_t value) {
#ifdef HAS_BME
2018-11-25 19:16:31 +01:00
writeFloat(value.temperature);
2018-11-25 23:39:12 +01:00
writePressure(value.pressure);
2018-11-25 19:16:31 +01:00
writeUFloat(value.humidity);
writeUFloat(value.iaq);
2018-11-14 23:10:59 +01:00
#endif
}
void PayloadConvert::addButton(uint8_t value) {
2018-07-21 18:25:03 +02:00
#ifdef HAS_BUTTON
writeUint8(value);
2018-07-21 18:25:03 +02:00
#endif
}
2018-07-21 18:25:03 +02:00
2019-02-24 13:35:22 +01:00
void PayloadConvert::addTime(time_t value) {
uint32_t time = (uint32_t)value;
writeUint32(time);
}
2018-07-19 22:33:37 +02:00
void PayloadConvert::intToBytes(uint8_t pos, int32_t i, uint8_t byteSize) {
2018-06-17 22:41:32 +02:00
for (uint8_t x = 0; x < byteSize; x++) {
2018-06-18 00:01:14 +02:00
buffer[x + pos] = (byte)(i >> (x * 8));
2018-06-17 22:41:32 +02:00
}
2018-06-18 00:01:14 +02:00
cursor += byteSize;
2018-06-17 22:41:32 +02:00
}
2018-07-19 22:33:37 +02:00
void PayloadConvert::writeUptime(uint64_t uptime) {
2018-06-18 09:15:57 +02:00
intToBytes(cursor, uptime, 8);
2018-06-17 22:41:32 +02:00
}
void PayloadConvert::writeVersion(char *version) {
2018-09-17 17:23:02 +02:00
memcpy(buffer + cursor, version, 10);
cursor += 10;
}
2018-07-19 22:33:37 +02:00
void PayloadConvert::writeLatLng(double latitude, double longitude) {
2018-06-18 09:15:57 +02:00
intToBytes(cursor, latitude, 4);
intToBytes(cursor, longitude, 4);
2018-06-17 22:41:32 +02:00
}
void PayloadConvert::writeUint32(uint32_t i) { intToBytes(cursor, i, 4); }
2018-07-19 22:33:37 +02:00
void PayloadConvert::writeUint16(uint16_t i) { intToBytes(cursor, i, 2); }
2018-06-17 22:41:32 +02:00
2018-07-19 22:33:37 +02:00
void PayloadConvert::writeUint8(uint8_t i) { intToBytes(cursor, i, 1); }
2018-06-17 22:41:32 +02:00
2018-11-25 23:39:12 +01:00
void PayloadConvert::writeUFloat(float value) {
int16_t h = (int16_t)(value * 100);
intToBytes(cursor, h, 2);
}
void PayloadConvert::writePressure(float value) {
int16_t h = (int16_t)(value);
2018-06-18 09:15:57 +02:00
intToBytes(cursor, h, 2);
2018-06-17 22:41:32 +02:00
}
/**
* Uses a 16bit two's complement with two decimals, so the range is
* -327.68 to +327.67 degrees
*/
2018-11-25 23:39:12 +01:00
void PayloadConvert::writeFloat(float value) {
int16_t t = (int16_t)(value * 100);
if (value < 0) {
2018-06-17 22:41:32 +02:00
t = ~-t;
t = t + 1;
}
2018-06-18 00:39:46 +02:00
buffer[cursor++] = (byte)((t >> 8) & 0xFF);
buffer[cursor++] = (byte)t & 0xFF;
2018-06-17 22:41:32 +02:00
}
2018-07-19 22:33:37 +02:00
void PayloadConvert::writeBitmap(bool a, bool b, bool c, bool d, bool e, bool f,
2018-07-21 17:14:27 +02:00
bool g, bool h) {
2018-06-17 22:41:32 +02:00
uint8_t bitmap = 0;
// LSB first
bitmap |= (a & 1) << 7;
bitmap |= (b & 1) << 6;
bitmap |= (c & 1) << 5;
bitmap |= (d & 1) << 4;
bitmap |= (e & 1) << 3;
bitmap |= (f & 1) << 2;
bitmap |= (g & 1) << 1;
bitmap |= (h & 1) << 0;
writeUint8(bitmap);
2018-06-16 19:50:36 +02:00
}
2018-11-18 12:09:18 +01:00
/* ---------------- Cayenne LPP 2.0 format ---------- */
2019-02-27 00:49:32 +01:00
// see specs
// http://community.mydevices.com/t/cayenne-lpp-2-0/7510 (LPP 2.0)
// https://github.com/myDevicesIoT/cayenne-docs/blob/master/docs/LORA.md (LPP 1.0)
2018-11-18 12:09:18 +01:00
// PAYLOAD_ENCODER == 3 -> Dynamic Sensor Payload, using channels -> FPort 1
// PAYLOAD_ENCODER == 4 -> Packed Sensor Payload, not using channels -> FPort 2
2018-07-21 17:14:27 +02:00
#elif (PAYLOAD_ENCODER == 3 || PAYLOAD_ENCODER == 4)
2018-12-02 14:08:50 +01:00
void PayloadConvert::addCount(uint16_t value, uint8_t snifftype) {
2019-02-24 13:35:22 +01:00
switch (snifftype) {
2018-12-02 14:08:50 +01:00
case MAC_SNIFF_WIFI:
2018-07-21 17:14:27 +02:00
#if (PAYLOAD_ENCODER == 3)
2018-12-02 14:08:50 +01:00
buffer[cursor++] = LPP_COUNT_WIFI_CHANNEL;
2018-07-21 17:14:27 +02:00
#endif
2018-12-02 14:08:50 +01:00
buffer[cursor++] =
LPP_LUMINOSITY; // workaround since cayenne has no data type meter
buffer[cursor++] = highByte(value);
buffer[cursor++] = lowByte(value);
break;
case MAC_SNIFF_BLE:
2018-07-21 17:14:27 +02:00
#if (PAYLOAD_ENCODER == 3)
2018-12-02 14:08:50 +01:00
buffer[cursor++] = LPP_COUNT_BLE_CHANNEL;
2018-07-21 17:14:27 +02:00
#endif
2018-12-02 14:08:50 +01:00
buffer[cursor++] =
LPP_LUMINOSITY; // workaround since cayenne has no data type meter
buffer[cursor++] = highByte(value);
buffer[cursor++] = lowByte(value);
break;
}
}
void PayloadConvert::addAlarm(int8_t rssi, uint8_t msg) {
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_ALARM_CHANNEL;
#endif
buffer[cursor++] = LPP_PRESENCE;
buffer[cursor++] = msg;
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_MSG_CHANNEL;
#endif
buffer[cursor++] = LPP_ANALOG_INPUT;
buffer[cursor++] = rssi;
}
2018-11-27 11:21:20 +01:00
void PayloadConvert::addVoltage(uint16_t value) {
2018-12-02 14:08:50 +01:00
uint16_t volt = value / 10;
2018-11-27 11:21:20 +01:00
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_BATT_CHANNEL;
#endif
buffer[cursor++] = LPP_ANALOG_INPUT;
buffer[cursor++] = highByte(volt);
buffer[cursor++] = lowByte(volt);
}
2018-07-21 18:25:03 +02:00
void PayloadConvert::addConfig(configData_t value) {
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_ADR_CHANNEL;
#endif
buffer[cursor++] = LPP_DIGITAL_INPUT;
buffer[cursor++] = value.adrmode;
}
2018-08-12 15:42:58 +02:00
void PayloadConvert::addStatus(uint16_t voltage, uint64_t uptime, float celsius,
uint32_t mem, uint8_t reset1, uint8_t reset2) {
2018-07-22 16:44:51 +02:00
uint16_t temp = celsius * 10;
uint16_t volt = voltage / 10;
2018-07-22 17:35:26 +02:00
#ifdef HAS_BATTERY_PROBE
2018-07-21 18:25:03 +02:00
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_BATT_CHANNEL;
#endif
buffer[cursor++] = LPP_ANALOG_INPUT;
2018-07-22 16:44:51 +02:00
buffer[cursor++] = highByte(volt);
buffer[cursor++] = lowByte(volt);
#endif // HAS_BATTERY_PROBE
2018-07-21 18:25:03 +02:00
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_TEMPERATURE_CHANNEL;
2018-07-21 18:25:03 +02:00
#endif
buffer[cursor++] = LPP_TEMPERATURE;
2018-07-22 16:44:51 +02:00
buffer[cursor++] = highByte(temp);
buffer[cursor++] = lowByte(temp);
2018-07-21 18:25:03 +02:00
}
2018-07-19 22:33:37 +02:00
void PayloadConvert::addGPS(gpsStatus_t value) {
#ifdef HAS_GPS
int32_t lat = value.latitude / 100;
int32_t lon = value.longitude / 100;
2018-07-21 13:36:49 +02:00
int32_t alt = value.altitude * 100;
2018-07-21 17:14:27 +02:00
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_GPS_CHANNEL;
2018-07-21 17:14:27 +02:00
#endif
buffer[cursor++] = LPP_GPS;
2018-07-22 17:35:26 +02:00
buffer[cursor++] = (byte)((lat & 0xFF0000) >> 16);
buffer[cursor++] = (byte)((lat & 0x00FF00) >> 8);
buffer[cursor++] = (byte)((lat & 0x0000FF));
buffer[cursor++] = (byte)((lon & 0xFF0000) >> 16);
buffer[cursor++] = (byte)((lon & 0x00FF00) >> 8);
buffer[cursor++] = (byte)(lon & 0x0000FF);
2018-07-22 17:35:26 +02:00
buffer[cursor++] = (byte)((alt & 0xFF0000) >> 16);
buffer[cursor++] = (byte)((alt & 0x00FF00) >> 8);
buffer[cursor++] = (byte)(alt & 0x0000FF);
#endif // HAS_GPS
}
void PayloadConvert::addSensor(uint8_t buf[]) {
#ifdef HAS_SENSORS
// to come
/*
uint8_t length = buf[0];
memcpy(buffer, buf+1, length);
cursor += length; // length of buffer
*/
#endif
}
void PayloadConvert::addBME(bmeStatus_t value) {
#ifdef HAS_BME
// data value conversions to meet cayenne data type definition
// 0.1°C per bit => -3276,7 .. +3276,7 °C
int16_t temperature = (int16_t)(value.temperature * 10.0);
// 0.1 hPa per bit => 0 .. 6553,6 hPa
2018-11-25 23:39:12 +01:00
uint16_t pressure = (uint16_t)(value.pressure * 10);
// 0.5% per bit => 0 .. 128 %C
uint8_t humidity = (uint8_t)(value.humidity * 2.0);
2018-11-25 23:39:12 +01:00
int16_t iaq = (int16_t)(value.iaq);
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_TEMPERATURE_CHANNEL;
#endif
buffer[cursor++] = LPP_TEMPERATURE; // 2 bytes 0.1 °C Signed MSB
buffer[cursor++] = highByte(temperature);
buffer[cursor++] = lowByte(temperature);
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_BAROMETER_CHANNEL;
2018-06-17 13:31:24 +02:00
#endif
buffer[cursor++] = LPP_BAROMETER; // 2 bytes 0.1 hPa Unsigned MSB
buffer[cursor++] = highByte(pressure);
buffer[cursor++] = lowByte(pressure);
#if (PAYLOAD_ENCODER == 3)
buffer[cursor++] = LPP_HUMIDITY_CHANNEL;
#endif
buffer[cursor++] = LPP_HUMIDITY; // 1 byte 0.5 % Unsigned
buffer[cursor++] = humidity;
#if (PAYLOAD_ENCODER == 3)
2018-11-25 19:16:31 +01:00
buffer[cursor++] = LPP_AIR_CHANNEL;
#endif
2018-11-25 23:39:12 +01:00
buffer[cursor++] = LPP_LUMINOSITY; // 2 bytes, 1.0 unsigned
2018-11-25 16:05:30 +01:00
buffer[cursor++] = highByte(iaq);
buffer[cursor++] = lowByte(iaq);
#endif // HAS_BME
}
2018-07-21 18:25:03 +02:00
void PayloadConvert::addButton(uint8_t value) {
#ifdef HAS_BUTTON
2018-07-21 17:14:27 +02:00
#if (PAYLOAD_ENCODER == 3)
2018-07-21 18:25:03 +02:00
buffer[cursor++] = LPP_BUTTON_CHANNEL;
2018-07-21 17:14:27 +02:00
#endif
buffer[cursor++] = LPP_DIGITAL_INPUT;
2018-07-21 18:25:03 +02:00
buffer[cursor++] = value;
#endif // HAS_BUTTON
}
2018-07-19 22:33:37 +02:00
2019-02-24 13:35:22 +01:00
void PayloadConvert::addTime(time_t value) {
#if (PAYLOAD_ENCODER == 4)
uint32_t t = (uint32_t)value;
uint32_t tx_period = (uint32_t)SEND_SECS * 2;
buffer[cursor++] = 0x03; // set config mask to UTCTime + TXPeriod
// UTCTime in seconds
buffer[cursor++] = (byte)((t & 0xFF000000) >> 24);
buffer[cursor++] = (byte)((t & 0x00FF0000) >> 16);
buffer[cursor++] = (byte)((t & 0x0000FF00) >> 8);
buffer[cursor++] = (byte)((t & 0x000000FF));
// TXPeriod in seconds
buffer[cursor++] = (byte)((tx_period & 0xFF000000) >> 24);
buffer[cursor++] = (byte)((tx_period & 0x00FF0000) >> 16);
buffer[cursor++] = (byte)((tx_period & 0x0000FF00) >> 8);
buffer[cursor++] = (byte)((tx_period & 0x000000FF));
#endif
}
2018-07-19 22:33:37 +02:00
#else
2019-02-09 15:46:44 +01:00
#error No valid payload converter defined!
2018-07-21 17:14:27 +02:00
#endif