Switch haspGetVersion to char* instead of String

This commit is contained in:
fvanroie 2020-11-26 20:09:58 +01:00
parent 9e282457ca
commit 99cdf25810
5 changed files with 114 additions and 106 deletions

View File

@ -395,6 +395,7 @@ void haspSetup()
} }
if(th) { if(th) {
lv_theme_set_act(th);
Log.trace(TAG_HASP, F("Custom theme loaded")); Log.trace(TAG_HASP, F("Custom theme loaded"));
} else { } else {
Log.error(TAG_HASP, F("No theme could be loaded")); Log.error(TAG_HASP, F("No theme could be loaded"));
@ -495,11 +496,11 @@ void hasp_background(uint16_t pageid, uint16_t imageid)
/////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////
String haspGetVersion() void haspGetVersion(char * version, size_t len)
{ {
char buffer[16]; // char buffer[16];
snprintf_P(buffer, sizeof(buffer), "%u.%u.%u", HASP_VERSION_MAJOR, HASP_VERSION_MINOR, HASP_VERSION_REVISION); snprintf_P(version, len, "%u.%u.%u", HASP_VERSION_MAJOR, HASP_VERSION_MINOR, HASP_VERSION_REVISION);
return buffer; // return buffer;
} }
void haspClearPage(uint16_t pageid) void haspClearPage(uint16_t pageid)

View File

@ -60,7 +60,7 @@ uint8_t haspGetPage();
void haspClearPage(uint16_t pageid); void haspClearPage(uint16_t pageid);
String haspGetNodename(); String haspGetNodename();
String haspGetVersion(); void haspGetVersion(char* version,size_t len);
void haspBackground(uint16_t pageid, uint16_t imageid); void haspBackground(uint16_t pageid, uint16_t imageid);
void hasp_set_group_objects(uint8_t groupid, uint8_t eventid, lv_obj_t * src_obj); void hasp_set_group_objects(uint8_t groupid, uint8_t eventid, lv_obj_t * src_obj);

View File

@ -400,7 +400,11 @@ void webHandleInfo()
/* HASP Stats */ /* HASP Stats */
httpMessage += F("<b>HASP Version: </b>"); httpMessage += F("<b>HASP Version: </b>");
httpMessage += String(haspGetVersion()); {
char version[32];
haspGetVersion(version, sizeof(version));
httpMessage += version;
}
httpMessage += F("<br/><b>Build DateTime: </b>"); httpMessage += F("<br/><b>Build DateTime: </b>");
httpMessage += __DATE__; httpMessage += __DATE__;
httpMessage += F(" "); httpMessage += F(" ");

View File

@ -214,9 +214,10 @@ void mqtt_send_statusupdate()
{ {
char buffer[128]; char buffer[128];
snprintf_P(data, sizeof(data), PSTR("{\"status\":\"available\",\"version\":\"%s\",\"uptime\":%lu,"), haspGetVersion(buffer, sizeof(buffer));
haspGetVersion().c_str(), long(millis() / 1000)); snprintf_P(data, sizeof(data), PSTR("{\"status\":\"available\",\"version\":\"%s\",\"uptime\":%lu,"), buffer,
strcat(buffer, data); long(millis() / 1000));
#if HASP_USE_WIFI > 0 #if HASP_USE_WIFI > 0
#if defined(STM32F4xx) #if defined(STM32F4xx)
IPAddress ip; IPAddress ip;

View File

@ -1,7 +1,7 @@
/* MIT License - Copyright (c) 2020 Francis Van Roie /* MIT License - Copyright (c) 2020 Francis Van Roie
For full license information read the LICENSE file in the project folder */ For full license information read the LICENSE file in the project folder */
#if HASP_USE_TASMOTA_SLAVE>0 #if HASP_USE_TASMOTA_SLAVE > 0
#include "hasp_slave.h" #include "hasp_slave.h"
#include <Arduino.h> #include <Arduino.h>
@ -21,145 +21,147 @@ TasmotaSlave slave(&Serial2);
#define slaveNodeTopic "hasp/" #define slaveNodeTopic "hasp/"
unsigned long updateLedTimer = 0; // timer in msec for tele mqtt send unsigned long updateLedTimer = 0; // timer in msec for tele mqtt send
unsigned long updatLedPeriod = 1000; // timer in msec for tele mqtt send unsigned long updatLedPeriod = 1000; // timer in msec for tele mqtt send
bool ledstate = false; bool ledstate = false;
void slave_send_state(const __FlashStringHelper * subtopic, const char * payload) void slave_send_state(const __FlashStringHelper * subtopic, const char * payload)
{ {
// page = 0 // page = 0
// p[0].b[0].attr = abc // p[0].b[0].attr = abc
// dim = 100 // dim = 100
// idle = 0/1 // idle = 0/1
// light = 0/1 // light = 0/1
// brightness = 100 // brightness = 100
char cBuffer[strlen(payload) + 64]; char cBuffer[strlen(payload) + 64];
memset(cBuffer, 0 ,sizeof(cBuffer)); memset(cBuffer, 0, sizeof(cBuffer));
snprintf(cBuffer, sizeof(cBuffer), PSTR("publish %sstate/%s %s"), slaveNodeTopic ,subtopic, payload); snprintf(cBuffer, sizeof(cBuffer), PSTR("publish %sstate/%s %s"), slaveNodeTopic, subtopic, payload);
slave.ExecuteCommand((char*)cBuffer); slave.ExecuteCommand((char *)cBuffer);
// Log after char buffers are cleared // Log after char buffers are cleared
Log.notice(TAG_TASM,F("TAS PUB: %sstate/%S = %s"), slaveNodeTopic, subtopic, payload); Log.notice(TAG_TASM, F("TAS PUB: %sstate/%S = %s"), slaveNodeTopic, subtopic, payload);
} }
void slave_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char * attribute, const char * data) void slave_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char * attribute, const char * data)
{ {
char cBuffer[192]; char cBuffer[192];
memset(cBuffer, 0 ,sizeof(cBuffer)); memset(cBuffer, 0, sizeof(cBuffer));
snprintf_P(cBuffer, sizeof(cBuffer), PSTR("publish %sstate/json {\"p[%u].b[%u].%s\":\"%s\"}"), slaveNodeTopic, pageid, btnid, attribute, data); snprintf_P(cBuffer, sizeof(cBuffer), PSTR("publish %sstate/json {\"p[%u].b[%u].%s\":\"%s\"}"), slaveNodeTopic,
slave.ExecuteCommand((char*)cBuffer); pageid, btnid, attribute, data);
// Log after char buffers are cleared slave.ExecuteCommand((char *)cBuffer);
Log.notice(TAG_TASM,F("TAS PUB: %sstate/json = {\"p[%u].b[%u].%s\":\"%s\"}"), slaveNodeTopic, pageid, btnid, attribute, data); // Log after char buffers are cleared
Log.notice(TAG_TASM, F("TAS PUB: %sstate/json = {\"p[%u].b[%u].%s\":\"%s\"}"), slaveNodeTopic, pageid, btnid,
attribute, data);
} }
void slave_send_input(uint8_t id, const char * payload) void slave_send_input(uint8_t id, const char * payload)
{ {
// Log.verbose(TAG_TASM,F("MQTT TST: %sstate/input%u = %s"), mqttNodeTopic, id, payload); // to be removed // Log.verbose(TAG_TASM,F("MQTT TST: %sstate/input%u = %s"), mqttNodeTopic, id, payload); // to be removed
char cBuffer[strlen(payload) + 64]; char cBuffer[strlen(payload) + 64];
memset(cBuffer, 0 ,sizeof(cBuffer)); memset(cBuffer, 0, sizeof(cBuffer));
snprintf_P(cBuffer, sizeof(cBuffer), PSTR("publish %sstate/input%u %s"), slaveNodeTopic, id, payload); snprintf_P(cBuffer, sizeof(cBuffer), PSTR("publish %sstate/input%u %s"), slaveNodeTopic, id, payload);
slave.ExecuteCommand((char*)cBuffer); slave.ExecuteCommand((char *)cBuffer);
// Log after char buffers are cleared // Log after char buffers are cleared
Log.notice(TAG_TASM,F("TAS PUB: %sstate/input%u = %s"), slaveNodeTopic, id, payload); Log.notice(TAG_TASM, F("TAS PUB: %sstate/input%u = %s"), slaveNodeTopic, id, payload);
} }
void TASMO_TELE_JSON() void TASMO_TELE_JSON()
{ // Periodically publish a JSON string indicating system status { // Periodically publish a JSON string indicating system status
char data[3 * 128]; char data[3 * 128];
{ {
char buffer[128]; char buffer[128];
snprintf_P(data, sizeof(data), PSTR("{\"status\":\"available\",\"version\":\"%s\",\"uptime\":%lu,"), haspGetVersion(buffer, sizeof(buffer));
haspGetVersion().c_str(), long(millis() / 1000));
strcat(buffer, data); snprintf_P(data, sizeof(data), PSTR("{\"status\":\"available\",\"version\":\"%s\",\"uptime\":%lu,"), buffer,
snprintf_P(buffer, sizeof(buffer), PSTR("\"espCanUpdate\":\"false\",\"page\":%u,\"numPages\":%u,"), long(millis() / 1000));
haspGetPage(), (HASP_NUM_PAGES));
strcat(data, buffer); snprintf_P(buffer, sizeof(buffer), PSTR("\"espCanUpdate\":\"false\",\"page\":%u,\"numPages\":%u,"),
snprintf_P(buffer, sizeof(buffer), PSTR("\"tftDriver\":\"%s\",\"tftWidth\":%u,\"tftHeight\":%u}"), haspGetPage(), (HASP_NUM_PAGES));
halDisplayDriverName().c_str(), (TFT_WIDTH), (TFT_HEIGHT)); strcat(data, buffer);
strcat(data, buffer); snprintf_P(buffer, sizeof(buffer), PSTR("\"tftDriver\":\"%s\",\"tftWidth\":%u,\"tftHeight\":%u}"),
} halDisplayDriverName().c_str(), (TFT_WIDTH), (TFT_HEIGHT));
slave.sendJSON((char*)data); strcat(data, buffer);
}
slave.sendJSON((char *)data);
// slave_send_state(F("statusupdate"), data); // slave_send_state(F("statusupdate"), data);
// debugLastMillis = millis(); // debugLastMillis = millis();
} }
void TASMO_DATA_RECEIVE(char *data) void TASMO_DATA_RECEIVE(char * data)
{ {
Log.trace(TAG_TASM,F("Slave IN [%s]"), data); Log.trace(TAG_TASM, F("Slave IN [%s]"), data);
char dataType[3]; char dataType[3];
memset(dataType, 0 ,sizeof(dataType)); memset(dataType, 0, sizeof(dataType));
snprintf_P(dataType, sizeof(dataType), data); snprintf_P(dataType, sizeof(dataType), data);
Log.trace(TAG_TASM,F("dataType [%s]"), dataType); Log.trace(TAG_TASM, F("dataType [%s]"), dataType);
if (!strcmp(dataType, "p[")){ // if(!strcmp(dataType, "p[")) { //
dispatchTextLine(data); dispatchTextLine(data);
} else if (!strcmp(dataType, "[\"")) { } else if(!strcmp(dataType, "[\"")) {
dispatchJson(data); dispatchJson(data);
} else {
char slvCmd[20],slvVal[60];
memset(slvCmd, 0 ,sizeof(slvCmd));
memset(slvVal, 0 ,sizeof(slvVal));
sscanf(data,"%[^=] =%s", slvCmd, slvVal);
Log.trace(TAG_TASM,F("Cmd[%s] Val[%s]"), slvCmd, slvVal);
if (!strcmp(slvCmd, "calData")){
if (strlen(slvVal) != 0) {
char cBuffer[strlen(slvVal) + 24];
memset(cBuffer, 0 ,sizeof(cBuffer));
snprintf_P(cBuffer, sizeof(cBuffer), PSTR("{'calibration':[%s]}"), slvVal);
dispatchConfig("gui",cBuffer);
} else {
dispatchConfig("gui","");
}
} else if (!strcmp(slvCmd, "jsonl")) {
dispatchJsonl(slvVal);
} else if (!strcmp(slvCmd, "clearpage")) {
dispatchClearPage(slvVal);
} else { } else {
dispatchTextLine(data); char slvCmd[20], slvVal[60];
memset(slvCmd, 0, sizeof(slvCmd));
memset(slvVal, 0, sizeof(slvVal));
sscanf(data, "%[^=] =%s", slvCmd, slvVal);
Log.trace(TAG_TASM, F("Cmd[%s] Val[%s]"), slvCmd, slvVal);
if(!strcmp(slvCmd, "calData")) {
if(strlen(slvVal) != 0) {
char cBuffer[strlen(slvVal) + 24];
memset(cBuffer, 0, sizeof(cBuffer));
snprintf_P(cBuffer, sizeof(cBuffer), PSTR("{'calibration':[%s]}"), slvVal);
dispatchConfig("gui", cBuffer);
} else {
dispatchConfig("gui", "");
}
} else if(!strcmp(slvCmd, "jsonl")) {
dispatchJsonl(slvVal);
} else if(!strcmp(slvCmd, "clearpage")) {
dispatchClearPage(slvVal);
} else {
dispatchTextLine(data);
}
} }
}
} }
void TASMO_EVERY_SECOND(void) void TASMO_EVERY_SECOND(void)
{ {
if (ledstate) { if(ledstate) {
ledstate = false; ledstate = false;
//digitalWrite(HASP_OUTPUT_PIN, 1); // digitalWrite(HASP_OUTPUT_PIN, 1);
// Log.trace(TAG_TASM,F("LED OFF")); // Log.trace(TAG_TASM,F("LED OFF"));
} else { } else {
ledstate = true; ledstate = true;
//digitalWrite(HASP_OUTPUT_PIN, 0); // digitalWrite(HASP_OUTPUT_PIN, 0);
// Log.trace(TAG_TASM,F("LED ON")); // Log.trace(TAG_TASM,F("LED ON"));
} }
} }
void slaveSetup() void slaveSetup()
{ {
Serial2.begin(HASP_SLAVE_SPEED); Serial2.begin(HASP_SLAVE_SPEED);
// slave.attach_FUNC_EVERY_SECOND(TASMO_EVERY_SECOND); // slave.attach_FUNC_EVERY_SECOND(TASMO_EVERY_SECOND);
slave.attach_FUNC_JSON(TASMO_TELE_JSON); slave.attach_FUNC_JSON(TASMO_TELE_JSON);
slave.attach_FUNC_COMMAND_SEND(TASMO_DATA_RECEIVE); slave.attach_FUNC_COMMAND_SEND(TASMO_DATA_RECEIVE);
Log.notice(TAG_TASM,F("HASP SLAVE LOADED")); Log.notice(TAG_TASM, F("HASP SLAVE LOADED"));
} }
void IRAM_ATTR slaveLoop(void) void IRAM_ATTR slaveLoop(void)
{ {
slave.loop(); slave.loop();
// demo code to run the led without tasmota // demo code to run the led without tasmota
// if ((millis() - updateLedTimer) >= updatLedPeriod) { // if ((millis() - updateLedTimer) >= updatLedPeriod) {
// updateLedTimer = millis(); // updateLedTimer = millis();
// TASMO_EVERY_SECOND(); // TASMO_EVERY_SECOND();
// } // }
} }
#endif #endif