151 lines
5.3 KiB
TypeScript
151 lines
5.3 KiB
TypeScript
import { Everything } from "../interfaces";
|
|
import {
|
|
selectAllGenericPointers,
|
|
selectAllPlantPointers,
|
|
selectAllCrops,
|
|
joinToolsAndSlot,
|
|
selectAllImages,
|
|
selectAllPeripherals,
|
|
selectAllPlantTemplates,
|
|
selectAllSensorReadings,
|
|
selectAllSensors,
|
|
maybeGetTimeSettings,
|
|
selectAllPoints,
|
|
selectAllPointGroups,
|
|
getDeviceAccountSettings,
|
|
maybeFindToolById,
|
|
selectAllWeedPointers,
|
|
} from "../resources/selectors";
|
|
import { validBotLocationData, validFwConfig, unpackUUID } from "../util";
|
|
import { getWebAppConfigValue } from "../config_storage/actions";
|
|
import { Props } from "./interfaces";
|
|
import { TaggedPlant, BotSize } from "./map/interfaces";
|
|
import { RestResources } from "../resources/interfaces";
|
|
import { isString, uniq, chain } from "lodash";
|
|
import { BooleanSetting } from "../session_keys";
|
|
import { getEnv, getShouldDisplayFn } from "../farmware/state_to_props";
|
|
import { getFirmwareConfig } from "../resources/getters";
|
|
import { calcMicrostepsPerMm } from "../controls/move/direction_axes_props";
|
|
import { getBotSize } from "./map/util";
|
|
import { getDefaultAxisLength } from ".";
|
|
|
|
const plantFinder = (plants: TaggedPlant[]) =>
|
|
(uuid: string | undefined): TaggedPlant =>
|
|
plants.filter(x => x.uuid === uuid)[0];
|
|
|
|
export const getPlants = (resources: RestResources) => {
|
|
const onlyPlants = selectAllPlantPointers(resources.index);
|
|
const plantTemplates = selectAllPlantTemplates(resources.index);
|
|
const { openedSavedGarden } = resources.consumers.farm_designer;
|
|
return isString(openedSavedGarden)
|
|
? plantTemplates.filter(x =>
|
|
x.body.saved_garden_id === unpackUUID(openedSavedGarden).remoteId)
|
|
: onlyPlants;
|
|
};
|
|
|
|
export function mapStateToProps(props: Everything): Props {
|
|
const plants = getPlants(props.resources);
|
|
const findPlant = plantFinder(plants);
|
|
|
|
const { selectedPoints } = props.resources.consumers.farm_designer;
|
|
const selectedPlant = selectedPoints ? findPlant(selectedPoints[0]) : undefined;
|
|
|
|
const { plantUUID } = props.resources.consumers.farm_designer.hoveredPlant;
|
|
const hoveredPlant = findPlant(plantUUID);
|
|
|
|
const getConfigValue = getWebAppConfigValue(() => props);
|
|
const allGenericPoints = selectAllGenericPointers(props.resources.index);
|
|
const genericPoints = getConfigValue(BooleanSetting.show_historic_points)
|
|
? allGenericPoints
|
|
: allGenericPoints.filter(x => x);
|
|
const weeds = selectAllWeedPointers(props.resources.index);
|
|
|
|
const fwConfig = validFwConfig(getFirmwareConfig(props.resources.index));
|
|
const { mcu_params } = props.bot.hardware;
|
|
const firmwareSettings = fwConfig || mcu_params;
|
|
|
|
const mountedToolId =
|
|
getDeviceAccountSettings(props.resources.index).body.mounted_tool_id;
|
|
const mountedToolName =
|
|
maybeFindToolById(props.resources.index, mountedToolId)?.body.name;
|
|
|
|
const peripherals = uniq(selectAllPeripherals(props.resources.index))
|
|
.map(x => {
|
|
const label = x.body.label;
|
|
const pinStatus = x.body.pin
|
|
? props.bot.hardware.pins[x.body.pin]
|
|
: undefined;
|
|
const value = pinStatus ? pinStatus.value > 0 : false;
|
|
return { label, value };
|
|
});
|
|
|
|
const latestImages = chain(selectAllImages(props.resources.index))
|
|
.sortBy(x => x.body.id)
|
|
.reverse()
|
|
.value();
|
|
|
|
const shouldDisplay = getShouldDisplayFn(props.resources.index, props.bot);
|
|
const env = getEnv(props.resources.index, shouldDisplay, props.bot);
|
|
|
|
const cameraCalibrationData = {
|
|
scale: env["CAMERA_CALIBRATION_coord_scale"],
|
|
rotation: env["CAMERA_CALIBRATION_total_rotation_angle"],
|
|
offset: {
|
|
x: env["CAMERA_CALIBRATION_camera_offset_x"],
|
|
y: env["CAMERA_CALIBRATION_camera_offset_y"]
|
|
},
|
|
origin: env["CAMERA_CALIBRATION_image_bot_origin_location"],
|
|
calibrationZ: env["CAMERA_CALIBRATION_camera_z"],
|
|
};
|
|
|
|
const sensorReadings = chain(selectAllSensorReadings(props.resources.index))
|
|
.sortBy(x => x.body.created_at)
|
|
.reverse()
|
|
.take(500)
|
|
.reverse()
|
|
.value();
|
|
|
|
return {
|
|
crops: selectAllCrops(props.resources.index),
|
|
dispatch: props.dispatch,
|
|
selectedPlant,
|
|
designer: props.resources.consumers.farm_designer,
|
|
genericPoints,
|
|
weeds,
|
|
allPoints: selectAllPoints(props.resources.index),
|
|
toolSlots: joinToolsAndSlot(props.resources.index),
|
|
hoveredPlant,
|
|
plants,
|
|
botLocationData: validBotLocationData(props.bot.hardware.location_data),
|
|
botMcuParams: firmwareSettings,
|
|
botSize: botSize(props),
|
|
peripherals,
|
|
eStopStatus: props.bot.hardware.informational_settings.locked,
|
|
latestImages,
|
|
cameraCalibrationData,
|
|
timeSettings: maybeGetTimeSettings(props.resources.index),
|
|
getConfigValue,
|
|
sensorReadings,
|
|
sensors: selectAllSensors(props.resources.index),
|
|
groups: selectAllPointGroups(props.resources.index),
|
|
shouldDisplay,
|
|
mountedToolName,
|
|
};
|
|
}
|
|
|
|
export const botSize = (props: Everything): BotSize => {
|
|
const getConfigValue = getWebAppConfigValue(() => props);
|
|
const fwConfig = validFwConfig(getFirmwareConfig(props.resources.index));
|
|
const { mcu_params } = props.bot.hardware;
|
|
const firmwareSettings = fwConfig || mcu_params;
|
|
const fw = firmwareSettings;
|
|
const stepsPerMmXY = {
|
|
x: calcMicrostepsPerMm(fw.movement_step_per_mm_x, fw.movement_microsteps_x),
|
|
y: calcMicrostepsPerMm(fw.movement_step_per_mm_y, fw.movement_microsteps_y),
|
|
};
|
|
return getBotSize(
|
|
firmwareSettings,
|
|
stepsPerMmXY,
|
|
getDefaultAxisLength(getConfigValue));
|
|
};
|