From 65cb7acbab85037fc39d8e016071dfc082d46faa Mon Sep 17 00:00:00 2001 From: csawatzky Date: Mon, 3 Nov 2025 13:23:02 -0600 Subject: [PATCH] finished the functionality for adding components from the scan --- .../autoDetect/DeviceScannedComponents.tsx | 13 ++-- .../autoDetect/OneWire/PortComponent.tsx | 62 +++++++++++++++---- .../autoDetect/OneWire/ScannedOneWirePort.tsx | 31 ++++++++-- src/pbHelpers/ComponentType.tsx | 1 + .../ComponentTypes/CapacitorCable.ts | 1 + src/pbHelpers/ComponentTypes/GrainCable.ts | 1 + src/pbHelpers/ComponentTypes/PressureCable.ts | 1 + 7 files changed, 90 insertions(+), 20 deletions(-) diff --git a/src/device/autoDetect/DeviceScannedComponents.tsx b/src/device/autoDetect/DeviceScannedComponents.tsx index 18ea15f..e1fc020 100644 --- a/src/device/autoDetect/DeviceScannedComponents.tsx +++ b/src/device/autoDetect/DeviceScannedComponents.tsx @@ -203,6 +203,7 @@ export default function DeviceScannedComponents(props: Props){ }) }) } + console.log(cloneList) setComponents(cloneList) } @@ -251,7 +252,6 @@ export default function DeviceScannedComponents(props: Props){ Pin Port Sensors - {scannedOneWire.map((scan,i) => { let map = FindAvailablePositions([], device.settings.product).availability.get(quack.AddressType.ADDRESS_TYPE_CONFIGURABLE_PIN_ARRAY) @@ -265,9 +265,14 @@ export default function DeviceScannedComponents(props: Props){ } }) return( - - Port: {portLabel} - + + + Port: {portLabel} + + + ) })} diff --git a/src/device/autoDetect/OneWire/PortComponent.tsx b/src/device/autoDetect/OneWire/PortComponent.tsx index c92dfac..ee2ab3f 100644 --- a/src/device/autoDetect/OneWire/PortComponent.tsx +++ b/src/device/autoDetect/OneWire/PortComponent.tsx @@ -1,46 +1,84 @@ -import { Box, MenuItem, TextField } from "@mui/material" +import { Box, Checkbox, MenuItem, TextField, Tooltip } from "@mui/material" import { getFriendlyName, getSubtypes, Subtype } from "pbHelpers/ComponentType" import { quack } from "protobuf-ts/quack" import React, { useEffect, useState } from "react" interface Props { compData: quack.OneWireComponentData + componentSelect: (selected: boolean, componentData: quack.OneWireComponentData) => void } export default function PortComponent(props: Props){ - const {compData} = props - const [selectedSubtype, setSelectedSubtype] = useState(-1) + const {compData, componentSelect} = props + // const [selectedSubtype, setSelectedSubtype] = useState(0) + const [subtypeVal, setSubtypeVal] = useState("none")//note that this is the friendly name and not the key or the value because it needs to be different from the other alias options + const [subtypeMap, setSubtypeMap] = useState>(new Map()) + const [subtypeOptions, setSubtypeOptions] = useState([]) + const [added, setAdded] = useState(false) useEffect(()=>{ - setSelectedSubtype(compData.subtype) - },[compData]) - - const subtypeSelector = (compData: quack.OneWireComponentData) => { + // setSelectedSubtype(compData.subtype) let validSubtypes: Subtype[] = [] + let subMap: Map = new Map() + let subVal: string = "none" getSubtypes(compData.type).forEach(option => { if(compData.subtype === option.key || compData.subtype === 0){ validSubtypes.push(option) + if(subVal === "none"){ + subVal = option.friendlyName + } } + subMap.set(option.friendlyName, option.key) }) + setSubtypeOptions(validSubtypes) + setSubtypeMap(subMap) + setSubtypeVal(subVal) + },[compData]) + + const subtypeSelector = () => { return ( { + setSubtypeVal(event.target.value) + // setSelectedSubtype(subtypeMap.get(event.target.value) ?? 0) + compData.subtype = subtypeMap.get(event.target.value) ?? 0 + }} select> - Select the Component Subtype - {validSubtypes.map((s, i) => ( - {s.friendlyName} + Select the Component Subtype + {subtypeOptions.map((s, i) => ( + {s.friendlyName} ))} ) } + const selectCompCheckbox = () => { + return ( + { + setAdded(checked) + componentSelect(checked, compData) + }} + /> + } + /> + ) + } + return ( {getFriendlyName(compData.type)} Cable ID: {compData.cableId} Number of nodes: {compData.nodeCount} - {subtypeSelector(compData)} + {subtypeOptions.length < 2 ? subtypeVal : subtypeSelector()} + {selectCompCheckbox()} ) diff --git a/src/device/autoDetect/OneWire/ScannedOneWirePort.tsx b/src/device/autoDetect/OneWire/ScannedOneWirePort.tsx index a4f3e11..4fd99d8 100644 --- a/src/device/autoDetect/OneWire/ScannedOneWirePort.tsx +++ b/src/device/autoDetect/OneWire/ScannedOneWirePort.tsx @@ -4,26 +4,49 @@ import { pond } from "protobuf-ts/pond" import { quack } from "protobuf-ts/quack" import React, { useEffect, useState } from "react" import PortComponent from "./PortComponent" +import { Component } from "models" interface Props { scan: pond.DetectOneWire + componentSelectionCallback: (newComponents: Component[], checked: boolean) => void } export default function ScannedOneWirePort(props: Props){ - const {scan} = props + const {scan, componentSelectionCallback} = props const [portComponents, setPortComponents] = useState([]) useEffect(()=>{ setPortComponents(scan.settings?.oneWireData?.components ?? []) },[scan]) + const componentSelected = (checked: boolean, componentData: quack.OneWireComponentData) => { + let newComponents: Component[] = [] + //use the component data to create a new Component + //build a component with given information and defaults for the rest + let primaryComponent = Component.create() + primaryComponent.settings.type = componentData.type + primaryComponent.settings.subtype = componentData.subtype + primaryComponent.settings.address = scan.settings?.oneWireData?.port ?? 0 + primaryComponent.settings.addressType = quack.AddressType.ADDRESS_TYPE_CONFIGURABLE_PIN_ARRAY + primaryComponent.settings.name = getFriendlyName(componentData.type, componentData.subtype) + + //need to check if the component is chainable, meaning the address type will reflect the cable id + let ext = extension(componentData.type, componentData.subtype) + if(ext.isChainable){ + primaryComponent.settings.addressType = componentData.cableId + 8 + } + newComponents.push(primaryComponent) + + componentSelectionCallback(newComponents, checked) + } + return ( {portComponents.map((compData, i) => { - // let ext = extension(compData.type, compData.subtype) - // console.log(ext) return ( - + { + componentSelected(checked, component) + }}/> ) })} diff --git a/src/pbHelpers/ComponentType.tsx b/src/pbHelpers/ComponentType.tsx index 60f14cd..03be638 100644 --- a/src/pbHelpers/ComponentType.tsx +++ b/src/pbHelpers/ComponentType.tsx @@ -168,6 +168,7 @@ export interface ComponentTypeExtension { //if the map does not exist then just use the array from the device availability, //if the map does exist filter the availability after claims to find matching address between them and use that subtypeI2CMap?: Map + isChainable?: boolean } export interface Summary { diff --git a/src/pbHelpers/ComponentTypes/CapacitorCable.ts b/src/pbHelpers/ComponentTypes/CapacitorCable.ts index cc56e27..8843952 100644 --- a/src/pbHelpers/ComponentTypes/CapacitorCable.ts +++ b/src/pbHelpers/ComponentTypes/CapacitorCable.ts @@ -68,6 +68,7 @@ export function CapacitorCable(subtype: number = 0): ComponentTypeExtension { isSource: true, isArray: true, isCalibratable: false, + isChainable: true, addressTypes: addressTypes, interactionResultTypes: [], states: [], diff --git a/src/pbHelpers/ComponentTypes/GrainCable.ts b/src/pbHelpers/ComponentTypes/GrainCable.ts index c715611..bacc514 100644 --- a/src/pbHelpers/ComponentTypes/GrainCable.ts +++ b/src/pbHelpers/ComponentTypes/GrainCable.ts @@ -176,6 +176,7 @@ export function GrainCable(subtype: number = 0): ComponentTypeExtension { isSource: true, isArray: true, isCalibratable: false, + isChainable: true, addressTypes: [quack.AddressType.ADDRESS_TYPE_CONFIGURABLE_PIN_ARRAY, quack.AddressType.ADDRESS_TYPE_I2C], interactionResultTypes: [], states: [], diff --git a/src/pbHelpers/ComponentTypes/PressureCable.ts b/src/pbHelpers/ComponentTypes/PressureCable.ts index f03cc9e..3a22362 100644 --- a/src/pbHelpers/ComponentTypes/PressureCable.ts +++ b/src/pbHelpers/ComponentTypes/PressureCable.ts @@ -64,6 +64,7 @@ export function PressureCable(subtype: number = 0): ComponentTypeExtension { isArray: true, hasFan: true, isCalibratable: false, + isChainable: true, addressTypes: [quack.AddressType.ADDRESS_TYPE_CONFIGURABLE_PIN_ARRAY], interactionResultTypes: [], states: [],