Add build scripts and API calls for WebUI
This commit is contained in:
parent
d46b07399f
commit
59c9bf4477
11 changed files with 141 additions and 35 deletions
|
@ -20,6 +20,8 @@ monitor_filters = esp32_exception_decoder, colorize
|
||||||
board_build.filesystem = littlefs
|
board_build.filesystem = littlefs
|
||||||
board_build.partitions = partition.csv
|
board_build.partitions = partition.csv
|
||||||
build_flags =
|
build_flags =
|
||||||
|
!python scripts/git_rev.py
|
||||||
|
-DLAST_BUILD_TIME=$UNIX_TIME
|
||||||
lib_deps =
|
lib_deps =
|
||||||
zinggjm/GxEPD2@^1.5.6
|
zinggjm/GxEPD2@^1.5.6
|
||||||
https://github.com/tzapu/WiFiManager.git#v2.0.17
|
https://github.com/tzapu/WiFiManager.git#v2.0.17
|
||||||
|
|
8
scripts/git_rev.py
Normal file
8
scripts/git_rev.py
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
revision = (
|
||||||
|
subprocess.check_output(["git", "rev-parse", "HEAD"])
|
||||||
|
.strip()
|
||||||
|
.decode("utf-8")
|
||||||
|
)
|
||||||
|
print("'-DGIT_REV=\"%s\"'" % revision)
|
|
@ -38,6 +38,11 @@ void setupPreferences()
|
||||||
{
|
{
|
||||||
preferences.putString(SETTING_CURRENCY, CURRENCY_USD);
|
preferences.putString(SETTING_CURRENCY, CURRENCY_USD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!preferences.isKey(SETTING_HOSTNAME_PREFIX))
|
||||||
|
{
|
||||||
|
preferences.putString(SETTING_HOSTNAME_PREFIX, "oc");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupWifi()
|
void setupWifi()
|
||||||
|
@ -221,3 +226,4 @@ void OTAUpdateTask(void *pvParameters) {
|
||||||
vTaskDelay(1000 / portTICK_PERIOD_MS); // Delay to avoid high CPU usage
|
vTaskDelay(1000 / portTICK_PERIOD_MS); // Delay to avoid high CPU usage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,4 +20,4 @@ void OTAUpdateTask(void *pvParameters);
|
||||||
void wakeModemSleep();
|
void wakeModemSleep();
|
||||||
void setModemSleep();
|
void setModemSleep();
|
||||||
|
|
||||||
bool inPowerSaveMode();
|
bool inPowerSaveMode();
|
||||||
|
|
36
src/epd.cpp
36
src/epd.cpp
|
@ -9,6 +9,10 @@ String currentRow1 = "";
|
||||||
String currentRow2 = "";
|
String currentRow2 = "";
|
||||||
String currentRow3 = "";
|
String currentRow3 = "";
|
||||||
|
|
||||||
|
char currentIcon1;
|
||||||
|
char currentIcon2;
|
||||||
|
char currentIcon3;
|
||||||
|
|
||||||
void setupDisplay()
|
void setupDisplay()
|
||||||
{
|
{
|
||||||
display.init(0, true);
|
display.init(0, true);
|
||||||
|
@ -60,8 +64,11 @@ void setupDisplay()
|
||||||
// display.display(true);
|
// display.display(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateRow2(String c)
|
void updateRow2(String c, char icon)
|
||||||
{
|
{
|
||||||
|
if (c.equals(currentRow2) && icon == currentIcon2)
|
||||||
|
return;
|
||||||
|
|
||||||
display.setRotation(1);
|
display.setRotation(1);
|
||||||
display.setFont(&ROW2_FONT);
|
display.setFont(&ROW2_FONT);
|
||||||
display.setTextColor(GxEPD_BLACK);
|
display.setTextColor(GxEPD_BLACK);
|
||||||
|
@ -82,17 +89,23 @@ void updateRow2(String c)
|
||||||
|
|
||||||
display.setFont(&ROW2_ICONFONT);
|
display.setFont(&ROW2_ICONFONT);
|
||||||
display.setCursor(x, y);
|
display.setCursor(x, y);
|
||||||
display.print(ICON_BLOCK);
|
display.print(icon);
|
||||||
|
|
||||||
display.setFont(&ROW2_FONT);
|
display.setFont(&ROW2_FONT);
|
||||||
display.setCursor(x + ROW2_ICONWIDTH, y);
|
display.setCursor(x + ROW2_ICONWIDTH, y);
|
||||||
display.print(c);
|
display.print(c);
|
||||||
} while (display.nextPage());
|
} while (display.nextPage());
|
||||||
// display.display(true);
|
// display.display(true);
|
||||||
|
|
||||||
|
currentRow2 = c;
|
||||||
|
currentIcon2 = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateRow3(String c)
|
void updateRow3(String c, char icon)
|
||||||
{
|
{
|
||||||
|
if (c.equals(currentRow3) && icon == currentIcon3)
|
||||||
|
return;
|
||||||
|
|
||||||
display.setRotation(1);
|
display.setRotation(1);
|
||||||
display.setFont(&LibreFranklin_SemiBold15pt7b);
|
display.setFont(&LibreFranklin_SemiBold15pt7b);
|
||||||
display.setTextColor(GxEPD_WHITE);
|
display.setTextColor(GxEPD_WHITE);
|
||||||
|
@ -114,13 +127,16 @@ void updateRow3(String c)
|
||||||
|
|
||||||
display.setFont(&orangeclock_icons15pt7b);
|
display.setFont(&orangeclock_icons15pt7b);
|
||||||
display.setCursor(x, y);
|
display.setCursor(x, y);
|
||||||
display.print(ICON_SATS);
|
display.print(icon);
|
||||||
|
|
||||||
display.setFont(&LibreFranklin_SemiBold15pt7b);
|
display.setFont(&LibreFranklin_SemiBold15pt7b);
|
||||||
|
|
||||||
display.setCursor(x + ROW3_ICONWIDTH, y);
|
display.setCursor(x + ROW3_ICONWIDTH, y);
|
||||||
display.print(c);
|
display.print(c);
|
||||||
} while (display.nextPage());
|
} while (display.nextPage());
|
||||||
|
|
||||||
|
currentRow3 = c;
|
||||||
|
currentIcon3 = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
void showSetupText(String t)
|
void showSetupText(String t)
|
||||||
|
@ -133,7 +149,7 @@ void showSetupText(String t)
|
||||||
// center the bounding box by transposition of the origin:
|
// center the bounding box by transposition of the origin:
|
||||||
uint16_t x = ((display.width() - (tbw)) / 2) - tbx;
|
uint16_t x = ((display.width() - (tbw)) / 2) - tbx;
|
||||||
uint16_t y = ((display.height() - tbh) / 2) - tby;
|
uint16_t y = ((display.height() - tbh) / 2) - tby;
|
||||||
|
display.setFullWindow();
|
||||||
display.firstPage();
|
display.firstPage();
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@ -147,8 +163,11 @@ void showSetupText(String t)
|
||||||
} while (display.nextPage());
|
} while (display.nextPage());
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateRow1(String c)
|
void updateRow1(String c, char icon)
|
||||||
{
|
{
|
||||||
|
if (c.equals(currentRow1) && icon == currentIcon1)
|
||||||
|
return;
|
||||||
|
|
||||||
// struct tm timeinfo;
|
// struct tm timeinfo;
|
||||||
// if (!getLocalTime(&timeinfo))
|
// if (!getLocalTime(&timeinfo))
|
||||||
// {
|
// {
|
||||||
|
@ -180,13 +199,16 @@ void updateRow1(String c)
|
||||||
|
|
||||||
display.setFont(&ROW1_ICONFONT);
|
display.setFont(&ROW1_ICONFONT);
|
||||||
display.setCursor(x, y);
|
display.setCursor(x, y);
|
||||||
display.print(ICON_PIE);
|
display.print(icon);
|
||||||
|
|
||||||
display.setFont(&ROW1_FONT);
|
display.setFont(&ROW1_FONT);
|
||||||
|
|
||||||
display.setCursor(x + ROW1_ICONWIDTH, y);
|
display.setCursor(x + ROW1_ICONWIDTH, y);
|
||||||
display.print(c);
|
display.print(c);
|
||||||
} while (display.nextPage());
|
} while (display.nextPage());
|
||||||
|
|
||||||
|
currentRow1 = c;
|
||||||
|
currentIcon1 = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateRows(String row1Content, String row2Content, String row3Content)
|
void updateRows(String row1Content, String row2Content, String row3Content)
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
void setupDisplay();
|
void setupDisplay();
|
||||||
|
|
||||||
void showSetupText(String t);
|
void showSetupText(String t);
|
||||||
void updateRow1(String c);
|
void updateRow1(String c, char icon);
|
||||||
void updateRow2(String c);
|
void updateRow2(String c, char icon);
|
||||||
void updateRow3(String c);
|
void updateRow3(String c, char icon);
|
||||||
void updateRows(String row1Content, String row2Content, String row3Content);
|
void updateRows(String row1Content, String row2Content, String row3Content);
|
15
src/main.cpp
15
src/main.cpp
|
@ -21,7 +21,7 @@ GxEPD2_BW<EPD_CLASS, EPD_CLASS::HEIGHT> display = EPD_CLASS(4, 2, 3, 1);
|
||||||
GxEPD2_BW<EPD_CLASS, EPD_CLASS::HEIGHT> display = EPD_CLASS(5, 3, 2, 1);
|
GxEPD2_BW<EPD_CLASS, EPD_CLASS::HEIGHT> display = EPD_CLASS(5, 3, 2, 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void (*MethodPtr)(String);
|
typedef void (*MethodPtr)(String, char);
|
||||||
|
|
||||||
MethodPtr methods[] = {nullptr, updateRow1, updateRow2, updateRow3};
|
MethodPtr methods[] = {nullptr, updateRow1, updateRow2, updateRow3};
|
||||||
|
|
||||||
|
@ -96,35 +96,40 @@ void loop()
|
||||||
for (uint i = 1; i <= 3; i++)
|
for (uint i = 1; i <= 3; i++)
|
||||||
{
|
{
|
||||||
String rowContent = "";
|
String rowContent = "";
|
||||||
|
char icon;
|
||||||
char keyName[5];
|
char keyName[5];
|
||||||
snprintf(keyName, sizeof(keyName), "row%d", i);
|
snprintf(keyName, sizeof(keyName), "row%d", i);
|
||||||
Serial.print(keyName);
|
|
||||||
Serial.print(" ");
|
|
||||||
Serial.println(preferences.getUInt(keyName));
|
|
||||||
switch (preferences.getUInt(keyName))
|
switch (preferences.getUInt(keyName))
|
||||||
{
|
{
|
||||||
case LINE_BLOCKHEIGHT:
|
case LINE_BLOCKHEIGHT:
|
||||||
|
icon = ICON_BLOCK;
|
||||||
rowContent = getBlock();
|
rowContent = getBlock();
|
||||||
break;
|
break;
|
||||||
case LINE_MEMPOOL_FEES:
|
case LINE_MEMPOOL_FEES:
|
||||||
|
icon = ICON_PIE;
|
||||||
rowContent = getMempoolFees();
|
rowContent = getMempoolFees();
|
||||||
break;
|
break;
|
||||||
case LINE_MEMPOOL_FEES_MEDIAN:
|
case LINE_MEMPOOL_FEES_MEDIAN:
|
||||||
|
icon = ICON_PIE;
|
||||||
rowContent = "NOT IMPL";
|
rowContent = "NOT IMPL";
|
||||||
break;
|
break;
|
||||||
case LINE_HALVING_COUNTDOWN:
|
case LINE_HALVING_COUNTDOWN:
|
||||||
|
icon = ICON_HOURGLASS;
|
||||||
rowContent = "NOT IMPL";
|
rowContent = "NOT IMPL";
|
||||||
break;
|
break;
|
||||||
case LINE_SATSPERUNIT:
|
case LINE_SATSPERUNIT:
|
||||||
{
|
{
|
||||||
|
icon = ICON_SATS;
|
||||||
uint satsPerDollar = int(round(1 / float(getPrice()) * 10e7));
|
uint satsPerDollar = int(round(1 / float(getPrice()) * 10e7));
|
||||||
rowContent = satsPerDollar;
|
rowContent = satsPerDollar;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LINE_FIATPRICE:
|
case LINE_FIATPRICE:
|
||||||
|
icon = ICON_DOLLAR;
|
||||||
rowContent = getPrice();
|
rowContent = getPrice();
|
||||||
break;
|
break;
|
||||||
case LINE_MARKETCAP:
|
case LINE_MARKETCAP:
|
||||||
|
icon = ICON_GLOBE;
|
||||||
rowContent = "NOT IMPL";
|
rowContent = "NOT IMPL";
|
||||||
break;
|
break;
|
||||||
case LINE_TIME:
|
case LINE_TIME:
|
||||||
|
@ -137,7 +142,7 @@ void loop()
|
||||||
rowContent = "DEFAULT";
|
rowContent = "DEFAULT";
|
||||||
}
|
}
|
||||||
|
|
||||||
methods[i](rowContent);
|
methods[i](rowContent, icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
// String block = String(getBlock());
|
// String block = String(getBlock());
|
||||||
|
|
13
src/shared.cpp
Normal file
13
src/shared.cpp
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#include "shared.hpp"
|
||||||
|
|
||||||
|
String getMyHostname()
|
||||||
|
{
|
||||||
|
uint8_t mac[6];
|
||||||
|
// WiFi.macAddress(mac);
|
||||||
|
esp_efuse_mac_get_default(mac);
|
||||||
|
char hostname[15];
|
||||||
|
String hostnamePrefix = preferences.getString(SETTING_HOSTNAME_PREFIX);
|
||||||
|
snprintf(hostname, sizeof(hostname), "%s-%02x%02x%02x", hostnamePrefix,
|
||||||
|
mac[3], mac[4], mac[5]);
|
||||||
|
return hostname;
|
||||||
|
}
|
|
@ -37,29 +37,30 @@
|
||||||
#define SETUPFONT LibreFranklin_SemiBold12pt7b
|
#define SETUPFONT LibreFranklin_SemiBold12pt7b
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ICON_BLOCK "A"
|
#define ICON_BLOCK 'A'
|
||||||
#define ICON_EURO "B"
|
#define ICON_EURO 'B'
|
||||||
#define ICON_POUND "C"
|
#define ICON_POUND 'C'
|
||||||
#define ICON_YEN "D"
|
#define ICON_YEN 'D'
|
||||||
#define ICON_DOLLAR "E"
|
#define ICON_DOLLAR 'E'
|
||||||
#define ICON_PIE "F"
|
#define ICON_PIE 'F'
|
||||||
#define ICON_GLOBE "G"
|
#define ICON_GLOBE 'G'
|
||||||
#define ICON_HOURGLASS "H"
|
#define ICON_HOURGLASS 'H'
|
||||||
#define ICON_LIGHTNING "I"
|
#define ICON_LIGHTNING 'I'
|
||||||
#define ICON_REFRESH "J"
|
#define ICON_REFRESH 'J'
|
||||||
#define ICON_NUCLEAR "K"
|
#define ICON_NUCLEAR 'K'
|
||||||
#define ICON_SATS "L"
|
#define ICON_SATS 'L'
|
||||||
#define ICON_SATUSD "M"
|
#define ICON_SATUSD 'M'
|
||||||
#define ICON_SETTINGS "N"
|
#define ICON_SETTINGS 'N'
|
||||||
#define ICON_WIFI "O"
|
#define ICON_WIFI 'O'
|
||||||
#define ICON_CROSS "P"
|
#define ICON_CROSS 'P'
|
||||||
#define ICON_CHECK "Q"
|
#define ICON_CHECK 'Q'
|
||||||
#define ICON_WARNING "R"
|
#define ICON_WARNING 'R'
|
||||||
|
|
||||||
#define SETTING_ROW1_CONTENT "row1"
|
#define SETTING_ROW1_CONTENT "row1"
|
||||||
#define SETTING_ROW2_CONTENT "row2"
|
#define SETTING_ROW2_CONTENT "row2"
|
||||||
#define SETTING_ROW3_CONTENT "row3"
|
#define SETTING_ROW3_CONTENT "row3"
|
||||||
#define SETTING_CURRENCY "currency"
|
#define SETTING_CURRENCY "currency"
|
||||||
|
#define SETTING_HOSTNAME_PREFIX "hostnamePrefix"
|
||||||
|
|
||||||
const int LINE_BLOCKHEIGHT = 0;
|
const int LINE_BLOCKHEIGHT = 0;
|
||||||
const int LINE_MEMPOOL_FEES = 1;
|
const int LINE_MEMPOOL_FEES = 1;
|
||||||
|
@ -82,4 +83,14 @@ const int LINE_DATE = 100;
|
||||||
extern WiFiClientSecure client;
|
extern WiFiClientSecure client;
|
||||||
extern GxEPD2_BW<EPD_CLASS, EPD_CLASS::HEIGHT> display;
|
extern GxEPD2_BW<EPD_CLASS, EPD_CLASS::HEIGHT> display;
|
||||||
extern Preferences preferences;
|
extern Preferences preferences;
|
||||||
extern bool isUpdating;
|
extern bool isUpdating;
|
||||||
|
|
||||||
|
extern String currentRow1;
|
||||||
|
extern String currentRow2;
|
||||||
|
extern String currentRow3;
|
||||||
|
|
||||||
|
extern char currentIcon1;
|
||||||
|
extern char currentIcon2;
|
||||||
|
extern char currentIcon3;
|
||||||
|
|
||||||
|
String getMyHostname();
|
||||||
|
|
|
@ -13,6 +13,7 @@ void setupWebserver()
|
||||||
Serial.println(F("An Error has occurred while mounting LittleFS"));
|
Serial.println(F("An Error has occurred while mounting LittleFS"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server.on("/api/status", HTTP_GET, onApiStatus);
|
||||||
server.on("/api/settings", HTTP_GET, onApiSettingsGet);
|
server.on("/api/settings", HTTP_GET, onApiSettingsGet);
|
||||||
AsyncCallbackJsonWebHandler *settingsPatchHandler =
|
AsyncCallbackJsonWebHandler *settingsPatchHandler =
|
||||||
new AsyncCallbackJsonWebHandler("/api/json/settings", onApiSettingsPatch);
|
new AsyncCallbackJsonWebHandler("/api/json/settings", onApiSettingsPatch);
|
||||||
|
@ -31,6 +32,31 @@ void setupWebserver()
|
||||||
server.begin();
|
server.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onApiStatus(AsyncWebServerRequest *request)
|
||||||
|
{
|
||||||
|
JsonDocument root;
|
||||||
|
|
||||||
|
root["row1"] = currentRow1;
|
||||||
|
root["row2"] = currentRow2;
|
||||||
|
root["row3"] = currentRow3;
|
||||||
|
|
||||||
|
root["icon1"] = String(currentIcon1);
|
||||||
|
root["icon2"] = String(currentIcon2);
|
||||||
|
root["icon3"] = String(currentIcon3);
|
||||||
|
|
||||||
|
root["espUptime"] = esp_timer_get_time() / 1000000;
|
||||||
|
root["espFreeHeap"] = ESP.getFreeHeap();
|
||||||
|
root["espHeapSize"] = ESP.getHeapSize();
|
||||||
|
|
||||||
|
root["rssi"] = WiFi.RSSI();
|
||||||
|
|
||||||
|
AsyncResponseStream *response =
|
||||||
|
request->beginResponseStream("application/json");
|
||||||
|
serializeJson(root, *response);
|
||||||
|
|
||||||
|
request->send(response);
|
||||||
|
}
|
||||||
|
|
||||||
void onApiSettingsGet(AsyncWebServerRequest *request)
|
void onApiSettingsGet(AsyncWebServerRequest *request)
|
||||||
{
|
{
|
||||||
JsonDocument root;
|
JsonDocument root;
|
||||||
|
@ -49,6 +75,17 @@ void onApiSettingsGet(AsyncWebServerRequest *request)
|
||||||
root[setting] = preferences.getBool(setting.c_str());
|
root[setting] = preferences.getBool(setting.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
root["hostname"] = getMyHostname();
|
||||||
|
root["ip"] = WiFi.localIP();
|
||||||
|
root["txPower"] = WiFi.getTxPower();
|
||||||
|
|
||||||
|
#ifdef GIT_REV
|
||||||
|
root["gitRev"] = String(GIT_REV);
|
||||||
|
#endif
|
||||||
|
#ifdef LAST_BUILD_TIME
|
||||||
|
root["lastBuildTime"] = String(LAST_BUILD_TIME);
|
||||||
|
#endif
|
||||||
|
|
||||||
AsyncResponseStream *response =
|
AsyncResponseStream *response =
|
||||||
request->beginResponseStream("application/json");
|
request->beginResponseStream("application/json");
|
||||||
serializeJson(root, *response);
|
serializeJson(root, *response);
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
|
|
||||||
void setupWebserver();
|
void setupWebserver();
|
||||||
|
|
||||||
|
void onApiStatus(AsyncWebServerRequest *request);
|
||||||
|
|
||||||
void onApiSettingsGet(AsyncWebServerRequest *request);
|
void onApiSettingsGet(AsyncWebServerRequest *request);
|
||||||
void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json);
|
void onApiSettingsPatch(AsyncWebServerRequest *request, JsonVariant &json);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue