From 7db42cc78830b6a8b7d8e66db9a8136c1fc4e5c8 Mon Sep 17 00:00:00 2001 From: WantClue Date: Sun, 20 Apr 2025 11:15:01 +0200 Subject: [PATCH 1/6] init --- main/http_server/http_server.c | 136 +++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/main/http_server/http_server.c b/main/http_server/http_server.c index d2029f9c1..a3fcd3f59 100644 --- a/main/http_server/http_server.c +++ b/main/http_server/http_server.c @@ -512,6 +512,133 @@ static esp_err_t POST_restart(httpd_req_t * req) return ESP_OK; } +/* Handler for system asic endpoint */ +static esp_err_t GET_system_asic(httpd_req_t *req) +{ + if (is_network_allowed(req) != ESP_OK) { + return httpd_resp_send_err(req, HTTPD_401_UNAUTHORIZED, "Unauthorized"); + } + + httpd_resp_set_type(req, "application/json"); + + // Set CORS headers + if (set_cors_headers(req) != ESP_OK) { + httpd_resp_send_500(req); + return ESP_OK; + } + + cJSON *root = cJSON_CreateObject(); + + // Add ASIC model to the JSON object + cJSON_AddStringToObject(root, "ASICModel", GLOBAL_STATE->asic_model_str); + + // Create arrays for frequency and voltage options based on ASIC model + cJSON *freqOptions = cJSON_CreateArray(); + cJSON *voltageOptions = cJSON_CreateArray(); + + // Set different frequency and voltage options based on ASIC model + if (strcmp(GLOBAL_STATE->asic_model_str, "BM1370") == 0) { + // BM1370 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(490)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(600)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(625)); + + // BM1370 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1000)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1060)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + } + else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1368") == 0) { + // BM1368 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); + + // BM1368 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + } + else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1366") == 0) { + // BM1366 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); + + // BM1366 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + } + else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1397") == 0) { + // BM1397 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(600)); + + // BM1397 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1350)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1400)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1450)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1500)); + } + else { + // Default options for other ASIC models + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + } + + // Add the arrays to the response + cJSON_AddItemToObject(root, "frequencyOptions", freqOptions); + cJSON_AddItemToObject(root, "voltageOptions", voltageOptions); + + const char *response = cJSON_Print(root); + httpd_resp_sendstr(req, response); + + free((void *)response); + cJSON_Delete(root); + return ESP_OK; +} + /* Simple handler for getting system handler */ static esp_err_t GET_system_info(httpd_req_t * req) { @@ -939,6 +1066,15 @@ esp_err_t start_rest_server(void * pvParameters) }; httpd_register_uri_handler(server, &system_info_get_uri); + /* URI handler for fetching system asic values */ + httpd_uri_t system_asic_get_uri = { + .uri = "/api/system/asic", + .method = HTTP_GET, + .handler = GET_system_asic, + .user_ctx = rest_context + }; + httpd_register_uri_handler(server, &system_asic_get_uri); + /* URI handler for WiFi scan */ httpd_uri_t wifi_scan_get_uri = { .uri = "/api/system/wifi/scan", From d1f68939ac2bc2724c4f91a83ff96b47a3e38e68 Mon Sep 17 00:00:00 2001 From: WantClue Date: Sun, 20 Apr 2025 11:30:22 +0200 Subject: [PATCH 2/6] add asic_api endpoint and create new api folder --- main/CMakeLists.txt | 2 + .../axe-os/api/system/asic_settings.c | 145 ++++++++++++++++++ .../axe-os/api/system/asic_settings.h | 13 ++ main/http_server/http_server.c | 134 +--------------- 4 files changed, 166 insertions(+), 128 deletions(-) create mode 100644 main/http_server/axe-os/api/system/asic_settings.c create mode 100644 main/http_server/axe-os/api/system/asic_settings.h diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index f3c8f26b4..9f3169750 100755 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -14,6 +14,7 @@ SRCS "logo.c" "./http_server/http_server.c" "./http_server/theme_api.c" + "./http_server/axe-os/api/system/asic_settings.c" "./self_test/self_test.c" "./tasks/stratum_task.c" "./tasks/create_jobs_task.c" @@ -35,6 +36,7 @@ INCLUDE_DIRS "." "tasks" "http_server" + "http_server/axe-os/api/system" "self_test" "../components/asic/include" "../components/connect/include" diff --git a/main/http_server/axe-os/api/system/asic_settings.c b/main/http_server/axe-os/api/system/asic_settings.c new file mode 100644 index 000000000..3d30546e4 --- /dev/null +++ b/main/http_server/axe-os/api/system/asic_settings.c @@ -0,0 +1,145 @@ +#include +#include "esp_log.h" +#include "esp_http_server.h" +#include "cJSON.h" +#include "global_state.h" +#include "asic.h" + +static const char *TAG = "asic_api"; +static GlobalState *GLOBAL_STATE = NULL; + +// Function declarations from http_server.c +extern esp_err_t is_network_allowed(httpd_req_t *req); +extern esp_err_t set_cors_headers(httpd_req_t *req); + +// Initialize the ASIC API with the global state +void asic_api_init(GlobalState *global_state) { + GLOBAL_STATE = global_state; +} + +/* Handler for system asic endpoint */ +esp_err_t GET_system_asic(httpd_req_t *req) +{ + if (is_network_allowed(req) != ESP_OK) { + return httpd_resp_send_err(req, HTTPD_401_UNAUTHORIZED, "Unauthorized"); + } + + httpd_resp_set_type(req, "application/json"); + + // Set CORS headers + if (set_cors_headers(req) != ESP_OK) { + httpd_resp_send_500(req); + return ESP_OK; + } + + cJSON *root = cJSON_CreateObject(); + + // Add ASIC model to the JSON object + cJSON_AddStringToObject(root, "ASICModel", GLOBAL_STATE->asic_model_str); + + // Create arrays for frequency and voltage options based on ASIC model + cJSON *freqOptions = cJSON_CreateArray(); + cJSON *voltageOptions = cJSON_CreateArray(); + + // Set different frequency and voltage options based on ASIC model + if (strcmp(GLOBAL_STATE->asic_model_str, "BM1370") == 0) { + // BM1370 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(490)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(600)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(625)); + + // BM1370 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1000)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1060)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + } + else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1368") == 0) { + // BM1368 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); + + // BM1368 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + } + else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1366") == 0) { + // BM1366 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); + + // BM1366 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + } + else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1397") == 0) { + // BM1397 frequency options + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(600)); + + // BM1397 voltage options + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1350)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1400)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1450)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1500)); + } + else { + // Default options for other ASIC models + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); + cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); + + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); + cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); + } + + // Add the arrays to the response + cJSON_AddItemToObject(root, "frequencyOptions", freqOptions); + cJSON_AddItemToObject(root, "voltageOptions", voltageOptions); + + const char *response = cJSON_Print(root); + httpd_resp_sendstr(req, response); + + free((void *)response); + cJSON_Delete(root); + return ESP_OK; +} diff --git a/main/http_server/axe-os/api/system/asic_settings.h b/main/http_server/axe-os/api/system/asic_settings.h new file mode 100644 index 000000000..22a2150c7 --- /dev/null +++ b/main/http_server/axe-os/api/system/asic_settings.h @@ -0,0 +1,13 @@ +#ifndef ASIC_API_SETTINGS_H_ +#define ASIC_API_SETTINGS_H_ + +#include +#include "global_state.h" + +// Function to handle the /api/system/asic endpoint +esp_err_t GET_system_asic(httpd_req_t *req); + +// Initialize the ASIC API with the global state +void asic_api_init(GlobalState *global_state); + +#endif // ASIC_API_H_ diff --git a/main/http_server/http_server.c b/main/http_server/http_server.c index a3fcd3f59..becec5763 100644 --- a/main/http_server/http_server.c +++ b/main/http_server/http_server.c @@ -36,6 +36,7 @@ #include "asic.h" #include "TPS546.h" #include "theme_api.h" // Add theme API include +#include "axe-os/api/system/asic_settings.h" #include "http_server.h" static const char * TAG = "http_server"; @@ -159,7 +160,7 @@ static uint32_t extract_origin_ip_addr(char *origin) return origin_ip_addr; } -static esp_err_t is_network_allowed(httpd_req_t * req) +esp_err_t is_network_allowed(httpd_req_t * req) { if (GLOBAL_STATE->SYSTEM_MODULE.ap_enabled == true) { ESP_LOGI(CORS_TAG, "Device in AP mode. Allowing CORS."); @@ -260,7 +261,7 @@ static esp_err_t set_content_type_from_file(httpd_req_t * req, const char * file return httpd_resp_set_type(req, type); } -static esp_err_t set_cors_headers(httpd_req_t * req) +esp_err_t set_cors_headers(httpd_req_t * req) { esp_err_t err; @@ -512,132 +513,6 @@ static esp_err_t POST_restart(httpd_req_t * req) return ESP_OK; } -/* Handler for system asic endpoint */ -static esp_err_t GET_system_asic(httpd_req_t *req) -{ - if (is_network_allowed(req) != ESP_OK) { - return httpd_resp_send_err(req, HTTPD_401_UNAUTHORIZED, "Unauthorized"); - } - - httpd_resp_set_type(req, "application/json"); - - // Set CORS headers - if (set_cors_headers(req) != ESP_OK) { - httpd_resp_send_500(req); - return ESP_OK; - } - - cJSON *root = cJSON_CreateObject(); - - // Add ASIC model to the JSON object - cJSON_AddStringToObject(root, "ASICModel", GLOBAL_STATE->asic_model_str); - - // Create arrays for frequency and voltage options based on ASIC model - cJSON *freqOptions = cJSON_CreateArray(); - cJSON *voltageOptions = cJSON_CreateArray(); - - // Set different frequency and voltage options based on ASIC model - if (strcmp(GLOBAL_STATE->asic_model_str, "BM1370") == 0) { - // BM1370 frequency options - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(490)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(600)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(625)); - - // BM1370 voltage options - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1000)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1060)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); - } - else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1368") == 0) { - // BM1368 frequency options - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); - - // BM1368 voltage options - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); - } - else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1366") == 0) { - // BM1366 frequency options - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); - - // BM1366 voltage options - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); - } - else if (strcmp(GLOBAL_STATE->asic_model_str, "BM1397") == 0) { - // BM1397 frequency options - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(475)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(485)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(500)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(525)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(550)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(575)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(600)); - - // BM1397 voltage options - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1100)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1150)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1350)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1400)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1450)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1500)); - } - else { - // Default options for other ASIC models - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(400)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(425)); - cJSON_AddItemToArray(freqOptions, cJSON_CreateNumber(450)); - - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1200)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1250)); - cJSON_AddItemToArray(voltageOptions, cJSON_CreateNumber(1300)); - } - - // Add the arrays to the response - cJSON_AddItemToObject(root, "frequencyOptions", freqOptions); - cJSON_AddItemToObject(root, "voltageOptions", voltageOptions); - - const char *response = cJSON_Print(root); - httpd_resp_sendstr(req, response); - - free((void *)response); - cJSON_Delete(root); - return ESP_OK; -} /* Simple handler for getting system handler */ static esp_err_t GET_system_info(httpd_req_t * req) @@ -1021,6 +896,9 @@ void websocket_log_handler() esp_err_t start_rest_server(void * pvParameters) { GLOBAL_STATE = (GlobalState *) pvParameters; + + // Initialize the ASIC API with the global state + asic_api_init(GLOBAL_STATE); const char * base_path = ""; bool enter_recovery = false; From dc2820c07785eefbddc053632657d1b70fa13245 Mon Sep 17 00:00:00 2001 From: WantClue Date: Sun, 20 Apr 2025 11:35:20 +0200 Subject: [PATCH 3/6] missed comment --- main/http_server/axe-os/api/system/asic_settings.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/http_server/axe-os/api/system/asic_settings.h b/main/http_server/axe-os/api/system/asic_settings.h index 22a2150c7..2bd55cd4f 100644 --- a/main/http_server/axe-os/api/system/asic_settings.h +++ b/main/http_server/axe-os/api/system/asic_settings.h @@ -10,4 +10,4 @@ esp_err_t GET_system_asic(httpd_req_t *req); // Initialize the ASIC API with the global state void asic_api_init(GlobalState *global_state); -#endif // ASIC_API_H_ +#endif // ASIC_API_SETTINGS_H_ From 0acf6cfcd91a6e98d04c9bf11ea26e640f554b5c Mon Sep 17 00:00:00 2001 From: WantClue Date: Tue, 22 Apr 2025 23:37:34 +0200 Subject: [PATCH 4/6] fix: remove hardcode freq and volt, add mapping of new api endpoint asic --- .../src/app/components/edit/edit.component.ts | 257 +++++++----------- .../axe-os/src/app/services/system.service.ts | 21 ++ 2 files changed, 122 insertions(+), 156 deletions(-) diff --git a/main/http_server/axe-os/src/app/components/edit/edit.component.ts b/main/http_server/axe-os/src/app/components/edit/edit.component.ts index b6ffc3852..471e6cbd7 100644 --- a/main/http_server/axe-os/src/app/components/edit/edit.component.ts +++ b/main/http_server/axe-os/src/app/components/edit/edit.component.ts @@ -2,7 +2,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ToastrService } from 'ngx-toastr'; -import { startWith, Subject, takeUntil } from 'rxjs'; +import { forkJoin, startWith, Subject, takeUntil } from 'rxjs'; import { LoadingService } from 'src/app/services/loading.service'; import { SystemService } from 'src/app/services/system.service'; import { eASICModel } from 'src/models/enum/eASICModel'; @@ -29,95 +29,24 @@ export class EditComponent implements OnInit, OnDestroy { @Input() uri = ''; - public BM1397DropdownFrequency = [ - { name: '400', value: 400 }, - { name: '425 (default)', value: 425 }, - { name: '450', value: 450 }, - { name: '475', value: 475 }, - { name: '485', value: 485 }, - { name: '500', value: 500 }, - { name: '525', value: 525 }, - { name: '550', value: 550 }, - { name: '575', value: 575 }, - { name: '590', value: 590 }, - { name: '600', value: 600 }, - { name: '610', value: 610 }, - { name: '620', value: 620 }, - { name: '630', value: 630 }, - { name: '640', value: 640 }, - { name: '650', value: 650 }, - ]; - - public BM1366DropdownFrequency = [ - { name: '400', value: 400 }, - { name: '425', value: 425 }, - { name: '450', value: 450 }, - { name: '475', value: 475 }, - { name: '485 (default)', value: 485 }, - { name: '500', value: 500 }, - { name: '525', value: 525 }, - { name: '550', value: 550 }, - { name: '575', value: 575 }, - ]; - - public BM1368DropdownFrequency = [ - { name: '400', value: 400 }, - { name: '425', value: 425 }, - { name: '450', value: 450 }, - { name: '475', value: 475 }, - { name: '490 (default)', value: 490 }, - { name: '500', value: 500 }, - { name: '525', value: 525 }, - { name: '550', value: 550 }, - { name: '575', value: 575 }, - ]; - - public BM1370DropdownFrequency = [ - { name: '400', value: 400 }, - { name: '490', value: 490 }, - { name: '525 (default)', value: 525 }, - { name: '550', value: 550 }, - { name: '575', value: 575 }, - //{ name: '596', value: 596 }, - { name: '600', value: 600 }, - { name: '625', value: 625 }, - ]; - - public BM1370CoreVoltage = [ - { name: '1000', value: 1000 }, - { name: '1060', value: 1060 }, - { name: '1100', value: 1100 }, - { name: '1150 (default)', value: 1150 }, - { name: '1200', value: 1200 }, - { name: '1250', value: 1250 }, - ]; - - public BM1397CoreVoltage = [ - { name: '1100', value: 1100 }, - { name: '1150', value: 1150 }, - { name: '1200', value: 1200 }, - { name: '1250', value: 1250 }, - { name: '1300', value: 1300 }, - { name: '1350', value: 1350 }, - { name: '1400', value: 1400 }, - { name: '1450', value: 1450 }, - { name: '1500', value: 1500 }, - ]; - public BM1366CoreVoltage = [ - { name: '1100', value: 1100 }, - { name: '1150', value: 1150 }, - { name: '1200 (default)', value: 1200 }, - { name: '1250', value: 1250 }, - { name: '1300', value: 1300 }, - ]; - public BM1368CoreVoltage = [ - { name: '1100', value: 1100 }, - { name: '1150', value: 1150 }, - { name: '1166 (default)', value: 1166 }, - { name: '1200', value: 1200 }, - { name: '1250', value: 1250 }, - { name: '1300', value: 1300 }, - ]; + // Store frequency and voltage options from API + public frequencyOptions: number[] = []; + public voltageOptions: number[] = []; + + // Default values for different ASIC models + private defaultFrequencies: Record = { + [eASICModel.BM1366]: 485, + [eASICModel.BM1368]: 490, + [eASICModel.BM1370]: 525, + [eASICModel.BM1397]: 425 + }; + + private defaultVoltages: Record = { + [eASICModel.BM1366]: 1200, + [eASICModel.BM1368]: 1166, + [eASICModel.BM1370]: 1150, + [eASICModel.BM1397]: 1200 + }; private destroy$ = new Subject(); @@ -166,47 +95,55 @@ export class EditComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.systemService.getInfo(this.uri) - .pipe( - this.loadingService.lockUIUntilComplete(), + // Fetch both system info and ASIC settings in parallel + forkJoin({ + info: this.systemService.getInfo(this.uri), + asicSettings: this.systemService.getAsicSettings(this.uri) + }) + .pipe( + this.loadingService.lockUIUntilComplete(), + takeUntil(this.destroy$) + ) + .subscribe(({ info, asicSettings }) => { + this.ASICModel = info.ASICModel; + + // Store the frequency and voltage options from the API + this.frequencyOptions = asicSettings.frequencyOptions; + this.voltageOptions = asicSettings.voltageOptions; + + // Check if overclock is enabled in NVS + if (info.overclockEnabled === 1) { + this.settingsUnlocked = true; + console.log( + '🎉 Overclock mode is enabled from NVS settings!\n' + + '⚡ Custom frequency and voltage values are available.' + ); + } + + this.form = this.fb.group({ + flipscreen: [info.flipscreen == 1], + invertscreen: [info.invertscreen == 1], + coreVoltage: [info.coreVoltage, [Validators.required]], + frequency: [info.frequency, [Validators.required]], + autofanspeed: [info.autofanspeed == 1, [Validators.required]], + fanspeed: [info.fanspeed, [Validators.required]], + temptarget: [info.temptarget, [Validators.required]], + overheat_mode: [info.overheat_mode, [Validators.required]] + }); + + this.form.controls['autofanspeed'].valueChanges.pipe( + startWith(this.form.controls['autofanspeed'].value), takeUntil(this.destroy$) - ) - .subscribe(info => { - this.ASICModel = info.ASICModel; - - // Check if overclock is enabled in NVS - if (info.overclockEnabled === 1) { - this.settingsUnlocked = true; - console.log( - '🎉 Overclock mode is enabled from NVS settings!\n' + - '⚡ Custom frequency and voltage values are available.' - ); + ).subscribe(autofanspeed => { + if (autofanspeed) { + this.form.controls['fanspeed'].disable(); + this.form.controls['temptarget'].enable(); + } else { + this.form.controls['fanspeed'].enable(); + this.form.controls['temptarget'].disable(); } - - this.form = this.fb.group({ - flipscreen: [info.flipscreen == 1], - invertscreen: [info.invertscreen == 1], - coreVoltage: [info.coreVoltage, [Validators.required]], - frequency: [info.frequency, [Validators.required]], - autofanspeed: [info.autofanspeed == 1, [Validators.required]], - fanspeed: [info.fanspeed, [Validators.required]], - temptarget: [info.temptarget, [Validators.required]], - overheat_mode: [info.overheat_mode, [Validators.required]] - }); - - this.form.controls['autofanspeed'].valueChanges.pipe( - startWith(this.form.controls['autofanspeed'].value), - takeUntil(this.destroy$) - ).subscribe(autofanspeed => { - if (autofanspeed) { - this.form.controls['fanspeed'].disable(); - this.form.controls['temptarget'].enable(); - } else { - this.form.controls['fanspeed'].enable(); - this.form.controls['temptarget'].disable(); - } - }); }); + }); } ngOnDestroy(): void { @@ -278,54 +215,62 @@ export class EditComponent implements OnInit, OnDestroy { } getDropdownFrequency() { - // Get base frequency options based on ASIC model - let options = []; - switch(this.ASICModel) { - case this.eASICModel.BM1366: options = [...this.BM1366DropdownFrequency]; break; - case this.eASICModel.BM1368: options = [...this.BM1368DropdownFrequency]; break; - case this.eASICModel.BM1370: options = [...this.BM1370DropdownFrequency]; break; - case this.eASICModel.BM1397: options = [...this.BM1397DropdownFrequency]; break; - default: return []; + if (!this.frequencyOptions.length) { + return []; } + // Convert frequency options from API to dropdown format + const options = this.frequencyOptions.map(freq => { + // Check if this is a default frequency for the current ASIC model + const isDefault = this.defaultFrequencies[this.ASICModel] === freq; + return { + name: isDefault ? `${freq} (default)` : `${freq}`, + value: freq + }; + }); + // Get current frequency value from form const currentFreq = this.form?.get('frequency')?.value; // If current frequency exists and isn't in the options if (currentFreq && !options.some(opt => opt.value === currentFreq)) { - options.push({ - name: `${currentFreq} (Custom)`, - value: currentFreq - }); - // Sort options by frequency value - options.sort((a, b) => a.value - b.value); + options.push({ + name: `${currentFreq} (Custom)`, + value: currentFreq + }); + // Sort options by frequency value + options.sort((a, b) => a.value - b.value); } return options; } getCoreVoltage() { - // Get base voltage options based on ASIC model - let options = []; - switch(this.ASICModel) { - case this.eASICModel.BM1366: options = [...this.BM1366CoreVoltage]; break; - case this.eASICModel.BM1368: options = [...this.BM1368CoreVoltage]; break; - case this.eASICModel.BM1370: options = [...this.BM1370CoreVoltage]; break; - case this.eASICModel.BM1397: options = [...this.BM1397CoreVoltage]; break; - default: return []; + if (!this.voltageOptions.length) { + return []; } + // Convert voltage options from API to dropdown format + const options = this.voltageOptions.map(voltage => { + // Check if this is a default voltage for the current ASIC model + const isDefault = this.defaultVoltages[this.ASICModel] === voltage; + return { + name: isDefault ? `${voltage} (default)` : `${voltage}`, + value: voltage + }; + }); + // Get current voltage value from form const currentVoltage = this.form?.get('coreVoltage')?.value; // If current voltage exists and isn't in the options if (currentVoltage && !options.some(opt => opt.value === currentVoltage)) { - options.push({ - name: `${currentVoltage} (Custom)`, - value: currentVoltage - }); - // Sort options by voltage value - options.sort((a, b) => a.value - b.value); + options.push({ + name: `${currentVoltage} (Custom)`, + value: currentVoltage + }); + // Sort options by voltage value + options.sort((a, b) => a.value - b.value); } return options; diff --git a/main/http_server/axe-os/src/app/services/system.service.ts b/main/http_server/axe-os/src/app/services/system.service.ts index f9e34a309..9d5298d75 100644 --- a/main/http_server/axe-os/src/app/services/system.service.ts +++ b/main/http_server/axe-os/src/app/services/system.service.ts @@ -120,6 +120,27 @@ export class SystemService { } + public getAsicSettings(uri: string = ''): Observable<{ + ASICModel: eASICModel; + frequencyOptions: number[]; + voltageOptions: number[]; + }> { + if (environment.production) { + return this.httpClient.get(`${uri}/api/system/asic`) as Observable<{ + ASICModel: eASICModel; + frequencyOptions: number[]; + voltageOptions: number[]; + }>; + } else { + // Mock data for development + return of({ + ASICModel: eASICModel.BM1366, + frequencyOptions: [400, 425, 450, 475, 485, 500, 525, 550, 575], + voltageOptions: [1100, 1150, 1200, 1250, 1300] + }).pipe(delay(1000)); + } + } + public getSwarmInfo(uri: string = ''): Observable<{ ip: string }[]> { return this.httpClient.get(`${uri}/api/swarm/info`) as Observable<{ ip: string }[]>; } From 23eb16e484d8bdfcee37013d0966d0d8b6034460 Mon Sep 17 00:00:00 2001 From: WantClue Date: Tue, 22 Apr 2025 23:54:59 +0200 Subject: [PATCH 5/6] fix: update openapi.yaml --- main/http_server/openapi.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/main/http_server/openapi.yaml b/main/http_server/openapi.yaml index 79987d0bf..38a48659e 100644 --- a/main/http_server/openapi.yaml +++ b/main/http_server/openapi.yaml @@ -467,6 +467,25 @@ paths: '500': description: Internal server error + /api/system/asic: + get: + summary: Get asic information + description: Returns current asic model and corresponding frequency and voltage + operationId: getSystemInfo + tags: + - asic_api + responses: + '200': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/SystemInfo' + '401': + description: Unauthorized - Client not in allowed network range + '500': + description: Internal server error + /api/system/restart: post: summary: Restart the system From e66ff6de9cd4c83a1384b85fadd574108d9ebf73 Mon Sep 17 00:00:00 2001 From: WantClue Date: Wed, 23 Apr 2025 00:02:46 +0200 Subject: [PATCH 6/6] add properties and example mock data output --- main/http_server/openapi.yaml | 65 +++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/main/http_server/openapi.yaml b/main/http_server/openapi.yaml index 38a48659e..4bd176deb 100644 --- a/main/http_server/openapi.yaml +++ b/main/http_server/openapi.yaml @@ -467,24 +467,53 @@ paths: '500': description: Internal server error - /api/system/asic: - get: - summary: Get asic information - description: Returns current asic model and corresponding frequency and voltage - operationId: getSystemInfo - tags: - - asic_api - responses: - '200': - description: Successful operation - content: - application/json: - schema: - $ref: '#/components/schemas/SystemInfo' - '401': - description: Unauthorized - Client not in allowed network range - '500': - description: Internal server error + /api/system/asic: + get: + summary: Get ASIC settings information + description: Returns current ASIC model and corresponding available frequency and voltage options + operationId: getAsicSettings + tags: + - system + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + required: + - ASICModel + - frequencyOptions + - voltageOptions + properties: + ASICModel: + type: string + description: ASIC model identifier + enum: + - BM1366 + - BM1368 + - BM1370 + - BM1397 + examples: + - "BM1366" + frequencyOptions: + type: array + description: Available frequency options for the ASIC model in MHz + items: + type: number + examples: + - [400, 425, 450, 475, 485, 500, 525, 550, 575] + voltageOptions: + type: array + description: Available voltage options for the ASIC model in millivolts + items: + type: number + examples: + - [1100, 1150, 1200, 1250, 1300] + '401': + description: Unauthorized - Client not in allowed network range + '500': + description: Internal server error /api/system/restart: post: