import React, { useEffect, useState } from 'react'; import dronecan from './dronecan'; import { Paper, Box, Typography, TextField, Button, Stack, Switch, TableContainer, Table, TableHead, TableBody, TableRow, TableCell } from '@mui/material'; import { secondsToTime } from './common'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; import CableIcon from '@mui/icons-material/Cable'; import SystemUpdateAltIcon from '@mui/icons-material/SystemUpdateAlt'; import FirmwareUpdateModal from './FirmwareUpdateModal'; import ConfirmRestartModal from './ConfirmRestartModal'; import { useTranslation } from './i18n/LanguageContext'; const VendorSpecificCodeDisplay = (code) => { code = Math.max(0, Math.floor(code) & 0xFFFF); let decimal = code.toString(); let hex = `0x${code.toString(16).padStart(4, '0')}`; let binary = `0b${(code >>> 8).toString(2).padStart(8, '0')}_${(code & 255).toString(2).padStart(8, '0')}`; return `${decimal} | ${hex} | ${binary}`; }; const NodeProperties = ({ nodeId, nodes, multiNodeEditorEnable, setMultiNodeEditorEnable }) => { const [firmwareModalOpen, setFirmwareModalOpen] = useState(false); const [restartModalOpen, setRestartModalOpen] = useState(false); const { t } = useTranslation(); useEffect(() => { const localNode = window.localNode; const handleNodeParam = (transfer) => { if (transfer.sourceNodeId !== nodeId) return; }; localNode.on('uavcan.protocol.param.GetSet.Response', handleNodeParam); return () => { localNode.off('uavcan.protocol.param.GetSet.Response', handleNodeParam); }; }, [nodeId]); if (!nodeId) return null; const node = nodes[nodeId]; if (!node) return null; const handleNodeRestart = (nodeId) => { const localNode = window.localNode; localNode.restartNode(nodeId, (transfer) => { console.log('Restart response:', transfer); }); }; const handleConfirmRestart = () => { handleNodeRestart(nodeId); setRestartModalOpen(false); }; const status = nodes[nodeId]?.status; const name = node.name ? node.name : ''; const health = status ? `${status.getConstant('health')} (${status.health})` : ''; const mode = status ? `${status.getConstant('mode')} (${status.mode})` : ''; const uptime = status ? secondsToTime(status.uptime_sec) : 0; const vendor_specific_status_code = status ? VendorSpecificCodeDisplay(status.vendor_specific_status_code) : 0; const softwareVersion = node.software_version ? `${node.software_version.major}.${node.software_version.minor}` : ''; const softwareCrc64 = node.software_version ? `0x${node.software_version.image_crc.toString(16).padStart(8, '0')}` : ''; const softwareVcsCommit = node.software_version ? `0x${node.software_version.vcs_commit.toString(16).padStart(4, '0')}` : ''; const hardwareVersion = node.hardware_version ? `${node.hardware_version.major}.${node.hardware_version.minor}` : ''; const hardwareUID = node.hardware_version ? node.hardware_version.unique_id.map((item) => { return item.toString(16).padStart(2, '0') }).join(' ') : ''; const certificateOfAuthenticity = node.certificate_of_authenticity ? node.certificate_of_authenticity : ' '; return ( {t('props.title')} {t('props.multi_editor')} { setMultiNodeEditorEnable(e.target.checked) }} /> {t('props.controls')} setFirmwareModalOpen(false)} targetNodeId={nodeId} /> setRestartModalOpen(false)} onConfirm={handleConfirmRestart} /> ); }; export default NodeProperties;