void MTD_FLASHMEM HTTPGPIOConfigurationResponse::flush()
 {
     if (getRequest().method == HTTPHandler::Post)
     {
         char const* gpio = getRequest().form[FSTR("GPIO")];
         if (getRequest().form[FSTR("configured")])
         {		
             // gpio enabled
             char const* mode     = getRequest().form[STR_mode];
             char const* pullUp   = getRequest().form[STR_pullup];
             ConfigurationManager::setGPIOParams(strtol(gpio, NULL, 10), true, f_strcmp(mode, STR_out) == 0, pullUp != NULL, false);
             ConfigurationManager::applyGPIO();
         }
         else if (gpio)
         {
             // gpio disabled (not configured)
             ConfigurationManager::setGPIOParams(strtol(gpio, NULL, 10), false, false, false, false);
         }
     }
     
     HTTPHelperConfiguration::GPIOSetValue(this);
     
     LinkedCharChunks* linkedChunks = addParamCharChunks(FSTR("GPIOS"));
     for (uint32_t i = 0; i != 16; ++i)
     {
         if (i != 1 && i != 3 && (i < 6 || i > 11))
         {
             bool configured, isOutput, pullUp, value;
             ConfigurationManager::getGPIOParams(i, &configured, &isOutput, &pullUp, &value);
             
             linkedChunks->addChunk(f_printf(FSTR("<tr> <td>%d</td> <td><form method='POST'>"), i), true);
             linkedChunks->addChunk(f_printf(FSTR("Enabled <input type='checkbox' name='configured' value='1' onclick=\"document.getElementById('GPIO%d').disabled=!this.checked\" %s>"), i, configured? STR_checked:STR_), true);
             linkedChunks->addChunk(f_printf(FSTR("<fieldset class='inline' id='GPIO%d' %s>"), i, configured? STR_:STR_disabled), true);
             linkedChunks->addChunk(f_printf(FSTR("<select name='mode'><option value='in' %s>IN</option><option value='out' %s>OUT</option></select>"), 
                                            isOutput? STR_:STR_selected, 
                                            isOutput? STR_selected:STR_), 
                                   true);
             linkedChunks->addChunk(f_printf(FSTR("     PullUp <input type='checkbox' name='pullup' value='1' %s> </fieldset>"), pullUp? STR_checked:STR_), true);
             linkedChunks->addChunk(f_printf(FSTR("<input type='hidden' name='GPIO' value='%d'>"), i), true);
             linkedChunks->addChunk(FSTR("<input type='submit' value='Save'></form></td>"));
             if (configured)
             {
                 if (isOutput)
                 {
                     linkedChunks->addChunk(f_printf(FSTR("<td><a href='confgpio?gpio=%d&val=%d&store=1' class='link_button2'>%s</a></td> </tr>"), i, !value, value? STR_HI:STR_LO), true);
                 }
                 else
                 {
                     linkedChunks->addChunk(f_printf(FSTR("<td>%s</td> </tr>"), GPIO(i).read()? STR_HI:STR_LO), true);
                 }
             }
             else
             {
                 linkedChunks->addChunk(FSTR("<td></td></tr>"));
             }
         }
     }			
         
     HTTPTemplateResponse::flush();
 }
void MTD_FLASHMEM HTTPTemplateResponse::addParamFmt(char const *key, char const *fmt, ...) {
  va_list args;
  va_start(args, fmt);
  uint16_t len = vsprintf(NULL, fmt, args);
  va_end(args);
  char *buf = new char[len + 1];
  va_start(args, fmt);
  vsprintf(buf, fmt, args);
  va_end(args);

  LinkedCharChunks *linkedCharChunks = m_params.add(key);
  linkedCharChunks->addChunk(buf, len, true); // true = need to free
}
 void MTD_FLASHMEM HTTPTemplateResponse::addParamInt(char const* key, int32_t value)
 {
     char* valueStr = f_printf(FSTR("%d"), value);
     LinkedCharChunks* linkedCharChunks = m_params.add(key);
     linkedCharChunks->addChunk(valueStr, f_strlen(valueStr), true);	// true = need to free
 }
 void MTD_FLASHMEM HTTPTemplateResponse::addParamStr(char const* key, char const* value)
 {
     LinkedCharChunks* linkedCharChunks = m_params.add(key);
     linkedCharChunks->addChunk(value);
 }
 void MTD_FLASHMEM HTTPTemplateResponse::addParamStr(char const* key, char const* value)
 {
     LinkedCharChunks linkedCharChunks;
     linkedCharChunks.addChunk(value, f_strlen(value), false);
     m_params.add(key, linkedCharChunks);
 }