feat: add udp over mesh toggle

This commit is contained in:
Dan Ditomaso
2025-04-02 17:59:59 -04:00
parent 8fffde0165
commit 8d5dc440d0
5 changed files with 50 additions and 72 deletions
-5
View File
@@ -39,15 +39,11 @@ export function SelectInput<T extends FieldValues>({
disabled, disabled,
field, field,
}: GenericFormElementProps<T, SelectFieldProps<T>>) { }: GenericFormElementProps<T, SelectFieldProps<T>>) {
// Get default value and set it
const defaultValue = field.properties.defaultValue ?? field.defaultValue;
const { const {
field: { value, onChange, ...rest }, field: { value, onChange, ...rest },
} = useController({ } = useController({
name: field.name, name: field.name,
control, control,
defaultValue: defaultValue ? defaultValue.toString() : undefined,
}); });
const { enumValue, formatEnumName, ...remainingProperties } = field.properties; const { enumValue, formatEnumName, ...remainingProperties } = field.properties;
@@ -80,7 +76,6 @@ export function SelectInput<T extends FieldValues>({
onValueChange={handleValueChange} onValueChange={handleValueChange}
disabled={disabled} disabled={disabled}
value={value?.toString()} value={value?.toString()}
defaultValue={defaultValue?.toString()}
{...remainingProperties} {...remainingProperties}
{...rest} {...rest}
> >
@@ -1,4 +1,4 @@
import type { NetworkValidation } from "@app/validation/config/network.ts"; import { NetworkValidationSchema, type NetworkValidation } from "@app/validation/config/network.ts";
import { create } from "@bufbuild/protobuf"; import { create } from "@bufbuild/protobuf";
import { DynamicForm } from "@components/Form/DynamicForm.tsx"; import { DynamicForm } from "@components/Form/DynamicForm.tsx";
import { useDevice } from "@core/stores/deviceStore.ts"; import { useDevice } from "@core/stores/deviceStore.ts";
@@ -7,13 +7,19 @@ import {
convertIpAddressToInt, convertIpAddressToInt,
} from "@core/utils/ip.ts"; } from "@core/utils/ip.ts";
import { Protobuf } from "@meshtastic/core"; import { Protobuf } from "@meshtastic/core";
import { validateSchema } from "@app/validation/validate.ts";
export const Network = () => { export const Network = () => {
const { config, setWorkingConfig } = useDevice(); const { config, setWorkingConfig } = useDevice();
const onSubmit = (data: NetworkValidation) => { console.log(config.network);
console.log("Network data", data); const onSubmit = (data: NetworkValidation) => {
const result = validateSchema(NetworkValidationSchema, data);
if (!result.success) {
console.error("Validation errors:", result.errors);
}
setWorkingConfig( setWorkingConfig(
create(Protobuf.Config.ConfigSchema, { create(Protobuf.Config.ConfigSchema, {
@@ -24,10 +30,10 @@ export const Network = () => {
ipv4Config: create( ipv4Config: create(
Protobuf.Config.Config_NetworkConfig_IpV4ConfigSchema, Protobuf.Config.Config_NetworkConfig_IpV4ConfigSchema,
{ {
ip: convertIpAddressToInt(data?.ipv4Config?.ip) ?? 0, ip: convertIpAddressToInt(data.ipv4Config?.ip ?? ""),
gateway: convertIpAddressToInt(data.ipv4Config.gateway) ?? 0, gateway: convertIpAddressToInt(data.ipv4Config?.gateway ?? ""),
subnet: convertIpAddressToInt(data.ipv4Config.subnet) ?? 0, subnet: convertIpAddressToInt(data.ipv4Config?.subnet ?? ""),
dns: convertIpAddressToInt(data.ipv4Config.dns) ?? 0, dns: convertIpAddressToInt(data.ipv4Config?.dns ?? ""),
}, },
), ),
}, },
@@ -51,6 +57,8 @@ export const Network = () => {
), ),
dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0), dns: convertIntToIpAddress(config.network?.ipv4Config?.dns ?? 0),
}, },
enabledProtocols: config.network?.enabledProtocols ?? Protobuf.Config.Config_NetworkConfig_ProtocolFlags.NO_BROADCAST
}} }}
fieldGroups={[ fieldGroups={[
{ {
@@ -175,7 +183,7 @@ export const Network = () => {
{ {
type: "select", type: "select",
name: "enabledProtocols", name: "enabledProtocols",
label: "Mesh via UDP enabled", label: "Mesh via UDP",
properties: { properties: {
enumValue: enumValue:
Protobuf.Config.Config_NetworkConfig_ProtocolFlags, Protobuf.Config.Config_NetworkConfig_ProtocolFlags,
-1
View File
@@ -31,7 +31,6 @@ export const DeviceConfig = () => {
{ {
label: "Network", label: "Network",
element: Network, element: Network,
// disabled: !metadata.get(0)?.hasWifi,
}, },
{ {
label: "Display", label: "Display",
+21 -58
View File
@@ -1,64 +1,27 @@
import type { Message } from "@bufbuild/protobuf"; import { z } from "zod";
import { Protobuf } from "@meshtastic/core"; import { Protobuf } from "@meshtastic/core";
import {
IsBoolean,
IsEnum,
IsIP,
IsOptional,
IsString,
Length,
} from "class-validator";
export class NetworkValidation const AddressModeEnum = z.nativeEnum(Protobuf.Config.Config_NetworkConfig_AddressMode);
implements const ProtocolFlagsEnum = z.nativeEnum(Protobuf.Config.Config_NetworkConfig_ProtocolFlags);
Omit<Protobuf.Config.Config_NetworkConfig, keyof Message | "ipv4Config"> {
@IsBoolean()
wifiEnabled: boolean;
@Length(1, 33) export const NetworkValidationIpV4ConfigSchema = z.object({
@IsOptional({}) ip: z.string().ip(),
wifiSsid: string; gateway: z.string().ip(),
subnet: z.string().ip(),
dns: z.string().ip(),
});
@Length(8, 64) export const NetworkValidationSchema = z.object({
@IsOptional() wifiEnabled: z.boolean(),
wifiPsk: string; wifiSsid: z.string().min(0).max(33).optional(),
wifiPsk: z.string().min(0).max(64).optional(),
ntpServer: z.string().min(2).max(30),
ethEnabled: z.boolean(),
addressMode: AddressModeEnum,
ipv4Config: NetworkValidationIpV4ConfigSchema.optional(),
enabledProtocols: ProtocolFlagsEnum,
rsyslogServer: z.string(),
});
@Length(2, 30) export type NetworkValidation = z.infer<typeof NetworkValidationSchema>;
ntpServer: string;
@IsBoolean()
ethEnabled: boolean;
@IsEnum(Protobuf.Config.Config_NetworkConfig_AddressMode)
addressMode: Protobuf.Config.Config_NetworkConfig_AddressMode;
ipv4Config: NetworkValidationIpV4Config;
@IsEnum(Protobuf.Config.Config_NetworkConfig_EnabledProtocols)
enabledProtocols: Protobuf.Config.Config_NetworkConfig_ProtocolFlags;
@IsString()
rsyslogServer: string;
}
export class NetworkValidationIpV4Config implements
Omit<
Protobuf.Config.Config_NetworkConfig_IpV4Config,
keyof Message | "ip" | "gateway" | "subnet" | "dns"
> {
@IsIP()
@IsOptional()
ip: string;
@IsIP()
@IsOptional()
gateway: string;
@IsIP()
@IsOptional()
subnet: string;
@IsIP()
@IsOptional()
dns: string;
}
+13
View File
@@ -0,0 +1,13 @@
import { ZodError, ZodSchema } from "zod";
export function validateSchema<T>(
schema: ZodSchema<T>,
data: unknown
): { success: true; data: T } | { success: false; errors: ZodError["issues"] } {
const result = schema.safeParse(data);
if (result.success) {
return { success: true, data: result.data };
} else {
return { success: false, errors: result.error.issues };
}
}