aboutsummaryrefslogtreecommitdiff
path: root/web/http/nissyapp.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'web/http/nissyapp.mjs')
-rw-r--r--web/http/nissyapp.mjs94
1 files changed, 89 insertions, 5 deletions
diff --git a/web/http/nissyapp.mjs b/web/http/nissyapp.mjs
index 1f9fa72..bdc553a 100644
--- a/web/http/nissyapp.mjs
+++ b/web/http/nissyapp.mjs
@@ -3,16 +3,31 @@
3// to this folder when running ./build web. 3// to this folder when running ./build web.
4 4
5var solveButton = document.getElementById("solveButton"); 5var solveButton = document.getElementById("solveButton");
6var pauseResumeButton = document.getElementById("pauseResumeButton");
7var cancelSolveButton = document.getElementById("cancelSolveButton");
6var scrField = document.getElementById("scrambleText"); 8var scrField = document.getElementById("scrambleText");
7var resultsLabel = document.getElementById("resultsLabel"); 9var resultsLabel = document.getElementById("resultsLabel");
8var resultsText = document.getElementById("results"); 10var resultsText = document.getElementById("results");
9var solverSelector = document.getElementById("solverSelector"); 11var solverSelector = document.getElementById("solverSelector");
10var toggleLog = document.getElementById("toggleShowLog"); 12var toggleLog = document.getElementById("toggleShowLog");
11var logPane = document.getElementById("logPane"); 13var logPane = document.getElementById("logPane");
14var minSlider = document.getElementById("minMovesSlider");
15var maxSlider = document.getElementById("maxMovesSlider");
16var minLabel = document.getElementById("minLabel");
17var maxLabel = document.getElementById("maxLabel");
18var maxSolsInput = document.getElementById("maxSolutions");
12 19
20var solveStatus = "run"; // For now this is global
13var lastCallbackId = 0; 21var lastCallbackId = 0;
14var callbacks = new Map(); // Values: { f: function, arg: object } 22var callbacks = new Map(); // Values: { f: function, arg: object }
15var worker = new Worker("./worker.mjs", { type: "module" }); 23var worker = new Worker("./worker.mjs", { type: "module" });
24
25// Periodically send status updates to the worker
26
27const sendStatusUpdateToWorker = () =>
28 worker.postMessage({command: "update status", id: -1, arg: solveStatus });
29setInterval(() => sendStatusUpdateToWorker(), 500);
30
16worker.onmessage = (event) => { 31worker.onmessage = (event) => {
17 if (event.data.command == "log") { 32 if (event.data.command == "log") {
18 logPane.innerText += event.data.object; 33 logPane.innerText += event.data.object;
@@ -32,8 +47,48 @@ function updateResults(label, results, enable) {
32 resultsText.innerText = results; 47 resultsText.innerText = results;
33 solveButton.disabled = !enable; 48 solveButton.disabled = !enable;
34 solverSelector.disabled = !enable; 49 solverSelector.disabled = !enable;
50 minSlider.disabled = !enable;
51 maxSlider.disabled = !enable;
52 maxSolsInput.disabled = !enable;
35} 53}
36 54
55scrField.addEventListener("input", (e) => {
56 const scramble = scrField.value;
57
58 const callbackId = ++lastCallbackId;
59 callbacks.set(callbackId, {
60 f: (callbackArg, validateResult) => {
61 if (validateResult) {
62 scrField.style.border = "";
63 } else {
64 scrField.style.border = "2px solid red";
65 }
66 },
67 arg: scramble
68 });
69
70 worker.postMessage({
71 command: "validate scramble",
72 id: callbackId,
73 arg: scramble
74 });
75});
76
77minSlider.addEventListener("input", () =>
78 minLabel.innerText = "Minimum moves: " + minSlider.value);
79
80maxSlider.addEventListener("input", () =>
81 maxLabel.innerText = "Maximum moves: " + maxSlider.value);
82
83maxSolsInput.addEventListener("keyup", () => {
84 if (maxSolsInput.value != "") {
85 if (parseInt(maxSolsInput.value) < parseInt(maxSolsInput.min))
86 maxSolsInput.value = maxSolsInput.min;
87 if (parseInt(maxSolsInput.value) > parseInt(maxSolsInput.max))
88 maxSolsInput.value = maxSolsInput.max;
89 }
90});
91
37var logVisible = false; 92var logVisible = false;
38toggleLog.addEventListener("click", () => { 93toggleLog.addEventListener("click", () => {
39 logVisible = !logVisible; 94 logVisible = !logVisible;
@@ -67,7 +122,7 @@ solveButton.addEventListener("click", () => {
67 122
68 worker.postMessage({ 123 worker.postMessage({
69 command: "validate scramble", 124 command: "validate scramble",
70 id: lastCallbackId, 125 id: callbackId,
71 arg: scramble 126 arg: scramble
72 }); 127 });
73}); 128});
@@ -110,7 +165,10 @@ function askDownloadThenSolve(solver, scramble) {
110 updateResults("", "", false); 165 updateResults("", "", false);
111 confirmDiv.style.display = "block"; 166 confirmDiv.style.display = "block";
112 167
113 cancel.addEventListener("click", cleanup); 168 cancel.addEventListener("click", () => {
169 cleanup();
170 updateResults("", "", true);
171 });
114 172
115 download.addEventListener("click", () => { 173 download.addEventListener("click", () => {
116 cleanup(); 174 cleanup();
@@ -153,12 +211,38 @@ function downloadOrGenerateThenSolve(solver, scramble, download) {
153 }); 211 });
154} 212}
155 213
214pauseResumeButton.addEventListener("click", (e) => {
215 if (pauseResumeButton.innerText == "Pause") {
216 solveStatus = "pause";
217 pauseResumeButton.innerText = "Resume";
218 updateResults("Solver paused - click Resume to continue", "", false);
219 } else {
220 solveStatus = "run";
221 pauseResumeButton.innerText = "Pause";
222 updateResults("Solving...", "", false);
223 }
224});
225
226cancelSolveButton.addEventListener("click", (e) => {
227 solveStatus = "stop";
228 pauseResumeButton.innerText = "Pause";
229});
230
156function startSolve(solver, scramble) { 231function startSolve(solver, scramble) {
157 updateResults("Solving...", "", false); 232 updateResults("Solving...", "", false);
158 233
159 const callbackId = ++lastCallbackId; 234 const callbackId = ++lastCallbackId;
235 pauseResumeButton.disabled = false;
236 cancelSolveButton.disabled = false;
237 solveStatus = "run";
238
160 callbacks.set(callbackId, { 239 callbacks.set(callbackId, {
161 f: (callbackArg, solveResult) => { 240 f: (callbackArg, solveResult) => {
241 pauseResumeButton.disabled = true;
242 cancelSolveButton.disabled = true;
243 pauseResumeButton.innerText = "Pause";
244 solveStatus = "stop";
245
162 if (solveResult.success) { 246 if (solveResult.success) {
163 const n = solveResult.solutions.length; 247 const n = solveResult.solutions.length;
164 const label = n == 0 ? "No solution found" : 248 const label = n == 0 ? "No solution found" :
@@ -178,9 +262,9 @@ function startSolve(solver, scramble) {
178 arg: { 262 arg: {
179 solver: solver, 263 solver: solver,
180 scramble: scramble, 264 scramble: scramble,
181 minmoves: 0, 265 minmoves: minSlider.value,
182 maxmoves: 20, 266 maxmoves: maxSlider.value,
183 maxsolutions: 1, 267 maxsolutions: maxSolsInput.value,
184 optimal: 20, 268 optimal: 20,
185 threads: window.navigator.hardwareConcurrency, 269 threads: window.navigator.hardwareConcurrency,
186 } 270 }

Generated with cgit - Back to sebastiano.tronto.net