diff --git a/src/component/ComponentSettings.tsx b/src/component/ComponentSettings.tsx index 5dd2695..db0e5ad 100644 --- a/src/component/ComponentSettings.tsx +++ b/src/component/ComponentSettings.tsx @@ -36,6 +36,7 @@ import { } from "pbHelpers/AddressType"; import { extension, + FilterSubtypeI2C, getAddressTypes, GetComponentTypeOptions, getFriendlyName, @@ -240,7 +241,8 @@ export default function ComponentSettings(props: Props) { const getAvailablePositions = ( addressType: quack.AddressType, - componentType: quack.ComponentType + componentType: quack.ComponentType, + subtype: number ): number[] => { let positions = availablePositions.get(addressType); if (!positions) return []; @@ -249,7 +251,8 @@ export default function ComponentSettings(props: Props) { case quack.AddressType.ADDRESS_TYPE_SPI: let componentPositions; if (positions) { - componentPositions = (positions as ComponentAvailabilityMap).get(componentType); + componentPositions = (positions as ComponentAvailabilityMap).get(componentType); //gets the addresses that are not claimed yet + componentPositions = FilterSubtypeI2C(componentType, subtype, componentPositions as number[]) //filters the I2C addresses for valid ones for the subtype } return componentPositions ? (componentPositions as number[]) : []; case quack.AddressType.ADDRESS_TYPE_CONFIGURABLE_PIN_ARRAY: @@ -264,7 +267,8 @@ export default function ComponentSettings(props: Props) { if (mode === "add") { let positions = getAvailablePositions( component.settings.addressType, - component.settings.type + component.settings.type, + component.settings.subtype ); availablePosition = positions ? positions.length > 0 : false; } @@ -285,7 +289,7 @@ export default function ComponentSettings(props: Props) { component.settings.subtype ); for (let i = 0; i < addressTypes.length; i++) { - if (getAvailablePositions(addressTypes[i], component.settings.type).length > 0) { + if (getAvailablePositions(addressTypes[i], component.settings.type, component.settings.subtype).length > 0) { return true; } } @@ -383,7 +387,7 @@ export default function ComponentSettings(props: Props) { formComponent.settings.subtype )[0]); formComponent.settings.address = or( - getAvailablePositions(formComponent.settings.addressType, formComponent.settings.type)[0], + getAvailablePositions(formComponent.settings.addressType, formComponent.settings.type, formComponent.settings.subtype)[0], Component.create().settings.address ); formComponent.settings.name = option.label; @@ -426,7 +430,7 @@ export default function ComponentSettings(props: Props) { let availableMenuItemPositions = []; for (let i = 0; i < addressTypes.length; i++) { let addressType = addressTypes[i]; - let availablePositions = getAvailablePositions(addressType, type); + let availablePositions = getAvailablePositions(addressType, type, subtype); availableMenuItemPositions.push( diff --git a/src/device/autoDetect/DeviceScannedComponents.tsx b/src/device/autoDetect/DeviceScannedComponents.tsx index 5e91dd0..0381281 100644 --- a/src/device/autoDetect/DeviceScannedComponents.tsx +++ b/src/device/autoDetect/DeviceScannedComponents.tsx @@ -40,6 +40,7 @@ export default function DeviceScannedComponents(props: Props){ const [openDialog, setOpenDialog] = useState(false); useEffect(()=>{ + //console.log(scannedComponents) if (scannedComponents.i2c) setScannedI2C(scannedComponents.i2c) //makes the array empty for testing // if (scannedComponents.i2c) { @@ -65,13 +66,16 @@ export default function DeviceScannedComponents(props: Props){ useEffect(()=>{ let valid: quack.AddressData[] = [] //filter the address data - scannedI2C?.settings?.foundAddresses.forEach(addrData => { - if(!i2cBlacklistAddresses.includes(addrData.address)){ - if(!(addrData.address === 0x71 && addrData.expansionLine === undefined)){ - valid.push(addrData) + let addr = scannedI2C?.settings?.foundAddresses + if(addr){ + addr.forEach(addrData => { + if(!i2cBlacklistAddresses.includes(addrData.address)){ + if(!(addrData.address === 0x71 && addrData.expansionLine === undefined)){ + valid.push(addrData) + } } - } - }) + }) + } setValidComponentAddresses(valid) },[scannedI2C]) @@ -223,7 +227,7 @@ export default function DeviceScannedComponents(props: Props){ {validCompAddresses.length > 0 ? validCompAddresses.map((addr, index) => { return ( - + ()}/> ) }) : ([]) const [subtypeOptions, setSubtypeOptions] = useState>([]) @@ -107,6 +107,7 @@ export default function ScannedI2C(props: Props){ return ( {sensorNum && Sensor {sensorNum}} + {addressData.expansionLine !== 0 && "Expansion Line: " + addressData.expansionLine} {types.length > 0 ? @@ -145,7 +146,7 @@ export default function ScannedI2C(props: Props){ }} select> {subtypeOptions.map(s => ( - {s.friendlyName} + {s.friendlyName} ))} } diff --git a/src/pages/Device.tsx b/src/pages/Device.tsx index 0313373..5acc7aa 100644 --- a/src/pages/Device.tsx +++ b/src/pages/Device.tsx @@ -167,7 +167,7 @@ export default function DevicePage() { } const loadPortScan = () => { - deviceAPI.listFoundComponents(device.id()) + deviceAPI.listFoundComponents(parseInt(deviceID)) .then(resp => { if (resp.data.foundComponents?.i2c){ setScannedAddresses(resp.data.foundComponents ?? undefined) diff --git a/src/pbHelpers/ComponentType.tsx b/src/pbHelpers/ComponentType.tsx index 260f524..60f14cd 100644 --- a/src/pbHelpers/ComponentType.tsx +++ b/src/pbHelpers/ComponentType.tsx @@ -164,6 +164,10 @@ export interface ComponentTypeExtension { filters?: GraphFilters ) => LineChartData; secondaryComponentSettings?: () => pond.ComponentSettings[] + //(only for I2C) possibly add an optional map here that has a number (subtype) as the key and the addresses available for that subtype + //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 } export interface Summary { @@ -1090,3 +1094,31 @@ export const GetNumNodesFromUnitMeasurement = (unitMeasurement: UnitMeasurement) } return nodes; }; + +export const FilterSubtypeI2C = ( + componentType: quack.ComponentType, + subtype: number, + positions: number[] +) => { + console.log("Filter I2C") + console.log(positions) + let filtered: number[] = [] + //create an extension using the type and subtype + let ext = extension(componentType, subtype) + //if the extension has a subtype map + if (ext.subtypeI2CMap !== undefined){ + //check if any of the position passed in match to the map values according to the subtype + let subtypePositions = ext.subtypeI2CMap.get(subtype) + if(subtypePositions !== undefined){ + positions.forEach(position => { + if(subtypePositions.includes(position)){ + filtered.push(position) + } + }) + } + }else{ + filtered = positions + } + //return any matches between the arrays + return filtered +} diff --git a/src/pbHelpers/ComponentTypes/Lidar.ts b/src/pbHelpers/ComponentTypes/Lidar.ts index ab2398c..1bd0f6f 100644 --- a/src/pbHelpers/ComponentTypes/Lidar.ts +++ b/src/pbHelpers/ComponentTypes/Lidar.ts @@ -95,6 +95,11 @@ export function Lidar(subtype: number = 0): ComponentTypeExtension { minMeasurementPeriodMs: 1000, icon: (theme?: "light" | "dark"): string | undefined => { return theme === "light" ? LidarSensorDarkIcon : LidarSensorLightIcon; - } + }, + subtypeI2CMap: new Map([ + [quack.LidarSubtype.LIDAR_SUBTYPE_NONE, [0x62]], + [quack.LidarSubtype.LIDAR_SUBTYPE_LONG_DISTANCE, [0x66]], + [quack.LidarSubtype.LIDAR_SUBTYPE_BENEWAKE_TF02W_MID_RANGE, [0x10]], + ]) }; } diff --git a/src/pbHelpers/DeviceAvailability.ts b/src/pbHelpers/DeviceAvailability.ts index 12aadb7..972c2e2 100644 --- a/src/pbHelpers/DeviceAvailability.ts +++ b/src/pbHelpers/DeviceAvailability.ts @@ -5,6 +5,7 @@ import { GetProductAvailability } from "products/DeviceProduct"; import { pond } from "protobuf-ts/pond"; import { quack } from "protobuf-ts/quack"; import { or } from "utils/types"; +import { FilterSubtypeI2C } from "./ComponentType"; export type ComponentAvailabilityMap = Map; export type DevicePositions = number[] | ComponentAvailabilityMap | ConfigurablePin[]; @@ -47,16 +48,17 @@ const DefaultAvailability: DeviceAvailabilityMap = new Map([ [quack.ComponentType.COMPONENT_TYPE_PRESSURE, [0x18, 0x19, 0x1a]], [quack.ComponentType.COMPONENT_TYPE_LIGHT, [0x29]], [quack.ComponentType.COMPONENT_TYPE_CO2, [0x61]], [quack.ComponentType.COMPONENT_TYPE_STEPPER_MOTOR, [0x14, 0x15, 0x16, 0x17]], [quack.ComponentType.COMPONENT_TYPE_PH, [0x40]], - [quack.ComponentType.COMPONENT_TYPE_DHT, [0x40, 0x61]], //TODO temp fix, needs to be fixed to use channels similar to PH + [quack.ComponentType.COMPONENT_TYPE_DHT, [0x40, 0x61]], // [quack.ComponentType.COMPONENT_TYPE_VAPOUR_PRESSURE_DEFICIT, [0x40]], //component type deprecated? [quack.ComponentType.COMPONENT_TYPE_AIR_QUALITY, [0x58]], - [quack.ComponentType.COMPONENT_TYPE_LIDAR, [0x62]], + [quack.ComponentType.COMPONENT_TYPE_LIDAR, [0x62, 0x66, 0x10]], [quack.ComponentType.COMPONENT_TYPE_CAPACITANCE, [0x50]], [quack.ComponentType.COMPONENT_TYPE_CAPACITOR_CABLE, [0x50]], [quack.ComponentType.COMPONENT_TYPE_SEN5X, [0x69]], diff --git a/src/products/Bindapt/BindaptAvailability.ts b/src/products/Bindapt/BindaptAvailability.ts index 50575d8..89b3a47 100644 --- a/src/products/Bindapt/BindaptAvailability.ts +++ b/src/products/Bindapt/BindaptAvailability.ts @@ -249,7 +249,7 @@ export const BindaptV2MonitorAvailability: DeviceAvailabilityMap = new Map< [quack.ComponentType.COMPONENT_TYPE_PRESSURE, [0x18]], [quack.ComponentType.COMPONENT_TYPE_DHT, [0x40]], // [quack.ComponentType.COMPONENT_TYPE_VAPOUR_PRESSURE_DEFICIT, [0x40]], //component type deprecated? - [quack.ComponentType.COMPONENT_TYPE_LIDAR, [0x62]], + [quack.ComponentType.COMPONENT_TYPE_LIDAR, [0x62, 0x66, 0x10]], [quack.ComponentType.COMPONENT_TYPE_CO2, [0x61]], [quack.ComponentType.COMPONENT_TYPE_SEN5X, [0x69]], [quack.ComponentType.COMPONENT_TYPE_GRAIN_CABLE, [0x71]] @@ -282,7 +282,7 @@ export const BindaptV2AutomateAvailability: DeviceAvailabilityMap = new Map< [quack.ComponentType.COMPONENT_TYPE_PRESSURE, [0x18]], [quack.ComponentType.COMPONENT_TYPE_DHT, [0x40]], // [quack.ComponentType.COMPONENT_TYPE_VAPOUR_PRESSURE_DEFICIT, [0x40]], //component type deprecated? - [quack.ComponentType.COMPONENT_TYPE_LIDAR, [0x62]], + [quack.ComponentType.COMPONENT_TYPE_LIDAR, [0x62, 0x66, 0x10]], [quack.ComponentType.COMPONENT_TYPE_CO2, [0x61]], [quack.ComponentType.COMPONENT_TYPE_SEN5X, [0x69]], [quack.ComponentType.COMPONENT_TYPE_GRAIN_CABLE, [0x71]]