add restart to factory partition (if there is one)

This commit is contained in:
MichaelDvP
2022-11-05 15:56:08 +01:00
parent 342cf12ae7
commit 1d4634a76c
6 changed files with 50 additions and 3 deletions

View File

@@ -12,6 +12,10 @@ export function restart(): AxiosPromise<void> {
return AXIOS.post('/restart');
}
export function partition(): AxiosPromise<void> {
return AXIOS.post('/partition');
}
export function factoryReset(): AxiosPromise<void> {
return AXIOS.post('/factoryReset');
}

View File

@@ -87,7 +87,19 @@ const SystemStatusForm: FC = () => {
setProcessing(true);
try {
await SystemApi.restart();
enqueueSnackbar(LL.APPLICATION_RESTARTING(), { variant: 'info' });
setRestarting(true);
} catch (error) {
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_LOADING()), { variant: 'error' });
} finally {
setConfirmRestart(false);
setProcessing(false);
}
};
const partition = async () => {
setProcessing(true);
try {
await SystemApi.partition();
setRestarting(true);
} catch (error) {
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_LOADING()), { variant: 'error' });
@@ -121,6 +133,17 @@ const SystemStatusForm: FC = () => {
>
{LL.RESTART()}
</Button>
{data?.has_loader && (
<Button
startIcon={<PowerSettingsNewIcon />}
variant="outlined"
onClick={partition}
disabled={processing}
color="primary"
>
EMS-ESP-Loader
</Button>
)}
</DialogActions>
</Dialog>
);

View File

@@ -25,6 +25,7 @@ import * as EMSESP from './api';
import { Settings, BOARD_PROFILES } from './types';
import { useI18nContext } from '../i18n/i18n-react';
import RestartMonitor from '../framework/system/RestartMonitor';
export function boardProfileSelectItems() {
return Object.keys(BOARD_PROFILES).map((code) => (
@@ -39,6 +40,7 @@ const SettingsApplication: FC = () => {
read: EMSESP.readSettings,
update: EMSESP.writeSettings
});
const [restarting, setRestarting] = useState<boolean>();
const { LL } = useI18nContext();
@@ -106,7 +108,7 @@ const SettingsApplication: FC = () => {
validateAndSubmit();
try {
await EMSESP.restart();
enqueueSnackbar(LL.APPLICATION_RESTARTING(), { variant: 'info' });
setRestarting(true);
} catch (error) {
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });
}
@@ -617,7 +619,7 @@ const SettingsApplication: FC = () => {
return (
<SectionContent title={LL.APPLICATION_SETTINGS()} titleGutter>
{content()}
{restarting ? <RestartMonitor /> : content()}
</SectionContent>
);
};

View File

@@ -15,6 +15,7 @@ export interface SystemStatus {
free_mem: number;
psram_size?: number;
free_psram?: number;
has_loader: boolean;
}
export interface OTASettings {

View File

@@ -1,12 +1,27 @@
#include <RestartService.h>
#include <esp_ota_ops.h>
using namespace std::placeholders; // for `_1` etc
RestartService::RestartService(AsyncWebServer * server, SecurityManager * securityManager) {
server->on(RESTART_SERVICE_PATH, HTTP_POST, securityManager->wrapRequest(std::bind(&RestartService::restart, this, _1), AuthenticationPredicates::IS_ADMIN));
server->on(PARTITION_SERVICE_PATH,
HTTP_POST,
securityManager->wrapRequest(std::bind(&RestartService::partition, this, _1), AuthenticationPredicates::IS_ADMIN));
}
void RestartService::restart(AsyncWebServerRequest * request) {
request->onDisconnect(RestartService::restartNow);
request->send(200);
}
void RestartService::partition(AsyncWebServerRequest * request) {
const esp_partition_t * factory_partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);
if (!factory_partition) {
request->send(400); // bad request
return;
}
esp_ota_set_boot_partition(factory_partition);
request->onDisconnect(RestartService::restartNow);
request->send(200);
}

View File

@@ -8,6 +8,7 @@
#include <SecurityManager.h>
#define RESTART_SERVICE_PATH "/rest/restart"
#define PARTITION_SERVICE_PATH "/rest/partition"
class RestartService {
public:
@@ -21,6 +22,7 @@ class RestartService {
private:
void restart(AsyncWebServerRequest * request);
void partition(AsyncWebServerRequest * request);
};
#endif