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: (
<>