Skip to content

Commit ce7f0f9

Browse files
committed
Merge remote-tracking branch 'killerink/master' into splitt-module2
# Conflicts: # main/http_server/http_server.c # main/http_server/http_server.h # main/tasks/power_management_task.c # main/tasks/power_management_task.h # main/thermal/thermal.h
2 parents 773f540 + 99f9601 commit ce7f0f9

21 files changed

+470
-131
lines changed

main/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ SRCS
1414
"logo.c"
1515
"device_config.c"
1616
"./http_server/http_server.c"
17+
"./http_server/websocket.c"
1718
"./http_server/theme_api.c"
1819
"./http_server/axe-os/api/system/asic_settings.c"
1920
"./self_test/self_test.c"

main/device_config.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include <stdbool.h>
66
#include "esp_err.h"
77

8+
#define THERMAL_MAX_SENSORS 2
9+
810
typedef enum
911
{
1012
BM1397,

main/http_server/axe-os/src/app/components/home/home.component.html

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
<ng-template #noTemp>--</ng-template>
2+
13
<ng-container *ngIf="info$ | async as info">
24
<!-- Temp warning alert -->
35
<p-message *ngIf="info.overheat_mode" severity="error" styleClass="w-full mb-4 py-4 border-round-xl"
@@ -202,9 +204,13 @@ <h4 class="text-center">Heat</h4>
202204

203205
<div class="mb-3">
204206
<h6 class="flex justify-content-between mb-1">
205-
ASIC Temperature
207+
<ng-container *ngIf="info.temp2 > 0; else singleTemp">
208+
ASIC Temperature 1
209+
</ng-container>
210+
<ng-template #singleTemp>
211+
ASIC Temperature
212+
</ng-template>
206213
<span>
207-
<ng-template #noTemp>--</ng-template>
208214
<ng-container *ngIf="info.temp > 0; else noTemp">
209215
{{info.temp}} &deg;C
210216
</ng-container>
@@ -219,6 +225,24 @@ <h6 class="flex justify-content-between mb-1">
219225
</strong>
220226
</div>
221227

228+
<div class="mb-3" *ngIf="info.temp2 > 0">
229+
<h6 class="flex justify-content-between mb-1">
230+
ASIC Temperature 2
231+
<span>
232+
<ng-container *ngIf="info.temp2 > 0; else noTemp">
233+
{{info.temp2}} &deg;C
234+
</ng-container>
235+
</span>
236+
</h6>
237+
<p-progressBar [value]="(info.temp2 / maxTemp) * 100" [styleClass]="'p-progressbar--thin'">
238+
<ng-template pTemplate="content" let-value></ng-template>
239+
</p-progressBar>
240+
241+
<strong class="text-red-500" *ngIf="info.temp2 >= 70">
242+
Danger: High Temperature
243+
</strong>
244+
</div>
245+
222246
<div class="mb-3" *ngIf="info.vrTemp > 0">
223247
<h6 class="flex justify-content-between mb-1">
224248
Voltage Regulator Temperature<span>{{info.vrTemp}} &deg;C</span>

main/http_server/axe-os/src/app/components/home/home.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ export class HomeComponent {
279279
info.coreVoltageActual = parseFloat((info.coreVoltageActual / 1000).toFixed(2));
280280
info.coreVoltage = parseFloat((info.coreVoltage / 1000).toFixed(2));
281281
info.temp = parseFloat(info.temp.toFixed(1));
282+
info.temp2 = parseFloat(info.temp2.toFixed(1));
282283

283284
return info;
284285
}),
@@ -307,7 +308,7 @@ export class HomeComponent {
307308
this.pageDefaultTitle,
308309
info.hostname,
309310
(info.hashRate ? HashSuffixPipe.transform(info.hashRate * 1000000000) : false),
310-
(info.temp ? `${info.temp}${info.vrTemp ? `/${info.vrTemp}` : ''} °C` : false),
311+
(info.temp ? `${info.temp}${info.temp2 > -1 ? `/${info.temp2}` : ''}${info.vrTemp ? `/${info.vrTemp}` : ''} °C` : false),
311312
(!info.power_fault ? `${info.power} W` : false),
312313
(info.bestDiff ? info.bestDiff : false),
313314
].filter(Boolean).join(' • ')

main/http_server/axe-os/src/app/components/logs/logs.component.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { AfterViewChecked, Component, Input, OnInit, ElementRef, OnDestroy, ViewChild, HostListener } from '@angular/core';
22
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
33
import { Subscription } from 'rxjs';
4+
import { ToastrService } from 'ngx-toastr';
45
import { WebsocketService } from 'src/app/services/web-socket.service';
56

67
@Component({
@@ -34,6 +35,7 @@ export class LogsComponent implements OnInit, OnDestroy, AfterViewChecked {
3435
constructor(
3536
private fb: FormBuilder,
3637
private websocketService: WebsocketService,
38+
private toastr: ToastrService,
3739
) {}
3840

3941
ngOnInit(): void {
@@ -78,6 +80,9 @@ export class LogsComponent implements OnInit, OnDestroy, AfterViewChecked {
7880
if (this.logs.length > 256) {
7981
this.logs.shift();
8082
}
83+
},
84+
error: (error) => {
85+
this.toastr.error("Error opening websocket connection");
8186
}
8287
})
8388
}

main/http_server/axe-os/src/app/components/update/update.component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { HttpErrorResponse, HttpEventType } from '@angular/common/http';
21
import { Component, ViewChild } from '@angular/core';
2+
import { Observable, switchMap, shareReplay, map, timer, distinctUntilChanged } from 'rxjs';
3+
import { HttpErrorResponse, HttpEventType } from '@angular/common/http';
34
import { ToastrService } from 'ngx-toastr';
45
import { FileUploadHandlerEvent, FileUpload } from 'primeng/fileupload';
5-
import { map, Observable, shareReplay, startWith } from 'rxjs';
66
import { GithubUpdateService } from 'src/app/services/github-update.service';
77
import { LoadingService } from 'src/app/services/loading.service';
88
import { SystemService } from 'src/app/services/system.service';
@@ -42,7 +42,11 @@ export class UpdateComponent {
4242
return releases[0];
4343
}));
4444

45-
this.info$ = this.systemService.getInfo().pipe(shareReplay({refCount: true, bufferSize: 1}))
45+
this.info$ = timer(0, 5000).pipe(
46+
switchMap(() => this.systemService.getInfo()),
47+
distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),
48+
shareReplay(1)
49+
);
4650
}
4751

4852
otaUpdate(event: FileUploadHandlerEvent) {

main/http_server/axe-os/src/app/services/system.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export class SystemService {
2828
voltage: 5208.75,
2929
current: 2237.5,
3030
temp: 60,
31+
temp2: 60,
3132
vrTemp: 45,
3233
maxPower: 25,
3334
nominalVoltage: 5,

main/http_server/axe-os/src/app/services/web-socket.service.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,4 @@ export class WebsocketService {
1414
deserializer: (e: MessageEvent) => { return e.data }
1515
});
1616
}
17-
18-
19-
}
17+
}

main/http_server/axe-os/src/models/ISystemInfo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface ISystemInfo {
1212
voltage: number,
1313
current: number,
1414
temp: number,
15+
temp2: number,
1516
vrTemp: number,
1617
maxPower: number,
1718
nominalVoltage: number,

main/http_server/http_server.c

Lines changed: 9 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "vcore.h"
4242
#include "system.h"
4343
#include "power_management_module.h"
44+
#include "websocket.h"
4445
#include "system_module.h"
4546
#include "device_config.h"
4647
#include "wifi_module.h"
@@ -55,6 +56,8 @@ static const char * CORS_TAG = "CORS";
5556

5657
static char axeOSVersion[32];
5758

59+
static httpd_handle_t server = NULL;
60+
5861
/* Handler for WiFi scan endpoint */
5962
static esp_err_t GET_wifi_scan(httpd_req_t *req)
6063
{
@@ -92,10 +95,6 @@ static esp_err_t GET_wifi_scan(httpd_req_t *req)
9295
cJSON_Delete(root);
9396
return ESP_OK;
9497
}
95-
static httpd_handle_t server = NULL;
96-
QueueHandle_t log_queue = NULL;
97-
98-
static int fd = -1;
9998

10099
#define REST_CHECK(a, str, goto_tag, ...) \
101100
do { \
@@ -297,7 +296,6 @@ static esp_err_t set_content_type_from_file(httpd_req_t * req, const char * file
297296

298297
esp_err_t set_cors_headers(httpd_req_t * req)
299298
{
300-
301299
esp_err_t err;
302300

303301
err = httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
@@ -440,7 +438,6 @@ static esp_err_t handle_options_request(httpd_req_t * req)
440438

441439
static esp_err_t PATCH_update_settings(httpd_req_t * req)
442440
{
443-
444441
if (is_network_allowed(req) != ESP_OK) {
445442
return httpd_resp_send_err(req, HTTPD_401_UNAUTHORIZED, "Unauthorized");
446443
}
@@ -596,7 +593,6 @@ static esp_err_t POST_restart(httpd_req_t * req)
596593
return ESP_OK;
597594
}
598595

599-
600596
/* Simple handler for getting system handler */
601597
static esp_err_t GET_system_info(httpd_req_t * req)
602598
{
@@ -635,6 +631,7 @@ static esp_err_t GET_system_info(httpd_req_t * req)
635631
cJSON_AddNumberToObject(root, "voltage", POWER_MANAGEMENT_MODULE.voltage);
636632
cJSON_AddNumberToObject(root, "current", Power_get_current());
637633
cJSON_AddNumberToObject(root, "temp", POWER_MANAGEMENT_MODULE.chip_temp_avg);
634+
cJSON_AddNumberToObject(root, "temp2", POWER_MANAGEMENT_MODULE.chip_temp2_avg);
638635
cJSON_AddNumberToObject(root, "vrTemp", POWER_MANAGEMENT_MODULE.vr_temp);
639636
cJSON_AddNumberToObject(root, "maxPower", DEVICE_CONFIG.family.max_power);
640637
cJSON_AddNumberToObject(root, "nominalVoltage", DEVICE_CONFIG.family.nominal_voltage);
@@ -1008,86 +1005,6 @@ esp_err_t POST_OTA_update(httpd_req_t * req)
10081005
return ESP_OK;
10091006
}
10101007

1011-
int log_to_queue(const char * format, va_list args)
1012-
{
1013-
va_list args_copy;
1014-
va_copy(args_copy, args);
1015-
1016-
// Calculate the required buffer size
1017-
int needed_size = vsnprintf(NULL, 0, format, args_copy) + 1;
1018-
va_end(args_copy);
1019-
1020-
// Allocate the buffer dynamically
1021-
char * log_buffer = (char *) calloc(needed_size + 2, sizeof(char)); // +2 for potential \n and \0
1022-
if (log_buffer == NULL) {
1023-
return 0;
1024-
}
1025-
1026-
// Format the string into the allocated buffer
1027-
va_copy(args_copy, args);
1028-
vsnprintf(log_buffer, needed_size, format, args_copy);
1029-
va_end(args_copy);
1030-
1031-
// Ensure the log message ends with a newline
1032-
size_t len = strlen(log_buffer);
1033-
if (len > 0 && log_buffer[len - 1] != '\n') {
1034-
log_buffer[len] = '\n';
1035-
log_buffer[len + 1] = '\0';
1036-
len++;
1037-
}
1038-
1039-
// Print to standard output
1040-
printf("%s", log_buffer);
1041-
1042-
if (xQueueSendToBack(log_queue, (void*)&log_buffer, (TickType_t) 0) != pdPASS) {
1043-
if (log_buffer != NULL) {
1044-
free((void*)log_buffer);
1045-
}
1046-
}
1047-
1048-
return 0;
1049-
}
1050-
1051-
void send_log_to_websocket(char *message)
1052-
{
1053-
// Prepare the WebSocket frame
1054-
httpd_ws_frame_t ws_pkt;
1055-
memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t));
1056-
ws_pkt.payload = (uint8_t *)message;
1057-
ws_pkt.len = strlen(message);
1058-
ws_pkt.type = HTTPD_WS_TYPE_TEXT;
1059-
1060-
// Ensure server and fd are valid
1061-
if (server != NULL && fd >= 0) {
1062-
// Send the WebSocket frame asynchronously
1063-
if (httpd_ws_send_frame_async(server, fd, &ws_pkt) != ESP_OK) {
1064-
esp_log_set_vprintf(vprintf);
1065-
}
1066-
}
1067-
1068-
// Free the allocated buffer
1069-
free((void*)message);
1070-
}
1071-
1072-
/*
1073-
* This handler echos back the received ws data
1074-
* and triggers an async send if certain message received
1075-
*/
1076-
esp_err_t echo_handler(httpd_req_t * req)
1077-
{
1078-
if (is_network_allowed(req) != ESP_OK) {
1079-
return httpd_resp_send_err(req, HTTPD_401_UNAUTHORIZED, "Unauthorized");
1080-
}
1081-
1082-
if (req->method == HTTP_GET) {
1083-
ESP_LOGI(TAG, "Handshake done, the new connection was opened");
1084-
fd = httpd_req_to_sockfd(req);
1085-
esp_log_set_vprintf(log_to_queue);
1086-
return ESP_OK;
1087-
}
1088-
return ESP_OK;
1089-
}
1090-
10911008
// HTTP Error (404) Handler - Redirects all requests to the root page
10921009
esp_err_t http_404_error_handler(httpd_req_t * req, httpd_err_code_t err)
10931010
{
@@ -1102,29 +1019,6 @@ esp_err_t http_404_error_handler(httpd_req_t * req, httpd_err_code_t err)
11021019
return ESP_OK;
11031020
}
11041021

1105-
void websocket_log_handler()
1106-
{
1107-
while (true)
1108-
{
1109-
char *message;
1110-
if (xQueueReceive(log_queue, &message, (TickType_t) portMAX_DELAY) != pdPASS) {
1111-
if (message != NULL) {
1112-
free((void*)message);
1113-
}
1114-
vTaskDelay(10 / portTICK_PERIOD_MS);
1115-
continue;
1116-
}
1117-
1118-
if (fd == -1) {
1119-
free((void*)message);
1120-
vTaskDelay(100 / portTICK_PERIOD_MS);
1121-
continue;
1122-
}
1123-
1124-
send_log_to_websocket(message);
1125-
}
1126-
}
1127-
11281022
esp_err_t start_rest_server()
11291023
{
11301024

@@ -1143,13 +1037,13 @@ esp_err_t start_rest_server()
11431037
REST_CHECK(rest_context, "No memory for rest context", err);
11441038
strlcpy(rest_context->base_path, base_path, sizeof(rest_context->base_path));
11451039

1146-
log_queue = xQueueCreate(MESSAGE_QUEUE_SIZE, sizeof(char*));
1147-
11481040
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
11491041
config.uri_match_fn = httpd_uri_match_wildcard;
11501042
config.stack_size = 8192;
1151-
config.max_open_sockets = 10;
1043+
config.max_open_sockets = 20;
11521044
config.max_uri_handlers = 20;
1045+
config.close_fn = websocket_close_fn;
1046+
config.lru_purge_enable = true;
11531047

11541048
ESP_LOGI(TAG, "Starting HTTP Server");
11551049
REST_CHECK(httpd_start(&server, &config) == ESP_OK, "Start server failed", err_start);
@@ -1260,7 +1154,7 @@ esp_err_t start_rest_server()
12601154
httpd_uri_t ws = {
12611155
.uri = "/api/ws",
12621156
.method = HTTP_GET,
1263-
.handler = echo_handler,
1157+
.handler = websocket_handler,
12641158
.user_ctx = NULL,
12651159
.is_websocket = true
12661160
};
@@ -1296,7 +1190,7 @@ esp_err_t start_rest_server()
12961190
httpd_register_err_handler(server, HTTPD_404_NOT_FOUND, http_404_error_handler);
12971191

12981192
// Start websocket log handler thread
1299-
xTaskCreate(&websocket_log_handler, "websocket_log_handler", 4096, NULL, 2, NULL);
1193+
xTaskCreate(websocket_task, "websocket_task", 4096, server, 2, NULL);
13001194

13011195
// Start the DNS server that will redirect all queries to the softAP IP
13021196
dns_server_config_t dns_config = DNS_SERVER_CONFIG_SINGLE("*" /* all A queries */, "WIFI_AP_DEF" /* softAP netif ID */);

0 commit comments

Comments
 (0)