import * as React from "react"; import { FarmbotColorPicker } from "./farmbot_picker"; import { BlurableInput, Row, Col } from "../../ui/index"; import { ImageFlipper } from "../images/image_flipper"; import { HSV } from "./interfaces"; import { WeedDetectorSlider } from "./slider"; import { TaggedImage } from "farmbot"; import { PhotoFooter } from "../images/photos"; import { parseIntInput } from "../../util"; import { t } from "../../i18next_wrapper"; import { TimeSettings } from "../../interfaces"; const RANGES = { H: { LOWEST: 0, HIGHEST: 179 }, S: { LOWEST: 0, HIGHEST: 255 }, V: { LOWEST: 0, HIGHEST: 255 }, BLUR: { LOWEST: 0, HIGHEST: 100 }, MORPH: { LOWEST: 0, HIGHEST: 100 }, ITERATION: { LOWEST: 0, HIGHEST: 100 }, }; /** Number values that the panel deals with. */ export interface NumericValues { iteration: number; morph: number; blur: number; H_LO: number; H_HI: number; S_LO: number; S_HI: number; V_LO: number; V_HI: number; } type NumericKeyName = keyof NumericValues; export interface ImageWorkspaceProps extends NumericValues { onFlip(uuid: string | undefined): void; onProcessPhoto(image_id: number): void; currentImage: TaggedImage | undefined; images: TaggedImage[]; onChange(key: NumericKeyName, value: number): void; invertHue?: boolean; botOnline: boolean; timeSettings: TimeSettings; } /** Mapping of HSV values to FBOS Env variables. */ const CHANGE_MAP: Record = { H: ["H_LO", "H_HI"], S: ["S_LO", "S_HI"], V: ["V_LO", "V_HI"] }; export class ImageWorkspace extends React.Component { /** Generates a function to handle changes to blur/morph/iteration. */ numericChange = (key: NumericKeyName) => (e: React.SyntheticEvent) => { this.props.onChange(key, parseIntInput(e.currentTarget.value) || 0); }; maybeProcessPhoto = () => { const img = this.props.currentImage || this.props.images[0]; if (img?.body.id) { this.props.onProcessPhoto(img.body.id); } }; /** This will trigger onChange callback only when necessary, at most twice. * (H|S|L)_HI and (H|S|L)_LO */ onHslChange = (key: keyof typeof CHANGE_MAP) => (values: [number, number]) => { const keys = CHANGE_MAP[key]; [0, 1].map(i => { if (values[i] !== this.props[keys[i]]) { this.props.onChange(keys[i], values[i]); } }); }; render() { const { H_LO, H_HI, S_LO, S_HI, V_LO, V_HI } = this.props; return

{t("Color Range")}

{t("Processing Parameters")}

; } }