@@ -15,18 +15,55 @@ const resetStateButton = document.getElementById("reset-state");
1515const board = document . getElementById ( "board" ) ;
1616const log = document . getElementById ( "log" ) ;
1717const stateLine = document . getElementById ( "state-line" ) ;
18+ const latestStatus = document . getElementById ( "latest-status" ) ;
19+ const scriptPreview = document . getElementById ( "script-preview" ) ;
20+ const presetButtons = document . querySelectorAll ( ".preset" ) ;
1821
1922let state = { ...initialState } ;
2023let scriptCommands = [ ] ;
2124let scriptCursor = 0 ;
2225
26+ const demoPresets = {
27+ A : "PLACE 0,0,NORTH\nMOVE\nREPORT" ,
28+ B : "PLACE 0,0,NORTH\nLEFT\nREPORT" ,
29+ C : "PLACE 1,2,EAST\nMOVE\nMOVE\nLEFT\nMOVE\nREPORT" ,
30+ } ;
31+
2332function escapeHtml ( text ) {
2433 return String ( text )
2534 . replaceAll ( "&" , "&" )
2635 . replaceAll ( "<" , "<" )
2736 . replaceAll ( ">" , ">" ) ;
2837}
2938
39+ function setStatusBanner ( status , message ) {
40+ latestStatus . classList . remove ( "success" , "fail" , "neutral" ) ;
41+
42+ if ( status === "success" ) {
43+ latestStatus . classList . add ( "success" ) ;
44+ } else if ( status === "fail" ) {
45+ latestStatus . classList . add ( "fail" ) ;
46+ } else {
47+ latestStatus . classList . add ( "neutral" ) ;
48+ }
49+
50+ latestStatus . textContent = message ;
51+ }
52+
53+ function renderScriptPreview ( ) {
54+ if ( scriptCommands . length === 0 ) {
55+ scriptPreview . innerHTML = "<li>No parsed script commands yet.</li>" ;
56+ return ;
57+ }
58+
59+ scriptPreview . innerHTML = scriptCommands
60+ . map ( ( line , index ) => {
61+ const activeClass = index === scriptCursor ? "active-line" : "" ;
62+ return `<li class="${ activeClass } ">${ escapeHtml ( line ) } </li>` ;
63+ } )
64+ . join ( "" ) ;
65+ }
66+
3067function renderState ( ) {
3168 if ( ! state . Placed ) {
3269 stateLine . textContent = "Not placed" ;
@@ -65,6 +102,7 @@ function executeCommand(commandText) {
65102 state = result . state ;
66103 renderState ( ) ;
67104 renderBoard ( ) ;
105+ setStatusBanner ( result . status , result . message ) ;
68106 appendLog ( {
69107 commandText,
70108 status : result . status ,
@@ -76,6 +114,7 @@ function executeCommand(commandText) {
76114function reloadScriptCommands ( ) {
77115 scriptCommands = parseScript ( scriptInput . value ) ;
78116 scriptCursor = 0 ;
117+ renderScriptPreview ( ) ;
79118}
80119
81120runCommandButton . addEventListener ( "click" , ( ) => {
@@ -98,6 +137,7 @@ stepScriptButton.addEventListener("click", () => {
98137 }
99138
100139 if ( scriptCursor >= scriptCommands . length ) {
140+ setStatusBanner ( "fail" , "Command failed: Script has no remaining commands" ) ;
101141 appendLog ( {
102142 commandText : "SCRIPT" ,
103143 status : "fail" ,
@@ -109,16 +149,20 @@ stepScriptButton.addEventListener("click", () => {
109149
110150 executeCommand ( scriptCommands [ scriptCursor ] ) ;
111151 scriptCursor += 1 ;
152+ renderScriptPreview ( ) ;
112153} ) ;
113154
114155runScriptButton . addEventListener ( "click" , ( ) => {
115156 reloadScriptCommands ( ) ;
116157 scriptCommands . forEach ( ( command ) => executeCommand ( command ) ) ;
117158 scriptCursor = scriptCommands . length ;
159+ renderScriptPreview ( ) ;
118160} ) ;
119161
120162resetScriptButton . addEventListener ( "click" , ( ) => {
121163 scriptCursor = 0 ;
164+ renderScriptPreview ( ) ;
165+ setStatusBanner ( "success" , "Command success: Script cursor reset" ) ;
122166 appendLog ( {
123167 commandText : "SCRIPT" ,
124168 status : "success" ,
@@ -131,6 +175,7 @@ resetStateButton.addEventListener("click", () => {
131175 state = { ...initialState } ;
132176 renderState ( ) ;
133177 renderBoard ( ) ;
178+ setStatusBanner ( "success" , "Command success: Robot state reset" ) ;
134179 appendLog ( {
135180 commandText : "RESET" ,
136181 status : "success" ,
@@ -139,5 +184,19 @@ resetStateButton.addEventListener("click", () => {
139184 } ) ;
140185} ) ;
141186
187+ scriptInput . addEventListener ( "input" , ( ) => {
188+ reloadScriptCommands ( ) ;
189+ } ) ;
190+
191+ presetButtons . forEach ( ( button ) => {
192+ button . addEventListener ( "click" , ( ) => {
193+ const presetKey = button . dataset . preset ;
194+ scriptInput . value = demoPresets [ presetKey ] || "" ;
195+ reloadScriptCommands ( ) ;
196+ setStatusBanner ( "neutral" , `Preset loaded: Example ${ presetKey } ` ) ;
197+ } ) ;
198+ } ) ;
199+
142200renderState ( ) ;
143201renderBoard ( ) ;
202+ reloadScriptCommands ( ) ;
0 commit comments