Andrew Boyson / web

Dependents:   oldheating gps motorhome heating

page/page.c

Committer:
andrewboyson
Date:
2019-04-26
Revision:
99:5aa33c306167
Parent:
92:9ce59a5b6032
Child:
101:07234e772d31

File content as of revision 99:5aa33c306167:

#include <stdio.h>
#include "http.h"
#include "http-server-derived.h"
#include "page.h"
#include "page-derived.h"
#include "mac.h"
#include "ip4addr.h"
#include "ip6addr.h"
#include "ds18b20.h"

void PageAddHeader(const char* site, const char* title, const char* style, const char* script)
{
    HttpAddText("<!DOCTYPE html>\r\n"
                     "<html>\r\n"
                     "<head>\r\n");
    if (site)
    {
        HttpAddText("   <title>");
        HttpAddText(site);
        if (title)
        {
            HttpAddText(" - ");
            HttpAddText(title);
        }
        HttpAddText("</title>\r\n");
    }
    HttpAddText("   <link rel='stylesheet' href='/base.css' type='text/css'/>\r\n");
    if (style)
    {
        HttpAddText("   <link rel='stylesheet' href='/");
        HttpAddText(style);
        HttpAddText("' type='text/css'/>\r\n");
    }
    if (script)
    {
        HttpAddText("   <script src='/");
        HttpAddText(script);
        HttpAddText("' type='text/javascript'></script>\r\n");
    }
    HttpAddText("   <meta name='viewport' content='width=device-width, initial-scale=1'>\r\n"
                     "   <link rel='icon'       href='/favicon.ico' type='image/x-icon'/>\r\n"
                     "</head>\r\n"
                     "<body>\r\n");

}
void PageAddH1(const char* site, const char* pageName)
{
    HttpAddText("<h1 id='main-content'>");
    HttpAddText(site);
    HttpAddText(" - ");
    HttpAddText(pageName);
    HttpAddText("</h1>\r\n");
}
void PageAddH2(const char* text)
{
    HttpAddText("<h2>");
    HttpAddText(text);
    HttpAddText("</h2>\r\n");
}
void PageAddEnd()
{
    HttpAddText("</body>\r\n"
                "</html>\r\n");
}

void PageAddNavItem(int highlight, char* href, char* title)
{
    char *p;
    HttpAddText("<li ");
    if (highlight) p = "class='this'";
    else           p = "            ";
    HttpAddText(p);
    HttpAddText("><a href='");
    HttpAddText(href);
    HttpAddText("'>");
    HttpAddText(title);
    HttpAddText("</a></li>\r\n");

}
void PageAddNav(int page)
{
    HttpAddText("<a class='tab-shortcut' href='#main-content'>Skip to content</a>\r\n");

    HttpAddText("<nav><ul>\r\n");
    PageAddNavDerived(page);
#ifdef INCLUDE_1_WIRE
    PageAddNavItem(page == ONE_WIRE_PAGE, "/1wire",    "1-Wire"   );
#endif
    PageAddNavItem(page ==    CLOCK_PAGE, "/clock",    "Clock"    );
    PageAddNavItem(page ==    FAULT_PAGE, "/fault",    "Fault"    );
    PageAddNavItem(page ==      NET_PAGE, "/net",      "Net"      );
    PageAddNavItem(page ==     NET4_PAGE, "/net4",     "Net IPv4" );
    PageAddNavItem(page ==     NET6_PAGE, "/net6",     "Net IPv6" );
    PageAddNavItem(page ==    TRACE_PAGE, "/trace",    "Net Trace");
    PageAddNavItem(page ==      LOG_PAGE, "/log",      "Log"      );
    PageAddNavItem(page == FIRMWARE_PAGE, "/firmware", "Firmware" );
    HttpAddText("</ul></nav>\r\n");
}

void PageAddLabelledPrefixSuffix(char* label, char* prefix, char* text, char* suffix)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <div>%s%s%s</div>\r\n", prefix, text, suffix);
    HttpAddText("</div>\r\n");
}
void PageAddLabelledText(char* label, char* text)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <div>%s</div>\r\n", text);
    HttpAddText("</div>\r\n");
}

void PageAddLabelledMac(char* label, char* mac)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddText("  <div>"); MacHttp(mac); HttpAddText("</div>\r\n");
    HttpAddText("</div>\r\n");
}

void PageAddLabelledIp4(char* label, uint32_t ip)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddText("  <div>"); Ip4AddressHttp(ip); HttpAddText("</div>\r\n");
    HttpAddText("</div>\r\n");
}

void PageAddLabelledIp6(char* label, char* ip)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddText("  <div>"); Ip6AddressHttp(ip); HttpAddText("</div>\r\n");
    HttpAddText("</div>\r\n");
}
void PageAddLabelledOnOff(char* label, bool value)
{
    if (value) PageAddLabelledText(label, "On");
    else       PageAddLabelledText(label, "Off");
}
void PageAddLabelledInt(char* label, int value)
{
    char text[30];
    snprintf(text, sizeof(text), "%8d", value); //Right align with enough spaces so that the length is always constant. 
    PageAddLabelledText(label, text);
}
void PageAddInputText(char* label, float inputwidth, char* value, char* action, char* name)
{
    HttpAddF   ("<form action='%s' method='get'>\r\n", action);
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <input type='text' name='%s' style='width:%.1fem;' value='%s'>\r\n", name, inputwidth, value);
    HttpAddText("</div>\r\n");
    HttpAddText("<input type='submit' value='Set' style='display:none;'>\r\n");
    HttpAddF   ("</form>\r\n");

}
void PageAddInputInt(char* label, float inputwidth, int value, char* action, char* name)
{    
    char text[30];
    snprintf(text, sizeof(text), "%d", value);
    PageAddInputText(label, inputwidth, text, action, name);
}
void PageAddInputButton(char* label, char* value, char* action, char* name)
{
    HttpAddF   ("<form action='%s' method='get'>\r\n", action);
    HttpAddF   ("<input type='hidden' name='%s'>\r\n", name);
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <input type='submit' value='%s'>\r\n", value);
    HttpAddText("</div>\r\n");
    HttpAddText("</form>\r\n");
}
void PageAddAjaxInputToggle(char* label, char* id, char* name)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <div class='toggle' id='%s' tabindex='0' dir='ltr' onclick='AjaxRequest(\"%s=1\")' onkeydown='return event.keyCode != 13 || AjaxRequest(\"%s=1\")'>\r\n", id, name, name);
    HttpAddText("    <div class='slot'></div><div class='knob'></div>\r\n");
    HttpAddText("  </div>\r\n");
    HttpAddText("</div>\r\n");
}
void PageAddAjaxLed(char* label, char* id)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <div class='led' id='%s' dir='ltr'></div>\r\n", id);
    HttpAddText("</div>\r\n");
}
void PageAddAjaxInput(char* label, float inputwidth, char* id, char* name)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <input type='text' style='width:%.1fem;' id='%s' onchange='AjaxRequest(\"%s=\" + this.value)'>\r\n", inputwidth, id, name);
    HttpAddText("</div>\r\n");
}
void PageAddAjaxInputSuffix(char* label, float inputwidth, char* id, char* name, char* suffix)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <input type='text' style='width:%.1fem;' id='%s' onchange='AjaxRequest(\"%s=\" + this.value)'>%s\r\n", inputwidth, id, name, suffix);
    HttpAddText("</div>\r\n");
}
void PageAddAjaxLabelled(char* label, char* id)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <div id='%s'></div>\r\n", id);
    HttpAddText("</div>\r\n");
}
void PageAddAjaxLabelledSuffix(char* label, char* id, char* suffix)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div>%s</div>\r\n", label);
    HttpAddF   ("  <div><span id='%s'></span>%s</div>\r\n", id, suffix);
    HttpAddText("</div>\r\n");
}
void PageAddAjaxInputLabelId(char* labelId, float inputwidth, char* id, char* name)
{
    HttpAddText("<div class='line'>\r\n");
    HttpAddF   ("  <div id='%s'></div>\r\n", labelId);
    HttpAddF   ("  <input type='text' style='width:%.1fem;' id='%s' onchange='AjaxRequest(\"%s=\" + this.value)'>\r\n", inputwidth, id, name);
    HttpAddText("</div>\r\n");
}