diff --git a/wled00/xml.cpp b/wled00/xml.cpp
index 2d63d61f3..5ed1109c9 100644
--- a/wled00/xml.cpp
+++ b/wled00/xml.cpp
@@ -8,63 +8,22 @@
//build XML response to HTTP /win API request
void XML_response(Print& dest)
{
- dest.print(F(""));
- dest.print((nightlightActive && nightlightMode > NL_MODE_SET) ? briT : bri);
- dest.print(F(""));
-
+ dest.printf_P(PSTR("%d"), (nightlightActive && nightlightMode > NL_MODE_SET) ? briT : bri);
for (int i = 0; i < 3; i++)
{
- dest.print("");
- dest.print(col[i]);
- dest.print("");
+ dest.printf_P(PSTR("%d"), col[i]);
}
for (int i = 0; i < 3; i++)
{
- dest.print("");
- dest.print(colSec[i]);
- dest.print("");
+ dest.printf_P(PSTR("%d"), colSec[i]);
}
- dest.print(F(""));
- dest.print(notifyDirect);
- dest.print(F(""));
- dest.print(receiveGroups!=0);
- dest.print(F(""));
- dest.print(nightlightActive);
- dest.print(F(""));
- dest.print(nightlightMode > NL_MODE_SET);
- dest.print(F(""));
- dest.print(nightlightDelayMins);
- dest.print(F(""));
- dest.print(nightlightTargetBri);
- dest.print(F(""));
- dest.print(effectCurrent);
- dest.print(F(""));
- dest.print(effectSpeed);
- dest.print(F(""));
- dest.print(effectIntensity);
- dest.print(F(""));
- dest.print(effectPalette);
- dest.print(F(""));
- if (strip.hasWhiteChannel()) {
- dest.print(col[3]);
- } else {
- dest.print("-1");
- }
- dest.print(F(""));
- dest.print(colSec[3]);
- dest.print(F(""));
- dest.print(currentPreset);
- dest.print(F(""));
- dest.print(currentPlaylist >= 0);
- dest.print(F(""));
- dest.print(serverDescription);
- if (realtimeMode)
- {
- dest.print(F(" (live)"));
- }
- dest.print(F(""));
- dest.print(strip.getFirstSelectedSegId());
- dest.print(F(""));
+ dest.printf_P(PSTR("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%s%s%d"),
+ notifyDirect, receiveGroups!=0, nightlightActive, nightlightMode > NL_MODE_SET, nightlightDelayMins,
+ nightlightTargetBri, effectCurrent, effectSpeed, effectIntensity, effectPalette,
+ strip.hasWhiteChannel() ? col[3] : -1, colSec[3], currentPreset, currentPlaylist >= 0,
+ serverDescription, realtimeMode ? PSTR(" (live)") : "",
+ strip.getFirstSelectedSegId()
+ );
}
static void extractPin(Print& dest, JsonObject &obj, const char *key) {
@@ -114,17 +73,12 @@ void fillUMPins(Print& dest, JsonObject &mods)
}
void appendGPIOinfo(Print& dest) {
- char nS[8];
-
- // add usermod pins as d.um_p array
dest.print(F("d.um_p=[-1")); // has to have 1 element
if (i2c_sda > -1 && i2c_scl > -1) {
- dest.print(","); dest.print(itoa(i2c_sda,nS,10));
- dest.print(","); dest.print(itoa(i2c_scl,nS,10));
+ dest.printf_P(PSTR(",%d,%d"), i2c_sda, i2c_scl);
}
if (spi_mosi > -1 && spi_sclk > -1) {
- dest.print(","); dest.print(itoa(spi_mosi,nS,10));
- dest.print(","); dest.print(itoa(spi_sclk,nS,10));
+ dest.printf_P(PSTR(",%d,%d"), spi_mosi, spi_sclk);
}
// usermod pin reservations will become unnecessary when settings pages will read cfg.json directly
if (requestJSONBufferLock(6)) {
@@ -147,16 +101,16 @@ void appendGPIOinfo(Print& dest) {
dest.print(SET_F("2,")); // DMX hardcoded pin
#endif
#if defined(WLED_DEBUG) && !defined(WLED_DEBUG_HOST)
- dest.print(itoa(hardwareTX,nS,10)); dest.print(","); // debug output (TX) pin
+ dest.printf_P(PSTR(",%d"),hardwareTX); // debug output (TX) pin
#endif
//Note: Using pin 3 (RX) disables Adalight / Serial JSON
#ifdef WLED_USE_ETHERNET
if (ethernetType != WLED_ETH_NONE && ethernetType < WLED_NUM_ETH_TYPES) {
- for (unsigned p=0; p=0) { dest.print(itoa(ethernetBoards[ethernetType].eth_power,nS,10)); dest.print(","); }
- if (ethernetBoards[ethernetType].eth_mdc>=0) { dest.print(itoa(ethernetBoards[ethernetType].eth_mdc,nS,10)); dest.print(","); }
- if (ethernetBoards[ethernetType].eth_mdio>=0) { dest.print(itoa(ethernetBoards[ethernetType].eth_mdio,nS,10)); dest.print(","); }
- switch (ethernetBoards[ethernetType].eth_clk_mode) {
+ for (unsigned p=0; p=0) { dest.printf(",%d", ethernetBoards[ethernetType].eth_power); }
+ if (ethernetBoards[ethernetType].eth_mdc>=0) { dest.printf(",%d", ethernetBoards[ethernetType].eth_mdc); }
+ if (ethernetBoards[ethernetType].eth_mdio>=0) { dest.printf(",%d", ethernetBoards[ethernetType].eth_mdio); }
+ switch (ethernetBoards[ethernetType].eth_clk_mode) {
case ETH_CLOCK_GPIO0_IN:
case ETH_CLOCK_GPIO0_OUT:
dest.print(SET_F("0"));
@@ -211,27 +165,19 @@ void getSettingsJS(byte subPage, Print& dest)
if (subPage == SUBPAGE_WIFI)
{
- char nS[10];
size_t l;
- dest.print(F("resetWiFi("));
- dest.print(WLED_MAX_WIFI_COUNT);
- dest.print(F(");"));
+ dest.printf_P(PSTR("resetWiFi(%d);"), WLED_MAX_WIFI_COUNT);
for (size_t n = 0; n < multiWiFi.size(); n++) {
l = strlen(multiWiFi[n].clientPass);
char fpass[l+1]; //fill password field with ***
fpass[l] = 0;
memset(fpass,'*',l);
- dest.print(F("addWiFi(\""));
- dest.print(multiWiFi[n].clientSSID);
- dest.print(F("\",\""));
- dest.print(fpass);
- dest.print(F("\",0x"));
- dest.print(itoa(multiWiFi[n].staticIP,nS,16));
- dest.print(F(",0x"));
- dest.print(itoa(multiWiFi[n].staticGW,nS,16));
- dest.print(F(",0x"));
- dest.print(itoa(multiWiFi[n].staticSN,nS,16));
- dest.print(F(");"));
+ dest.printf_P(PSTR("addWiFi(\"%s\",\",%s\",0x%X,0x%X,0x%X);"),
+ multiWiFi[n].clientSSID,
+ fpass,
+ (uint32_t) multiWiFi[n].staticIP, // explicit cast required as this is a struct
+ (uint32_t) multiWiFi[n].staticGW,
+ (uint32_t) multiWiFi[n].staticSN);
}
sappend(dest,'v',SET_F("D0"),dnsAddress[0]);
@@ -320,16 +266,16 @@ void getSettingsJS(byte subPage, Print& dest)
dest.print(SET_F("d.ledTypes=")); dest.print(BusManager::getLEDTypesJSONString().c_str()); dest.print(";");
// set limits
- dest.print(F("bLimits("));
- dest.print(itoa(WLED_MAX_BUSSES,nS,10)); dest.print(",");
- dest.print(itoa(WLED_MIN_VIRTUAL_BUSSES,nS,10)); dest.print(",");
- dest.print(itoa(MAX_LEDS_PER_BUS,nS,10)); dest.print(",");
- dest.print(itoa(MAX_LED_MEMORY,nS,10)); dest.print(",");
- dest.print(itoa(MAX_LEDS,nS,10)); dest.print(",");
- dest.print(itoa(WLED_MAX_COLOR_ORDER_MAPPINGS,nS,10)); dest.print(",");
- dest.print(itoa(WLED_MAX_DIGITAL_CHANNELS,nS,10)); dest.print(",");
- dest.print(itoa(WLED_MAX_ANALOG_CHANNELS,nS,10));
- dest.print(F(");"));
+ dest.printf_P(PSTR("bLimits(%d,%d,%d,%d,%d,%d,%d,%d);"),
+ WLED_MAX_BUSSES,
+ WLED_MIN_VIRTUAL_BUSSES,
+ MAX_LEDS_PER_BUS,
+ MAX_LED_MEMORY,
+ MAX_LEDS,
+ WLED_MAX_COLOR_ORDER_MAPPINGS,
+ WLED_MAX_DIGITAL_CHANNELS,
+ WLED_MAX_ANALOG_CHANNELS
+ );
sappend(dest,'c',SET_F("MS"),strip.autoSegments);
sappend(dest,'c',SET_F("CCT"),strip.correctWB);
@@ -403,17 +349,12 @@ void getSettingsJS(byte subPage, Print& dest)
sappend(dest,'c',SET_F("ABL"),BusManager::ablMilliampsMax() || sumMa > 0);
sappend(dest,'c',SET_F("PPL"),!BusManager::ablMilliampsMax() && sumMa > 0);
- dest.print(F("resetCOM("));
- dest.print(itoa(WLED_MAX_COLOR_ORDER_MAPPINGS,nS,10));
- dest.print(F(");"));
+ dest.printf_P(PSTR("resetCOM(%d);"), WLED_MAX_COLOR_ORDER_MAPPINGS);
const ColorOrderMap& com = BusManager::getColorOrderMap();
for (int s = 0; s < com.count(); s++) {
const ColorOrderMapEntry* entry = com.get(s);
if (entry == nullptr) break;
- dest.print(F("addCOM("));
- dest.print(itoa(entry->start,nS,10)); dest.print(",");
- dest.print(itoa(entry->len,nS,10)); dest.print(",");
- dest.print(itoa(entry->colorOrder,nS,10)); dest.print(");");
+ dest.printf_P(PSTR("addCOM(%d,%d,%d);"), entry->start, entry->len, entry->colorOrder);
}
sappend(dest,'v',SET_F("CA"),briS);
@@ -439,11 +380,7 @@ void getSettingsJS(byte subPage, Print& dest)
sappend(dest,'c',SET_F("RM"),rlyMde);
sappend(dest,'c',SET_F("RO"),rlyOpenDrain);
for (int i = 0; i < WLED_MAX_BUTTONS; i++) {
- dest.print(F("addBtn("));
- dest.print(itoa(i,nS,10)); dest.print(",");
- dest.print(itoa(btnPin[i],nS,10)); dest.print(",");
- dest.print(itoa(buttonType[i],nS,10));
- dest.print(F(");"));
+ dest.printf_P(PSTR("addBtn(%d,%d,%d);"), i, btnPin[i], buttonType[i]);
}
sappend(dest,'c',SET_F("IP"),disablePullUp);
sappend(dest,'v',SET_F("TT"),touchThreshold);
@@ -528,9 +465,8 @@ void getSettingsJS(byte subPage, Print& dest)
sappends(dest,'s',SET_F("MG"),mqttGroupTopic);
sappend(dest,'c',SET_F("BM"),buttonPublishMqtt);
sappend(dest,'c',SET_F("RT"),retainMqttMsg);
- dest.print(F("d.Sf.MD.maxlength=")); dest.print(itoa(MQTT_MAX_TOPIC_LEN,nS,10)); dest.print(F(";"));
- dest.print(F("d.Sf.MG.maxlength=")); dest.print(itoa(MQTT_MAX_TOPIC_LEN,nS,10)); dest.print(F(";"));
- dest.print(F("d.Sf.MS.maxlength=")); dest.print(itoa(MQTT_MAX_SERVER_LEN,nS,10)); dest.print(F(";"));
+ dest.printf_P(PSTR("d.Sf.MD.maxlength=%d;d.Sf.MG.maxlength=%d;d.Sf.MS.maxlength=%d;"),
+ MQTT_MAX_TOPIC_LEN, MQTT_MAX_TOPIC_LEN, MQTT_MAX_SERVER_LEN);
#else
dest.print(F("toggle('MQTT');")); // hide MQTT settings
#endif
@@ -608,12 +544,7 @@ void getSettingsJS(byte subPage, Print& dest)
sappend(dest,'v',SET_F("MC"),macroCountdown);
sappend(dest,'v',SET_F("MN"),macroNl);
for (unsigned i=0; i