Skip to content

Commit b1d666d

Browse files
committed
alova - refactor wifi scan
1 parent ed55a96 commit b1d666d

14 files changed

+58
-60
lines changed

interface/src/api/endpoints.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ export const alovaInstance = createAlova({
3535

3636
responded: {
3737
onSuccess: async (response) => {
38-
if (response.status === 202) {
39-
throw new Error('Wait');
40-
} else if (response.status === 205) {
38+
// if (response.status === 202) {
39+
// throw new Error('Wait'); // wifi scan in progress
40+
// } else
41+
if (response.status === 205) {
4142
throw new Error('Reboot required');
4243
} else if (response.status === 400) {
4344
throw new Error('Request Failed');

interface/src/api/network.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import type { WiFiNetworkList, NetworkSettings, NetworkStatus } from 'types';
44

55
export const readNetworkStatus = () => alovaInstance.Get<NetworkStatus>('/rest/networkStatus');
66
export const scanNetworks = () => alovaInstance.Get('/rest/scanNetworks');
7-
export const listNetworks = () => alovaInstance.Get<WiFiNetworkList>('/rest/listNetworks');
7+
export const listNetworks = () =>
8+
alovaInstance.Get<WiFiNetworkList>('/rest/listNetworks', {
9+
name: 'listNetworks'
10+
});
811
export const readNetworkSettings = () =>
912
alovaInstance.Get<NetworkSettings>('/rest/networkSettings', { name: 'networkSettings' });
1013
export const updateNetworkSettings = (wifiSettings: NetworkSettings) =>

interface/src/api/security.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { AxiosPromise } from 'axios';
33

44
import type { SecuritySettings, Token } from 'types';
55

6-
// TODO move to Alova
6+
// TODO move these 3 to Alova
77
export function readSecuritySettings(): AxiosPromise<SecuritySettings> {
88
return AXIOS.get('/securitySettings');
99
}

interface/src/api/system.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@ import type { AxiosPromise } from 'axios';
44

55
import type { OTASettings, SystemStatus, LogSettings } from 'types';
66

7-
export const readSystemStatus = (timeout?: number) =>
8-
alovaInstance.Get<SystemStatus>('/rest/systemStatus', {
9-
params: { timeout }
10-
});
7+
// SystemStatus - also used to ping in Restart monitor
8+
export const readSystemStatus = () => alovaInstance.Get<SystemStatus>('/rest/systemStatus');
119

1210
// commands
1311
export const restart = () => alovaInstance.Post('/rest/restart');
@@ -23,5 +21,6 @@ export const readLogSettings = () => alovaInstance.Get<LogSettings>(`/rest/logSe
2321
export const updateLogSettings = (data: any) => alovaInstance.Post('/rest/logSettings', data);
2422
export const fetchLog = () => alovaInstance.Post('/rest/fetchLog');
2523

24+
// TODO fileupload move to Alova
2625
export const uploadFile = (file: File, config?: FileUploadConfig): AxiosPromise<void> =>
2726
startUploadFile('/uploadFile', file, config);

interface/src/framework/network/WiFiNetworkScanner.tsx

+19-30
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import PermScanWifiIcon from '@mui/icons-material/PermScanWifi';
22
import { Button } from '@mui/material';
3-
import { useRequest } from 'alova';
4-
import { useState, useCallback, useRef } from 'react';
5-
import { toast } from 'react-toastify';
3+
// eslint-disable-next-line import/named
4+
import { updateState, useRequest } from 'alova';
5+
import { useState, useRef } from 'react';
66

77
import WiFiNetworkSelector from './WiFiNetworkSelector';
88
import type { FC } from 'react';
@@ -15,48 +15,37 @@ const NUM_POLLS = 10;
1515
const POLLING_FREQUENCY = 1000;
1616

1717
const WiFiNetworkScanner: FC = () => {
18-
const { LL } = useI18nContext();
19-
2018
const pollCount = useRef(0);
19+
const { LL } = useI18nContext();
2120
const [errorMessage, setErrorMessage] = useState<string>();
2221

23-
const { data: networkList, send: getNetworkList } = useRequest(NetworkApi.listNetworks, {
22+
const { send: scanNetworks, onComplete: onCompleteScanNetworks } = useRequest(NetworkApi.scanNetworks); // is called on page load to start network scan
23+
const {
24+
data: networkList,
25+
send: getNetworkList,
26+
onSuccess: onSuccessNetworkList
27+
} = useRequest(NetworkApi.listNetworks, {
2428
immediate: false
2529
});
2630

27-
const {
28-
send: scanNetworks,
29-
onSuccess: onSuccessScanNetworks,
30-
onError: onErrorScanNetworks
31-
} = useRequest(NetworkApi.scanNetworks);
32-
33-
const finishedWithError = useCallback((message: string) => {
34-
toast.error(message);
35-
setErrorMessage(message);
36-
pollCount.current = 0;
37-
}, []);
38-
39-
onErrorScanNetworks((event) => {
40-
console.log('onErrorScanNetworks'); // TODO fix
41-
if (event.error?.message === 'Wait') {
42-
// 202
43-
console.log('not ready...: ', event.error?.message); // TODO fix
31+
onSuccessNetworkList((event) => {
32+
if (!event.data) {
4433
const completedPollCount = pollCount.current + 1;
4534
if (completedPollCount < NUM_POLLS) {
4635
pollCount.current = completedPollCount;
47-
setTimeout(scanNetworks, POLLING_FREQUENCY);
36+
setTimeout(getNetworkList, POLLING_FREQUENCY);
4837
} else {
49-
finishedWithError(LL.PROBLEM_LOADING());
38+
setErrorMessage(LL.PROBLEM_LOADING());
39+
pollCount.current = 0;
5040
}
51-
} else {
52-
finishedWithError(LL.PROBLEM_LOADING());
5341
}
5442
});
5543

56-
onSuccessScanNetworks(() => {
57-
console.log('onCompleteScanNetworks'); // TODO fix
44+
onCompleteScanNetworks(() => {
5845
pollCount.current = 0;
59-
void getNetworkList(); // fetch the list
46+
setErrorMessage(undefined);
47+
updateState('listNetworks', () => undefined);
48+
void getNetworkList();
6049
});
6150

6251
const renderNetworkScanner = () => {

interface/src/framework/security/ManageUsersForm.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { useRest } from 'utils';
2323
import { createUserValidator } from 'validators';
2424

2525
const ManageUsersForm: FC = () => {
26+
// TODO move to Alova
2627
const { loadData, saving, data, setData, saveData, errorMessage } = useRest<SecuritySettings>({
2728
read: SecurityApi.readSecuritySettings,
2829
update: SecurityApi.updateSecuritySettings

interface/src/framework/security/SecuritySettingsForm.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const SecuritySettingsForm: FC = () => {
1818
const { LL } = useI18nContext();
1919

2020
const [fieldErrors, setFieldErrors] = useState<ValidateFieldsError>();
21+
// TODO move to Alova
2122
const { loadData, saving, data, setData, origData, dirtyFlags, blocker, setDirtyFlags, saveData, errorMessage } =
2223
useRest<SecuritySettings>({
2324
read: SecurityApi.readSecuritySettings,

interface/src/framework/system/GeneralFileUpload.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { useI18nContext } from 'i18n/i18n-react';
1212
import * as EMSESP from 'project/api';
1313

1414
interface UploadFileProps {
15-
// TODO fileupload upload move to alova
15+
// TODO fileupload move to alova
1616
uploadGeneralFile: (file: File, config?: FileUploadConfig) => AxiosPromise<void>;
1717
}
1818

interface/src/framework/system/RestartMonitor.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { FormLoader } from 'components';
88
import { useI18nContext } from 'i18n/i18n-react';
99

1010
const RESTART_TIMEOUT = 2 * 60 * 1000;
11-
const POLL_TIMEOUT = 2000;
1211
const POLL_INTERVAL = 5000;
1312

1413
const RestartMonitor: FC = () => {
@@ -17,14 +16,15 @@ const RestartMonitor: FC = () => {
1716

1817
const { LL } = useI18nContext();
1918

20-
const { send: readSystemStatus } = useRequest((timeout) => SystemApi.readSystemStatus(timeout), {
19+
const { send: readSystemStatus } = useRequest(SystemApi.readSystemStatus(), {
20+
force: true,
2121
immediate: false
2222
});
2323

2424
const timeoutAt = useRef(new Date().getTime() + RESTART_TIMEOUT);
2525
const poll = useRef(async () => {
2626
try {
27-
await readSystemStatus(POLL_TIMEOUT);
27+
await readSystemStatus();
2828
document.location.href = '/fileUpdated';
2929
} catch (error) {
3030
if (new Date().getTime() < timeoutAt.current) {

interface/src/framework/system/SystemStatusForm.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ const SystemStatusForm: FC = () => {
7373
immediate: false
7474
});
7575

76-
const { data: data, send: loadData, error } = useRequest(SystemApi.readSystemStatus);
76+
const { data: data, send: loadData, error } = useRequest(SystemApi.readSystemStatus, { force: true });
7777

7878
useEffect(() => {
7979
void axios.get(VERSIONCHECK_ENDPOINT).then((response) => {

interface/src/project/SettingsEntities.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,7 @@ const SettingsEntities: FC = () => {
184184
}
185185

186186
function showHex(value: number, digit: number) {
187-
return digit === 4
188-
? '0x' + ('000' + value.toString(16).toUpperCase()).slice(-4)
189-
: '0x' + ('0' + value.toString(16).toUpperCase()).slice(-2);
187+
return '0x' + value.toString(16).toUpperCase().padStart(digit, '0');
190188
}
191189

192190
const renderEntity = () => {
@@ -212,7 +210,7 @@ const SettingsEntities: FC = () => {
212210
<Row key={ei.name} item={ei} onClick={() => editEntityItem(ei)}>
213211
<Cell>{ei.name}</Cell>
214212
<Cell>{showHex(ei.device_id as number, 2)}</Cell>
215-
<Cell>{showHex(ei.type_id as number, 4)}</Cell>
213+
<Cell>{showHex(ei.type_id as number, 3)}</Cell>
216214
<Cell>{ei.offset}</Cell>
217215
<Cell>{formatValue(ei.value, ei.uom)}</Cell>
218216
</Row>

interface/src/project/SettingsEntitiesDialog.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ const SettingsEntitiesDialog = ({
5858
// convert to hex strings straight away
5959
setEditItem({
6060
...selectedItem,
61-
device_id: selectedItem.device_id.toString(16).toUpperCase().slice(-2),
62-
type_id: selectedItem.type_id.toString(16).toUpperCase().slice(-4)
61+
device_id: selectedItem.device_id.toString(16).toUpperCase(),
62+
type_id: selectedItem.type_id.toString(16).toUpperCase()
6363
});
6464
}
6565
}, [open, selectedItem]);

lib/framework/WiFiScanner.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ WiFiScanner::WiFiScanner(AsyncWebServer * server, SecurityManager * securityMana
1212
};
1313

1414
void WiFiScanner::scanNetworks(AsyncWebServerRequest * request) {
15+
request->send(202); // special code to indicate scan in progress
16+
1517
if (WiFi.scanComplete() != -1) {
1618
WiFi.scanDelete();
1719
WiFi.scanNetworks(true);
1820
}
19-
request->send(202); // special code to indicate scan in progress
2021
}
2122

2223
void WiFiScanner::listNetworks(AsyncWebServerRequest * request) {

mock-api/server.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,8 @@ const FACTORY_RESET_ENDPOINT = REST_ENDPOINT_ROOT + 'factoryReset';
271271
const UPLOAD_FILE_ENDPOINT = REST_ENDPOINT_ROOT + 'uploadFile';
272272
const SIGN_IN_ENDPOINT = REST_ENDPOINT_ROOT + 'signIn';
273273
const GENERATE_TOKEN_ENDPOINT = REST_ENDPOINT_ROOT + 'generateToken';
274-
const system_status = {
274+
275+
let system_status = {
275276
emsesp_version: '3.6.0-demo',
276277
esp_platform: 'ESP32',
277278
max_alloc_heap: 89,
@@ -2023,19 +2024,20 @@ rest_server.post(NETWORK_SETTINGS_ENDPOINT, (req, res) => {
20232024
res.sendStatus(200);
20242025
});
20252026
rest_server.get(LIST_NETWORKS_ENDPOINT, (req, res) => {
2026-
countWifiScanPoll = 0; // stop the poll
2027-
res.json(list_networks);
2028-
});
2029-
rest_server.get(SCAN_NETWORKS_ENDPOINT, (req, res) => {
2030-
console.log('scan networks');
2031-
if (countWifiScanPoll++ === 2) {
2027+
if (countWifiScanPoll++ === 4) {
20322028
console.log('done, have list');
2033-
res.sendStatus(200); // ready to send list
2029+
res.json(list_networks); // send list
20342030
} else {
20352031
console.log('...waiting #' + countWifiScanPoll);
2036-
res.sendStatus(202); // waiting....
2032+
res.sendStatus(200); // waiting....
20372033
}
20382034
});
2035+
// TODO should be a post as its a command?
2036+
rest_server.get(SCAN_NETWORKS_ENDPOINT, (req, res) => {
2037+
console.log('start scan networks');
2038+
countWifiScanPoll = 0; // stop the poll
2039+
res.sendStatus(200); // always 202, poll for list
2040+
});
20392041

20402042
// AP
20412043
rest_server.get(AP_SETTINGS_ENDPOINT, (req, res) => {
@@ -2092,6 +2094,9 @@ rest_server.post(TIME_ENDPOINT, (req, res) => {
20922094

20932095
// SYSTEM
20942096
rest_server.get(SYSTEM_STATUS_ENDPOINT, (req, res) => {
2097+
console.log('get systemStatus');
2098+
// create some random data to see if caching works
2099+
system_status.fs_used = Math.floor(Math.random() * (Math.floor(200) - 100) + 100);
20952100
res.json(system_status);
20962101
});
20972102
rest_server.get(SECURITY_SETTINGS_ENDPOINT, (req, res) => {

0 commit comments

Comments
 (0)