From 006caf9c79a2a92cac903249ef38b4aa3f076140 Mon Sep 17 00:00:00 2001 From: David Holdeman Date: Sun, 5 Feb 2023 15:38:15 -0600 Subject: [PATCH] Use external interactive pinout generator (#5034) * Use interactive-pinout action * remove scripts --- .github/workflows/gen-pinouts.yaml | 64 +++++-- misc/actions/pinouts-create.sh | 54 ------ misc/actions/pinouts-install.sh | 9 - misc/pinout-gen/append.sh | 9 - misc/pinout-gen/gen.sh | 10 - misc/pinout-gen/pinout.html | 72 ------- misc/pinout-gen/script.js | 236 ----------------------- misc/pinout-gen/style.css | 289 ----------------------------- 8 files changed, 46 insertions(+), 697 deletions(-) delete mode 100755 misc/actions/pinouts-create.sh delete mode 100755 misc/actions/pinouts-install.sh delete mode 100644 misc/pinout-gen/append.sh delete mode 100644 misc/pinout-gen/gen.sh delete mode 100644 misc/pinout-gen/pinout.html delete mode 100644 misc/pinout-gen/script.js delete mode 100644 misc/pinout-gen/style.css diff --git a/.github/workflows/gen-pinouts.yaml b/.github/workflows/gen-pinouts.yaml index fe3ae4b342..29216aa26b 100644 --- a/.github/workflows/gen-pinouts.yaml +++ b/.github/workflows/gen-pinouts.yaml @@ -16,22 +16,50 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Install prerequisite software - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' - run: | - misc/actions/pinouts-install.sh - echo "::add-path::`pwd`/yqdir/" + - name: Generate Pinouts + uses: chuckwagoncomputing/interactive-pinout@main + with: + mapping-path: ./firmware/config/boards/*/connectors/*.yaml + warnings: "false" + columns: | + { + "pin":"Pin Number", + "ts_name":"TS Name", + "type":"Type", + "function":"Typical Function", + "color":"Pigtail Color" + } + print-columns: | + [ + "function" + ] + colors: | + { + "12v":"yellow"; + "12V":"yellow"; + "5v":"red", + "5V":"red", + "at":"green", + "av":"brown", + "can":"blue", + "din":"lime", + "etb":"darkcyan", + "gnd":"darkgreen", + "gp_high":"aqua", + "gp_low":"aquamarine", + "gp_pp":"cyan", + "hall":"darkolivegreen", + "hl":"gold", + "hs":"indigo", + "ign":"magenta", + "inj":"maroon", + "ls":"lightgreen", + "mr":"firebrick", + "pgnd":"coral", + "sgnd":"olive", + "usb":"lightseagreen", + "vr":"sienna" + } - - name: Set FTP variables - env: - ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' - run: | - if [ "${{github.ref}}" = "refs/heads/master" ]; then - echo "::set-env name=RUSEFI_SSH_SERVER::${{secrets.RUSEFI_SSH_SERVER}}"; - echo "::set-env name=RUSEFI_SSH_USER::${{secrets.RUSEFI_SSH_USER}}"; - echo "::set-env name=RUSEFI_SSH_PASS::${{secrets.RUSEFI_SSH_PASS}}"; - fi - - - name: Generate documentation - run: bash ./misc/jenkins/generate_pinouts/gen_upload_pinouts.sh + - name: Upload Pinouts + run: tar -czf - pinouts | sshpass -p "${{ secrets.RUSEFI_SSH_PASS }}" ssh -o StrictHostKeyChecking=no "${{ secrets.RUSEFI_SSH_USER }}"@"${{ secrets.RUSEFI_SSH_SERVER }}" "tar -xzf - -C docs" diff --git a/misc/actions/pinouts-create.sh b/misc/actions/pinouts-create.sh deleted file mode 100755 index d6c5c8fe08..0000000000 --- a/misc/actions/pinouts-create.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -I_AM="pinouts-create.sh:" - -I_AM="gen_upload_pinouts.sh:" - -# yq 3 and 4 have incompatible syntax. We use yq 4. -echo ${I_AM} invoking yq version -yqdir/yq -V - -if [ -z $1 ] ; then - echo "Specific yaml parameter not specified, searching for */connectors/*.yaml" - CONNECTORS=$(find -path "./firmware/config/boards/*/connectors/*.yaml") - FILES=$(for f in $CONNECTORS; do - ORDER=$(yqdir/yq e '.info.order' $f) - echo "$f $ORDER" - done) - CONNECTORS=$(echo "$FILES" | sort -k2 | cut -d ' ' -f 1) -else - CONNECTORS=$1 - echo "Processing $CONNECTORS" -fi - -for c in $CONNECTORS; do - echo "${I_AM} processing "$c - DIR="pinouts/"$(echo $c | tr '/' '\n' | tail -n +5 | head -n -2 | tr '\n' '/') - echo "${I_AM} DIR "$DIR - NAME=$(basename $c .yaml) - echo "${I_AM} NAME "$NAME - mkdir -p $DIR - if [ "$(yqdir/yq e '.info.id' $c)" == "null" ]; then - echo "${I_AM} Missing yaml id field in info section of $c" -# todo fail once all pages are compliant exit 1 - fi - if [ -f $DIR/index.html ]; then - bash misc/pinout-gen/append.sh "$(yqdir/yq -o=json e $c)" $DIR/index.html - else - bash misc/pinout-gen/gen.sh "$(yqdir/yq -o=json e $c)" $DIR/index.html - fi - if [ $? -ne 0 ]; then - echo "${I_AM} something is broken" - exit 1; - fi - file $DIR/index.html - IMG=$(yqdir/yq e '.info.image.file' $c) - if [ $? -ne 0 ]; then - exit 1; - fi - echo "IMG "$IMG - if [ "$IMG" != "null" ]; then - cp $(dirname $c)/$IMG $DIR - fi - ls $DIR -done diff --git a/misc/actions/pinouts-install.sh b/misc/actions/pinouts-install.sh deleted file mode 100755 index 207c818a96..0000000000 --- a/misc/actions/pinouts-install.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - - sudo apt-get update - sudo apt-get install sshpass - wget https://github.com/mikefarah/yq/releases/download/v4.30.8/yq_linux_amd64 - chmod a+x yq_linux_amd64 - rm -rf yqdir - mkdir yqdir - mv yq_linux_amd64 yqdir/yq diff --git a/misc/pinout-gen/append.sh b/misc/pinout-gen/append.sh deleted file mode 100644 index de5f013487..0000000000 --- a/misc/pinout-gen/append.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)"/" -TEXT=$(sed -e "/\/\/\/DATA\/\/\//{a \ \`$(echo ${1//\//\\/} | tr -d '\n')\ \`,\n///DATA///" -e "d}" $2) -if [ $? -ne 0 ]; then - echo "Error in append.sh" - exit 1; -fi -echo "$TEXT" > $2 diff --git a/misc/pinout-gen/gen.sh b/misc/pinout-gen/gen.sh deleted file mode 100644 index 7953b7fe25..0000000000 --- a/misc/pinout-gen/gen.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)"/" -JSON="$(echo $1 | sed 's/\\/\\\\\\\\/g')" -TEXT=$(sed -e "/###CSS###/{r ${DIR}style.css" -e 'd}' -e "/###JS###/{r ${DIR}script.js" -e 'd}' ${DIR}pinout.html | sed -e "s/\/\/\/DATA\/\/\//\`$(echo ${JSON//\//\\/} | tr -d '\n')\`,\n\/\/\/DATA\/\/\//") -if [ $? -ne 0 ]; then - echo "Error in gen.sh" - exit 1; -fi -echo "$TEXT" > $2 diff --git a/misc/pinout-gen/pinout.html b/misc/pinout-gen/pinout.html deleted file mode 100644 index 79d9fbf45e..0000000000 --- a/misc/pinout-gen/pinout.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/misc/pinout-gen/script.js b/misc/pinout-gen/script.js deleted file mode 100644 index c7f6d5fa16..0000000000 --- a/misc/pinout-gen/script.js +++ /dev/null @@ -1,236 +0,0 @@ -var connectorData = [ -///DATA/// -]; - -function hideEmptyColumns(table) { - var rows = table.querySelector('tbody').children; - var tableHead = table.querySelector("thead>tr") - var cols = tableHead.children - for (var i = 0; i < cols.length; i++) { - var empty = true; - for (var ii = 0; ii < rows.length; ii++) { - empty = rows[ii].children[i].textContent.length > 0 ? false : empty; - } - if (empty) { - tableHead.querySelectorAll('th')[i].style.display = 'none'; - for (var ii = 0; ii < rows.length; ii++) { - rows[ii].children[i].style.display = 'none'; - } - } else { - tableHead.querySelectorAll('th')[i].style.display = ''; - for (var ii = 0; ii < rows.length; ii++) { - rows[ii].children[i].style.display = ''; - } - } - } -} - -function addRow(table, pin) { - var clone = getRow(table, pin) - table.appendChild(clone); -} - -function addRow(table, pin, cid) { - var clone = getRow(table, pin) - var row = clone.querySelector(".data"); - if (pin.pdiv) { - row.addEventListener('click', function(table, pin, cid) { - var container; - for (var elem = table; elem && elem !== document; elem = elem.parentNode) { - if (elem.matches(".container")) { - var container = elem; - }; - } - clickPin(container.querySelector(".info-table tbody"), pin, cid); - container.scrollIntoView() - }.bind(null, table, pin, cid)); - } - table.appendChild(clone); -} - -function getRow(table, pin) { - var template = document.getElementById("table-template"); - var clone = template.content.cloneNode(true); - var row = clone.querySelector(".data"); - var cells = row.children; - for (var i = 0; i < cells.length; i++) { - var cell = cells[i]; - cell.textContent = Array.isArray(pin[cell.dataset.field]) ? pin[cell.dataset.field].join(", ") : pin[cell.dataset.field]; - } - clone.querySelector(".pin-data").dataset.type = pin.type; - return clone; -} - -function clickPin(table, pin, cid) { - var container; - for (var elem = table; elem && elem !== document; elem = elem.parentNode) { - if (elem.matches(".container")) { - container = elem; - }; - } - table.parentElement.style.display = "table"; - table.innerHTML = ""; - addRow(table, pin, cid); - var pins = document.querySelectorAll(".pin-marker"); - for (var i = 0; i < pins.length; i++) { - if (pins[i].dataset.type == pin.type) { - pins[i].classList.add("highlight"); - } else { - pins[i].classList.remove("highlight"); - } - pins[i].classList.remove("selected"); - } - pin.pdiv.classList.add("selected"); - hideEmptyColumns(table.parentElement); - if (typeof(cid) != "undefined") { - var url = new URL(window.location); - url.searchParams.set("connector", cid); - url.searchParams.set("pin", pin.pin); - window.history.pushState({}, "", url) - } else { - var url = new URL(window.location); - url.search = ""; - window.history.pushState({}, "", url) - } - container.scrollIntoView() -} - -function checkparams() { - var params = new URLSearchParams(window.location.search); - var connector = params.get("connector"); - var pin = params.get("pin"); - for (var i = 0; i < connectorData.length; i++) { - var c = connectorData[i]; - if (c.info.id == connector) { - var table = document.querySelectorAll(".info-table tbody")[i]; - for (var iii = 0; iii < c.pins.length; iii++) { - if (c.pins[iii].pin == pin) { - clickPin(table, c.pins[iii], c.info.id); - return; - } - } - return; - } - } -} - -var images = 0; - -function checkImagesLoaded() { - images -= 1; - if (images == 0) { - checkparams(); - } -} - -window.addEventListener('load', function() { - window.onpopstate = function(ev) { - if (event.state) { - checkparams(); - } - }; - for (var c = 0; c < connectorData.length; c++) { - connectorData[c] = JSON.parse(connectorData[c]); - var connector = connectorData[c]; - var template = document.getElementById("connector-template"); - var clone = template.content.cloneNode(true); - document.body.appendChild(clone); - var sdiv = document.body.lastChild.previousSibling; - var img = sdiv.querySelector(".connector-img"); - images += 1; - img.addEventListener('load', function(connector, sdiv, img) { - var cdiv = sdiv.querySelector(".connector-div"); - var cid = connector.info.id; - var ptemplate = document.getElementById("pin-template"); - var imgHeight = img.naturalHeight; - var imgWidth = img.naturalWidth; - var table = sdiv.querySelector(".info-table").querySelector("tbody"); - var fullTable = sdiv.querySelector(".pinout-table").querySelector("tbody"); - for (var i = 0; i < connector.pins.length; i++) { - var pin = connector.pins[i]; - if (!pin.pin) { - continue; - } - var pinfo = {}; - for (var ii = 0; ii < connector.info.pins.length; ii++) { - if (connector.info.pins[ii].pin == pin.pin) { - pinfo = connector.info.pins[ii]; - break; - } - } - if (!pinfo.x) { - addRow(fullTable, connector.pins[i], cid); - continue; - } - var closest = 1000000; - for (var ii = 0; ii < connector.info.pins.length; ii++) { - var tinfo = connector.info.pins[ii]; - var distance = Math.pow((tinfo.x - pinfo.x), 2) + Math.pow((tinfo.y - pinfo.y), 2); - if (tinfo.pin != pin.pin && (!closest || distance < closest)) { - closest = distance; - } - } - var pclone = ptemplate.content.cloneNode(true); - var pdiv = pclone.querySelector("div"); - pdiv.textContent = pinfo.pin; - pdiv.style.top = ((pinfo.y / imgHeight) * 100) + "%"; - pdiv.style.left = ((pinfo.x / imgWidth) * 100) + "%"; - pdiv.dataset.type = pin.type; - pin.pdiv = pdiv; - pdiv.addEventListener("click", function(table, pin, cid) { - clickPin(table, pin, cid); - }.bind(null, table, pin, cid)); - closest = Math.sqrt(closest); - var divheight = cdiv.clientHeight; - var divwidth = cdiv.clientWidth; - var mult = cdiv.querySelector("img").naturalHeight / divheight; - var newheight = (closest / mult) - var pxheight = divheight * 0.08; - if (newheight < pxheight) { - pxheight = newheight; - } - var height = (pxheight / divheight) * 100; - var width = (pxheight / divwidth) * 100; - pdiv.style.height = "calc(" + height + "% - 0.21vw)"; - pdiv.style.width = "calc(" + width + "% - 0.21vw)"; - pdiv.style.marginTop = "-" + (width / 2) + "%"; - pdiv.style.marginLeft = "-" + (width / 2) + "%"; - pdiv.style.fontSize = (height * 1.8) + "px"; - pdiv.style.fontSize = (pxheight * 0.5) + "px"; - window.addEventListener('beforeprint', function(pdiv, width, divwidth, event) { - pdiv.style.fontSize = "calc(calc(" + width + "px * min(640, " + divwidth + ")) * 0.0055)"; - }.bind(null, pdiv, width, divwidth)); - window.addEventListener('afterprint', function(pdiv, pxheight, event) { - pdiv.style.fontSize = (pxheight * 0.5) + "px"; - }.bind(null, pdiv, pxheight)); - cdiv.appendChild(pdiv); - addRow(fullTable, pin, cid); - } - hideEmptyColumns(sdiv.querySelector('.pinout-table')); - checkImagesLoaded(); - }.bind(null, connector, sdiv, img)); - if (typeof(connector.info) != "undefined") { - img.src = connector.info.image.file; - if (document.title.length == 0 && typeof(connector.info.title) != "undefined") { - document.title = connector.info.title; - } - if (typeof(connector.info.board_url) != "undefined" && document.title.length > 0) { - document.getElementById("board-link").innerText = document.title; - document.getElementById("board-link").href = connector.info.board_url; - } - if (typeof(connector.info.name) != "undefined") { - sdiv.querySelector(".connector-name").innerText = connector.info.name; - } - } else { - img.parentElement.parentElement.style.height = 0; - for (var i = 0; i < connector.pins.length; i++) { - var pin = connector.pins[i]; - if (!pin.pin) { - continue; - } - var fullTable = sdiv.querySelector(".pinout-table").querySelector("tbody"); - addRow(fullTable, pin); - } - } - } -}); diff --git a/misc/pinout-gen/style.css b/misc/pinout-gen/style.css deleted file mode 100644 index 2fddd2bc03..0000000000 --- a/misc/pinout-gen/style.css +++ /dev/null @@ -1,289 +0,0 @@ -.pin-marker { - position: absolute; - z-index: 1; - border-radius: 50%; - background-color: white; - border: 0.21vw black solid; - cursor: pointer; - color: black; - text-align: center; - line-height: 200%; -} - -[data-type*="12v"], -[data-type*="12V"] { - border-color: yellow; -} - -[data-type*="5v"], -[data-type*="5V"] { - border-color: red; -} - -[data-type*="at"] { - border-color: green; -} - -[data-type*="av"] { - border-color: brown; -} - -[data-type*="can"] { - border-color: blue; -} - -[data-type*="din"] { - border-color: lime; -} - -[data-type*="etb"] { - border-color: darkcyan; -} - -[data-type*="gnd"] { - border-color: darkgreen; -} - -[data-type*="gp_high"] { - border-color: aqua; -} - -[data-type*="gp_low"] { - border-color: aquamarine; -} - -[data-type*="gp_pp"] { - border-color: cyan; -} - -[data-type*="hall"] { - border-color: darkolivegreen; -} - -[data-type*="hl"] { - border-color: gold; -} - -[data-type*="hs"] { - border-color: indigo; -} - -[data-type*="ign"] { - border-color: magenta; -} - -[data-type*="inj"] { - border-color: maroon; -} - -[data-type*="ls"] { - border-color: lightgreen; -} - -[data-type*="mr"] { - border-color: firebrick; -} - -[data-type*="pgnd"] { - border-color: coral; -} - -[data-type*="sgnd"] { - border-color: olive; -} - -[data-type*="usb"] { - border-color: lightseagreen; -} - -[data-type*="vr"] { - border-color: sienna; -} - -#board-link { - font-size: 24px; -} - -.pin-marker:hover { - transform: scale(2); - z-index: 2; -} - -.pin-marker.highlight { - background-color: #fc935a; -} - -.pin-marker.selected { - background-color: #f15a24; - color: white; -} - -.connector-container { - width: 100%; - overflow-x: scroll; - position: relative; - height: max(3in, 50vh); -} - -.connector-div { - height: 100%; - position: relative; - z-index: 0; - width: max-content; -} - -.connector-img { - height: 100%; - min-width: 100%; -} - -table { - font-family: Arial, Helvetica, sans-serif; - border-collapse: collapse; - width: clamp(100%, 100%, 1000px); - text-align: left; -} - -@media (min-width: 1000px) { - table { - font-size: 1rem; - } -} - -@media (max-width: 1000px) { - table { - word-wrap: break-word; - font-size: 2.5rem; - } -} - -table tbody tr { - cursor: pointer; -} - -@media screen { - td.pin-data { - border-color: black; - } -} - -table td, table th { - border: 1px solid black; - padding: 8px; -} - -table tr:nth-child(even){ - background-color: #fc935a; -} - -table tr:hover { - background-color: #f15a24; -} - -table th { - padding-top: 12px; - padding-bottom: 12px; - text-align: left; - background-color: #f15a24; - color: black; -} - -.info-table { - display: none; -} - -@media (prefers-color-scheme: dark) { - html { - background-color: black; - color: white; - } - - td.pin-data { - border: 1px solid #ddd; - } - - table td, table th { - border: 1px solid #ddd; - } - - table th { - color: white; - } - - table tr:nth-child(even){ - background-color: #230c00; - color: white; - } - - table tr:hover { - background-color: #f15a24; - } - - a { - color: #71b7ff; - } - - a:visited { - color: #71b7ff; - } -} - -@media print { - .container { - height: 99vh; - display: flex; - flex-direction: column; - } - .info-table, .ts-data, .ts-header, .type-data, .type-header, .color-data, .color-header, thead { - display: none; - } - .connector-container { - flex: 0 1 auto; - height: unset; - min-height: 2in; - } - .connector-div { - max-width: 100%; - height: unset; - } - .connector-img { - max-width: 100% !important; - max-height: 3in; - } - h2 { - font-size: 14px; - } - th { - font-size: 12px; - } - td { - font-size: 10px; - } - td:not(.pin-data) { - border: none !important; - } - td.pin-data { - border-width: 3px; - border-radius: 10px; - width: 10px; - margin: 0px; - padding: 0px; - } - html, tr { - background-color: white !important; - color: black !important; - } - table { - width: auto; - border-collapse: separate; - } - .table-wrapper { - column-count: 4; - } - table, tbody, tr { - display: block; - } - #board-link { - display: none; - } -}