import { useContext, useState, useEffect } from 'react' import { Typography, Spin, Flex, Space, Slider, Descriptions, Tag } from 'antd' import { LoadingOutlined } from '@ant-design/icons' import { ApiServerContext } from '../context/ApiServerContext' import PropTypes from 'prop-types' import merge from 'lodash/merge' const { Text } = Typography const PrinterMiscPanel = ({ id, showControls = true }) => { const { subscribeToObjectEvent, connected, sendObjectAction } = useContext(ApiServerContext) const [miscData, setMiscData] = useState({ fan: { speed: 0, target: 0 }, lcdBacklight: { brightness: 0 }, beeper: { value: 0 }, filamentSensor: { enabled: false, filamentDetected: false }, coolingFan: { speed: 0 } }) const [fanSpeed, setFanSpeed] = useState(0) const [lcdBrightness, setLcdBrightness] = useState(0) const [beeperValue, setBeeperValue] = useState(0) useEffect(() => { if (id && connected == true) { const miscEventUnsubscribe = subscribeToObjectEvent( id, 'printer', 'misc', (event) => { setMiscData((prev) => { const merged = merge({}, prev, event.data) return merged }) } ) return () => { if (miscEventUnsubscribe) miscEventUnsubscribe() } } }, [id, connected, subscribeToObjectEvent]) useEffect(() => { if (miscData.fan?.speed !== undefined) { setFanSpeed(miscData.fan.speed) } if (miscData.lcdBacklight?.brightness !== undefined) { setLcdBrightness(miscData.lcdBacklight.brightness) } if (miscData.beeper?.value !== undefined) { setBeeperValue(miscData.beeper.value) } }, [ miscData.fan?.speed, miscData.lcdBacklight?.brightness, miscData.beeper?.value ]) const handleSetFanSpeed = (value) => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'gcodeScript', data: { script: `M106 S${Math.round(value * 255)}` } }) } } const handleSetLcdBrightness = (value) => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'gcodeScript', data: { script: `SET_LCD LCD=lcd_backlight BRIGHTNESS=${value}` } }) } } const handleSetBeeperValue = (value) => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'gcodeScript', data: { script: `M300 S440 P200 V${Math.round(value * 100)}` } }) } } return (
{miscData ? ( {showControls && ( <> Fan Speed: {Math.round(fanSpeed * 100)}% LCD Backlight: {Math.round(lcdBrightness * 100)}% Beeper Pitch: {Math.round(beeperValue * 100)}% )} {miscData.filamentSensor.enabled ? ( miscData.filamentSensor.filamentDetected ? ( Detected ) : ( Open ) ) : ( Disabled )} {miscData.fan.speed > 0 ? ( Running ({Math.round(miscData.fan.speed * 100)}%) ) : ( Off )} {miscData.coolingFan.speed > 0 ? ( Running ({Math.round(miscData.coolingFan.speed * 100)}%) ) : ( Off )} ) : ( } size='large' /> )}
) } PrinterMiscPanel.propTypes = { id: PropTypes.string.isRequired, showControls: PropTypes.bool } export default PrinterMiscPanel