Skip to content

Commit e001e00

Browse files
committed
Merge branch 'develop' into feature/ditch-arduino-serial
2 parents 5379918 + 4a3bd1c commit e001e00

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+848
-613
lines changed

frontend/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,29 @@
2121
"@skeletonlabs/skeleton": "2.10.3",
2222
"@skeletonlabs/tw-plugin": "0.4.0",
2323
"@sveltejs/adapter-static": "^3.0.6",
24-
"@sveltejs/kit": "2.8.0",
24+
"@sveltejs/kit": "2.8.1",
2525
"@sveltejs/vite-plugin-svelte": "^3.1.2",
2626
"@tailwindcss/forms": "0.5.9",
2727
"@tailwindcss/typography": "0.5.15",
2828
"@types/node": "22.9.0",
2929
"autoprefixer": "10.4.20",
30-
"eslint": "^9.14.0",
30+
"eslint": "^9.15.0",
3131
"eslint-config-prettier": "9.1.0",
3232
"eslint-plugin-svelte": "2.46.0",
3333
"flatbuffers": "24.3.25",
34-
"postcss": "8.4.48",
34+
"postcss": "8.4.49",
3535
"prettier": "3.3.3",
36-
"prettier-plugin-svelte": "3.2.7",
36+
"prettier-plugin-svelte": "3.2.8",
3737
"svelte": "4.2.19",
38-
"svelte-check": "4.0.6",
39-
"tailwindcss": "3.4.14",
38+
"svelte-check": "4.0.9",
39+
"tailwindcss": "3.4.15",
4040
"tslib": "2.8.1",
4141
"typescript": "5.6.3",
4242
"vite-plugin-tailwind-purgecss": "^0.3.3",
43-
"vitest": "2.1.4"
43+
"vitest": "2.1.5"
4444
},
4545
"dependencies": {
46-
"vite": "^5.4.10"
46+
"vite": "^5.4.11"
4747
},
4848
"engines": {
4949
"node": ">=20.18",

frontend/pnpm-lock.yaml

Lines changed: 274 additions & 274 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/lib/MessageHandlers/WifiNetworkEventHandler.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { WifiNetworkEvent } from '$lib/_fbs/open-shock/serialization/local/wifi-network-event';
22
import { WifiNetwork as FbsWifiNetwork } from '$lib/_fbs/open-shock/serialization/types/wifi-network';
33
import { WifiNetworkEventType } from '$lib/_fbs/open-shock/serialization/types/wifi-network-event-type';
4-
import { DeviceStateStore } from '$lib/stores';
4+
import { HubStateStore } from '$lib/stores';
55
import { toastDelegator } from '$lib/stores/ToastDelegator';
66
import type { WiFiNetwork } from '$lib/types/WiFiNetwork';
77
import type { MessageHandler } from '.';
@@ -27,7 +27,7 @@ function handleDiscoveredEvent(fbsNetwork: FbsWifiNetwork) {
2727
saved: fbsNetwork.saved(),
2828
};
2929

30-
DeviceStateStore.setWifiNetwork(network);
30+
HubStateStore.setWifiNetwork(network);
3131
}
3232
function handleUpdatedEvent(fbsNetwork: FbsWifiNetwork) {
3333
const ssid = fbsNetwork.ssid();
@@ -47,7 +47,7 @@ function handleUpdatedEvent(fbsNetwork: FbsWifiNetwork) {
4747
saved: fbsNetwork.saved(),
4848
};
4949

50-
DeviceStateStore.setWifiNetwork(network);
50+
HubStateStore.setWifiNetwork(network);
5151
}
5252
function handleLostEvent(fbsNetwork: FbsWifiNetwork) {
5353
const bssid = fbsNetwork.bssid();
@@ -57,7 +57,7 @@ function handleLostEvent(fbsNetwork: FbsWifiNetwork) {
5757
return;
5858
}
5959

60-
DeviceStateStore.removeWifiNetwork(bssid);
60+
HubStateStore.removeWifiNetwork(bssid);
6161
}
6262
function handleSavedEvent(fbsNetwork: FbsWifiNetwork) {
6363
const ssid = fbsNetwork.ssid();
@@ -68,7 +68,7 @@ function handleSavedEvent(fbsNetwork: FbsWifiNetwork) {
6868
return;
6969
}
7070

71-
DeviceStateStore.updateWifiNetwork(bssid, (network) => {
71+
HubStateStore.updateWifiNetwork(bssid, (network) => {
7272
network.saved = true;
7373
return network;
7474
});
@@ -87,7 +87,7 @@ function handleRemovedEvent(fbsNetwork: FbsWifiNetwork) {
8787
return;
8888
}
8989

90-
DeviceStateStore.updateWifiNetwork(bssid, (network) => {
90+
HubStateStore.updateWifiNetwork(bssid, (network) => {
9191
network.saved = false;
9292
return network;
9393
});
@@ -106,7 +106,7 @@ function handleConnectedEvent(fbsNetwork: FbsWifiNetwork) {
106106
return;
107107
}
108108

109-
DeviceStateStore.setWifiConnectedBSSID(bssid);
109+
HubStateStore.setWifiConnectedBSSID(bssid);
110110

111111
toastDelegator.trigger({
112112
message: 'WiFi network connected: ' + ssid,
@@ -122,7 +122,7 @@ function handleDisconnectedEvent(fbsNetwork: FbsWifiNetwork) {
122122
return;
123123
}
124124

125-
DeviceStateStore.setWifiConnectedBSSID(null);
125+
HubStateStore.setWifiConnectedBSSID(null);
126126

127127
toastDelegator.trigger({
128128
message: 'WiFi network disconnected: ' + ssid,

frontend/src/lib/MessageHandlers/index.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { HubToLocalMessagePayload } from '$lib/_fbs/open-shock/serialization/loc
44
import { ReadyMessage } from '$lib/_fbs/open-shock/serialization/local/ready-message';
55
import { WifiScanStatusMessage } from '$lib/_fbs/open-shock/serialization/local/wifi-scan-status-message';
66
import { ByteBuffer } from 'flatbuffers';
7-
import { DeviceStateStore } from '$lib/stores';
7+
import { HubStateStore } from '$lib/stores';
88
import { SerializeWifiScanCommand } from '$lib/Serializers/WifiScanCommand';
99
import { toastDelegator } from '$lib/stores/ToastDelegator';
1010
import { SetRfTxPinCommandResult } from '$lib/_fbs/open-shock/serialization/local/set-rf-tx-pin-command-result';
@@ -25,15 +25,17 @@ function handleInvalidMessage() {
2525
}
2626

2727
const PayloadTypes = Object.keys(HubToLocalMessagePayload).length / 2;
28-
const PayloadHandlers: MessageHandler[] = new Array<MessageHandler>(PayloadTypes).fill(handleInvalidMessage);
28+
const PayloadHandlers: MessageHandler[] = new Array<MessageHandler>(PayloadTypes).fill(
29+
handleInvalidMessage
30+
);
2931

3032
PayloadHandlers[HubToLocalMessagePayload.ReadyMessage] = (cli, msg) => {
3133
const payload = new ReadyMessage();
3234
msg.payload(payload);
3335

34-
console.log('[WS] Connected to device, poggies: ', payload.poggies());
36+
console.log('[WS] Connected to hub, poggies: ', payload.poggies());
3537

36-
DeviceStateStore.update((store) => {
38+
HubStateStore.update((store) => {
3739
store.wifiConnectedBSSID = payload.connectedWifi()?.bssid() || null;
3840
store.accountLinked = payload.accountLinked();
3941
store.config = mapConfig(payload.config());
@@ -48,7 +50,7 @@ PayloadHandlers[HubToLocalMessagePayload.ReadyMessage] = (cli, msg) => {
4850
store.gpioValidOutputs = gpioValidOutputs;
4951
}
5052

51-
console.log('[WS] Updated device state store: ', store);
53+
console.log('[WS] Updated hub state store: ', store);
5254

5355
return store;
5456
});
@@ -78,7 +80,7 @@ PayloadHandlers[HubToLocalMessagePayload.WifiScanStatusMessage] = (cli, msg) =>
7880
const payload = new WifiScanStatusMessage();
7981
msg.payload(payload);
8082

81-
DeviceStateStore.setWifiScanStatus(payload.status());
83+
HubStateStore.setWifiScanStatus(payload.status());
8284
};
8385

8486
PayloadHandlers[HubToLocalMessagePayload.WifiNetworkEvent] = WifiNetworkEventHandler;
@@ -109,6 +111,9 @@ PayloadHandlers[HubToLocalMessagePayload.AccountLinkCommandResult] = (cli, msg)
109111
case AccountLinkResultCode.InvalidCode:
110112
reason = 'Invalid code';
111113
break;
114+
case AccountLinkResultCode.RateLimited:
115+
reason = 'Too many requests';
116+
break;
112117
case AccountLinkResultCode.InternalError:
113118
reason = 'Internal error';
114119
break;
@@ -130,7 +135,7 @@ PayloadHandlers[HubToLocalMessagePayload.SetRfTxPinCommandResult] = (cli, msg) =
130135
const result = payload.result();
131136

132137
if (result == SetGPIOResultCode.Success) {
133-
DeviceStateStore.setRfTxPin(payload.pin());
138+
HubStateStore.setRfTxPin(payload.pin());
134139
toastDelegator.trigger({
135140
message: 'Changed RF TX pin to: ' + payload.pin(),
136141
background: 'bg-green-500',
@@ -163,7 +168,7 @@ PayloadHandlers[HubToLocalMessagePayload.SetEstopEnabledCommandResult] = (cli, m
163168
const success = payload.success();
164169

165170
if (success) {
166-
DeviceStateStore.setEstopEnabled(payload.enabled());
171+
HubStateStore.setEstopEnabled(payload.enabled());
167172
toastDelegator.trigger({
168173
message: 'Changed EStop enabled to: ' + enabled,
169174
background: 'bg-green-500',
@@ -184,7 +189,7 @@ PayloadHandlers[HubToLocalMessagePayload.SetEstopPinCommandResult] = (cli, msg)
184189

185190
if (result == SetGPIOResultCode.Success) {
186191
const gpioPin = payload.gpioPin();
187-
DeviceStateStore.setEstopGpioPin(gpioPin);
192+
HubStateStore.setEstopGpioPin(gpioPin);
188193
toastDelegator.trigger({
189194
message: 'Changed EStop pin to: ' + gpioPin,
190195
background: 'bg-green-500',

frontend/src/lib/_fbs/open-shock/serialization/local/account-link-result-code.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ export enum AccountLinkResultCode {
88
InvalidCodeLength = 2,
99
NoInternetConnection = 3,
1010
InvalidCode = 4,
11-
InternalError = 5
11+
RateLimited = 5,
12+
InternalError = 6
1213
}

frontend/src/lib/components/GpioPinSelector.svelte

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { DeviceStateStore } from '$lib/stores';
2+
import { HubStateStore } from '$lib/stores';
33
import { UsedPinsStore } from '$lib/stores/UsedPinsStore';
44
import { WebSocketClient } from '$lib/WebSocketClient';
55
@@ -10,7 +10,13 @@
1010
let pendingPin: number | null = null;
1111
let statusText: string = 'Loading...';
1212
13-
$: canSet = pendingPin !== null && pendingPin !== currentPin && pendingPin >= 0 && pendingPin <= 255 && $DeviceStateStore.gpioValidOutputs.includes(pendingPin) && !$UsedPinsStore.has(pendingPin);
13+
$: canSet =
14+
pendingPin !== null &&
15+
pendingPin !== currentPin &&
16+
pendingPin >= 0 &&
17+
pendingPin <= 255 &&
18+
$HubStateStore.gpioValidOutputs.includes(pendingPin) &&
19+
!$UsedPinsStore.has(pendingPin);
1420
1521
$: if (currentPin !== null) {
1622
UsedPinsStore.markPinUsed(currentPin, name);
@@ -40,7 +46,12 @@
4046
<span class="text-sm text-gray-500">{statusText}</span>
4147
</div>
4248
<div class="flex space-x-2">
43-
<input class="input variant-form-material" type="number" placeholder="GPIO Pin" bind:value={pendingPin} />
49+
<input
50+
class="input variant-form-material"
51+
type="number"
52+
placeholder="GPIO Pin"
53+
bind:value={pendingPin}
54+
/>
4455
<button class="btn variant-filled" on:click={setGpioPin} disabled={!canSet}>Set</button>
4556
</div>
4657
</div>

frontend/src/lib/components/WiFiList.svelte

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import { getModalStore } from '@skeletonlabs/skeleton';
3-
import { DeviceStateStore } from '$lib/stores';
3+
import { HubStateStore } from '$lib/stores';
44
import { WebSocketClient } from '$lib/WebSocketClient';
55
import { WifiAuthMode } from '$lib/_fbs/open-shock/serialization/types/wifi-auth-mode';
66
import { WifiScanStatus } from '$lib/_fbs/open-shock/serialization/types/wifi-scan-status';
@@ -13,14 +13,16 @@
1313
1414
const modalStore = getModalStore();
1515
16-
$: scanStatus = $DeviceStateStore.wifiScanStatus;
16+
$: scanStatus = $HubStateStore.wifiScanStatus;
1717
$: isScanning = scanStatus === WifiScanStatus.Started || scanStatus === WifiScanStatus.InProgress;
1818
19-
$: connectedBSSID = $DeviceStateStore.wifiConnectedBSSID;
19+
$: connectedBSSID = $HubStateStore.wifiConnectedBSSID;
2020
2121
// Sorting the groups themselves by each one's strongest network (by RSSI, higher is stronger)
2222
// Only need to check the first network in each group, since they're already sorted by signal strength
23-
$: strengthSortedGroups = Array.from($DeviceStateStore.wifiNetworkGroups.entries()).sort((a, b) => b[1].networks[0].rssi - a[1].networks[0].rssi);
23+
$: strengthSortedGroups = Array.from($HubStateStore.wifiNetworkGroups.entries()).sort(
24+
(a, b) => b[1].networks[0].rssi - a[1].networks[0].rssi
25+
);
2426
2527
function wifiScan() {
2628
const data = SerializeWifiScanCommand(!isScanning);
@@ -87,14 +89,20 @@
8789
{#if netgroup.ssid}
8890
<span class="ml-2">{netgroup.ssid}</span>
8991
{:else}
90-
<span class="ml-2">{netgroup.networks[0].bssid}</span><span class="text-gray-500 ml-1">(Hidden)</span>
92+
<span class="ml-2">{netgroup.networks[0].bssid}</span><span class="text-gray-500 ml-1"
93+
>(Hidden)</span
94+
>
9195
{/if}
9296
</span>
9397
<div class="btn-group variant-outline">
9498
{#if netgroup.saved}
95-
<button on:click={() => wifiConnect(netgroup)}><i class="fa fa-arrow-right text-green-500" /></button>
99+
<button on:click={() => wifiConnect(netgroup)}
100+
><i class="fa fa-arrow-right text-green-500" /></button
101+
>
96102
{:else}
97-
<button on:click={() => wifiAuthenticate(netgroup)}><i class="fa fa-link text-green-500" /></button>
103+
<button on:click={() => wifiAuthenticate(netgroup)}
104+
><i class="fa fa-link text-green-500" /></button
105+
>
98106
{/if}
99107
<button on:click={() => wifiSettings(netgroupKey)}><i class="fa fa-cog" /></button>
100108
</div>

frontend/src/lib/components/modals/WiFiDetails.svelte

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
import { SerializeWifiNetworkSaveCommand } from '$lib/Serializers/WifiNetworkSaveCommand';
33
import { SerializeWifiNetworkConnectCommand } from '$lib/Serializers/WifiNetworkConnectCommand';
44
import { WebSocketClient } from '$lib/WebSocketClient';
5-
import { DeviceStateStore } from '$lib/stores';
5+
import { HubStateStore } from '$lib/stores';
66
import { getModalStore } from '@skeletonlabs/skeleton';
77
import { SerializeWifiNetworkForgetCommand } from '$lib/Serializers/WifiNetworkForgetCommand';
88
import { WifiAuthMode } from '$lib/_fbs/open-shock/serialization/types/wifi-auth-mode';
99
1010
const modalStore = getModalStore();
1111
1212
export let groupKey: string;
13-
$: group = $DeviceStateStore.wifiNetworkGroups.get(groupKey);
13+
$: group = $HubStateStore.wifiNetworkGroups.get(groupKey);
1414
1515
function GetWifiAuthModeString(type: WifiAuthMode) {
1616
switch (type) {
@@ -85,11 +85,17 @@
8585
{#if group}
8686
<div class="flex justify-between space-x-2">
8787
<h2 class="h2">Network Info</h2>
88-
<button class="btn-icon variant-outline" on:click={() => modalStore.close()}><i class="fa fa-xmark"></i></button>
88+
<button class="btn-icon variant-outline" on:click={() => modalStore.close()}
89+
><i class="fa fa-xmark"></i></button
90+
>
8991
</div>
9092
<div>
9193
{#each rows as row (row.key)}
92-
<span class="flex justify-between"><span class="font-bold">{row.key}:</span><span class="text-gray-700 dark:text-gray-300">{row.value}</span></span>
94+
<span class="flex justify-between"
95+
><span class="font-bold">{row.key}:</span><span class="text-gray-700 dark:text-gray-300"
96+
>{row.value}</span
97+
></span
98+
>
9399
{/each}
94100
</div>
95101
<!-- Per-AP info -->
@@ -117,7 +123,10 @@
117123
{#if showPasswordPrompt}
118124
<button on:click={() => (showPasswordPrompt = false)}>Cancel</button>
119125
{/if}
120-
<button on:click={ConnectWiFi} disabled={showPasswordPrompt && !validPassword}><i class={'fa mr-2 text-green-500' + (group.saved ? ' fa-wifi' : ' fa-link')}></i>Connect</button>
126+
<button on:click={ConnectWiFi} disabled={showPasswordPrompt && !validPassword}
127+
><i class={'fa mr-2 text-green-500' + (group.saved ? ' fa-wifi' : ' fa-link')}
128+
></i>Connect</button
129+
>
121130
{#if group.saved}
122131
<button on:click={ForgetWiFi}><i class="fa fa-trash mr-2 text-red-500"></i>Forget</button>
123132
{/if}
@@ -126,7 +135,9 @@
126135
{:else}
127136
<div class="flex justify-between space-x-2">
128137
<h2 class="h2">WiFi Info</h2>
129-
<button class="btn-icon variant-outline" on:click={() => modalStore.close()}><i class="fa fa-xmark"></i></button>
138+
<button class="btn-icon variant-outline" on:click={() => modalStore.close()}
139+
><i class="fa fa-xmark"></i></button
140+
>
130141
</div>
131142
<div class="flex justify-center">
132143
<i class="fa fa-spinner fa-spin"></i>

frontend/src/lib/stores/DeviceStateStore.ts renamed to frontend/src/lib/stores/HubStateStore.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { WifiScanStatus } from '$lib/_fbs/open-shock/serialization/types/wifi-scan-status';
2-
import type { WiFiNetwork, WiFiNetworkGroup, DeviceState } from '$lib/types';
2+
import type { WiFiNetwork, WiFiNetworkGroup, HubState } from '$lib/types';
33
import { writable } from 'svelte/store';
44
import { WifiAuthMode } from '$lib/_fbs/open-shock/serialization/types/wifi-auth-mode';
55

6-
const { subscribe, update } = writable<DeviceState>({
6+
const { subscribe, update } = writable<HubState>({
77
wifiConnectedBSSID: null,
88
wifiScanStatus: null,
99
wifiNetworks: new Map<string, WiFiNetwork>(),
@@ -47,11 +47,11 @@ function SsidMapReducer(groups: Map<string, WiFiNetworkGroup>, [, value]: [strin
4747
return groups;
4848
}
4949

50-
function updateWifiNetworkGroups(store: DeviceState) {
50+
function updateWifiNetworkGroups(store: HubState) {
5151
store.wifiNetworkGroups = Array.from(store.wifiNetworks.entries()).reduce(SsidMapReducer, new Map<string, WiFiNetworkGroup>());
5252
}
5353

54-
export const DeviceStateStore = {
54+
export const HubStateStore = {
5555
subscribe,
5656
update,
5757
setWifiConnectedBSSID(connectedBSSID: string | null) {

frontend/src/lib/stores/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export * from './DeviceStateStore';
1+
export * from './HubStateStore';

0 commit comments

Comments
 (0)