From 4ac63fd5557450c3b25f29c02b86ffd46eef8ad4 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 8 Nov 2023 17:56:10 -0600 Subject: [PATCH] Progress! --- src/main/deploy/nodeselector/auto.html | 51 ---- src/main/deploy/nodeselector/favicon.ico | Bin 15406 -> 0 bytes src/main/deploy/nodeselector/index.html | 123 ---------- src/main/deploy/nodeselector/js/index.js | 282 +--------------------- src/main/deploy/nodeselector/nav.html | 6 +- src/main/deploy/nodeselector/teamIcon.png | Bin 0 -> 4180 bytes 6 files changed, 11 insertions(+), 451 deletions(-) delete mode 100644 src/main/deploy/nodeselector/auto.html delete mode 100644 src/main/deploy/nodeselector/favicon.ico delete mode 100644 src/main/deploy/nodeselector/index.html create mode 100644 src/main/deploy/nodeselector/teamIcon.png diff --git a/src/main/deploy/nodeselector/auto.html b/src/main/deploy/nodeselector/auto.html deleted file mode 100644 index 4cc48801..00000000 --- a/src/main/deploy/nodeselector/auto.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - Node Selector — Banana Split - - - -
-
-
-
- - -
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
- adsfasdfasdfasdf -
- - - \ No newline at end of file diff --git a/src/main/deploy/nodeselector/favicon.ico b/src/main/deploy/nodeselector/favicon.ico deleted file mode 100644 index 267a065fe5de0bc0b059f4d156234d661f6b2bb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 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 diff --git a/src/main/deploy/nodeselector/index.html b/src/main/deploy/nodeselector/index.html deleted file mode 100644 index f72e3877..00000000 --- a/src/main/deploy/nodeselector/index.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - Node Selector — Banana Split - - - -
-
-
-
- H1 -
-
- H2 -
-
- H3 -
-
- H4 -
-
- H5 -
-
- H6 -
-
- H7 -
-
- H8 -
-
- H9 -
-
-
-
- M1 -
-
- M2 -
-
- M3 -
-
- M4 -
-
- M5 -
-
- M6 -
-
- M7 -
-
- M8 -
-
- M9 -
-
-
-
- L1 -
-
- L2 -
-
- L3 -
-
- L4 -
-
- L5 -
-
- L6 -
-
- L7 -
-
- L8 -
-
- L9 -
-
-
-
0:00
-
-
CONFIRM
-
-
- - - -
-
-
- - - - - \ No newline at end of file diff --git a/src/main/deploy/nodeselector/js/index.js b/src/main/deploy/nodeselector/js/index.js index de15eb1d..66560c50 100644 --- a/src/main/deploy/nodeselector/js/index.js +++ b/src/main/deploy/nodeselector/js/index.js @@ -7,171 +7,19 @@ import { NT4_Client } from "./NT4.js"; -const nodeTopic = "/nodeselector/node_target"; -const nodeStatusTopic = "/nodeselector/node_status"; -const coneTippeddTopic = "/nodeselector/cone_tipped"; -const matchTimeTopic = "/nodeselector/match_time"; -const isAutoTopic = "/nodeselector/is_auto"; -const autoChooserOptions = "/Shuffleboard/Auto/Auto Chooser/options"; -const autoChooserActive = "/Shuffleboard/Auto/Auto Chooser/active"; -const autoChooserSelected = "/Shuffleboard/Auto/Auto Chooser/selected"; -const LevelOptions = "/Shuffleboard/Auto/Level/options"; -const LevelActive = "/Shuffleboard/Auto/Level/active"; -const LevelSelected = "/Shuffleboard/Auto/Level/selected"; -const ColumnOptions = "/Shuffleboard/Auto/Column/options"; -const ColumnActive = "/Shuffleboard/Auto/Column/active"; -const ColumnSelected = "/Shuffleboard/Auto/Column/selected"; -const fieldPos = "/Shuffleboard/Auto/Field Pos/Robot"; -const enableDock = "/Shuffleboard/Auto/Enable Dock"; -const aprilTagStatus = "/Shuffleboard/Auto/Currently Seeing April Tag"; +const buttonBool = "/Button/Stuff/pressed"; -let active = null; -let tipped = false; -let matchTime = 0; -let isAuto = false; -let nodeStatus = Array(27).fill(false); - -function rowIdFromId(row_num) { - let a = ["#row-low", "#row-med", "#row-high"]; - return a[row_num]; -} - -function displayActive(index) { - if (index !== null) { - active = index; - $(".node.active").removeClass('active'); - let row = rowIdFromId(index[0]); - $(row).find("div").eq(index[1]).addClass("active"); - } - console.log(active); -} - -function sendTarget(row, column) { - // alert(row + ' ' + column); - if ([row, column] !== active) { - // if (row !== active[0] && column !== active[1]) { - displayActive([row, column]); - client.addSample(nodeTopic, [row, column]); - } -} - -function displayTipped(newTipped) { - // if (newTipped != tipped) { - tipped = newTipped; - if (tipped) { - $(".cone-orientation").addClass("tipped"); - } else { - $(".cone-orientation").removeClass("tipped"); - } - // } -} - -function displayTime(time, isAuto) { - let element = $("#time"); - if (isAuto) { - element.addClass("auto"); - element.removeClass("teleop-1 teleop-2 teleop-3"); - } else if (time > 30 || time == 0) { - element.addClass("teleop-1"); - element.removeClass("auto teleop-2 teleop-3"); - } else if (time > 15) { - element.addClass("teleop-2"); - element.removeClass("teleop-1 auto teleop-3"); - } else { - element.addClass("teleop-3"); - element.removeClass("teleop-1 teleop-2 auto"); - } - let secondsString = (time % 60).toString(); - if (secondsString.length == 1) { - secondsString = "0" + secondsString; - } - element.text(Math.floor(time / 60).toString() + ":" + secondsString); -} - -function toggleTipped() { - tipped = !tipped; - displayTipped(tipped); - client.addSample(coneTippeddTopic, tipped); -} +let bool = false; let client = new NT4_Client( window.location.hostname, - "NodeSelector", - (topic) => { - // Topic announce - }, - (topic) => { - // Topic unannounce - }, (topic, timestamp, value) => { // New data - if (topic.name === nodeTopic) { - document.body.style.backgroundColor = "white"; - displayActive(value); - } else if (topic.name == nodeStatusTopic) { - nodeStatus = value; - console.log(value); - for (let i = 0; i < value.length; i++) { - let row = Math.floor(i / 9); - let col = i - (row * 9); - let rowId = rowIdFromId(row); - let colId = $(rowId).find("div").eq(col); - if (value[i]) { - colId.addClass("confirmed"); - } else { - colId.removeClass("confirmed"); - } - } - } else if (topic.name === coneTippeddTopic) { - console.log(value); - displayTipped(value); - } else if (topic.name === matchTimeTopic) { - matchTime = value; - displayTime(matchTime, isAuto); - console.log(matchTime); - } else if (topic.name === isAutoTopic) { - isAuto = value; - displayTime(matchTime, isAuto); - } else if (topic.name == autoChooserOptions) { - // console.log("Auto Chooser Options - " + value); - // let values = value.split(","); - $("#autoChooser").children("option").remove(); - for (let i = 0; i < value.length; i++) { - $("#autoChooser").append(new Option(value[i], value[i])); - } - } else if (topic.name == autoChooserActive) { - // console.log("Auto Chooser Active - " + value); - $("#autoChooser").val(value); - } else if (topic.name == enableDock) { - // console.log("Auto Chooser Active - " + value); - $("#enableDock").prop('checked', value); - } else if (topic.name == ColumnOptions) { - // console.log("Auto Chooser Options - " + value); - // let values = value.split(","); - $("#columnChooser").children("option").remove(); - for (let i = 0; i < value.length; i++) { - $("#columnChooser").append(new Option(value[i], value[i])); - } - } else if (topic.name == ColumnActive) { - $("#columnChooser").val(value); - } else if (topic.name == LevelOptions) { - // let values = value.split(","); - $("#levelChooser").children("option").remove(); - for (let i = 0; i < value.length; i++) { - $("#levelChooser").append(new Option(value[i], value[i])); - } - } else if (topic.name == LevelActive) { - $("#levelChooser").val(value); - } else if (topic.name == aprilTagStatus) { - let element = $("#aprilTagStatus"); - element.removeClass("aprilgood aprilbad"); - if (value) { - element.addClass("aprilgood"); - } else { - element.addClass("aprilbad"); - } + if (topic.name == buttonBool) { + bool = value; } + }, () => { // Connected @@ -203,127 +51,15 @@ window.addEventListener("load", () => { // Start NT connection client.subscribe( [ - nodeTopic, - nodeStatusTopic, - coneTippeddTopic, - matchTimeTopic, - isAutoTopic, - autoChooserActive, - autoChooserOptions, - autoChooserSelected, - fieldPos, - enableDock, - LevelActive, - LevelOptions, - LevelSelected, - ColumnActive, - ColumnOptions, - ColumnSelected, - aprilTagStatus, + buttonBool, ], - false, - false, - 0.02 ); - client.publishTopic(nodeTopic, "int[]"); - client.publishTopic(nodeStatusTopic, "boolean[]"); - client.publishTopic(coneTippeddTopic, "boolean"); - // client.publishTopic(autoChooserActive, "string"); - client.publishTopic(autoChooserSelected, "string"); - client.publishTopic(enableDock, "boolean"); - client.publishTopic(LevelSelected, "string"); - client.publishTopic(ColumnSelected, "string"); + client.publishTopic(buttonBool, "boolean"); client.connect(); // Add node click listeners - $(".node.low").click(function () { - sendTarget(0, $(this).index()); - }); - $(".node.med").click(function () { - sendTarget(1, $(this).index()); - }); - $(".node.high").click(function () { - sendTarget(2, $(this).index()); - }); - $("#confirm-node").click(function () { - let row = active[0]; - let column = active[1]; - let rowId = rowIdFromId(row); - let colId = $(rowId).find("div").eq(column); - let index = row * 9 + column; - nodeStatus[index] = !nodeStatus[index]; - if (nodeStatus[index]) { - colId.addClass("confirmed"); - } else { - colId.removeClass("confirmed"); - } - client.addSample(nodeStatusTopic, nodeStatus); - console.log(nodeStatus); - - }); - - $("#autoChooser").change(function () { - let value = $("#autoChooser").val(); - client.addSample(autoChooserSelected, value); - }) - $("#columnChooser").change(function () { - let value = $("#columnChooser").val(); - client.addSample(ColumnSelected, value); + $("#theButton").click(function () { + client.addSample(buttonBool, !value); }) - $("#levelChooser").change(function () { - let value = $("#levelChooser").val(); - client.addSample(LevelSelected, value); - }) - $("#enableDock").change(function () { - // let value = $("#enableDock").prop('checked'); - let value = $("#enableDock").val() === "true"; - client.addSample(enableDock, value); - }) - // each((cell, index) => { - // cell.addEventListener("click", () => { - // sendActive(index); - // console.log("click node " + JSON.stringify(cell) + ' ' + index) - // }); - // cell.addEventListener("contextmenu", (event) => { - // event.preventDefault(); - // sendActive(index); - // }); - // }); - // Add node touch listeners - // [("touchstart", "touchmove")].forEach((eventString) => { - // document.body.addEventListener(eventString, (event) => { - // if (event.touches.length > 0) { - // let x = event.touches[0].clientX; - // let y = event.touches[0].clientY; - // Array.from(document.getElementsByClassName("node")).forEach( - // (cell, index) => { - // let rect = cell.getBoundingClientRect(); - // if ( - // x >= rect.left && - // x <= rect.right && - // y >= rect.top && - // y <= rect.bottom - // ) { - // sendActive(index); - // } - // } - // ); - // } - // }); - // }); - - // Add cone orientation listeners - const coneOrientationDiv = $(".cone-orientation"); - coneOrientationDiv.click(function () { - toggleTipped(); - }); - // coneOrientationDiv.addEventListener("contextmenu", (event) => { - // event.preventDefault(); - // toggleTipped(); - // }); - // coneOrientationDiv.addEventListener("touchstart", () => { - // event.preventDefault(); - // toggleTipped(); - // }); }); diff --git a/src/main/deploy/nodeselector/nav.html b/src/main/deploy/nodeselector/nav.html index f3e3a839..a5c6eb6f 100644 --- a/src/main/deploy/nodeselector/nav.html +++ b/src/main/deploy/nodeselector/nav.html @@ -1,14 +1,12 @@ \ No newline at end of file diff --git a/src/main/deploy/nodeselector/teamIcon.png b/src/main/deploy/nodeselector/teamIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad796fdaaecb0179694c6d694972e14ce5450ccf GIT binary patch literal 4180 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