Skip to content

Commit 71679ba

Browse files
adding vehicle list
1 parent 52c585a commit 71679ba

File tree

5 files changed

+184
-8
lines changed

5 files changed

+184
-8
lines changed

index.css

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,58 @@ body {
33
flex-direction: column;
44
height: 100vh;
55
margin: 0;
6-
background-color: black;
76
overflow: hidden;
87
}
9-
#sim-container {
8+
#top-container {
9+
display: flex;
10+
flex-direction: row;
1011
flex-grow: 1;
11-
background-color: white;
12-
width: 100%;
1312
min-height: 0;
1413
}
14+
#vehicle-container{
15+
width: 200px;
16+
overflow: auto;
17+
white-space: nowrap;
18+
}
19+
.vehicle{
20+
margin: 10px;
21+
padding: 5px;
22+
}
23+
.vehicle-hover{
24+
background-color: grey;
25+
}
26+
.vehicle-body{
27+
margin-left: 10px;
28+
}
29+
.vehicle-position{
30+
font-family: monospace;
31+
}
32+
.vehicle-action{
33+
font-family: monospace;
34+
}
35+
#sidebar-resizer {
36+
width: 15px;
37+
background-color: #ccc;
38+
cursor: col-resize;
39+
user-select: none;
40+
background: repeating-linear-gradient(45deg, #e3e3e3, #e3e3e3 10px, #f1f1f1 10px, #f1f1f1 20px);
41+
display: flex;
42+
justify-content: center;
43+
align-items: center;
44+
}
45+
#sidebar-resizer-handle{
46+
width: 6px;
47+
height: 50px;
48+
background: #ffffff;
49+
border-radius: 3px;
50+
cursor: ew-resize;
51+
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
52+
}
53+
#sim-container {
54+
background-color: white;
55+
flex: 1;
56+
min-width: 0;
57+
}
1558
#controls-box{
1659
background-color: #c5c5c5;
1760
}

index.html

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,25 @@
2828
<span class="perturbation-group-item-range"></span>
2929
<span class="perturbation-group-item-value"></span>
3030
</li>
31-
</template>
31+
</template>
32+
<template id="vehicle-template">
33+
<div class="vehicle">
34+
<div class="vehicle-header">
35+
<span class="vehicle-title"></span>
36+
<span class="vehicle-id"></span>
37+
</div>
38+
<div class="vehicle-body">
39+
<div>
40+
<span>Position: </span>
41+
<span class="vehicle-position"></span>
42+
</div>
43+
<div>
44+
<span>Action: </span>
45+
<span class="vehicle-action"></span>
46+
</div>
47+
</div>
48+
</div>
49+
</template>
3250
<link rel="stylesheet" href="./index.css">
3351
<script type="importmap">
3452
{
@@ -45,10 +63,17 @@
4563
}
4664
</script>
4765
<script type="module" src="./index.js"></script>
66+
<script type="module" src="./sidebar.js"></script>
4867
</head>
4968
<body>
5069
<div id="status"></div>
51-
<div id="sim-container"></div>
70+
<div id="top-container">
71+
<div id="vehicle-container"></div>
72+
<div id="sidebar-resizer">
73+
<div id="sidebar-resizer-handle"></div>
74+
</div>
75+
<div id="sim-container"></div>
76+
</div>
5277
<div id="controls-box">
5378
<div id="controller-options-container">
5479
<div id="controller-selector-container">

index.js

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,10 +231,47 @@ async function main(){
231231
proxy_controller = new ProxyController(new Policy(model))
232232
const l2f = new L2F(sim_container, 10, proxy_controller, seed)
233233

234+
l2f.state_update_callbacks.push((states) => {
235+
const vehicle_container = document.getElementById("vehicle-container")
236+
if(vehicle_container.children.length != states.length){
237+
const vehicle_template = document.getElementById("vehicle-template")
238+
vehicle_container.innerHTML = ""
239+
states.forEach((state, i) => {
240+
const vehicle_pre = vehicle_template.content.cloneNode(true)
241+
const vehicle = vehicle_pre.querySelector(".vehicle")
242+
vehicle.querySelector(".vehicle-title").textContent = `Vehicle ${i}`
243+
// vehicle.querySelector(".vehicle-id").textContent = JSON.stringify(state.parameters.dynamics, null, 2)
244+
vehicle_container.appendChild(vehicle)
245+
vehicle.title = JSON.stringify(state.parameters.dynamics, null, 2)
246+
// on hover
247+
vehicle.addEventListener("mouseenter", (event) => {
248+
console.log(`hovering over vehicle ${i}`)
249+
vehicle.classList.add("vehicle-hover")
250+
event.stopPropagation()
251+
})
252+
vehicle.addEventListener("mouseleave", (event) => {
253+
vehicle.classList.remove("vehicle-hover")
254+
event.stopPropagation()
255+
})
256+
})
257+
}
258+
states.forEach((state, i) => {
259+
const vehicle = vehicle_container.children[i]
260+
const fixed = (x, n) => {
261+
const y = x.toFixed(n);
262+
return y >= 0 ? `+${y}` : y;
263+
}
264+
vehicle.querySelector(".vehicle-position").textContent = state.state.position.map(x => fixed(x, 3)).join(",")
265+
vehicle.querySelector(".vehicle-action").textContent = state.action.map(x => fixed(x, 2)).join(",")
266+
})
267+
268+
})
269+
234270
const parameter_manager = new ParameterManager(l2f)
235271
const sim_controls = new SimControls(l2f, proxy_controller, parameter_manager)
236272
}
237-
window.onload = main
273+
274+
document.addEventListener("DOMContentLoaded", main)
238275

239276
const drag_and_drop_overlay = document.getElementById('drag-and-drop-overlay');
240277
let drag_and_drop_counter = 0;

l2f.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ export class L2F{
1919

2020
this.seed = seed
2121

22+
23+
this.state_update_callbacks = []
24+
2225
const urlParams = new URLSearchParams(window.location.search);
2326
this.DEBUG = urlParams.has('DEBUG') ? urlParams.get('DEBUG') === 'true' : false
2427

@@ -89,14 +92,24 @@ export class L2F{
8992
else{
9093
this.states = this.states.slice(0, num)
9194
}
92-
this.update_render_state()
9395
this.parameters = this.states.map(state => JSON.parse(state.get_parameters()))
96+
this.update_render_state()
9497
await this.ui.episode_init_multi(this.ui_state, this.parameters)
9598
return diff
9699
}
97100
update_render_state(){
98101
this.render_states = this.states.map(state => JSON.parse(state.get_state()))
99102
this.render_actions = this.states.map(state => JSON.parse(state.get_action()))
103+
104+
105+
const combined_state = this.render_states.map((state, i) => {
106+
return {
107+
"state": state,
108+
"action": this.render_actions[i],
109+
"parameters": this.parameters[i]
110+
}
111+
})
112+
this.state_update_callbacks.forEach(callback => callback(combined_state))
100113
}
101114
simulate_step(){
102115
let dts = []

sidebar.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
document.addEventListener('DOMContentLoaded', () => {
2+
const sidebarResizer = document.getElementById('sidebar-resizer');
3+
const vehicleContainer = document.getElementById('vehicle-container');
4+
const simContainer = document.getElementById('sim-container');
5+
let isResizing = false;
6+
let dragStartX = 0;
7+
let didMove = false;
8+
if(localStorage.getItem('vehicle-container-width') !== null) {
9+
vehicleContainer.style.width = localStorage.getItem('vehicle-container-width')
10+
window.dispatchEvent(new Event('resize'));
11+
}
12+
13+
sidebarResizer.addEventListener('mousedown', initResize);
14+
document.addEventListener('mousemove', resize);
15+
document.addEventListener('mouseup', stopResize);
16+
17+
sidebarResizer.addEventListener('click', e => {
18+
if (didMove) {
19+
e.stopPropagation();
20+
e.preventDefault();
21+
return;
22+
}
23+
vehicleContainer.style.width = '0px';
24+
localStorage.setItem('vehicle-container-width', '0px');
25+
window.dispatchEvent(new Event('resize'));
26+
});
27+
28+
function initResize(e) {
29+
isResizing = true;
30+
didMove = false;
31+
dragStartX = e.clientX;
32+
document.body.style.cursor = 'col-resize';
33+
e.preventDefault();
34+
}
35+
36+
function resize(e) {
37+
if (!isResizing) return;
38+
39+
if (Math.abs(e.clientX - dragStartX) > 3) {
40+
didMove = true;
41+
}
42+
43+
const containerRect = sidebarResizer.parentElement.getBoundingClientRect();
44+
const newWidth = e.clientX - containerRect.left - sidebarResizer.getBoundingClientRect().width / 2;
45+
46+
vehicleContainer.style.width = `${newWidth}px`;
47+
simContainer.style.flexGrow = 1;
48+
window.dispatchEvent(new Event('resize'));
49+
localStorage.setItem('vehicle-container-width', newWidth);
50+
}
51+
52+
function stopResize() {
53+
isResizing = false;
54+
document.body.style.cursor = 'default';
55+
window.dispatchEvent(new Event('resize'));
56+
}
57+
58+
});

0 commit comments

Comments
 (0)