From 50b33e587d685f021d76b6abaf29f34fc82a64ed Mon Sep 17 00:00:00 2001 From: csawatzky Date: Tue, 7 Oct 2025 12:39:32 -0600 Subject: [PATCH] implemented a way of filtering positions using the subtype The lidar uses a different I2C address for each of the subtypes so this allows us to be able to control the options for a user for each of the subtypes so that one lidars address cant be used for another --- src/component/ComponentSettings.tsx | 16 +++++++---- src/pbHelpers/ComponentType.tsx | 32 +++++++++++++++++++++ src/pbHelpers/ComponentTypes/Lidar.ts | 7 ++++- src/pbHelpers/DeviceAvailability.ts | 6 ++-- src/products/Bindapt/BindaptAvailability.ts | 4 +-- 5 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/component/ComponentSettings.tsx b/src/component/ComponentSettings.tsx index a7b8877..44aef71 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/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]]