From c73a1fe19a2a7c21dd92888db78344002a0af800 Mon Sep 17 00:00:00 2001 From: cosmicpsyop Date: Tue, 28 May 2024 14:29:00 -0700 Subject: [PATCH] t-hmi first working: add touch, sdcard, remove vkbit --- README.md | 1 + platformio.ini | 3 +- src/NerdMinerV2.ino.cpp | 12 +- src/drivers/devices/lilygoT_HMI.h | 3 +- src/drivers/displays/t_hmiDisplayDriver.cpp | 204 ++++++++++++++++++-- src/drivers/storage/SDCard.cpp | 9 + src/monitor.cpp | 5 +- 7 files changed, 218 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 3d30a3c..1213bf0 100644 --- a/README.md +++ b/README.md @@ -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 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)) +- LILYGO T-HMI ([Aliexpress link\*](https://s.click.aliexpress.com/e/_oFII4s2)) / Dev support: @cosmicpsyop \*Affiliate links diff --git a/platformio.ini b/platformio.ini index 9555602..733fb38 100644 --- a/platformio.ini +++ b/platformio.ini @@ -751,10 +751,11 @@ build_flags = board_build.arduino.memory_type = qio_opi lib_deps = + https://github.com/liangyingy/arduino_xpt2046_library https://github.com/takkaO/OpenFontRender bblanchon/ArduinoJson@^6.21.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 bodmer/TFT_eSPI @ ^2.5.31 https://github.com/achillhasler/TFT_eTouch diff --git a/src/NerdMinerV2.ino.cpp b/src/NerdMinerV2.ino.cpp index c2be3f8..48a8305 100644 --- a/src/NerdMinerV2.ino.cpp +++ b/src/NerdMinerV2.ino.cpp @@ -96,7 +96,11 @@ void setup() /******** SHOW LED INIT STATUS (devices without screen) *****/ mMonitor.NerdStatus = NM_waitingConfig; doLedStuff(0); - + +#ifdef NERDMINER_T_HMI + extern void t_hmiCheckForSDCardAndMoveToNVM(void); + t_hmiCheckForSDCardAndMoveToNVM(); +#endif /******** INIT WIFI ************/ init_WifiManager(); @@ -142,6 +146,9 @@ void app_error_fault_handler(void *arg) { // restart ESP32 esp_restart(); } +#ifdef NERDMINER_T_HMI +extern uint16_t t_hmiCheckForTouch(); +#endif void loop() { // keep watching the push buttons: @@ -153,6 +160,9 @@ void loop() { button2.tick(); #endif +#ifdef NERDMINER_T_HMI + t_hmiCheckForTouch(); +#endif wifiManagerProcess(); // avoid delays() in loop when non-blocking and other long running code vTaskDelay(50 / portTICK_PERIOD_MS); diff --git a/src/drivers/devices/lilygoT_HMI.h b/src/drivers/devices/lilygoT_HMI.h index ab384b8..556c067 100644 --- a/src/drivers/devices/lilygoT_HMI.h +++ b/src/drivers/devices/lilygoT_HMI.h @@ -4,6 +4,7 @@ #define T_HMI_DISPLAY #define PWR_EN_PIN (10) +#define PIN_ENABLE5V PWR_EN_PIN #define PWR_ON_PIN (14) #define BAT_ADC_PIN (5) #define BUTTON1_PIN (0) @@ -29,11 +30,9 @@ // sd card // 1-bit SD MMC -#ifdef DEFINE_SDMMC_1BIT #define SDMMC_CLK (12) #define SDMMC_CMD (11) #define SDMMC_D0 (13) -#endif #ifndef TFT_BL // XXX - defined in User_Setups/Setup207_LilyGo_T_HMI.h:37 diff --git a/src/drivers/displays/t_hmiDisplayDriver.cpp b/src/drivers/displays/t_hmiDisplayDriver.cpp index d3b0510..84c1ad8 100644 --- a/src/drivers/displays/t_hmiDisplayDriver.cpp +++ b/src/drivers/displays/t_hmiDisplayDriver.cpp @@ -1,7 +1,8 @@ #include "displayDriver.h" #ifdef T_HMI_DISPLAY - +#include +#include // https://github.com/liangyingy/arduino_xpt2046_library #include #include #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_eSprite background = TFT_eSprite(&tft); // Invoke library sprite - -SPIClass hSPI(HSPI); +#define TOUCH_ENABLE +//SPIClass hSPI(HSPI); // TFT_eTouch touch(tft, ETOUCH_CS, 0xFF, hSPI); +#ifdef TOUCH_ENABLE +XPT2046 touch = XPT2046(SPI, ETOUCH_CS, TOUCH_IRQ); +#endif + bool showbtcprice = false; extern monitor_data mMonitor; extern pool_data pData; extern DisplayDriver *currentDisplayDriver; +/*=============================================*/ +#include +#include +#include +#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(); + if (json.containsKey(JSON_KEY_TIMEZONE)) + pSettings->Timezone = json[JSON_KEY_TIMEZONE].as(); + if (json.containsKey(JSON_KEY_STATS2NV)) + pSettings->saveStats = json[JSON_KEY_STATS2NV].as(); + 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) { esp_adc_cal_characteristics_t adc_chars; @@ -70,12 +215,32 @@ void t_hmiDisplay_Init(void) Serial.println("Initialise error"); return; } -/* XXX - Pass for first version + Serial.println(F("Initialize the touch screen")); - hSPI.begin(TOUCH_CLK, TOUCH_MISO, TOUCH_MOSI, ETOUCH_CS); - TFT_eTouchBase::Calibation calibation = { 233, 3785, 3731, 120, 2 }; - touch.setCalibration(calibation); -*/ + #ifdef TOUCH_ENABLE + // different approach + //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")); pinMode(LED_PIN, OUTPUT); pinMode(BK_LIGHT_PIN, OUTPUT); @@ -83,6 +248,7 @@ void t_hmiDisplay_Init(void) pData.bestDifficulty = "0"; pData.workersHash = "0"; pData.workersCount = 0; + lower_switch = 1; } @@ -188,7 +354,11 @@ void t_hmiDisplay_MinerScreen(unsigned long mElapsed) render.setFontSize(10); render.rdrawString(data.currentTime.c_str(), 286, 1, TFT_BLACK); - printPoolData(); + if (lower_switch == 1) + printPoolData(); + else + printMemPoolFees(mElapsed); + // Push prepared background to screen background.pushSprite(0, 0); } @@ -226,7 +396,10 @@ void t_hmiDisplay_ClockScreen(unsigned long mElapsed) background.setTextColor(0xDEDB, TFT_BLACK); background.drawString(data.currentTime.c_str(), 130, 50, GFXFF); - printMemPoolFees(mElapsed); + if (lower_switch == 1) + printMemPoolFees(mElapsed); + else + printPoolData(); // Push prepared background to screen background.pushSprite(0, 0); } @@ -286,7 +459,11 @@ void t_hmiDisplay_GlobalHashScreen(unsigned long mElapsed) background.setTextColor(TFT_BLACK); background.drawString(data.remainingBlocks.c_str(), 72, 159, FONT2); - printMemPoolFees(mElapsed); + if (lower_switch == 1) + printMemPoolFees(mElapsed); + else + printPoolData(); + // Push prepared background to screen background.pushSprite(0, 0); } @@ -326,7 +503,10 @@ void t_hmiDisplay_BTCprice(unsigned long mElapsed) background.setTextSize(1); background.setTextColor(0xDEDB, TFT_BLACK); background.drawString(data.btcPrice.c_str(), 300, 58, GFXFF); - printPoolData(); + if (lower_switch == 1) + printPoolData(); + else + printMemPoolFees(mElapsed); // Push prepared background to screen background.pushSprite(0, 0); } diff --git a/src/drivers/storage/SDCard.cpp b/src/drivers/storage/SDCard.cpp index 4552f8c..a1cda51 100644 --- a/src/drivers/storage/SDCard.cpp +++ b/src/drivers/storage/SDCard.cpp @@ -34,7 +34,9 @@ SDCard::SDCard(int ID):cardInitialized_(false),cardBusy_(false) } iSD_ = &SD; #endif // interface type +#ifndef NERDMINER_T_HMI initSDcard(); +#endif } SDCard::~SDCard() @@ -167,7 +169,14 @@ bool SDCard::initSDcard() #elif defined (BUILD_SDMMC_1) #warning SDMMC : 1 - bit mode is not always working. If you experience issues, try other modes. 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); +#endif Serial.println("SDCard: 1-Bit Mode."); } #elif defined (BUILD_SDSPI) diff --git a/src/monitor.cpp b/src/monitor.cpp index 0d129a0..35a76fd 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -335,13 +335,12 @@ String getPoolAPIUrl(void) { else { switch (Settings.PoolPort) { case 3333: - if (Settings.PoolAddress == "pool.vkbit.com") - poolAPIUrl = "https://vkbit.com/miner/"; - else if (Settings.PoolAddress == "pool.sethforprivacy.com") + if (Settings.PoolAddress == "pool.sethforprivacy.com") poolAPIUrl = "https://pool.sethforprivacy.com/api/client/"; // Add more cases for other addresses with port 3333 if needed break; case 2018: + // Local instance of public-pool.io on Umbrel or Start9 poolAPIUrl = "http://" + Settings.PoolAddress + ":2019/api/client/"; break; default: