Skip to content

Commit

Permalink
Release NerdAxe v2.1.4
Browse files Browse the repository at this point in the history
- UI during initial selfTest
- Added error control on DS4432U & EMC2101 during selftest
- Added portal Screen
- Last UI changes on Settings screen & Portal screen
  • Loading branch information
BitMaker-hub committed May 19, 2024
1 parent e2877b7 commit 9b44f3a
Show file tree
Hide file tree
Showing 13 changed files with 505 additions and 109 deletions.
4 changes: 2 additions & 2 deletions components/connect/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ static void event_handler(void * arg, esp_event_base_t event_base, int32_t event
}
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t * event = (ip_event_got_ip_t *) event_data;
ESP_LOGI(TAG, "Bitaxe ip:" IPSTR, IP2STR(&event->ip_info.ip));
ESP_LOGI(TAG, "Nerdaxe ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
}
Expand All @@ -86,7 +86,7 @@ void generate_ssid(char * ssid)
esp_wifi_get_mac(ESP_IF_WIFI_AP, mac);

// Format the last 4 bytes of the MAC address as a hexadecimal string
snprintf(ssid, 32, "Bitaxe_%02X%02X", mac[4], mac[5]);
snprintf(ssid, 32, "Nerdaxe_%02X%02X", mac[4], mac[5]);
}

esp_netif_t * wifi_init_softap(void)
Expand Down
Binary file added esp-miner-factory-nerd101-v2.1.4.bin
Binary file not shown.
1 change: 1 addition & 0 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ SRCS
"./displays/images/ui_img_miningscreen2_png.c"
"./displays/images/ui_img_settingsscreen_png.c"
"./displays/images/ui_img_splashscreen2_png.c"
"./displays/images/ui_img_PortalScreen_png.c"


INCLUDE_DIRS
Expand Down
14 changes: 11 additions & 3 deletions main/DS4432U.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,17 @@ void DS4432U_read(void)
ESP_LOGI(TAG, "DS4432U+ OUT1 = 0x%02X", data[0]);
}

static void DS4432U_set(uint8_t val)
static esp_err_t DS4432U_set(uint8_t val)
{
ESP_LOGI(TAG, "Writing 0x%02X", val);
ESP_ERROR_CHECK(register_write_byte(DS4432U_OUT0_REG, val));
esp_err_t ret = register_write_byte(DS4432U_OUT0_REG, val);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to write 0x%02X to register 0x%02X, error: 0x%X", val, DS4432U_OUT0_REG, ret);
return ret;
}

ESP_LOGI(TAG, "Successfully wrote 0x%02X to register 0x%02X", val, DS4432U_OUT0_REG);
return ESP_OK;
}

bool DS4432U_set_vcore(float core_voltage)
Expand All @@ -139,7 +146,8 @@ bool DS4432U_set_vcore(float core_voltage)

ESP_LOGI(TAG, "Set ASIC voltage = %.3fV [0x%02X]", core_voltage, reg_setting);

DS4432U_set(reg_setting); /// eek!
esp_err_t ret = DS4432U_set(reg_setting); /// eek!
if (ret != ESP_OK) return false;

return true;
}
12 changes: 10 additions & 2 deletions main/EMC2101.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,23 @@ static esp_err_t register_write_byte(uint8_t reg_addr, uint8_t data)
}

// run this first. sets up the config register
void EMC2101_init(bool invertPolarity)
bool EMC2101_init(bool invertPolarity)
{

// set the TACH input
ESP_ERROR_CHECK(register_write_byte(EMC2101_REG_CONFIG, 0x04));
esp_err_t ret = register_write_byte(EMC2101_REG_CONFIG, 0x04);
if (ret != ESP_OK) {
ESP_LOGE("EMC2101", "Failed to write 0x%02X to EMC2101 register 0x%02X, error: 0x%X", 0x04, EMC2101_REG_CONFIG, ret);
return false;
}

ESP_LOGI("EMC2101", "Successfully wrote 0x%02X to EMC2101 register 0x%02X", 0x04, EMC2101_REG_CONFIG);


if (invertPolarity) {
ESP_ERROR_CHECK(register_write_byte(EMC2101_FAN_CONFIG, 0b00100011));
}
return true;
}

// takes a fan speed percent
Expand Down
2 changes: 1 addition & 1 deletion main/EMC2101.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ typedef enum
void EMC2101_set_fan_speed(float);
// void EMC2101_read(void);
uint16_t EMC2101_get_fan_speed(void);
void EMC2101_init(bool);
bool EMC2101_init(bool);
float EMC2101_get_external_temp(void);
uint8_t EMC2101_get_internal_temp(void);
#endif /* EMC2101_H_ */
175 changes: 149 additions & 26 deletions main/displays/displayDriver.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "lv_conf.h"
#include "../adc.h"
#include "esp_netif.h"
#include "nvs_config.h"
//#include "../system.h"
//#include "lvgl.h"

Expand All @@ -20,10 +21,11 @@
#include "ui_helpers.h"

static const char *TAG = "TDisplayS3";
static bool lvgl_update_enabled = true; // Set animations on at beginning
static bool animations_enabled = false;
static bool doCangeScreenFlag = false;


static int screenStatus = STATE_ONINIT;
static int NextScreen = 0;
char portalWifiName[30];

static void example_increase_lvgl_tick (void *arg);
static bool example_notify_lvgl_flush_ready (esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx);
Expand Down Expand Up @@ -64,18 +66,44 @@ void display_RefreshScreen() {
increase_lvgl_tick(); // Incrementa el tick según el periodo que definías antes
}

void changeScreen(void){ // * arg) {

if(screenStatus == SCREEN_MINING) {
enable_lvgl_animations(true); //AutoStops after loading the screen
_ui_screen_change(ui_SettingsScreen, LV_SCR_LOAD_ANIM_MOVE_LEFT, 350, 0);
screenStatus = SCREEN_SETTINGS; // Actualiza la pantalla actual
ESP_LOGI("UI", "NewScreen Settings displayed");
} else if(screenStatus == SCREEN_SETTINGS) {
enable_lvgl_animations(true); //AutoStops after loading the screen
_ui_screen_change(ui_MiningScreen, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 350, 0);
screenStatus = SCREEN_MINING; // Actualiza la pantalla actual
ESP_LOGI("UI", "NewScreen Mining displayed");
}

}

static void lvglTimerTask(void* param)
{
int64_t myLastTime = esp_timer_get_time();
//int64_t current_time = esp_timer_get_time();

//Check if screen is changing to avoid problems during change
//if ((current_time - last_screen_change_time) < 1500000) return; // 1500000 microsegundos = 1500 ms = 1.5s - No cambies pantalla
//last_screen_change_time = current_time;

int32_t elapsed_Ani_cycles = 0;
while(1) {
if(lvgl_update_enabled) {
//int32_t elapsedTimeInMilliseconds = (esp_timer_get_time() - myLastTime) / 1000;
//if(elapsedTimeInMilliseconds>20) lv_tick_inc(TDISPLAYS3_LVGL_TICK_PERIOD_MS);
//else lv_tick_inc(elapsedTimeInMilliseconds);

//Enabled when change screen animation is activated
if(animations_enabled) {
increase_lvgl_tick();
lv_timer_handler(); // Process pending LVGL tasks
vTaskDelay(15 / portTICK_PERIOD_MS); // Delay during animations

if(elapsed_Ani_cycles++>80) {
//After 1s aprox stop animations
animations_enabled = false;
elapsed_Ani_cycles = 0;
}
}
else{
if(doCangeScreenFlag) {
Expand All @@ -85,12 +113,67 @@ static void lvglTimerTask(void* param)
vTaskDelay(200 / portTICK_PERIOD_MS); // Delay waiting animation trigger
}

if((screenStatus > STATE_INIT_OK)) continue; //Doesn't need to do the initial animation screens

//Screen initial process
int32_t elapsed = (esp_timer_get_time() - myLastTime) / 1000;
switch(screenStatus){
case STATE_ONINIT: //First splash Screen
if(elapsed > 3000) {
ESP_LOGI(TAG, "Changing Screen to SPLASH2");
if (ui_Splash2 == NULL) ui_Splash2_screen_init();
enable_lvgl_animations(true);
_ui_screen_change(ui_Splash2, LV_SCR_LOAD_ANIM_FADE_ON, 500, 0);
screenStatus = STATE_SPLASH1;
myLastTime = esp_timer_get_time();
}
break;
case STATE_SPLASH1: //Second splash screen
if(elapsed > 3000) {
//Init done, wait until on portal or mining is shown
screenStatus = STATE_INIT_OK;
ESP_LOGI(TAG, "Changing Screen to WAIT SELECTION");
lv_obj_clean(ui_Splash1);
ui_Splash1 = NULL;
}
break;
case STATE_INIT_OK: //Show portal
if(NextScreen == SCREEN_PORTAL) {
ESP_LOGI(TAG, "Changing Screen to Show Portal");
screenStatus = SCREEN_PORTAL;
if (ui_PortalScreen == NULL) {
ui_Portal_screen_init();
}
lv_label_set_text(ui_lbSSID, portalWifiName); // Actualiza el label
enable_lvgl_animations(true);
_ui_screen_change(ui_PortalScreen, LV_SCR_LOAD_ANIM_FADE_ON, 500, 0);
lv_obj_clean(ui_Splash2);
ui_Splash2 = NULL;
}
else if(NextScreen == SCREEN_MINING){
//Show Mining screen
ESP_LOGI(TAG, "Changing Screen to Mining screen");
screenStatus = SCREEN_MINING;
if (ui_MiningScreen == NULL) {
ui_MiningScreen_screen_init();
}
if (ui_SettingsScreen == NULL) {
ui_SettingsScreen_screen_init();
}
enable_lvgl_animations(true);
_ui_screen_change(ui_MiningScreen, LV_SCR_LOAD_ANIM_FADE_ON, 500, 0);
lv_obj_clean(ui_Splash2);
ui_Splash2 = NULL;
}
break;

}
}
}

// Función para activar las actualizaciones
void enable_lvgl_animations(bool enable) {
lvgl_update_enabled = enable;
animations_enabled = enable;
}

static void main_creatSysteTasks(void)
Expand Down Expand Up @@ -277,9 +360,36 @@ void display_updateTime(SystemModule * module){

}

void display_updateCurrentSettings(GlobalState * GLOBAL_STATE){
char strData[20];
if(ui_SettingsScreen == NULL) return;

lv_label_set_text(ui_lbPoolSet, GLOBAL_STATE->SYSTEM_MODULE.pool_url); // Update label

snprintf(strData, sizeof(strData), "%d", GLOBAL_STATE->SYSTEM_MODULE.pool_port);
lv_label_set_text(ui_lbPortSet, strData); // Update label

snprintf(strData, sizeof(strData), "%d", nvs_config_get_u16(NVS_CONFIG_ASIC_FREQ, CONFIG_ASIC_FREQUENCY));
lv_label_set_text(ui_lbFreqSet, strData); // Update label

snprintf(strData, sizeof(strData), "%d", nvs_config_get_u16(NVS_CONFIG_ASIC_VOLTAGE, CONFIG_ASIC_VOLTAGE));
lv_label_set_text(ui_lbVcoreSet, strData); // Update label

uint16_t auto_fan_speed = nvs_config_get_u16(NVS_CONFIG_AUTO_FAN_SPEED, 1);
if(auto_fan_speed == 1) lv_label_set_text(ui_lbFanSet, "AUTO"); // Update label
else {
snprintf(strData, sizeof(strData), "%d", nvs_config_get_u16(NVS_CONFIG_FAN_SPEED, 100));
lv_label_set_text(ui_lbFanSet, strData); // Update label
}

}

void display_updateGlobalState(GlobalState * GLOBAL_STATE){
char strData[20];

if(ui_MiningScreen == NULL) return;
if(ui_SettingsScreen == NULL) return;

SystemModule * module = &GLOBAL_STATE->SYSTEM_MODULE;
PowerManagementModule * power_management = &GLOBAL_STATE->POWER_MANAGEMENT_MODULE;

Expand Down Expand Up @@ -310,36 +420,49 @@ void display_updateGlobalState(GlobalState * GLOBAL_STATE){
void display_updateIpAddress(char * ip_address_str){
char strData[20];

if(ui_MiningScreen == NULL) return;
if(ui_SettingsScreen == NULL) return;

snprintf(strData, sizeof(strData), "%s", ip_address_str);
lv_label_set_text(ui_lbIP, ip_address_str); // Update label
lv_label_set_text(ui_lbIPSet, ip_address_str); // Update label

}

/*
void updateScreensTask(void *pvParameter) {
int hash = 0;
while (1) {
vTaskDelay(pdMS_TO_TICKS(1000)); // Espera un segundo
//lv_label_set_text(ui_lbTime,
}
void display_log_message(const char *message)
{
screenStatus = SCREEN_LOG;
if(ui_LogScreen == NULL) ui_LogScreen_init();
lv_label_set_text(ui_LogLabel, message);
enable_lvgl_animations(true);
_ui_screen_change(ui_LogScreen, LV_SCR_LOAD_ANIM_NONE, 500, 0);
}

void startUpdateScreenTask() {
xTaskCreate(updateScreensTask, "updateScreensTask", 2048, NULL, 5, NULL);
}*/

void display_MiningScreen(void)
{
//Only called once at the beggining from system lib
if (ui_MiningScreen == NULL) ui_MiningScreen_screen_init();
if (ui_SettingsScreen == NULL) ui_SettingsScreen_screen_init();
NextScreen = SCREEN_MINING;
}

void display_PortalScreen(const char *message)
{
NextScreen = SCREEN_PORTAL;
strcpy(portalWifiName, message);
}
void display_UpdateWifiStatus(const char *message)
{
if(ui_lbConnect != NULL)
lv_label_set_text(ui_lbConnect, message); // Actualiza el label
display_RefreshScreen();

}

// ISR Handler para el botón
static void boton_isr_handler(void* arg) {
//ESP_LOGI("UI", "Button pressed changing screen");
doCangeScreenFlag = true;
lvgl_update_enabled = false;
//lv_async_call(changeScreen, NULL);
doCangeScreenFlag=true;
}

void buttons_init(void) {
Expand Down
13 changes: 13 additions & 0 deletions main/displays/displayDriver.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,14 @@
#define TDISPLAYS3_LCD_CMD_BITS 8
#define TDISPLAYS3_LCD_PARAM_BITS 8

//Display screens status
#define STATE_ONINIT 0
#define STATE_SPLASH1 1
#define STATE_INIT_OK 2
#define SCREEN_PORTAL 3
#define SCREEN_MINING 4
#define SCREEN_SETTINGS 5
#define SCREEN_LOG 6


/* FUNCTIONS DECLARATION -----------------------------------------------------*/
Expand All @@ -57,9 +65,14 @@ void display_updateHashrate(SystemModule * module, float power);
void display_updateShares(SystemModule * module);
void display_updateTime(SystemModule * module);
void display_updateGlobalState(GlobalState * GLOBAL_STATE);
void display_updateCurrentSettings(GlobalState * GLOBAL_STATE);
void display_updateIpAddress(char * ip_address_str);
void enable_lvgl_animations(bool enable);
void display_RefreshScreen(void);
void display_log_message(const char *message);
void display_MiningScreen(void);
void display_PortalScreen(const char *message);
void display_UpdateWifiStatus(const char *message);



Expand Down
Loading

0 comments on commit 9b44f3a

Please sign in to comment.