This commit is contained in:
333
www/index.html
333
www/index.html
@@ -863,6 +863,56 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="page" id="pageSounds" data-page-content="sounds" hidden>
|
||||
<div class="soundsPage">
|
||||
<section class="card">
|
||||
<div class="cardHeader">
|
||||
<div>
|
||||
<div class="cardTitle" data-i18n="sounds.title">Sounds</div>
|
||||
<div class="cardSub" data-i18n="sounds.subtitle">Setup → Sounds — upload and manage robot sounds for sound zones.</div>
|
||||
</div>
|
||||
<button id="soundCreateBtn" type="button" class="btn primary" data-i18n="sounds.create">Create sound</button>
|
||||
</div>
|
||||
<div class="cardBody">
|
||||
<div id="soundListEmpty" class="mutedNote" hidden data-i18n="sounds.empty">No sounds yet. Create one to use in sound zones.</div>
|
||||
<div id="soundList" class="missionList"></div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<dialog id="soundEditDialog" class="mapsMirDialog">
|
||||
<form id="soundEditForm" method="dialog">
|
||||
<h2 class="mapsMirDialogTitle" id="soundEditTitle" data-i18n="sounds.createTitle">Create sound</h2>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="sounds.name">Name</span>
|
||||
<input type="text" id="soundEditName" autocomplete="off" required />
|
||||
</label>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="sounds.description">Description</span>
|
||||
<textarea id="soundEditDescription" rows="2"></textarea>
|
||||
</label>
|
||||
<label class="mapsMirField mapsMirField--checkbox">
|
||||
<input type="checkbox" id="soundEditEnabled" checked />
|
||||
<span data-i18n="sounds.enabled">Enabled</span>
|
||||
</label>
|
||||
<div class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="sounds.file">Audio file</span>
|
||||
<p id="soundEditFileMeta" class="mutedNote">—</p>
|
||||
<div class="mapsMirDialogFooter mapsMirDialogFooter--inline">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="soundEditUploadBtn" data-i18n="sounds.upload">Upload file…</button>
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="soundEditPlayBtn" disabled data-i18n="sounds.play">Play</button>
|
||||
</div>
|
||||
<input type="file" id="soundEditUploadInput" accept="audio/*,.wav,.mp3,.ogg" hidden />
|
||||
</div>
|
||||
<div class="mapsMirDialogFooter">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="soundEditCancelBtn" data-i18n="common.cancel">Cancel</button>
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--danger" id="soundEditDeleteBtn" hidden data-i18n="common.delete">Delete</button>
|
||||
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
</div>
|
||||
|
||||
<div class="page" id="pageMaps" data-page-content="maps" hidden>
|
||||
<div id="mapsListView" class="mapsMirPage">
|
||||
<header class="mapsMirHeader">
|
||||
@@ -993,7 +1043,7 @@
|
||||
</button>
|
||||
</header>
|
||||
|
||||
<div class="mapEditorMappingBar" role="toolbar" data-i18n-aria="maps.editor.toolbarAria">
|
||||
<div class="mapEditorMappingBar" id="mapEditorMappingBar" role="toolbar" data-i18n-aria="maps.editor.toolbarAria">
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorSearchBtn" disabled data-i18n-title="maps.editor.tool.search" title="Search">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><circle cx="8.5" cy="8.5" r="5.5" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M12.5 12.5L17 17" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
|
||||
</button>
|
||||
@@ -1010,9 +1060,119 @@
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M10 2.5v15M2.5 10h15" stroke="currentColor" stroke-width="1.2"/><path d="M10 2.5L8 5.5h4L10 2.5zM10 17.5l-2-3h4l-2 3zM2.5 10l3-2v4l-3-2zM17.5 10l-3-2v4l3-2z" fill="currentColor"/></svg>
|
||||
</button>
|
||||
<div class="mapEditorMappingBarSpacer" aria-hidden="true"></div>
|
||||
<select class="mapEditorObjectSelect" id="mapEditorObjectSelect" disabled>
|
||||
<option value="" data-i18n="maps.editor.objectTypesNone">No object-type selected</option>
|
||||
</select>
|
||||
<div class="mapEditorObjectTypePicker" id="mapEditorObjectTypePicker">
|
||||
<button
|
||||
type="button"
|
||||
class="mapEditorObjectTypeBtn"
|
||||
id="mapEditorObjectTypeBtn"
|
||||
disabled
|
||||
aria-haspopup="listbox"
|
||||
aria-expanded="false"
|
||||
aria-controls="mapEditorObjectTypeMenu"
|
||||
>
|
||||
<span class="mapEditorObjectTypeIcon" id="mapEditorObjectTypeIcon" aria-hidden="true"></span>
|
||||
<span class="mapEditorObjectTypeLabel" id="mapEditorObjectTypeLabel" data-i18n="maps.editor.objectTypesNone">No object-type selected</span>
|
||||
<svg class="mapEditorObjectTypeChevron" width="10" height="6" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</button>
|
||||
<ul class="mapEditorObjectTypeMenu" id="mapEditorObjectTypeMenu" role="listbox" hidden>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><rect x="3" y="3" width="12" height="12" rx="1.5" fill="none" stroke="currentColor" stroke-width="1.4" stroke-dasharray="2.5 2"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectTypesNone">No object-type selected</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="wall" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--wall" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><path d="M3 14L15 4" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.wall">Walls</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="floor" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--floor" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.18" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.floor">Floors</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="position" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--position" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><circle cx="4.5" cy="9" r="2.2" fill="currentColor"/><path d="M7 9h8M13 9l-2.5-2.2M13 9l-2.5 2.2" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.position">Positions</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="forbidden" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--forbidden" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.22" stroke="currentColor" stroke-width="1.5"/><path d="M5 13L13 5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.forbidden">Forbidden zones</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="preferred" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--preferred" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.28" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.preferred">Preferred zones</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="unpreferred" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--unpreferred" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.18" stroke="currentColor" stroke-width="1.5" stroke-dasharray="3 2" stroke-linejoin="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.unpreferred">Unpreferred zones</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="speed" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--speed" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.2" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 11h6M9 8v3" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.speed">Speed zones</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="sound" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--sound" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.18" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 10.5v-3h2l2.5-1.5v7L8 11.5H6z" fill="currentColor" fill-opacity="0.5"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.sound">Sound zones</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="directional" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--directional" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.16" stroke="currentColor" stroke-width="1.5"/><path d="M6 9h6M10 9l-2-2M10 9l-2 2" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.directional">Directional zones</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="directional_line" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--directionalLine" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><path d="M3 14L15 4" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M11 4h4v4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.directionalLine">Directional lines</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="planner" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--planner" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.14" stroke="currentColor" stroke-width="1.5" stroke-dasharray="4 2"/><circle cx="9" cy="9" r="2" fill="currentColor"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.planner">Planner zones</span>
|
||||
</li>
|
||||
<li class="mapEditorObjectTypeOption" role="option" data-value="io" tabindex="-1">
|
||||
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--io" aria-hidden="true">
|
||||
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.12" stroke="currentColor" stroke-width="1.5"/><path d="M6.5 10h5M8 8v4M10 8v4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
|
||||
</span>
|
||||
<span data-i18n="maps.editor.objectType.io">I/O zones</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorDrawBtn" data-tool="draw" disabled data-i18n-title="maps.editor.tool.draw" title="Draw">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.5 3.5l2 2-9 9H5.5v-2l9-9z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/><path d="M12.5 5.5l2 2" stroke="currentColor" stroke-width="1.4"/></svg>
|
||||
</button>
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorSelectBtn" data-tool="select" disabled data-i18n-title="maps.editor.tool.select" title="Select">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M4 3l12 7-5.5 1.5L8 17 6.5 11.5 4 3z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg>
|
||||
</button>
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorEraserBtn" data-tool="eraser" disabled data-i18n-title="maps.editor.tool.eraser" title="Eraser">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M4 14h12M6.5 14L14 6.5l2.5 2.5L9 16.5H6.5V14z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg>
|
||||
</button>
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorEraseSelectionBtn" data-tool="eraseSelection" disabled data-i18n-title="maps.editor.tool.eraseSelection" title="Erase by selection">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><rect x="4" y="4" width="12" height="12" rx="1" fill="none" stroke="currentColor" stroke-width="1.4" stroke-dasharray="3 2"/></svg>
|
||||
</button>
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorEraseShapeBtn" data-tool="eraseShape" disabled data-i18n-title="maps.editor.tool.eraseShape" title="Erase shape">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M5 5l10 10M15 5L5 15" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
|
||||
</button>
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorConfirmDrawBtn" hidden disabled data-i18n-title="maps.editor.tool.confirmDraw" title="Confirm shape">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M5 10l3.5 3.5L15 7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||||
</button>
|
||||
<button type="button" class="mapEditorMapTool" id="mapEditorCrosshairBtn" disabled data-i18n-title="maps.editor.tool.crosshair" title="Crosshair">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><circle cx="10" cy="10" r="6" fill="none" stroke="currentColor" stroke-width="1.4"/><path d="M10 4v12M4 10h12" stroke="currentColor" stroke-width="1.3"/></svg>
|
||||
</button>
|
||||
@@ -1050,6 +1210,7 @@
|
||||
<div class="mapEditorSheetGrid" id="mapEditorSheetGrid" aria-hidden="true"></div>
|
||||
<img id="mapEditorImage" class="mapEditorImageLoader" alt="" draggable="false" hidden />
|
||||
<canvas id="mapEditorOccupancyCanvas" class="mapEditorOccupancyCanvas" hidden aria-hidden="true"></canvas>
|
||||
<svg id="mapEditorObjectsSvg" class="mapEditorObjectsSvg" xmlns="http://www.w3.org/2000/svg" hidden aria-hidden="true"></svg>
|
||||
<div id="mapEditorOrigin" class="mapEditorOrigin" hidden aria-hidden="true">
|
||||
<span class="mapEditorOriginAxis mapEditorOriginAxis--x" aria-hidden="true"></span>
|
||||
<span class="mapEditorOriginAxis mapEditorOriginAxis--z" aria-hidden="true"></span>
|
||||
@@ -1198,6 +1359,164 @@
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="mapEditorPositionDialog" class="mapsMirDialog">
|
||||
<form id="mapEditorPositionForm" method="dialog">
|
||||
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.position.title">Position</h2>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.name">Name</span>
|
||||
<input type="text" id="mapPositionName" autocomplete="off" />
|
||||
</label>
|
||||
<div class="mapsMirFieldRow">
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.x">X (m)</span>
|
||||
<input type="number" id="mapPositionX" step="any" required />
|
||||
</label>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.y">Y (m)</span>
|
||||
<input type="number" id="mapPositionY" step="any" required />
|
||||
</label>
|
||||
</div>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.yaw">Orientation (°)</span>
|
||||
<input type="number" id="mapPositionYaw" step="any" required />
|
||||
</label>
|
||||
<p class="mapsMirDialogHint" data-i18n="maps.editor.position.hint">Click map and drag to set orientation, then confirm.</p>
|
||||
<div class="mapsMirDialogFooter">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapPositionCancelBtn" data-i18n="common.cancel">Cancel</button>
|
||||
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="mapEditorSpeedDialog" class="mapsMirDialog">
|
||||
<form id="mapEditorSpeedForm" method="dialog">
|
||||
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.speed.title">Speed zone</h2>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.speed.limit">Speed limit (m/s)</span>
|
||||
<input type="number" id="mapSpeedMps" min="0.1" max="1.5" step="0.05" value="0.8" required />
|
||||
</label>
|
||||
<p class="mapsMirDialogHint" data-i18n="maps.editor.speed.hint">Robot slows to this speed while inside the zone (0.1–1.5 m/s).</p>
|
||||
<div class="mapsMirDialogFooter">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapSpeedCancelBtn" data-i18n="common.cancel">Cancel</button>
|
||||
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="mapEditorSoundDialog" class="mapsMirDialog">
|
||||
<form id="mapEditorSoundForm" method="dialog">
|
||||
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.sound.title">Sound zone</h2>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.sound.select">Sound</span>
|
||||
<select id="mapSoundZoneSelect" required></select>
|
||||
</label>
|
||||
<p class="mapsMirDialogHint">
|
||||
<button type="button" class="mapsMirLinkBtn" id="mapSoundManageLink" data-i18n="maps.editor.sound.manage">Manage sounds in Setup → Sounds</button>
|
||||
</p>
|
||||
<div class="mapsMirDialogFooter">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapSoundCancelBtn" data-i18n="common.cancel">Cancel</button>
|
||||
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="mapEditorDirectionalDialog" class="mapsMirDialog">
|
||||
<form id="mapEditorDirectionalForm" method="dialog">
|
||||
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.directional.title">Directional zone</h2>
|
||||
<div id="mapDirectionalShapePanel">
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.directional.direction">Direction</span>
|
||||
<select id="mapDirectionalDeg"></select>
|
||||
</label>
|
||||
<p class="mapsMirDialogHint" data-i18n="maps.editor.directional.shapeHint">Robot cannot move opposite to the arrow (45° steps).</p>
|
||||
</div>
|
||||
<div id="mapDirectionalLinePanel" hidden>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.directional.lineWidth">Line width (px)</span>
|
||||
<input type="number" id="mapDirectionalLineWidth" min="2" max="48" step="1" value="8" />
|
||||
</label>
|
||||
<label class="mapsMirField mapsMirField--checkbox">
|
||||
<input type="checkbox" id="mapDirectionalReversed" />
|
||||
<span data-i18n="maps.editor.directional.reversed">Reverse direction</span>
|
||||
</label>
|
||||
<p class="mapsMirDialogHint" data-i18n="maps.editor.directional.lineHint">Direction follows line from first to last point.</p>
|
||||
</div>
|
||||
<div class="mapsMirDialogFooter">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapDirectionalCancelBtn" data-i18n="common.cancel">Cancel</button>
|
||||
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="mapEditorPlannerDialog" class="mapsMirDialog">
|
||||
<form id="mapEditorPlannerForm" method="dialog">
|
||||
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.planner.title">Planner zone</h2>
|
||||
<label class="mapsMirField mapsMirField--checkbox">
|
||||
<input type="checkbox" id="mapPlannerNoLocalization" />
|
||||
<span data-i18n="maps.editor.planner.noLocalization">No localization (encoders only)</span>
|
||||
</label>
|
||||
<label class="mapsMirField mapsMirField--checkbox">
|
||||
<input type="checkbox" id="mapPlannerLookAhead" />
|
||||
<span data-i18n="maps.editor.planner.lookAhead">Look-ahead (narrow field of view)</span>
|
||||
</label>
|
||||
<label class="mapsMirField mapsMirField--checkbox">
|
||||
<input type="checkbox" id="mapPlannerIgnoreObstacles" />
|
||||
<span data-i18n="maps.editor.planner.ignoreObstacles">Ignore obstacles</span>
|
||||
</label>
|
||||
<div class="mapsMirFieldRow">
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.planner.pathDeviation">Path deviation (m)</span>
|
||||
<input type="number" id="mapPlannerPathDeviation" min="0" max="3" step="0.1" value="0.5" />
|
||||
</label>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.planner.pathTimeout">Path timeout (s)</span>
|
||||
<input type="number" id="mapPlannerPathTimeout" min="0" step="1" value="30" />
|
||||
</label>
|
||||
</div>
|
||||
<div class="mapsMirDialogFooter">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapPlannerCancelBtn" data-i18n="common.cancel">Cancel</button>
|
||||
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="mapEditorIoDialog" class="mapsMirDialog">
|
||||
<form id="mapEditorIoForm" method="dialog">
|
||||
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.io.title">I/O zone</h2>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.module">I/O module</span>
|
||||
<input type="text" id="mapIoModule" list="mapIoModuleList" autocomplete="off" required />
|
||||
<datalist id="mapIoModuleList">
|
||||
<option value="GPIO module 1"></option>
|
||||
<option value="PLC I/O 1"></option>
|
||||
</datalist>
|
||||
</label>
|
||||
<div class="mapsMirFieldRow">
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.plcRegister">PLC register</span>
|
||||
<input type="number" id="mapIoPlcRegister" step="1" />
|
||||
</label>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.plcValue">Value</span>
|
||||
<input type="number" id="mapIoPlcValue" step="1" />
|
||||
</label>
|
||||
</div>
|
||||
<label class="mapsMirField">
|
||||
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.plcMode">PLC mode</span>
|
||||
<select id="mapIoPlcMode">
|
||||
<option value="set" data-i18n="maps.editor.io.plcModeSet">Set</option>
|
||||
<option value="add" data-i18n="maps.editor.io.plcModeAdd">Add</option>
|
||||
<option value="subtract" data-i18n="maps.editor.io.plcModeSubtract">Subtract</option>
|
||||
</select>
|
||||
</label>
|
||||
<p class="mapsMirDialogHint" data-i18n="maps.editor.io.hint">Robot activates I/O when entering the zone.</p>
|
||||
<div class="mapsMirDialogFooter">
|
||||
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapIoCancelBtn" data-i18n="common.cancel">Cancel</button>
|
||||
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
|
||||
</div>
|
||||
</form>
|
||||
</dialog>
|
||||
|
||||
<dialog id="mapUploadConfirmDialog" class="mapsMirDialog">
|
||||
<div class="mapsMirDialogPanel">
|
||||
<h2 class="mapsMirDialogTitle" data-i18n="maps.uploadConfirm.title">Overwrite map?</h2>
|
||||
@@ -1729,8 +2048,14 @@ GET /api/v2.0.0/status</pre>
|
||||
<script src="/missions.js"></script>
|
||||
<script src="/map-geo.js"></script>
|
||||
<script src="/map-occupancy-canvas.js"></script>
|
||||
<script src="/map-occupancy-edit.js"></script>
|
||||
<script src="/map-planner-zones.js"></script>
|
||||
<script src="/map-behavior-zones.js"></script>
|
||||
<script src="/map-advanced-zones.js"></script>
|
||||
<script src="/map-objects.js"></script>
|
||||
<script src="/map-yaml.js"></script>
|
||||
<script src="/maps.js"></script>
|
||||
<script src="/sounds.js"></script>
|
||||
<script src="/map-editor.js"></script>
|
||||
<script src="/topbar.js"></script>
|
||||
<script src="/dashboard.js"></script>
|
||||
|
||||
Reference in New Issue
Block a user