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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
- |
-
- | |
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
Full Pinout Table
-
-
-
-
-
-
-
-
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;
- }
-}