t-hmi first working: add touch, sdcard, remove vkbit
This commit is contained in:
parent
3a50f87c31
commit
c73a1fe19a
@ -61,6 +61,7 @@ Every time an stratum job notification is received miner update its current work
|
|||||||
- ESP32-C3 Devkit ([Board Info](https://docs.platformio.org/en/latest/boards/espressif32/esp32-c3-devkitm-1.html))
|
- ESP32-C3 Devkit ([Board Info](https://docs.platformio.org/en/latest/boards/espressif32/esp32-c3-devkitm-1.html))
|
||||||
- ESP32-C3 Super Mini ([Board Info](https://docs.platformio.org/en/latest/boards/espressif32/seeed_xiao_esp32c3.html))
|
- ESP32-C3 Super Mini ([Board Info](https://docs.platformio.org/en/latest/boards/espressif32/seeed_xiao_esp32c3.html))
|
||||||
- Waveshare ESP32-S3-GEEK ([Board Info](https://www.waveshare.com/wiki/ESP32-S3-GEEK))
|
- Waveshare ESP32-S3-GEEK ([Board Info](https://www.waveshare.com/wiki/ESP32-S3-GEEK))
|
||||||
|
- LILYGO T-HMI ([Aliexpress link\*](https://s.click.aliexpress.com/e/_oFII4s2)) / Dev support: @cosmicpsyop
|
||||||
|
|
||||||
\*Affiliate links
|
\*Affiliate links
|
||||||
|
|
||||||
|
@ -751,10 +751,11 @@ build_flags =
|
|||||||
|
|
||||||
board_build.arduino.memory_type = qio_opi
|
board_build.arduino.memory_type = qio_opi
|
||||||
lib_deps =
|
lib_deps =
|
||||||
|
https://github.com/liangyingy/arduino_xpt2046_library
|
||||||
https://github.com/takkaO/OpenFontRender
|
https://github.com/takkaO/OpenFontRender
|
||||||
bblanchon/ArduinoJson@^6.21.2
|
bblanchon/ArduinoJson@^6.21.2
|
||||||
https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2
|
https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2
|
||||||
mathertel/OneButton @ ^2.0.3
|
mathertel/OneButton @ ^2.5.0
|
||||||
arduino-libraries/NTPClient
|
arduino-libraries/NTPClient
|
||||||
bodmer/TFT_eSPI @ ^2.5.31
|
bodmer/TFT_eSPI @ ^2.5.31
|
||||||
https://github.com/achillhasler/TFT_eTouch
|
https://github.com/achillhasler/TFT_eTouch
|
||||||
|
@ -96,7 +96,11 @@ void setup()
|
|||||||
/******** SHOW LED INIT STATUS (devices without screen) *****/
|
/******** SHOW LED INIT STATUS (devices without screen) *****/
|
||||||
mMonitor.NerdStatus = NM_waitingConfig;
|
mMonitor.NerdStatus = NM_waitingConfig;
|
||||||
doLedStuff(0);
|
doLedStuff(0);
|
||||||
|
|
||||||
|
#ifdef NERDMINER_T_HMI
|
||||||
|
extern void t_hmiCheckForSDCardAndMoveToNVM(void);
|
||||||
|
t_hmiCheckForSDCardAndMoveToNVM();
|
||||||
|
#endif
|
||||||
/******** INIT WIFI ************/
|
/******** INIT WIFI ************/
|
||||||
init_WifiManager();
|
init_WifiManager();
|
||||||
|
|
||||||
@ -142,6 +146,9 @@ void app_error_fault_handler(void *arg) {
|
|||||||
// restart ESP32
|
// restart ESP32
|
||||||
esp_restart();
|
esp_restart();
|
||||||
}
|
}
|
||||||
|
#ifdef NERDMINER_T_HMI
|
||||||
|
extern uint16_t t_hmiCheckForTouch();
|
||||||
|
#endif
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
// keep watching the push buttons:
|
// keep watching the push buttons:
|
||||||
@ -153,6 +160,9 @@ void loop() {
|
|||||||
button2.tick();
|
button2.tick();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef NERDMINER_T_HMI
|
||||||
|
t_hmiCheckForTouch();
|
||||||
|
#endif
|
||||||
wifiManagerProcess(); // avoid delays() in loop when non-blocking and other long running code
|
wifiManagerProcess(); // avoid delays() in loop when non-blocking and other long running code
|
||||||
|
|
||||||
vTaskDelay(50 / portTICK_PERIOD_MS);
|
vTaskDelay(50 / portTICK_PERIOD_MS);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#define T_HMI_DISPLAY
|
#define T_HMI_DISPLAY
|
||||||
|
|
||||||
#define PWR_EN_PIN (10)
|
#define PWR_EN_PIN (10)
|
||||||
|
#define PIN_ENABLE5V PWR_EN_PIN
|
||||||
#define PWR_ON_PIN (14)
|
#define PWR_ON_PIN (14)
|
||||||
#define BAT_ADC_PIN (5)
|
#define BAT_ADC_PIN (5)
|
||||||
#define BUTTON1_PIN (0)
|
#define BUTTON1_PIN (0)
|
||||||
@ -29,11 +30,9 @@
|
|||||||
|
|
||||||
// sd card
|
// sd card
|
||||||
// 1-bit SD MMC
|
// 1-bit SD MMC
|
||||||
#ifdef DEFINE_SDMMC_1BIT
|
|
||||||
#define SDMMC_CLK (12)
|
#define SDMMC_CLK (12)
|
||||||
#define SDMMC_CMD (11)
|
#define SDMMC_CMD (11)
|
||||||
#define SDMMC_D0 (13)
|
#define SDMMC_D0 (13)
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TFT_BL
|
#ifndef TFT_BL
|
||||||
// XXX - defined in User_Setups/Setup207_LilyGo_T_HMI.h:37
|
// XXX - defined in User_Setups/Setup207_LilyGo_T_HMI.h:37
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
#include "displayDriver.h"
|
#include "displayDriver.h"
|
||||||
|
|
||||||
#ifdef T_HMI_DISPLAY
|
#ifdef T_HMI_DISPLAY
|
||||||
|
#include <FS.h>
|
||||||
|
#include <xpt2046.h> // https://github.com/liangyingy/arduino_xpt2046_library
|
||||||
#include <TFT_eSPI.h>
|
#include <TFT_eSPI.h>
|
||||||
#include <TFT_eTouch.h>
|
#include <TFT_eTouch.h>
|
||||||
#include "media/images_320_170.h"
|
#include "media/images_320_170.h"
|
||||||
@ -22,15 +23,159 @@ OpenFontRender render;
|
|||||||
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
|
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
|
||||||
TFT_eSprite background = TFT_eSprite(&tft); // Invoke library sprite
|
TFT_eSprite background = TFT_eSprite(&tft); // Invoke library sprite
|
||||||
|
|
||||||
|
#define TOUCH_ENABLE
|
||||||
SPIClass hSPI(HSPI);
|
//SPIClass hSPI(HSPI);
|
||||||
// TFT_eTouch<TFT_eSPI> touch(tft, ETOUCH_CS, 0xFF, hSPI);
|
// TFT_eTouch<TFT_eSPI> touch(tft, ETOUCH_CS, 0xFF, hSPI);
|
||||||
|
#ifdef TOUCH_ENABLE
|
||||||
|
XPT2046 touch = XPT2046(SPI, ETOUCH_CS, TOUCH_IRQ);
|
||||||
|
#endif
|
||||||
|
|
||||||
bool showbtcprice = false;
|
bool showbtcprice = false;
|
||||||
|
|
||||||
extern monitor_data mMonitor;
|
extern monitor_data mMonitor;
|
||||||
extern pool_data pData;
|
extern pool_data pData;
|
||||||
extern DisplayDriver *currentDisplayDriver;
|
extern DisplayDriver *currentDisplayDriver;
|
||||||
|
|
||||||
|
/*=============================================*/
|
||||||
|
#include <FS.h>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include "drivers/storage/nvMemory.h"
|
||||||
|
#include "drivers/storage/SDCard.h"
|
||||||
|
extern nvMemory nvMem;
|
||||||
|
extern TSettings Settings;
|
||||||
|
|
||||||
|
void t_hmiCheckForSDCardAndMoveToNVM(void)
|
||||||
|
{
|
||||||
|
// workaround removing use of class SDCard
|
||||||
|
// SCard SDCrd = SDCard() blows up in SDCard::initSDcard()
|
||||||
|
// Need to lower frequency to 20000
|
||||||
|
SD_MMC.setPins(SDMMC_CLK, SDMMC_CMD, SDMMC_D0);
|
||||||
|
delay(500);
|
||||||
|
bool rlst = SD_MMC.begin("/sd", true, false, 20000);
|
||||||
|
if (!rlst)
|
||||||
|
{
|
||||||
|
Serial.println("SD init failed");
|
||||||
|
Serial.println("➸ No detected SdCard");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println("SD init success");
|
||||||
|
Serial.printf("➸ Detected SdCard insert: %.2f GB\r\n", SD_MMC.cardSize() / 1024.0 / 1024.0 / 1024.0);
|
||||||
|
|
||||||
|
// SDCrd.SD2nvMemory(&nvMem, &Settings);
|
||||||
|
|
||||||
|
if (SD_MMC.exists(JSON_CONFIG_FILE))
|
||||||
|
{
|
||||||
|
// The file exists, reading and loading
|
||||||
|
File configFile = SD_MMC.open(JSON_CONFIG_FILE, "r");
|
||||||
|
if (configFile)
|
||||||
|
{
|
||||||
|
StaticJsonDocument<512> json;
|
||||||
|
DeserializationError error = deserializeJson(json, configFile);
|
||||||
|
configFile.close();
|
||||||
|
Serial.println("SDCard: Loading config file");
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
serializeJsonPretty(json, Serial);
|
||||||
|
Serial.print('\n');
|
||||||
|
TSettings *pSettings = &Settings;
|
||||||
|
pSettings->WifiSSID = json[JSON_KEY_SSID] | pSettings->WifiSSID;
|
||||||
|
pSettings->WifiPW = json[JSON_KEY_PASW] | pSettings->WifiPW;
|
||||||
|
pSettings->PoolAddress = json[JSON_KEY_POOLURL] | pSettings->PoolAddress;
|
||||||
|
strcpy(pSettings->PoolPassword, json[JSON_KEY_POOLPASS] | pSettings->PoolPassword);
|
||||||
|
strcpy(pSettings->BtcWallet, json[JSON_KEY_WALLETID] | pSettings->BtcWallet);
|
||||||
|
if (json.containsKey(JSON_KEY_POOLPORT))
|
||||||
|
pSettings->PoolPort = json[JSON_KEY_POOLPORT].as<int>();
|
||||||
|
if (json.containsKey(JSON_KEY_TIMEZONE))
|
||||||
|
pSettings->Timezone = json[JSON_KEY_TIMEZONE].as<int>();
|
||||||
|
if (json.containsKey(JSON_KEY_STATS2NV))
|
||||||
|
pSettings->saveStats = json[JSON_KEY_STATS2NV].as<bool>();
|
||||||
|
nvMem.saveConfig(pSettings);
|
||||||
|
WiFi.begin(pSettings->WifiSSID, pSettings->WifiPW);
|
||||||
|
Serial.println("SDCard: Settings transfered to internal memory. Restarting now.");
|
||||||
|
ESP.restart();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Error loading JSON data
|
||||||
|
Serial.println("SDCard: Error parsing config file!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println("SDCard: Error opening config file!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Serial.println("SDCard: No config file available!");
|
||||||
|
}
|
||||||
|
// delay(15000);
|
||||||
|
SD_MMC.end();
|
||||||
|
Serial.println("SD close");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*=============================================*/
|
||||||
|
unsigned int lower_switch = 1;
|
||||||
|
#ifdef TOUCH_ENABLE
|
||||||
|
extern void switchToNextScreen(void);
|
||||||
|
|
||||||
|
unsigned long now = 0;
|
||||||
|
unsigned long currentTime;
|
||||||
|
bool debounce() {
|
||||||
|
if (now) now = millis();
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
if (currentTime - now >= 2000) {
|
||||||
|
now = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t t_hmiCheckForTouch()
|
||||||
|
{
|
||||||
|
uint16_t touch_x, touch_y, code = 0;
|
||||||
|
|
||||||
|
if (touch.pressed()) {
|
||||||
|
touch_x = touch.RawX();
|
||||||
|
touch_y = touch.RawY();
|
||||||
|
// do something with the touch coordinates
|
||||||
|
/*
|
||||||
|
Serial.print("Touch coordinates: ");
|
||||||
|
Serial.print(touch_x);
|
||||||
|
Serial.print(", ");
|
||||||
|
Serial.println(touch_y);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Perform actions based on touch coordinates
|
||||||
|
/*
|
||||||
|
if (y < y_min + (y_max - y_min) / 2) {
|
||||||
|
*/
|
||||||
|
if (touch_x < 200 + (1700 - 200) / 4) {
|
||||||
|
// bottom
|
||||||
|
code = 1;
|
||||||
|
if (debounce())
|
||||||
|
lower_switch = 3 - lower_switch;;
|
||||||
|
} else {
|
||||||
|
// top
|
||||||
|
code = 2;
|
||||||
|
if (debounce())
|
||||||
|
switchToNextScreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (code) {
|
||||||
|
if (code == 1)
|
||||||
|
Serial.print("Touch bottom\n");
|
||||||
|
else
|
||||||
|
Serial.print("Touch top\n");
|
||||||
|
}
|
||||||
|
return(code);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
uint32_t readAdcVoltage(int pin) {
|
uint32_t readAdcVoltage(int pin) {
|
||||||
esp_adc_cal_characteristics_t adc_chars;
|
esp_adc_cal_characteristics_t adc_chars;
|
||||||
|
|
||||||
@ -70,12 +215,32 @@ void t_hmiDisplay_Init(void)
|
|||||||
Serial.println("Initialise error");
|
Serial.println("Initialise error");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* XXX - Pass for first version
|
|
||||||
Serial.println(F("Initialize the touch screen"));
|
Serial.println(F("Initialize the touch screen"));
|
||||||
hSPI.begin(TOUCH_CLK, TOUCH_MISO, TOUCH_MOSI, ETOUCH_CS);
|
#ifdef TOUCH_ENABLE
|
||||||
TFT_eTouchBase::Calibation calibation = { 233, 3785, 3731, 120, 2 };
|
// different approach
|
||||||
touch.setCalibration(calibation);
|
//hSPI.begin(TOUCH_CLK, TOUCH_MISO, TOUCH_MOSI, ETOUCH_CS);
|
||||||
*/
|
//TFT_eTouchBase::Calibation calibation = { 233, 3785, 3731, 120, 2 };
|
||||||
|
//touch.setCalibration(calibation);
|
||||||
|
|
||||||
|
// Check if the screen is touched and get the coordinates
|
||||||
|
/*
|
||||||
|
if (touch.touched()) {
|
||||||
|
TS_Point p = touch.getPoint();
|
||||||
|
Serial.print("Pressure = ");
|
||||||
|
Serial.print(p.z);
|
||||||
|
Serial.print(", x = ");
|
||||||
|
Serial.print(p.x);
|
||||||
|
Serial.print(", y = ");
|
||||||
|
Serial.print(p.y);
|
||||||
|
delay(30);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
SPI.begin(TOUCH_CLK, TOUCH_MISO, TOUCH_MOSI);
|
||||||
|
touch.begin(240, 320);
|
||||||
|
#endif
|
||||||
|
|
||||||
Serial.println(F("Turn on the LCD backlight"));
|
Serial.println(F("Turn on the LCD backlight"));
|
||||||
pinMode(LED_PIN, OUTPUT);
|
pinMode(LED_PIN, OUTPUT);
|
||||||
pinMode(BK_LIGHT_PIN, OUTPUT);
|
pinMode(BK_LIGHT_PIN, OUTPUT);
|
||||||
@ -83,6 +248,7 @@ void t_hmiDisplay_Init(void)
|
|||||||
pData.bestDifficulty = "0";
|
pData.bestDifficulty = "0";
|
||||||
pData.workersHash = "0";
|
pData.workersHash = "0";
|
||||||
pData.workersCount = 0;
|
pData.workersCount = 0;
|
||||||
|
lower_switch = 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,7 +354,11 @@ void t_hmiDisplay_MinerScreen(unsigned long mElapsed)
|
|||||||
render.setFontSize(10);
|
render.setFontSize(10);
|
||||||
render.rdrawString(data.currentTime.c_str(), 286, 1, TFT_BLACK);
|
render.rdrawString(data.currentTime.c_str(), 286, 1, TFT_BLACK);
|
||||||
|
|
||||||
printPoolData();
|
if (lower_switch == 1)
|
||||||
|
printPoolData();
|
||||||
|
else
|
||||||
|
printMemPoolFees(mElapsed);
|
||||||
|
|
||||||
// Push prepared background to screen
|
// Push prepared background to screen
|
||||||
background.pushSprite(0, 0);
|
background.pushSprite(0, 0);
|
||||||
}
|
}
|
||||||
@ -226,7 +396,10 @@ void t_hmiDisplay_ClockScreen(unsigned long mElapsed)
|
|||||||
background.setTextColor(0xDEDB, TFT_BLACK);
|
background.setTextColor(0xDEDB, TFT_BLACK);
|
||||||
|
|
||||||
background.drawString(data.currentTime.c_str(), 130, 50, GFXFF);
|
background.drawString(data.currentTime.c_str(), 130, 50, GFXFF);
|
||||||
printMemPoolFees(mElapsed);
|
if (lower_switch == 1)
|
||||||
|
printMemPoolFees(mElapsed);
|
||||||
|
else
|
||||||
|
printPoolData();
|
||||||
// Push prepared background to screen
|
// Push prepared background to screen
|
||||||
background.pushSprite(0, 0);
|
background.pushSprite(0, 0);
|
||||||
}
|
}
|
||||||
@ -286,7 +459,11 @@ void t_hmiDisplay_GlobalHashScreen(unsigned long mElapsed)
|
|||||||
background.setTextColor(TFT_BLACK);
|
background.setTextColor(TFT_BLACK);
|
||||||
background.drawString(data.remainingBlocks.c_str(), 72, 159, FONT2);
|
background.drawString(data.remainingBlocks.c_str(), 72, 159, FONT2);
|
||||||
|
|
||||||
printMemPoolFees(mElapsed);
|
if (lower_switch == 1)
|
||||||
|
printMemPoolFees(mElapsed);
|
||||||
|
else
|
||||||
|
printPoolData();
|
||||||
|
|
||||||
// Push prepared background to screen
|
// Push prepared background to screen
|
||||||
background.pushSprite(0, 0);
|
background.pushSprite(0, 0);
|
||||||
}
|
}
|
||||||
@ -326,7 +503,10 @@ void t_hmiDisplay_BTCprice(unsigned long mElapsed)
|
|||||||
background.setTextSize(1);
|
background.setTextSize(1);
|
||||||
background.setTextColor(0xDEDB, TFT_BLACK);
|
background.setTextColor(0xDEDB, TFT_BLACK);
|
||||||
background.drawString(data.btcPrice.c_str(), 300, 58, GFXFF);
|
background.drawString(data.btcPrice.c_str(), 300, 58, GFXFF);
|
||||||
printPoolData();
|
if (lower_switch == 1)
|
||||||
|
printPoolData();
|
||||||
|
else
|
||||||
|
printMemPoolFees(mElapsed);
|
||||||
// Push prepared background to screen
|
// Push prepared background to screen
|
||||||
background.pushSprite(0, 0);
|
background.pushSprite(0, 0);
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,9 @@ SDCard::SDCard(int ID):cardInitialized_(false),cardBusy_(false)
|
|||||||
}
|
}
|
||||||
iSD_ = &SD;
|
iSD_ = &SD;
|
||||||
#endif // interface type
|
#endif // interface type
|
||||||
|
#ifndef NERDMINER_T_HMI
|
||||||
initSDcard();
|
initSDcard();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
SDCard::~SDCard()
|
SDCard::~SDCard()
|
||||||
@ -167,7 +169,14 @@ bool SDCard::initSDcard()
|
|||||||
#elif defined (BUILD_SDMMC_1)
|
#elif defined (BUILD_SDMMC_1)
|
||||||
#warning SDMMC : 1 - bit mode is not always working. If you experience issues, try other modes.
|
#warning SDMMC : 1 - bit mode is not always working. If you experience issues, try other modes.
|
||||||
iSD_->setPins(SDMMC_CLK, SDMMC_CMD, SDMMC_D0);
|
iSD_->setPins(SDMMC_CLK, SDMMC_CMD, SDMMC_D0);
|
||||||
|
#ifdef NERDMINER_T_HMI
|
||||||
|
// Need to lower frequency to 20000
|
||||||
|
// Should work but blows up in SDCard::initSDcard()
|
||||||
|
// see temporary workaround t_hmiCheckForSDCardAndMoveToNVM()
|
||||||
|
cardInitialized_ = iSD_->begin("/sd", true, false, 20000);
|
||||||
|
#else
|
||||||
cardInitialized_ = iSD_->begin("/sd", true);
|
cardInitialized_ = iSD_->begin("/sd", true);
|
||||||
|
#endif
|
||||||
Serial.println("SDCard: 1-Bit Mode.");
|
Serial.println("SDCard: 1-Bit Mode.");
|
||||||
}
|
}
|
||||||
#elif defined (BUILD_SDSPI)
|
#elif defined (BUILD_SDSPI)
|
||||||
|
@ -335,13 +335,12 @@ String getPoolAPIUrl(void) {
|
|||||||
else {
|
else {
|
||||||
switch (Settings.PoolPort) {
|
switch (Settings.PoolPort) {
|
||||||
case 3333:
|
case 3333:
|
||||||
if (Settings.PoolAddress == "pool.vkbit.com")
|
if (Settings.PoolAddress == "pool.sethforprivacy.com")
|
||||||
poolAPIUrl = "https://vkbit.com/miner/";
|
|
||||||
else if (Settings.PoolAddress == "pool.sethforprivacy.com")
|
|
||||||
poolAPIUrl = "https://pool.sethforprivacy.com/api/client/";
|
poolAPIUrl = "https://pool.sethforprivacy.com/api/client/";
|
||||||
// Add more cases for other addresses with port 3333 if needed
|
// Add more cases for other addresses with port 3333 if needed
|
||||||
break;
|
break;
|
||||||
case 2018:
|
case 2018:
|
||||||
|
// Local instance of public-pool.io on Umbrel or Start9
|
||||||
poolAPIUrl = "http://" + Settings.PoolAddress + ":2019/api/client/";
|
poolAPIUrl = "http://" + Settings.PoolAddress + ":2019/api/client/";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user