Farmbot-Web-App/frontend/devices/components/hardware_settings.tsx

118 lines
4.7 KiB
TypeScript
Raw Normal View History

2017-06-29 12:54:02 -06:00
import * as React from "react";
import { MCUFactoryReset, bulkToggleControlPanel } from "../actions";
2020-02-26 11:10:59 -07:00
import { Widget, WidgetHeader, WidgetBody, Color } from "../../ui/index";
import { HardwareSettingsProps, SourceFwConfig } from "../interfaces";
2020-02-15 11:29:31 -07:00
import { isBotOnline } from "../must_be_online";
2017-06-29 12:54:02 -06:00
import { ToolTips } from "../../constants";
import { DangerZone } from "./hardware_settings/danger_zone";
2017-12-16 18:21:13 -07:00
import { PinGuard } from "./hardware_settings/pin_guard";
2020-02-15 11:29:09 -07:00
import { Encoders } from "./hardware_settings/encoders";
import { EndStops } from "./hardware_settings/endstops";
2017-06-29 12:54:02 -06:00
import { Motors } from "./hardware_settings/motors";
import { SpacePanelHeader } from "./hardware_settings/space_panel_header";
2017-07-26 09:51:31 -06:00
import {
2020-02-28 09:35:32 -07:00
HomingAndCalibration,
2017-07-26 09:51:31 -06:00
} from "./hardware_settings/homing_and_calibration";
2018-03-08 21:03:02 -07:00
import { Popover, Position } from "@blueprintjs/core";
2018-07-18 20:53:32 -06:00
import { FwParamExportMenu } from "./hardware_settings/export_menu";
2019-04-02 13:59:37 -06:00
import { t } from "../../i18next_wrapper";
2020-02-15 11:29:09 -07:00
import { PinBindings } from "./hardware_settings/pin_bindings";
import { ErrorHandling } from "./hardware_settings/error_handling";
2020-02-18 12:21:09 -07:00
import { maybeOpenPanel } from "./maybe_highlight";
2020-02-26 11:10:59 -07:00
import type { FirmwareConfig } from "farmbot/dist/resources/configs/firmware";
import type { McuParamName } from "farmbot";
2017-06-29 12:54:02 -06:00
export class HardwareSettings extends
React.Component<HardwareSettingsProps, {}> {
2020-02-18 12:21:09 -07:00
componentDidMount = () =>
this.props.dispatch(maybeOpenPanel(this.props.controlPanelState));
2017-06-29 12:54:02 -06:00
render() {
2018-03-09 02:34:24 -07:00
const {
2019-04-09 19:15:50 -06:00
bot, dispatch, sourceFwConfig, controlPanelState, firmwareConfig,
2019-06-21 15:45:44 -06:00
botToMqttStatus, firmwareHardware, resources
2018-03-09 02:34:24 -07:00
} = this.props;
const { informational_settings } = this.props.bot.hardware;
const { sync_status } = informational_settings;
2019-04-09 19:15:50 -06:00
const botDisconnected = !isBotOnline(sync_status, botToMqttStatus);
2020-02-15 11:29:09 -07:00
const commonProps = { dispatch, controlPanelState };
return <Widget className="hardware-widget">
2020-02-26 11:10:59 -07:00
<WidgetHeader title={t("Hardware")} helpText={ToolTips.HW_SETTINGS}>
<SettingLoadProgress firmwareConfig={firmwareConfig}
sourceFwConfig={sourceFwConfig} />
</WidgetHeader>
<WidgetBody>
<button
className={"fb-button gray no-float"}
2020-02-28 09:34:28 -07:00
title={t("Expand All")}
onClick={() => dispatch(bulkToggleControlPanel(true))}>
2018-02-27 10:49:37 -07:00
{t("Expand All")}
2018-03-08 21:03:02 -07:00
</button>
<button
className={"fb-button gray no-float"}
2020-02-28 09:34:28 -07:00
title={t("Collapse All")}
onClick={() => dispatch(bulkToggleControlPanel(false))}>
2018-02-27 10:49:37 -07:00
{t("Collapse All")}
2018-03-08 21:03:02 -07:00
</button>
2020-02-15 11:29:31 -07:00
<Popover position={Position.BOTTOM_RIGHT}>
<i className="fa fa-download" />
<FwParamExportMenu firmwareConfig={firmwareConfig} />
</Popover>
<div className="label-headings">
<SpacePanelHeader />
</div>
<HomingAndCalibration {...commonProps}
bot={bot}
sourceFwConfig={sourceFwConfig}
firmwareConfig={firmwareConfig}
firmwareHardware={firmwareHardware}
botDisconnected={botDisconnected} />
<Motors {...commonProps}
sourceFwConfig={sourceFwConfig}
firmwareHardware={firmwareHardware} />
<Encoders {...commonProps}
sourceFwConfig={sourceFwConfig}
firmwareHardware={firmwareHardware} />
<EndStops {...commonProps}
sourceFwConfig={sourceFwConfig} />
<ErrorHandling {...commonProps}
sourceFwConfig={sourceFwConfig} />
<PinGuard {...commonProps}
resources={resources}
sourceFwConfig={sourceFwConfig} />
<DangerZone {...commonProps}
onReset={MCUFactoryReset}
botDisconnected={botDisconnected} />
<PinBindings {...commonProps}
2020-02-26 11:10:59 -07:00
resources={resources}
firmwareHardware={firmwareHardware} />
</WidgetBody>
</Widget>;
2017-06-29 12:54:02 -06:00
}
}
2020-02-26 11:10:59 -07:00
interface SettingLoadProgressProps {
sourceFwConfig: SourceFwConfig;
firmwareConfig: FirmwareConfig | undefined;
}
const UNTRACKED_KEYS: (keyof FirmwareConfig)[] = [
"id", "created_at", "updated_at", "device_id", "api_migrated",
"param_config_ok", "param_test", "param_use_eeprom", "param_version",
];
/** Track firmware configuration adoption by FarmBot OS. */
const SettingLoadProgress = (props: SettingLoadProgressProps) => {
const keys = Object.keys(props.firmwareConfig || {})
.filter((k: keyof FirmwareConfig) => !UNTRACKED_KEYS.includes(k));
const loadedKeys = keys.filter((key: McuParamName) =>
props.sourceFwConfig(key).consistent);
const progress = loadedKeys.length / keys.length * 100;
const color = [0, 100].includes(progress) ? Color.darkGray : Color.white;
return <div className={"load-progress-bar-wrapper"}>
<div className={"load-progress-bar"}
style={{ width: `${progress}%`, background: color }} />
</div>;
};