import { useContext, useState, useEffect } from 'react' import { Typography, Spin, Flex, Space, Collapse, InputNumber, Descriptions, Button, Divider } from 'antd' import { LoadingOutlined, CaretRightOutlined } from '@ant-design/icons' import { ApiServerContext } from '../context/ApiServerContext' import styled from 'styled-components' import PropTypes from 'prop-types' import BoolDisplay from './BoolDisplay' import merge from 'lodash/merge' import { round } from '../utils/Utils' const { Text } = Typography const CustomCollapse = styled(Collapse)` .ant-collapse-header { padding: 0 !important; } .ant-collapse-content-box { padding-left: 0 !important; padding-right: 0 !important; padding-bottom: 0 !important; } ` const PrinterPositionPanel = ({ id, showControls = true, showMoreInfo = true }) => { const { subscribeToObjectEvent, connected, sendObjectAction } = useContext(ApiServerContext) const [positionData, setPositionData] = useState({ speedFactor: 1.0, // eslint-disable-line speed: 100, extrudeFactor: 1.0, // eslint-disable-line absoluteCoordinates: true, // eslint-disable-line absoluteExtrude: false, // eslint-disable-line homingOrigin: [0.0, 0.0, 0.0, 0.0], // eslint-disable-line toolheadPosition: [0.0, 0.0, 0.0, 0.0], gcodePosition: [0.0, 0.0, 0.0, 0.0], // eslint-disable-line livePosition: [0.0, 0.0, 0.0, 0.0], maxVelocity: 1000, maxAcceleration: 1000, squareCornerVelocity: 100, minCruiseRatio: 0 }) useEffect(() => { if (id && connected == true) { const motionEventUnsubscribe = subscribeToObjectEvent( id, 'printer', 'motion', (event) => { setPositionData((prev) => { const merged = merge({}, prev, event.data) return merged }) } ) return () => { if (motionEventUnsubscribe) motionEventUnsubscribe() } } }, [id, connected]) const [speedFactor, setSpeedFactor] = useState(positionData.speedFactor) const [extrudeFactor, setExtrudeFactor] = useState(positionData.extrudeFactor) const [maxVelocity, setMaxVelocity] = useState(positionData.maxVelocity) const [maxAcceleration, setMaxAcceleration] = useState( positionData.maxAcceleration ) const [squareCornerVelocity, setSquareCornerVelocity] = useState( positionData.squareCornerVelocity ) const [minCruiseRatio, setMinCruiseRatio] = useState( positionData.minCruiseRatio ) useEffect(() => { if (positionData.speedFactor !== undefined) { setSpeedFactor(positionData.speedFactor) } if (positionData.extrudeFactor !== undefined) { setExtrudeFactor(positionData.extrudeFactor) } if (positionData.maxVelocity !== undefined) { setMaxVelocity(positionData.maxVelocity) } if (positionData.maxAcceleration !== undefined) { setMaxAcceleration(positionData.maxAcceleration) } if (positionData.squareCornerVelocity !== undefined) { setSquareCornerVelocity(positionData.squareCornerVelocity) } if (positionData.minCruiseRatio !== undefined) { setMinCruiseRatio(positionData.minCruiseRatio) } }, [ positionData.speedFactor, positionData.extrudeFactor, positionData.maxVelocity, positionData.maxAcceleration, positionData.squareCornerVelocity, positionData.minCruiseRatio ]) const handleSetSpeedFactor = () => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'setSpeedFactor', data: { speedFactor: speedFactor * 100 } }) } } const handleSetExtrudeFactor = () => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'setExtrudeFactor', data: { extrudeFactor: extrudeFactor * 100 } }) } } const handleSetMaxVelocity = () => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'setMaxVelocity', data: { maxVelocity: maxVelocity } }) } } const handleSetMaxAcceleration = () => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'setMaxAcceleration', data: { maxAcceleration: maxAcceleration } }) } } const handleSetSquareCornerVelocity = () => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'setSquareCornerVelocity', data: { squareCornerVelocity: squareCornerVelocity } }) } } const handleSetMinCruiseRatio = () => { if (id && connected == true) { sendObjectAction(id, 'printer', { type: 'setMinCruiseRatio', data: { minCruiseRatio: minCruiseRatio } }) } } const moreInfoItems = [ { key: '1', label: 'More Position Data', children: ( <> GCode Position: {' '} {round(positionData.gcodePosition[0], 2)}mm {round(positionData.gcodePosition[1], 2)}mm {round(positionData.gcodePosition[2], 2)}mm {round(positionData.gcodePosition[3], 2)}mm {showControls && ( <> Max Velocity: setMaxVelocity(value)} onPressEnter={handleSetMaxVelocity} size='small' /> Max Acceleration: setMaxAcceleration(value)} onPressEnter={handleSetMaxAcceleration} size='small' /> Sqr Corner Vel: setSquareCornerVelocity(value)} onPressEnter={handleSetSquareCornerVelocity} size='small' /> Min Cruise Ratio: setMinCruiseRatio(value / 100)} onPressEnter={handleSetMinCruiseRatio} size='small' /> )} Homing Origin: {round(positionData.homingOrigin[0], 2)}mm {round(positionData.homingOrigin[1], 2)}mm {round(positionData.homingOrigin[2], 2)}mm {round(positionData.homingOrigin[3], 2)}mm ) } ] return (
{positionData ? ( {round(positionData.livePosition[0], 2)}mm {round(positionData.toolheadPosition[0], 2)}mm {round(positionData.livePosition[1], 2)}mm {round(positionData.toolheadPosition[1], 2)}mm {round(positionData.livePosition[2], 2)}mm {round(positionData.toolheadPosition[2], 2)}mm {round(positionData.livePosition[3], 2)}mm {round(positionData.toolheadPosition[3], 2)}mm {showControls && ( <> Speed Factor: setSpeedFactor(value)} onPressEnter={handleSetSpeedFactor} size='small' /> Extrude Factor: setExtrudeFactor(value)} onPressEnter={handleSetExtrudeFactor} size='small' /> )} {round(positionData.speed, 2)}mm/s {positionData ? ( ) : ( n/a )} {positionData ? ( ) : ( n/a )} {showMoreInfo && ( ( )} /> )} ) : ( } size='large' /> )}
) } PrinterPositionPanel.propTypes = { id: PropTypes.string.isRequired, showControls: PropTypes.bool, showMoreInfo: PropTypes.bool } export default PrinterPositionPanel