mirror of
https://github.com/tbnobody/OpenDTU.git
synced 2025-12-16 23:31:04 +01:00
Implemented parser methods and publish to mqtt
This commit is contained in:
@@ -10,9 +10,62 @@ void DevInfoParser::clearBuffer()
|
||||
void DevInfoParser::appendFragment(uint8_t offset, uint8_t* payload, uint8_t len)
|
||||
{
|
||||
if (offset + len > DEV_INFO_SIZE) {
|
||||
Serial.printf("FATAL: (%s, %d) stats packet too large for buffer\n", __FILE__, __LINE__);
|
||||
Serial.printf("FATAL: (%s, %d) dev info packet too large for buffer\n", __FILE__, __LINE__);
|
||||
return;
|
||||
}
|
||||
memcpy(&_payloadDevInfo[offset], payload, len);
|
||||
_devInfoLength += len;
|
||||
}
|
||||
|
||||
uint16_t DevInfoParser::getFwBuildVersion()
|
||||
{
|
||||
return (((uint16_t)_payloadDevInfo[0]) << 8) | _payloadDevInfo[1];
|
||||
}
|
||||
|
||||
time_t DevInfoParser::getFwBuildDateTime()
|
||||
{
|
||||
struct tm timeinfo = { 0 };
|
||||
timeinfo.tm_year = ((((uint16_t)_payloadDevInfo[2]) << 8) | _payloadDevInfo[3]) - 1900;
|
||||
|
||||
timeinfo.tm_mon = ((((uint16_t)_payloadDevInfo[4]) << 8) | _payloadDevInfo[5]) / 100 - 1;
|
||||
timeinfo.tm_mday = ((((uint16_t)_payloadDevInfo[4]) << 8) | _payloadDevInfo[5]) % 100;
|
||||
|
||||
timeinfo.tm_hour = ((((uint16_t)_payloadDevInfo[6]) << 8) | _payloadDevInfo[7]) / 100;
|
||||
timeinfo.tm_min = ((((uint16_t)_payloadDevInfo[6]) << 8) | _payloadDevInfo[7]) % 100;
|
||||
|
||||
return timegm(&timeinfo);
|
||||
}
|
||||
|
||||
uint16_t DevInfoParser::getFwBootloaderVersion()
|
||||
{
|
||||
return (((uint16_t)_payloadDevInfo[8]) << 8) | _payloadDevInfo[9];
|
||||
}
|
||||
|
||||
/* struct tm to seconds since Unix epoch */
|
||||
time_t DevInfoParser::timegm(struct tm* t)
|
||||
{
|
||||
register long year;
|
||||
register time_t result;
|
||||
#define MONTHSPERYEAR 12 /* months per calendar year */
|
||||
static const int cumdays[MONTHSPERYEAR] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
|
||||
|
||||
/*@ +matchanyintegral @*/
|
||||
year = 1900 + t->tm_year + t->tm_mon / MONTHSPERYEAR;
|
||||
result = (year - 1970) * 365 + cumdays[t->tm_mon % MONTHSPERYEAR];
|
||||
result += (year - 1968) / 4;
|
||||
result -= (year - 1900) / 100;
|
||||
result += (year - 1600) / 400;
|
||||
if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) && (t->tm_mon % MONTHSPERYEAR) < 2)
|
||||
result--;
|
||||
result += t->tm_mday - 1;
|
||||
result *= 24;
|
||||
result += t->tm_hour;
|
||||
result *= 60;
|
||||
result += t->tm_min;
|
||||
result *= 60;
|
||||
result += t->tm_sec;
|
||||
if (t->tm_isdst == 1)
|
||||
result -= 3600;
|
||||
/*@ -matchanyintegral @*/
|
||||
return (result);
|
||||
}
|
||||
Reference in New Issue
Block a user