diff options
author | LennertW <4999638+LennertW@users.noreply.github.com> | 2022-08-06 18:39:43 +0200 |
---|---|---|
committer | LennertW <4999638+LennertW@users.noreply.github.com> | 2022-08-06 18:39:43 +0200 |
commit | cbde04c9bc45ea54cc509a65247c62a82f64bca9 (patch) | |
tree | 5bc0900a502fc45c3c9cc778ed8a041056ae029e | |
parent | README placeholder (diff) | |
download | Starlink-FI-cbde04c9bc45ea54cc509a65247c62a82f64bca9.tar Starlink-FI-cbde04c9bc45ea54cc509a65247c62a82f64bca9.tar.gz Starlink-FI-cbde04c9bc45ea54cc509a65247c62a82f64bca9.tar.bz2 Starlink-FI-cbde04c9bc45ea54cc509a65247c62a82f64bca9.tar.lz Starlink-FI-cbde04c9bc45ea54cc509a65247c62a82f64bca9.tar.xz Starlink-FI-cbde04c9bc45ea54cc509a65247c62a82f64bca9.tar.zst Starlink-FI-cbde04c9bc45ea54cc509a65247c62a82f64bca9.zip |
-rw-r--r-- | GlitchedOnEarth_slides.pdf | bin | 0 -> 14371440 bytes | |||
-rw-r--r-- | README.md | 74 | ||||
-rw-r--r-- | img/decoupling.jpg | bin | 0 -> 454750 bytes | |||
-rw-r--r-- | img/emmc_testpoints.jpg | bin | 0 -> 703742 bytes | |||
-rwxr-xr-x | img/installed_modchip.jpg | bin | 0 -> 800603 bytes | |||
-rwxr-xr-x | img/modchip.jpg | bin | 0 -> 138124 bytes | |||
-rw-r--r-- | pcb/README.md | 20 | ||||
-rw-r--r-- | pcb/gerbers_modchip.zip | bin | 0 -> 130820 bytes | |||
-rw-r--r-- | pcb/ibom.html | 4345 | ||||
-rw-r--r-- | pcb/interposer_footprint.kicad_mod | 248 | ||||
-rw-r--r-- | pcb/interposer_symbol.kicad_sym | 40 | ||||
-rw-r--r-- | pcb/schematic.pdf | bin | 0 -> 120480 bytes | |||
-rw-r--r-- | src/README.md | 15 | ||||
-rw-r--r-- | src/modchipfw/CMakeLists.txt | 40 | ||||
-rw-r--r-- | src/modchipfw/pico_sdk_import.cmake | 62 | ||||
-rw-r--r-- | src/modchipfw/pulsegen.pio | 70 | ||||
-rw-r--r-- | src/modchipfw/utglitcher.c | 158 | ||||
-rw-r--r-- | src/python/example.py | 72 | ||||
-rw-r--r-- | src/python/pulsegen.py | 130 |
19 files changed, 5273 insertions, 1 deletions
diff --git a/GlitchedOnEarth_slides.pdf b/GlitchedOnEarth_slides.pdf Binary files differnew file mode 100644 index 0000000..709b5b6 --- /dev/null +++ b/GlitchedOnEarth_slides.pdf @@ -1,3 +1,75 @@ # Starlink User Terminal Modchip +This repository accompanies the talk titled "Glitched on Earth by Humans: A Black-Box Security Evaluation of the SpaceX Starlink User Terminal". +A slide deck is available [here](./GlitchedOnEarth_slides.pdf), a recording of the talk should be available soon. -## Known issues / limitations
\ No newline at end of file +The talk covers how we managed to execute arbitrary code on the Starlink User Terminal using a custom modchip that performs voltage fault injection. +The modchip can be used to bypass signature verification during execution of the System-on-Chip (SoC) ROM bootloader (BL1). This allows to execute arbitrary code on the SoC from BL2 onwards and allows to further explore the Starlink User Terminal and networking side of the system. +We provide the modchip design so that other researchers can build upon our work. + +# 🚨 USE AT YOUR OWN RISK 🚨 +Even though we tested and use the provided modchip design, it is possible to cause permanent damage to a user terminal using this modchip. +Similarly, disassembling the user terminal may result in permanent damage and will likely void your warranty. + + +## Modchip design overview +The modchip is controlled by a RP2040 microcontroller that triggers on the eMMC D0 line and creates two pulses with a (programmable) delay and offset for the MOSFET driver. +One of these pulses controls the glitch MOSFET, when the gate of this MOSFET is driven high the SoC core voltage supply will be shorted to ground. The second pulse generated by the RP2040 allows to control two MOSFETs that can enable/disable two capacitor banks. These capacitors are required for the UT to fully boot, but the capacitors banks cannot be enabled during the voltage glitch as this would prevent us from obtaining the desired fault. + +The schematic and gerbers to produce your own modchip are provided [here](./pcb/). + +![Modchip overview](./img/modchip.jpg) + +## Prerequisites +* Disassemble your UT. Stop here if you do not want to void your UT warranty or if you are not willing to risk permanent damage. + * [several](https://www.youtube.com/watch?v=omScudUro3s) [videos](https://youtu.be/iOmdQnIlnRo) [on](https://www.youtube.com/watch?v=yBnOS7V3oS4) [YouTube](https://youtu.be/-v7E7JIrW5Y) demonstrate the process. +* Read the contents of the eMMC chip. Make a backup! + * The eMMC chip can be read in-circuit by connecting to the CMD, CLK and D0 test points. ![eMMC pinout](./img/emmc_testpoints.jpg) + * The eMMC expects 1V8 logic levels! + * Several tools exist to read eMMC chips, a good and cheap ($12) option is the [Low Voltage eMMC Adapter by the exploitee.rs](https://shop.exploitee.rs/shop/p/low-voltage-emmc-adapter). +* You will have to extract, patch and repackage the different boot stages to disable signature verification. + * The eMMC layout is documented in the [U-Boot GPL release](https://github.com/SpaceExplorationTechnologies/u-boot/releases/tag/sx_2022_05_03) in the file `spacex_catson_boot.h`. + * More information on extracting the firmware can be found in our [blog post](https://www.esat.kuleuven.be/cosic/blog/dumping-and-extracting-the-spacex-starlink-user-terminal-firmware/). + * The early boot stages are all based on the [ARM Trusted Firmware-A project](https://trustedfirmware-a.readthedocs.io/en/latest/). + * You can use TF fiptool to unpack the Firmware Image Packages into the distinct parts. + * Patching these bootstages can be done using [Ghidra](https://github.com/NationalSecurityAgency/ghidra) after some basic static analysis (use the open source TF-A code to guide your efforts). + * Make sure to disable signature verification and to re-enable UART output. + * Update the firmware hash in the certificates. We glitch signature verification, but the hash still has to be valid. + * Similarly, you will have to make some changes to the U-Boot image to disable signature verification. + * You can also increase the `bootdelay` parameter. + * The Flattened uImage Tree can be unpacked using [dumpimage](https://github.com/u-boot/u-boot/blob/master/tools/dumpimage.c), provided as part of the U-Boot project. + * Make the changes you want and repackage. +* Rewrite the patched firmware to the eMMC chip. + +## Mounting the modchip on the Starlink UT PCB + +* Make sure that the modchip you assembled works before you try to solder it into place. +* Remove the decoupling capacitors within the red squares, these are normally used to stabilise the SoC core voltage supply. +![Decoupling capacitors](./img/decoupling.jpg) + +* Align the assembled modchip on the UT PCB and solder it into place using the castellated holes. Make sure to not make any shorts between the core voltage supply and ground. + * The rightmost castellated holes are not in the correct position. You can redesign the PCB or simply mask the exposed pads on the UT PCB and connect the castellated holes to a nearby ground pad (see picture). + +* Connect the test point marked `UT RST` to the enable pin of the the core voltage regulator. +* Connect the test point marked `12V` to a nearby 12V source on the UT PCB. +* Connect the rightmost jumper pad (below the button) to the eMMC D0 test point. + * We had to do this because of a firmware update that disabled the UART output. +* Connect the test point marked `1V8` to a nearby 1.8V source on the UT PCB (there is a decoupling capacitor next to the eMMC that is connected to 1V8). + +You should be all set now to start glitching, good luck! +The [Python folder](./src/) contains an example that demonstrates how you can start using the modchip for experimentation. + + +![Modchip mounted to the UT.](./img/installed_modchip.jpg) + + +## Known issues and limitations +* The modchip was designed before SpaceX introduced a firmware update that blew a fuse to disable all UART output. The modchip was initially designed to trigger on UART output, but can be adapted to trigger on the eMMC D0 signal. On a newer revision it would be useful to have the ability to read UART output as well as trigger on eMMC D0 data. UART can be re-enabled in BL2 and can provide an easy way of verifying that the glitch succeeded. +* The modchip was designed for the circular user terminal, the same attack should work on the square user terminal but will require you to create a new PCB design. +* One section of castellated holes is in the wrong location. Be careful when using the design as is and follow the mounting instruction accordingly. +* Unplugging the modchip from the control PC after the glitch succeeded may result in the dish rebooting. This is likely because of a missing pull-down resistor on the `IN A` pin of the MCP1405 MOSFET driver. +* The provided firmware expects an external control PC to orchestrate the fault injection attempts. It should be fairly straightforward to turn this into a stand-alone modchip using the (currently unused) second RP2040 Cortex-M0 core. + +## FAQ +* We are not selling finished modchips +* We are not providing (patched) Starlink User Terminal firmware +* We are not providing exact glitch parameters. The presentation slides contain various hints and the parameters will vary depending on how you patch the firmware.
\ No newline at end of file diff --git a/img/decoupling.jpg b/img/decoupling.jpg Binary files differnew file mode 100644 index 0000000..c77b203 --- /dev/null +++ b/img/decoupling.jpg diff --git a/img/emmc_testpoints.jpg b/img/emmc_testpoints.jpg Binary files differnew file mode 100644 index 0000000..76413f7 --- /dev/null +++ b/img/emmc_testpoints.jpg diff --git a/img/installed_modchip.jpg b/img/installed_modchip.jpg Binary files differnew file mode 100755 index 0000000..18b2014 --- /dev/null +++ b/img/installed_modchip.jpg diff --git a/img/modchip.jpg b/img/modchip.jpg Binary files differnew file mode 100755 index 0000000..ef7de4d --- /dev/null +++ b/img/modchip.jpg diff --git a/pcb/README.md b/pcb/README.md new file mode 100644 index 0000000..a4c83fb --- /dev/null +++ b/pcb/README.md @@ -0,0 +1,20 @@ +# PCB files +This folder contains the schematic and gerber files to produce your own modchip PCB. +We ordered our modchip PCB from JLCPCB and selected a PCB thickness of 0.8mm, 1.6mm might work but is not tested. + +An interactive BOM is [provided](./ibom.html), the main active components on the PCB are: +* RaspberryPi RP2040 microcontroller +* W25Q128JVS Flash storage +* MCP1405 MOSFET driver +* Vishay SISS54DN-T1-GE3 Capacitor switching MOSFET +* Vishay SISH112DN-T1-GE3 Crowbar MOSFET +* NLSV1T34 Level shifter +* NCP1117 SOT223 3.3V voltage regulator + +At the the time of writing most of these components appear to be available or easily replaceable. +The cost for all components on the PCB at low volume should be less than 25 EUR. + +## Optional improvements before building the PCB +* Add a pull-down resistor on the `IN A` pin of the MCP1405 MOSFET driver. +* Modify the locations of the castellated holes in `interposer_footprint.kicad_mod`. Currently the rightmost castellated holes are not conveniently located, see the mounting instructions. +* Do some additional routing such that the RP2040 can monitor eMMC D0 and UART at the same time.
\ No newline at end of file diff --git a/pcb/gerbers_modchip.zip b/pcb/gerbers_modchip.zip Binary files differnew file mode 100644 index 0000000..8877b56 --- /dev/null +++ b/pcb/gerbers_modchip.zip diff --git a/pcb/ibom.html b/pcb/ibom.html new file mode 100644 index 0000000..fd77a3c --- /dev/null +++ b/pcb/ibom.html @@ -0,0 +1,4345 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Interactive BOM for KiCAD</title> + <style type="text/css"> +:root { + --pcb-edge-color: black; + --pad-color: #878787; + --pad-hole-color: #CCCCCC; + --pad-color-highlight: #D04040; + --pad-color-highlight-both: #D0D040; + --pad-color-highlight-marked: #44a344; + --pin1-outline-color: #ffb629; + --pin1-outline-color-highlight: #ffb629; + --pin1-outline-color-highlight-both: #fcbb39; + --pin1-outline-color-highlight-marked: #fdbe41; + --silkscreen-edge-color: #aa4; + --silkscreen-polygon-color: #4aa; + --silkscreen-text-color: #4aa; + --fabrication-edge-color: #907651; + --fabrication-polygon-color: #907651; + --fabrication-text-color: #a27c24; + --track-color: #def5f1; + --track-color-highlight: #D04040; + --zone-color: #def5f1; + --zone-color-highlight: #d0404080; +} + +html, +body { + margin: 0px; + height: 100%; + font-family: Verdana, sans-serif; +} + +.dark.topmostdiv { + --pcb-edge-color: #eee; + --pad-color: #808080; + --pin1-outline-color: #ffa800; + --pin1-outline-color-highlight: #ccff00; + --track-color: #42524f; + --zone-color: #42524f; + background-color: #252c30; + color: #eee; +} + +button { + background-color: #eee; + border: 1px solid #888; + color: black; + height: 44px; + width: 44px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 14px; + font-weight: bolder; +} + +.dark button { + /* This will be inverted */ + background-color: #c3b7b5; +} + +button.depressed { + background-color: #0a0; + color: white; +} + +.dark button.depressed { + /* This will be inverted */ + background-color: #b3b; +} + +button:focus { + outline: 0; +} + +button#tb-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A"); +} + +button#lr-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A"); +} + +button#bom-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E"); +} + +button#bom-grouped-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E"); +} + +button#bom-ungrouped-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E"); +} + +button#bom-netlist-btn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E"); +} + +button#copy { + background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E"); + background-position: 6px 6px; + background-repeat: no-repeat; + background-size: 26px 26px; + border-radius: 6px; + height: 40px; + width: 40px; + margin: 10px 5px; +} + +button#copy:active { + box-shadow: inset 0px 0px 5px #6c6c6c; +} + +textarea.clipboard-temp { + position: fixed; + top: 0; + left: 0; + width: 2em; + height: 2em; + padding: 0; + border: None; + outline: None; + box-shadow: None; + background: transparent; +} + +.left-most-button { + border-right: 0; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +.middle-button { + border-right: 0; +} + +.right-most-button { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} + +.button-container { + font-size: 0; + margin: 10px 10px 10px 0px; +} + +.dark .button-container { + filter: invert(1); +} + +.button-container button { + background-size: 32px 32px; + background-position: 5px 5px; + background-repeat: no-repeat; +} + +@media print { + .hideonprint { + display: none; + } +} + +canvas { + cursor: crosshair; +} + +canvas:active { + cursor: grabbing; +} + +.fileinfo { + width: 100%; + max-width: 1000px; + border: none; + padding: 5px; +} + +.fileinfo .title { + font-size: 20pt; + font-weight: bold; +} + +.fileinfo td { + overflow: hidden; + white-space: nowrap; + max-width: 1px; + width: 50%; + text-overflow: ellipsis; +} + +.bom { + border-collapse: collapse; + font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace; + font-size: 10pt; + table-layout: fixed; + width: 100%; + margin-top: 1px; + position: relative; +} + +.bom th, +.bom td { + border: 1px solid black; + padding: 5px; + word-wrap: break-word; + text-align: center; + position: relative; +} + +.dark .bom th, +.dark .bom td { + border: 1px solid #777; +} + +.bom th { + background-color: #CCCCCC; + background-clip: padding-box; +} + +.dark .bom th { + background-color: #3b4749; +} + +.bom tr.highlighted:nth-child(n) { + background-color: #cfc; +} + +.dark .bom tr.highlighted:nth-child(n) { + background-color: #226022; +} + +.bom tr:nth-child(even) { + background-color: #f2f2f2; +} + +.dark .bom tr:nth-child(even) { + background-color: #313b40; +} + +.bom tr.checked { + color: #1cb53d; +} + +.dark .bom tr.checked { + color: #2cce54; +} + +.bom tr { + transition: background-color 0.2s; +} + +.bom .numCol { + width: 30px; +} + +.bom .value { + width: 15%; +} + +.bom .quantity { + width: 65px; +} + +.bom th .sortmark { + position: absolute; + right: 1px; + top: 1px; + margin-top: -5px; + border-width: 5px; + border-style: solid; + border-color: transparent transparent #221 transparent; + transform-origin: 50% 85%; + transition: opacity 0.2s, transform 0.4s; +} + +.dark .bom th .sortmark { + filter: invert(1); +} + +.bom th .sortmark.none { + opacity: 0; +} + +.bom th .sortmark.desc { + transform: rotate(180deg); +} + +.bom th:hover .sortmark.none { + opacity: 0.5; +} + +.bom .bom-checkbox { + width: 30px; + position: relative; + user-select: none; + -moz-user-select: none; +} + +.bom .bom-checkbox:before { + content: ""; + position: absolute; + border-width: 15px; + border-style: solid; + border-color: #51829f transparent transparent transparent; + visibility: hidden; + top: -15px; +} + +.bom .bom-checkbox:after { + content: "Double click to set/unset all"; + position: absolute; + color: white; + top: -35px; + left: -26px; + background: #51829f; + padding: 5px 15px; + border-radius: 8px; + white-space: nowrap; + visibility: hidden; +} + +.bom .bom-checkbox:hover:before, +.bom .bom-checkbox:hover:after { + visibility: visible; + transition: visibility 0.2s linear 1s; +} + +.split { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow-y: auto; + overflow-x: hidden; + background-color: inherit; +} + +.split.split-horizontal, +.gutter.gutter-horizontal { + height: 100%; + float: left; +} + +.gutter { + background-color: #ddd; + background-repeat: no-repeat; + background-position: 50%; + transition: background-color 0.3s; +} + +.dark .gutter { + background-color: #777; +} + +.gutter.gutter-horizontal { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=='); + cursor: ew-resize; + width: 5px; +} + +.gutter.gutter-vertical { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII='); + cursor: ns-resize; + height: 5px; +} + +.searchbox { + float: left; + height: 40px; + margin: 10px 5px; + padding: 12px 32px; + font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace; + font-size: 18px; + box-sizing: border-box; + border: 1px solid #888; + border-radius: 6px; + outline: none; + background-color: #eee; + transition: background-color 0.2s, border 0.2s; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg=='); + background-position: 10px 10px; + background-repeat: no-repeat; +} + +.dark .searchbox { + background-color: #111; + color: #eee; +} + +.searchbox::placeholder { + color: #ccc; +} + +.dark .searchbox::placeholder { + color: #666; +} + +.filter { + width: calc(60% - 64px); +} + +.reflookup { + width: calc(40% - 10px); +} + +input[type=text]:focus { + background-color: white; + border: 1px solid #333; +} + +.dark input[type=text]:focus { + background-color: #333; + border: 1px solid #ccc; +} + +mark.highlight { + background-color: #5050ff; + color: #fff; + padding: 2px; + border-radius: 6px; +} + +.dark mark.highlight { + background-color: #76a6da; + color: #111; +} + +.menubtn { + background-color: white; + border: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A"); + background-position: center; + background-repeat: no-repeat; +} + +.statsbtn { + background-color: white; + border: none; + background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E"); + background-position: center; + background-repeat: no-repeat; +} + +.iobtn { + background-color: white; + border: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E"); + background-position: center; + background-repeat: no-repeat; +} + +.visbtn { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E"); + background-position: center; + background-repeat: no-repeat; + padding: 15px; +} + +#vismenu-content { + left: 0px; + font-family: Verdana, sans-serif; +} + +.dark .statsbtn, +.dark .savebtn, +.dark .menubtn, +.dark .iobtn, +.dark .visbtn { + filter: invert(1); +} + +.flexbox { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.savebtn { + background-color: #d6d6d6; + width: auto; + height: 30px; + flex-grow: 1; + margin: 5px; + border-radius: 4px; +} + +.savebtn:active { + background-color: #0a0; + color: white; +} + +.dark .savebtn:active { + /* This will be inverted */ + background-color: #b3b; +} + +.stats { + border-collapse: collapse; + font-size: 12pt; + table-layout: fixed; + width: 100%; + min-width: 450px; +} + +.dark .stats td { + border: 1px solid #bbb; +} + +.stats td { + border: 1px solid black; + padding: 5px; + word-wrap: break-word; + text-align: center; + position: relative; +} + +#checkbox-stats div { + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +#checkbox-stats .bar { + background-color: rgba(28, 251, 0, 0.6); +} + +.menu { + position: relative; + display: inline-block; + margin: 10px 10px 10px 0px; +} + +.menu-content { + font-size: 12pt !important; + text-align: left !important; + font-weight: normal !important; + display: none; + position: absolute; + background-color: white; + right: 0; + min-width: 300px; + box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); + z-index: 100; + padding: 8px; +} + +.dark .menu-content { + background-color: #111; +} + +.menu:hover .menu-content { + display: block; +} + +.menu:hover .menubtn, +.menu:hover .iobtn, +.menu:hover .statsbtn { + background-color: #eee; +} + +.menu-label { + display: inline-block; + padding: 8px; + border: 1px solid #ccc; + border-top: 0; + width: calc(100% - 18px); +} + +.menu-label-top { + border-top: 1px solid #ccc; +} + +.menu-textbox { + float: left; + height: 24px; + margin: 10px 5px; + padding: 5px 5px; + font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace; + font-size: 14px; + box-sizing: border-box; + border: 1px solid #888; + border-radius: 4px; + outline: none; + background-color: #eee; + transition: background-color 0.2s, border 0.2s; + width: calc(100% - 10px); +} + +.menu-textbox.invalid, +.dark .menu-textbox.invalid { + color: red; +} + +.dark .menu-textbox { + background-color: #222; + color: #eee; +} + +.radio-container { + margin: 4px; +} + +.topmostdiv { + width: 100%; + height: 100%; + background-color: white; + transition: background-color 0.3s; +} + +#top { + height: 78px; + border-bottom: 2px solid black; +} + +.dark #top { + border-bottom: 2px solid #ccc; +} + +#dbg { + display: block; +} + +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: #aaa; +} + +::-webkit-scrollbar-thumb { + background: #666; + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: #555; +} + +.slider { + -webkit-appearance: none; + width: 100%; + margin: 3px 0; + padding: 0; + outline: none; + opacity: 0.7; + -webkit-transition: .2s; + transition: opacity .2s; + border-radius: 3px; +} + +.slider:hover { + opacity: 1; +} + +.slider:focus { + outline: none; +} + +.slider::-webkit-slider-runnable-track { + -webkit-appearance: none; + width: 100%; + height: 8px; + background: #d3d3d3; + border-radius: 3px; + border: none; +} + +.slider::-webkit-slider-thumb { + -webkit-appearance: none; + width: 15px; + height: 15px; + border-radius: 50%; + background: #0a0; + cursor: pointer; + margin-top: -4px; +} + +.dark .slider::-webkit-slider-thumb { + background: #3d3; +} + +.slider::-moz-range-thumb { + width: 15px; + height: 15px; + border-radius: 50%; + background: #0a0; + cursor: pointer; +} + +.slider::-moz-range-track { + height: 8px; + background: #d3d3d3; + border-radius: 3px; +} + +.dark .slider::-moz-range-thumb { + background: #3d3; +} + +.slider::-ms-track { + width: 100%; + height: 8px; + border-width: 3px 0; + background: transparent; + border-color: transparent; + color: transparent; + transition: opacity .2s; +} + +.slider::-ms-fill-lower { + background: #d3d3d3; + border: none; + border-radius: 3px; +} + +.slider::-ms-fill-upper { + background: #d3d3d3; + border: none; + border-radius: 3px; +} + +.slider::-ms-thumb { + width: 15px; + height: 15px; + border-radius: 50%; + background: #0a0; + cursor: pointer; + margin: 0; +} + +.shameless-plug { + font-size: 0.8em; + text-align: center; + display: block; +} + +a { + color: #0278a4; +} + +.dark a { + color: #00b9fd; +} + +#frontcanvas, +#backcanvas { + touch-action: none; +} + +.placeholder { + border: 1px dashed #9f9fda !important; + background-color: #edf2f7 !important; +} + +.dragging { + z-index: 999; +} + +.dark .dragging>table>tbody>tr { + background-color: #252c30; +} + +.dark .placeholder { + filter: invert(1); +} + +.column-spacer { + top: 0; + left: 0; + width: calc(100% - 4px); + position: absolute; + cursor: pointer; + user-select: none; + height: 100%; +} + +.column-width-handle { + top: 0; + right: 0; + width: 4px; + position: absolute; + cursor: col-resize; + user-select: none; + height: 100%; +} + +.column-width-handle:hover { + background-color: #4f99bd; +} + + + </style> + <script type="text/javascript" > +/////////////////////////////////////////////// +/* + Split.js - v1.3.5 + MIT License + https://github.com/nathancahill/Split.js +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}}); + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net> +// This work is free. You can redistribute it and/or modify it +// under the terms of the WTFPL, Version 2 +// For more information see LICENSE.txt or http://www.wtfpl.net/ +// +// For more information, the home page: +// http://pieroxy.net/blog/pages/lz-string/testing.html +// +// LZ-based compression algorithm, version 1.4.4 +var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString}); +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +/*! + * PEP v0.4.3 | https://github.com/jquery/PEP + * Copyright jQuery Foundation and other contributors | http://jquery.org/license + */ +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1); +for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0; +var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})} +var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++) +b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++) +b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){ +for(var b=a;b.parentNode;)b=b.parentNode; +return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target); +return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){ +// +this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))}, +installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){ +var b=x(a,this.findElements,this); +return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){} +var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[], +isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){ +var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID); +0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button]; +c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a), +c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events), +Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events), +Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b); +d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){ +(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE, +c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey; +var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))}, +shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c) +b=!1;else if("XY"===c) +b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]); +b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0}, +vacuumTouches:function(a){var b=a.touches; +if(R.size>=b.length){var c=[];R.forEach(function(a,d){ +if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId); +if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e, +d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):( +b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)}, +dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0]; +if(this.isPrimaryTouch(c)){ +var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba}); + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "fields": ["Value", "Footprint"]} +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +var pcbdata = JSON.parse(LZString.decompressFromBase64("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Hy5SqO1CLUicL+1FrWhtSewtLW7lVi1JrWRJSeQwbUEtbB1YIiQte61EHUyNLXCaHWwdZJ1UhjEdZR1snWZtQe1IFAVuKh1DHX8tRW4Q17BtTB1oRBItXm1ynUydQtwAMAntR9WhnWTQUWwJbWwkBW45nVdEAFGtHUdMEDUxVVwMoZ1zVTItca1FFCadUG10nW6dWp1g7W6dWu1VLViABB1mOptsjR1sHWAoYTE4nVUKD5Ev9jqddFQSQDOoJF1fnUJdVB15NWg2hvVCXX0dV3A+3zhdU01L9VNtcF12SAsdXF1tHVN9MV1gCCMddF1joiC0LW17zWYYBS1O9QldbB1UXT+8E119XWCtf81PbUqdRs1SeAHNae1YRCola21xbWeEFZ1yzUptVG15VColb51nkDOde11eLX+tR51LXVutcl1oPgctQOUJHVldTV1gXWiABB1QODsUEp1wnVEQL/AcnWytfO1kJWpdeK1dbVHdVu1bXWoldV1LdVNtc11fPQvtZd1Hwa7dcd1B3VjNbB1ELVstFO19XX3dUa1h3WolZ81+LVfdfV11HWcdReQwPW5OI21+pgX1cD1fzUiVfKk2bX/dRx1+bWsqN91y9K/dej1ZrDndft1jbXvRnqA73X3Ndt1mPUQ9cl1TLUDtet16HWCxKF1pPUiGCmQ5bXbNVx1emA3dbZ15DawdbT1zTXW1Ym1DPX9tbx1qbX1VZCVIPVI9eXcQvWIxNc1NvgY9Ud1JPV5OX4YmPWy9XO10FCQlTZ1BnVHdSL1t3WU9QL1OnXmJYJ1tXWWkBB1+tVxtfT1emDwdby11PWc9cM14fB/dXpgH7VLtT6g/HUGtcV1zPVQ9U71W3Xs9dG1DPV29fG113h+gJb15PWC9Zb1rnX6dcj1z5V6YFp1SPWLZDT1sbWHGRZ1I3WW9UR1p3XK9UOgXnWvdZK1pvX0kPp1OvVB0DD1YXVe9YB1nLWqgN/V/lUiJYFVS5XBVauV7wAx1Q01WXCvDCS19hgnQG013mR8CHJVDfVmAOC1bfyKrieVbfWEtSDQwTHoVQS4jfWItQSUJ5WxaHeATfU/tNqox4BUBL4QiLUiGFCk0/V4oQwAgzVqYOKyrfW9jm/VRLVr9aP1G/WcsMggdUrlVeJV7Ng0tckORFU99Sv1RXTLUseA8mRMNeS18/WJVfWItDjF9b/Vi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")) +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +/* Utility functions */ + +var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' + + pcbdata.metadata.revision + '__#'; +var storage; + +function initStorage(key) { + try { + window.localStorage.getItem("blank"); + storage = window.localStorage; + } catch (e) { + // localStorage not available + } + if (!storage) { + try { + window.sessionStorage.getItem("blank"); + storage = window.sessionStorage; + } catch (e) { + // sessionStorage also not available + } + } +} + +function readStorage(key) { + if (storage) { + return storage.getItem(storagePrefix + key); + } else { + return null; + } +} + +function writeStorage(key, value) { + if (storage) { + storage.setItem(storagePrefix + key, value); + } +} + +function fancyDblClickHandler(el, onsingle, ondouble) { + return function() { + if (el.getAttribute("data-dblclick") == null) { + el.setAttribute("data-dblclick", 1); + setTimeout(function() { + if (el.getAttribute("data-dblclick") == 1) { + onsingle(); + } + el.removeAttribute("data-dblclick"); + }, 200); + } else { + el.removeAttribute("data-dblclick"); + ondouble(); + } + } +} + +function smoothScrollToRow(rowid) { + document.getElementById(rowid).scrollIntoView({ + behavior: "smooth", + block: "center", + inline: "nearest" + }); +} + +function focusInputField(input) { + input.scrollIntoView(false); + input.focus(); + input.select(); +} + +function copyToClipboard() { + var text = ''; + for (var node of bomhead.childNodes[0].childNodes) { + if (node.firstChild) { + text = text + node.firstChild.nodeValue; + } + if (node != bomhead.childNodes[0].lastChild) { + text += '\t'; + } + } + text += '\n'; + for (var row of bombody.childNodes) { + for (var cell of row.childNodes) { + for (var node of cell.childNodes) { + if (node.nodeName == "INPUT") { + if (node.checked) { + text = text + '✓'; + } + } else if (node.nodeName == "MARK") { + text = text + node.firstChild.nodeValue; + } else { + text = text + node.nodeValue; + } + } + if (cell != row.lastChild) { + text += '\t'; + } + } + text += '\n'; + } + var textArea = document.createElement("textarea"); + textArea.classList.add('clipboard-temp'); + textArea.value = text; + + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + if (document.execCommand('copy')) { + console.log('Bom copied to clipboard.'); + } + } catch (err) { + console.log('Can not copy to clipboard.'); + } + + document.body.removeChild(textArea); +} + +function removeGutterNode(node) { + for (var i = 0; i < node.childNodes.length; i++) { + if (node.childNodes[i].classList && + node.childNodes[i].classList.contains("gutter")) { + node.removeChild(node.childNodes[i]); + break; + } + } +} + +function cleanGutters() { + removeGutterNode(document.getElementById("bot")); + removeGutterNode(document.getElementById("canvasdiv")); +} + +var units = { + prefixes: { + giga: ["G", "g", "giga", "Giga", "GIGA"], + mega: ["M", "mega", "Mega", "MEGA"], + kilo: ["K", "k", "kilo", "Kilo", "KILO"], + milli: ["m", "milli", "Milli", "MILLI"], + micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ + nano: ["N", "n", "nano", "Nano", "NANO"], + pico: ["P", "p", "pico", "Pico", "PICO"], + }, + unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"], + unitsLong: [ + "OHM", "Ohm", "ohm", "ohms", + "FARAD", "Farad", "farad", + "HENRY", "Henry", "henry" + ], + getMultiplier: function(s) { + if (this.prefixes.giga.includes(s)) return 1e9; + if (this.prefixes.mega.includes(s)) return 1e6; + if (this.prefixes.kilo.includes(s)) return 1e3; + if (this.prefixes.milli.includes(s)) return 1e-3; + if (this.prefixes.micro.includes(s)) return 1e-6; + if (this.prefixes.nano.includes(s)) return 1e-9; + if (this.prefixes.pico.includes(s)) return 1e-12; + return 1; + }, + valueRegex: null, +} + +function initUtils() { + var allPrefixes = units.prefixes.giga + .concat(units.prefixes.mega) + .concat(units.prefixes.kilo) + .concat(units.prefixes.milli) + .concat(units.prefixes.micro) + .concat(units.prefixes.nano) + .concat(units.prefixes.pico); + var allUnits = units.unitsShort.concat(units.unitsLong); + units.valueRegex = new RegExp("^([0-9\.]+)" + + "\\s*(" + allPrefixes.join("|") + ")?" + + "(" + allUnits.join("|") + ")?" + + "(\\b.*)?$", ""); + units.valueAltRegex = new RegExp("^([0-9]*)" + + "(" + units.unitsShort.join("|") + ")?" + + "([GgMmKkUuNnPp])?" + + "([0-9]*)" + + "(\\b.*)?$", ""); + if (config.fields.includes("Value")) { + var index = config.fields.indexOf("Value"); + pcbdata.bom["parsedValues"] = {}; + for (var id in pcbdata.bom.fields) { + pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index]) + } + } +} + +function parseValue(val, ref) { + var inferUnit = (unit, ref) => { + if (unit) { + unit = unit.toLowerCase(); + if (unit == 'Ω' || unit == "ohm" || unit == "ohms") { + unit = 'r'; + } + unit = unit[0]; + } else { + ref = /^([a-z]+)\d+$/i.exec(ref); + if (ref) { + ref = ref[1].toLowerCase(); + if (ref == "c") unit = 'f'; + else if (ref == "l") unit = 'h'; + else if (ref == "r" || ref == "rv") unit = 'r'; + else unit = null; + } + } + return unit; + }; + val = val.replace(/,/g, ""); + var match = units.valueRegex.exec(val); + var unit; + if (match) { + val = parseFloat(match[1]); + if (match[2]) { + val = val * units.getMultiplier(match[2]); + } + unit = inferUnit(match[3], ref); + if (!unit) return null; + else return { + val: val, + unit: unit, + extra: match[4], + } + } + match = units.valueAltRegex.exec(val); + if (match && (match[1] || match[4])) { + val = parseFloat(match[1] + "." + match[4]); + if (match[3]) { + val = val * units.getMultiplier(match[3]); + } + unit = inferUnit(match[2], ref); + if (!unit) return null; + else return { + val: val, + unit: unit, + extra: match[5], + } + } + return null; +} + +function valueCompare(a, b, stra, strb) { + if (a === null && b === null) { + // Failed to parse both values, compare them as strings. + if (stra != strb) return stra > strb ? 1 : -1; + else return 0; + } else if (a === null) { + return 1; + } else if (b === null) { + return -1; + } else { + if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1; + else if (a.val != b.val) return a.val > b.val ? 1 : -1; + else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1; + else return 0; + } +} + +function validateSaveImgDimension(element) { + var valid = false; + var intValue = 0; + if (/^[1-9]\d*$/.test(element.value)) { + intValue = parseInt(element.value); + if (intValue <= 16000) { + valid = true; + } + } + if (valid) { + element.classList.remove("invalid"); + } else { + element.classList.add("invalid"); + } + return intValue; +} + +function saveImage(layer) { + var width = validateSaveImgDimension(document.getElementById("render-save-width")); + var height = validateSaveImgDimension(document.getElementById("render-save-height")); + var bgcolor = null; + if (!document.getElementById("render-save-transparent").checked) { + var style = getComputedStyle(topmostdiv); + bgcolor = style.getPropertyValue("background-color"); + } + if (!width || !height) return; + + // Prepare image + var canvas = document.createElement("canvas"); + var layerdict = { + transform: { + x: 0, + y: 0, + s: 1, + panx: 0, + pany: 0, + zoom: 1, + }, + bg: canvas, + fab: canvas, + silk: canvas, + highlight: canvas, + layer: layer, + } + // Do the rendering + recalcLayerScale(layerdict, width, height); + prepareLayer(layerdict); + clearCanvas(canvas, bgcolor); + drawBackground(layerdict, false); + drawHighlightsOnLayer(layerdict, false); + + // Save image + var imgdata = canvas.toDataURL("image/png"); + + var filename = pcbdata.metadata.title; + if (pcbdata.metadata.revision) { + filename += `.${pcbdata.metadata.revision}`; + } + filename += `.${layer}.png`; + saveFile(filename, dataURLtoBlob(imgdata)); +} + +function saveSettings() { + var data = { + type: "InteractiveHtmlBom settings", + version: 1, + pcbmetadata: pcbdata.metadata, + settings: settings, + } + var blob = new Blob([JSON.stringify(data, null, 4)], { + type: "application/json" + }); + saveFile(`${pcbdata.metadata.title}.settings.json`, blob); +} + +function loadSettings() { + var input = document.createElement("input"); + input.type = "file"; + input.accept = ".settings.json"; + input.onchange = function(e) { + var file = e.target.files[0]; + var reader = new FileReader(); + reader.onload = readerEvent => { + var content = readerEvent.target.result; + var newSettings; + try { + newSettings = JSON.parse(content); + } catch (e) { + alert("Selected file is not InteractiveHtmlBom settings file."); + return; + } + if (newSettings.type != "InteractiveHtmlBom settings") { + alert("Selected file is not InteractiveHtmlBom settings file."); + return; + } + var metadataMatches = newSettings.hasOwnProperty("pcbmetadata"); + if (metadataMatches) { + for (var k in pcbdata.metadata) { + if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) { + metadataMatches = false; + } + } + } + if (!metadataMatches) { + var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4); + var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4); + if (!confirm( + `Settins file metadata does not match current metadata.\n\n` + + `Page metadata:\n${currentMetadata}\n\n` + + `Settings file metadata:\n${fileMetadata}\n\n` + + `Press OK if you would like to import settings anyway.`)) { + return; + } + } + overwriteSettings(newSettings.settings); + } + reader.readAsText(file, 'UTF-8'); + } + input.click(); +} + +function overwriteSettings(newSettings) { + initDone = false; + Object.assign(settings, newSettings); + writeStorage("bomlayout", settings.bomlayout); + writeStorage("bommode", settings.bommode); + writeStorage("canvaslayout", settings.canvaslayout); + writeStorage("bomCheckboxes", settings.checkboxes.join(",")); + document.getElementById("bomCheckboxes").value = settings.checkboxes.join(","); + for (var checkbox of settings.checkboxes) { + writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]); + } + writeStorage("markWhenChecked", settings.markWhenChecked); + padsVisible(settings.renderPads); + document.getElementById("padsCheckbox").checked = settings.renderPads; + fabricationVisible(settings.renderFabrication); + document.getElementById("fabricationCheckbox").checked = settings.renderFabrication; + silkscreenVisible(settings.renderSilkscreen); + document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen; + referencesVisible(settings.renderReferences); + document.getElementById("referencesCheckbox").checked = settings.renderReferences; + valuesVisible(settings.renderValues); + document.getElementById("valuesCheckbox").checked = settings.renderValues; + tracksVisible(settings.renderTracks); + document.getElementById("tracksCheckbox").checked = settings.renderTracks; + zonesVisible(settings.renderZones); + document.getElementById("zonesCheckbox").checked = settings.renderZones; + dnpOutline(settings.renderDnpOutline); + document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline; + setRedrawOnDrag(settings.redrawOnDrag); + document.getElementById("dragCheckbox").checked = settings.redrawOnDrag; + setDarkMode(settings.darkMode); + document.getElementById("darkmodeCheckbox").checked = settings.darkMode; + setHighlightPin1(settings.highlightpin1); + document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1; + showFootprints(settings.show_footprints); + writeStorage("boardRotation", settings.boardRotation); + document.getElementById("boardRotation").value = settings.boardRotation / 5; + document.getElementById("rotationDegree").textContent = settings.boardRotation; + initDone = true; + prepCheckboxes(); + changeBomLayout(settings.bomlayout); +} + +function saveFile(filename, blob) { + var link = document.createElement("a"); + var objurl = URL.createObjectURL(blob); + link.download = filename; + link.href = objurl; + link.click(); +} + +function dataURLtoBlob(dataurl) { + var arr = dataurl.split(','), + mime = arr[0].match(/:(.*?);/)[1], + bstr = atob(arr[1]), + n = bstr.length, + u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new Blob([u8arr], { + type: mime + }); +} + +var settings = { + canvaslayout: "default", + bomlayout: "default", + bommode: "grouped", + checkboxes: [], + checkboxStoredRefs: {}, + darkMode: false, + highlightpin1: false, + redrawOnDrag: true, + boardRotation: 0, + renderPads: true, + renderReferences: true, + renderValues: true, + renderSilkscreen: true, + renderFabrication: true, + renderDnpOutline: false, + renderTracks: true, + renderZones: true, + columnOrder: [], + hiddenColumns: [], +} + +function initDefaults() { + settings.bomlayout = readStorage("bomlayout"); + if (settings.bomlayout === null) { + settings.bomlayout = config.bom_view; + } + if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) { + settings.bomlayout = config.bom_view; + } + settings.bommode = readStorage("bommode"); + if (settings.bommode === null) { + settings.bommode = "grouped"; + } + if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) { + settings.bommode = "grouped"; + } + settings.canvaslayout = readStorage("canvaslayout"); + if (settings.canvaslayout === null) { + settings.canvaslayout = config.layer_view; + } + var bomCheckboxes = readStorage("bomCheckboxes"); + if (bomCheckboxes === null) { + bomCheckboxes = config.checkboxes; + } + settings.checkboxes = bomCheckboxes.split(",").filter((e) => e); + document.getElementById("bomCheckboxes").value = bomCheckboxes; + + settings.markWhenChecked = readStorage("markWhenChecked") || ""; + populateMarkWhenCheckedOptions(); + + function initBooleanSetting(storageString, def, elementId, func) { + var b = readStorage(storageString); + if (b === null) { + b = def; + } else { + b = (b == "true"); + } + document.getElementById(elementId).checked = b; + func(b); + } + + initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible); + initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible); + initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible); + initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible); + initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible); + if ("tracks" in pcbdata) { + initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible); + initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible); + } else { + document.getElementById("tracksAndZonesCheckboxes").style.display = "none"; + tracksVisible(false); + zonesVisible(false); + } + initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline); + initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag); + initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode); + initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1); + + var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]); + var hcols = JSON.parse(readStorage("hiddenColumns")); + if (hcols === null) { + hcols = []; + } + settings.hiddenColumns = hcols.filter(e => fields.includes(e)); + + var cord = JSON.parse(readStorage("columnOrder")); + if (cord === null) { + cord = fields; + } else { + cord = cord.filter(e => fields.includes(e)); + if (cord.length != fields.length) + cord = fields; + } + settings.columnOrder = cord; + + settings.boardRotation = readStorage("boardRotation"); + if (settings.boardRotation === null) { + settings.boardRotation = config.board_rotation * 5; + } else { + settings.boardRotation = parseInt(settings.boardRotation); + } + document.getElementById("boardRotation").value = settings.boardRotation / 5; + document.getElementById("rotationDegree").textContent = settings.boardRotation; +} + +// Helper classes for user js callbacks. + +const IBOM_EVENT_TYPES = { + ALL: "all", + HIGHLIGHT_EVENT: "highlightEvent", + CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent", + BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent", +} + +const EventHandler = { + callbacks: {}, + init: function() { + for (eventType of Object.values(IBOM_EVENT_TYPES)) + this.callbacks[eventType] = []; + }, + registerCallback: function(eventType, callback) { + this.callbacks[eventType].push(callback); + }, + emitEvent: function(eventType, eventArgs) { + event = { + eventType: eventType, + args: eventArgs, + } + var callback; + for (callback of this.callbacks[eventType]) + callback(event); + for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL]) + callback(event); + } +} +EventHandler.init(); + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +/* PCB rendering code */ + +var emptyContext2d = document.createElement("canvas").getContext("2d"); + +function deg2rad(deg) { + return deg * Math.PI / 180; +} + +function calcFontPoint(linepoint, text, offsetx, offsety, tilt) { + var point = [ + linepoint[0] * text.width + offsetx, + linepoint[1] * text.height + offsety + ]; + // This approximates pcbnew behavior with how text tilts depending on horizontal justification + point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt; + return point; +} + +function drawText(ctx, text, color) { + if ("ref" in text && !settings.renderReferences) return; + if ("val" in text && !settings.renderValues) return; + ctx.save(); + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + ctx.lineWidth = text.thickness; + if ("svgpath" in text) { + ctx.stroke(new Path2D(text.svgpath)); + ctx.restore(); + return; + } + ctx.translate(...text.pos); + ctx.translate(text.thickness * 0.5, 0); + var angle = -text.angle; + if (text.attr.includes("mirrored")) { + ctx.scale(-1, 1); + angle = -angle; + } + var tilt = 0; + if (text.attr.includes("italic")) { + tilt = 0.125; + } + var interline = text.height * 1.5 + text.thickness; + var txt = text.text.split("\n"); + // KiCad ignores last empty line. + if (txt[txt.length - 1] == '') txt.pop(); + ctx.rotate(deg2rad(angle)); + var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset + offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset + for (var i in txt) { + var lineWidth = text.thickness + interline / 2 * tilt; + for (var j = 0; j < txt[i].length; j++) { + if (txt[i][j] == '\t') { + var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width; + lineWidth += fourSpaces - lineWidth % fourSpaces; + } else { + if (txt[i][j] == '~') { + j++; + if (j == txt[i].length) + break; + } + lineWidth += pcbdata.font_data[txt[i][j]].w * text.width; + } + } + var offsetx = -lineWidth * (text.justify[0] + 1) / 2; + var inOverbar = false; + for (var j = 0; j < txt[i].length; j++) { + if (txt[i][j] == '\t') { + var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width; + offsetx += fourSpaces - offsetx % fourSpaces; + continue; + } else if (txt[i][j] == '~') { + j++; + if (j == txt[i].length) + break; + if (txt[i][j] != '~') { + inOverbar = !inOverbar; + } + } + var glyph = pcbdata.font_data[txt[i][j]]; + if (inOverbar) { + var overbarStart = [offsetx, -text.height * 1.4 + offsety]; + var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]]; + + if (!lastHadOverbar) { + overbarStart[0] += text.height * 1.4 * tilt; + lastHadOverbar = true; + } + ctx.beginPath(); + ctx.moveTo(...overbarStart); + ctx.lineTo(...overbarEnd); + ctx.stroke(); + } else { + lastHadOverbar = false; + } + for (var line of glyph.l) { + ctx.beginPath(); + ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt)); + for (var k = 1; k < line.length; k++) { + ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt)); + } + ctx.stroke(); + } + offsetx += glyph.w * text.width; + } + offsety += interline; + } + ctx.restore(); +} + +function drawedge(ctx, scalefactor, edge, color) { + ctx.strokeStyle = color; + ctx.fillStyle = color; + ctx.lineWidth = Math.max(1 / scalefactor, edge.width); + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + if ("svgpath" in edge) { + ctx.stroke(new Path2D(edge.svgpath)); + } else { + ctx.beginPath(); + if (edge.type == "segment") { + ctx.moveTo(...edge.start); + ctx.lineTo(...edge.end); + } + if (edge.type == "rect") { + ctx.moveTo(...edge.start); + ctx.lineTo(edge.start[0], edge.end[1]); + ctx.lineTo(...edge.end); + ctx.lineTo(edge.end[0], edge.start[1]); + ctx.lineTo(...edge.start); + } + if (edge.type == "arc") { + ctx.arc( + ...edge.start, + edge.radius, + deg2rad(edge.startangle), + deg2rad(edge.endangle)); + } + if (edge.type == "circle") { + ctx.arc( + ...edge.start, + edge.radius, + 0, 2 * Math.PI); + ctx.closePath(); + } + if (edge.type == "curve") { + ctx.moveTo(...edge.start); + ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end); + } + if("filled" in edge && edge.filled) + ctx.fill(); + else + ctx.stroke(); + } +} + +function getChamferedRectPath(size, radius, chamfpos, chamfratio) { + // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8 + var path = new Path2D(); + var width = size[0]; + var height = size[1]; + var x = width * -0.5; + var y = height * -0.5; + var chamfOffset = Math.min(width, height) * chamfratio; + path.moveTo(x, 0); + if (chamfpos & 4) { + path.lineTo(x, y + height - chamfOffset); + path.lineTo(x + chamfOffset, y + height); + path.lineTo(0, y + height); + } else { + path.arcTo(x, y + height, x + width, y + height, radius); + } + if (chamfpos & 8) { + path.lineTo(x + width - chamfOffset, y + height); + path.lineTo(x + width, y + height - chamfOffset); + path.lineTo(x + width, 0); + } else { + path.arcTo(x + width, y + height, x + width, y, radius); + } + if (chamfpos & 2) { + path.lineTo(x + width, y + chamfOffset); + path.lineTo(x + width - chamfOffset, y); + path.lineTo(0, y); + } else { + path.arcTo(x + width, y, x, y, radius); + } + if (chamfpos & 1) { + path.lineTo(x + chamfOffset, y); + path.lineTo(x, y + chamfOffset); + path.lineTo(x, 0); + } else { + path.arcTo(x, y, x, y + height, radius); + } + path.closePath(); + return path; +} + +function getOblongPath(size) { + return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0); +} + +function getPolygonsPath(shape) { + if (shape.path2d) { + return shape.path2d; + } + if ("svgpath" in shape) { + shape.path2d = new Path2D(shape.svgpath); + } else { + var path = new Path2D(); + for (var polygon of shape.polygons) { + path.moveTo(...polygon[0]); + for (var i = 1; i < polygon.length; i++) { + path.lineTo(...polygon[i]); + } + path.closePath(); + } + shape.path2d = path; + } + return shape.path2d; +} + +function drawPolygonShape(ctx, scalefactor, shape, color) { + ctx.save(); + if (!("svgpath" in shape)) { + ctx.translate(...shape.pos); + ctx.rotate(deg2rad(-shape.angle)); + } + if("filled" in shape && !shape.filled) { + ctx.strokeStyle = color; + ctx.lineWidth = Math.max(1 / scalefactor, shape.width); + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + ctx.stroke(getPolygonsPath(shape)); + } else { + ctx.fillStyle = color; + ctx.fill(getPolygonsPath(shape)); + } + ctx.restore(); +} + +function drawDrawing(ctx, scalefactor, drawing, color) { + if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) { + drawedge(ctx, scalefactor, drawing, color); + } else if (drawing.type == "polygon") { + drawPolygonShape(ctx, scalefactor, drawing, color); + } else { + drawText(ctx, drawing, color); + } +} + +function getCirclePath(radius) { + var path = new Path2D(); + path.arc(0, 0, radius, 0, 2 * Math.PI); + path.closePath(); + return path; +} + +function getCachedPadPath(pad) { + if (!pad.path2d) { + // if path2d is not set, build one and cache it on pad object + if (pad.shape == "rect") { + pad.path2d = new Path2D(); + pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size); + } else if (pad.shape == "oval") { + pad.path2d = getOblongPath(pad.size); + } else if (pad.shape == "circle") { + pad.path2d = getCirclePath(pad.size[0] / 2); + } else if (pad.shape == "roundrect") { + pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0); + } else if (pad.shape == "chamfrect") { + pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio) + } else if (pad.shape == "custom") { + pad.path2d = getPolygonsPath(pad); + } + } + return pad.path2d; +} + +function drawPad(ctx, pad, color, outline) { + ctx.save(); + ctx.translate(...pad.pos); + ctx.rotate(deg2rad(pad.angle)); + if (pad.offset) { + ctx.translate(...pad.offset); + } + ctx.fillStyle = color; + ctx.strokeStyle = color; + var path = getCachedPadPath(pad); + if (outline) { + ctx.stroke(path); + } else { + ctx.fill(path); + } + ctx.restore(); +} + +function drawPadHole(ctx, pad, padHoleColor) { + if (pad.type != "th") return; + ctx.save(); + ctx.translate(...pad.pos); + ctx.rotate(deg2rad(pad.angle)); + ctx.fillStyle = padHoleColor; + if (pad.drillshape == "oblong") { + ctx.fill(getOblongPath(pad.drillsize)); + } else { + ctx.fill(getCirclePath(pad.drillsize[0] / 2)); + } + ctx.restore(); +} + +function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) { + if (highlight) { + // draw bounding box + if (footprint.layer == layer) { + ctx.save(); + ctx.globalAlpha = 0.2; + ctx.translate(...footprint.bbox.pos); + ctx.rotate(deg2rad(-footprint.bbox.angle)); + ctx.translate(...footprint.bbox.relpos); + ctx.fillStyle = colors.pad; + ctx.fillRect(0, 0, ...footprint.bbox.size); + ctx.globalAlpha = 1; + ctx.strokeStyle = colors.pad; + ctx.strokeRect(0, 0, ...footprint.bbox.size); + ctx.restore(); + } + } + // draw drawings + for (var drawing of footprint.drawings) { + if (drawing.layer == layer) { + drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad); + } + } + // draw pads + if (settings.renderPads) { + for (var pad of footprint.pads) { + if (pad.layers.includes(layer)) { + drawPad(ctx, pad, colors.pad, outline); + if (pad.pin1 && settings.highlightpin1) { + drawPad(ctx, pad, colors.outline, true); + } + } + } + for (var pad of footprint.pads) { + drawPadHole(ctx, pad, colors.padHole); + } + } +} + +function drawEdgeCuts(canvas, scalefactor) { + var ctx = canvas.getContext("2d"); + var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color'); + for (var edge of pcbdata.edges) { + drawDrawing(ctx, scalefactor, edge, edgecolor); + } +} + +function drawFootprints(canvas, layer, scalefactor, highlight) { + var ctx = canvas.getContext("2d"); + ctx.lineWidth = 3 / scalefactor; + var style = getComputedStyle(topmostdiv); + + var colors = { + pad: style.getPropertyValue('--pad-color'), + padHole: style.getPropertyValue('--pad-hole-color'), + outline: style.getPropertyValue('--pin1-outline-color'), + } + + for (var i = 0; i < pcbdata.footprints.length; i++) { + var mod = pcbdata.footprints[i]; + var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i); + var h = highlightedFootprints.includes(i); + var d = markedFootprints.has(i); + if (highlight) { + if(h && d) { + colors.pad = style.getPropertyValue('--pad-color-highlight-both'); + colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both'); + } else if (h) { + colors.pad = style.getPropertyValue('--pad-color-highlight'); + colors.outline = style.getPropertyValue('--pin1-outline-color-highlight'); + } else if (d) { + colors.pad = style.getPropertyValue('--pad-color-highlight-marked'); + colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked'); + } + } + if( h || d || !highlight) { + drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline); + } + } +} + +function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) { + var ctx = canvas.getContext("2d"); + for (var d of pcbdata.drawings[layername][layer]) { + if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) { + drawedge(ctx, scalefactor, d, edgeColor); + } else if (d.type == "polygon") { + drawPolygonShape(ctx, scalefactor, d, polygonColor); + } else { + drawText(ctx, d, textColor); + } + } +} + +function drawTracks(canvas, layer, color, highlight) { + ctx = canvas.getContext("2d"); + ctx.strokeStyle = color; + ctx.lineCap = "round"; + for (var track of pcbdata.tracks[layer]) { + if (highlight && highlightedNet != track.net) continue; + ctx.lineWidth = track.width; + ctx.beginPath(); + if ('radius' in track) { + ctx.arc( + ...track.center, + track.radius, + deg2rad(track.startangle), + deg2rad(track.endangle)); + } else { + ctx.moveTo(...track.start); + ctx.lineTo(...track.end); + } + ctx.stroke(); + } +} + +function drawZones(canvas, layer, color, highlight) { + ctx = canvas.getContext("2d"); + ctx.strokeStyle = color; + ctx.fillStyle = color; + ctx.lineJoin = "round"; + for (var zone of pcbdata.zones[layer]) { + if (!zone.path2d) { + zone.path2d = getPolygonsPath(zone); + } + if (highlight && highlightedNet != zone.net) continue; + ctx.fill(zone.path2d); + if (zone.width > 0) { + ctx.lineWidth = zone.width; + ctx.stroke(zone.path2d); + } + } +} + +function clearCanvas(canvas, color = null) { + var ctx = canvas.getContext("2d"); + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + if (color) { + ctx.fillStyle = color; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } else { + if (!window.matchMedia("print").matches) + ctx.clearRect(0, 0, canvas.width, canvas.height); + } + ctx.restore(); +} + +function drawNets(canvas, layer, highlight) { + var style = getComputedStyle(topmostdiv); + if (settings.renderTracks) { + var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color'); + drawTracks(canvas, layer, trackColor, highlight); + } + if (settings.renderZones) { + var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color'); + drawZones(canvas, layer, zoneColor, highlight); + } + if (highlight && settings.renderPads) { + var padColor = style.getPropertyValue('--pad-color-highlight'); + var padHoleColor = style.getPropertyValue('--pad-hole-color'); + var ctx = canvas.getContext("2d"); + for (var footprint of pcbdata.footprints) { + // draw pads + var padDrawn = false; + for (var pad of footprint.pads) { + if (highlightedNet != pad.net) continue; + if (pad.layers.includes(layer)) { + drawPad(ctx, pad, padColor, false); + padDrawn = true; + } + } + if (padDrawn) { + // redraw all pad holes because some pads may overlap + for (var pad of footprint.pads) { + drawPadHole(ctx, pad, padHoleColor); + } + } + } + } +} + +function drawHighlightsOnLayer(canvasdict, clear = true) { + if (clear) { + clearCanvas(canvasdict.highlight); + } + if (markedFootprints.size > 0 || highlightedFootprints.length > 0) { + drawFootprints(canvasdict.highlight, canvasdict.layer, + canvasdict.transform.s * canvasdict.transform.zoom, true); + } + if (highlightedNet !== null) { + drawNets(canvasdict.highlight, canvasdict.layer, true); + } +} + +function drawHighlights() { + drawHighlightsOnLayer(allcanvas.front); + drawHighlightsOnLayer(allcanvas.back); +} + +function drawBackground(canvasdict, clear = true) { + if (clear) { + clearCanvas(canvasdict.bg); + clearCanvas(canvasdict.fab); + clearCanvas(canvasdict.silk); + } + + drawNets(canvasdict.bg, canvasdict.layer, false); + drawFootprints(canvasdict.bg, canvasdict.layer, + canvasdict.transform.s * canvasdict.transform.zoom, false); + + drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom); + + var style = getComputedStyle(topmostdiv); + var edgeColor = style.getPropertyValue('--silkscreen-edge-color'); + var polygonColor = style.getPropertyValue('--silkscreen-polygon-color'); + var textColor = style.getPropertyValue('--silkscreen-text-color'); + if (settings.renderSilkscreen) { + drawBgLayer( + "silkscreen", canvasdict.silk, canvasdict.layer, + canvasdict.transform.s * canvasdict.transform.zoom, + edgeColor, polygonColor, textColor); + } + edgeColor = style.getPropertyValue('--fabrication-edge-color'); + polygonColor = style.getPropertyValue('--fabrication-polygon-color'); + textColor = style.getPropertyValue('--fabrication-text-color'); + if (settings.renderFabrication) { + drawBgLayer( + "fabrication", canvasdict.fab, canvasdict.layer, + canvasdict.transform.s * canvasdict.transform.zoom, + edgeColor, polygonColor, textColor); + } +} + +function prepareCanvas(canvas, flip, transform) { + var ctx = canvas.getContext("2d"); + ctx.setTransform(1, 0, 0, 1, 0, 0); + var fontsize = 1.55; + ctx.scale(transform.zoom, transform.zoom); + ctx.translate(transform.panx, transform.pany); + if (flip) { + ctx.scale(-1, 1); + } + ctx.translate(transform.x, transform.y); + ctx.rotate(deg2rad(settings.boardRotation)); + ctx.scale(transform.s, transform.s); +} + +function prepareLayer(canvasdict) { + var flip = (canvasdict.layer == "B"); + for (var c of ["bg", "fab", "silk", "highlight"]) { + prepareCanvas(canvasdict[c], flip, canvasdict.transform); + } +} + +function rotateVector(v, angle) { + angle = deg2rad(angle); + return [ + v[0] * Math.cos(angle) - v[1] * Math.sin(angle), + v[0] * Math.sin(angle) + v[1] * Math.cos(angle) + ]; +} + +function applyRotation(bbox) { + var corners = [ + [bbox.minx, bbox.miny], + [bbox.minx, bbox.maxy], + [bbox.maxx, bbox.miny], + [bbox.maxx, bbox.maxy], + ]; + corners = corners.map((v) => rotateVector(v, settings.boardRotation)); + return { + minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity), + miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity), + maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity), + maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity), + } +} + +function recalcLayerScale(layerdict, width, height) { + var bbox = applyRotation(pcbdata.edges_bbox); + var scalefactor = 0.98 * Math.min( + width / (bbox.maxx - bbox.minx), + height / (bbox.maxy - bbox.miny) + ); + if (scalefactor < 0.1) { + scalefactor = 1; + } + layerdict.transform.s = scalefactor; + var flip = (layerdict.layer == "B"); + if (flip) { + layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5; + } else { + layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5; + } + layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5; + for (var c of ["bg", "fab", "silk", "highlight"]) { + canvas = layerdict[c]; + canvas.width = width; + canvas.height = height; + canvas.style.width = (width / devicePixelRatio) + "px"; + canvas.style.height = (height / devicePixelRatio) + "px"; + } +} + +function redrawCanvas(layerdict) { + prepareLayer(layerdict); + drawBackground(layerdict); + drawHighlightsOnLayer(layerdict); +} + +function resizeCanvas(layerdict) { + var canvasdivid = { + "F": "frontcanvas", + "B": "backcanvas" + } [layerdict.layer]; + var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio; + var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio; + recalcLayerScale(layerdict, width, height); + redrawCanvas(layerdict); +} + +function resizeAll() { + resizeCanvas(allcanvas.front); + resizeCanvas(allcanvas.back); +} + +function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) { + var A = x - x1; + var B = y - y1; + var C = x2 - x1; + var D = y2 - y1; + + var dot = A * C + B * D; + var len_sq = C * C + D * D; + var dx, dy; + if (len_sq == 0) { + // start and end of the segment coincide + dx = x - x1; + dy = y - y1; + } else { + var param = dot / len_sq; + var xx, yy; + if (param < 0) { + xx = x1; + yy = y1; + } else if (param > 1) { + xx = x2; + yy = y2; + } else { + xx = x1 + param * C; + yy = y1 + param * D; + } + dx = x - xx; + dy = y - yy; + } + return dx * dx + dy * dy <= d * d; +} + +function modulo(n, mod) { + return ((n % mod) + mod) % mod; +} + +function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) { + var dx = x - xc; + var dy = y - yc; + var r_sq = dx * dx + dy * dy; + var rmin = Math.max(0, radius - d); + var rmax = radius + d; + + if (r_sq < rmin * rmin || r_sq > rmax * rmax) + return false; + + var angle1 = modulo(deg2rad(startangle), 2 * Math.PI); + var dx1 = xc + radius * Math.cos(angle1) - x; + var dy1 = yc + radius * Math.sin(angle1) - y; + if (dx1 * dx1 + dy1 * dy1 <= d * d) + return true; + + var angle2 = modulo(deg2rad(endangle), 2 * Math.PI); + var dx2 = xc + radius * Math.cos(angle2) - x; + var dy2 = yc + radius * Math.sin(angle2) - y; + if (dx2 * dx2 + dy2 * dy2 <= d * d) + return true; + + var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI); + if (angle1 > angle2) + return (angle >= angle2 || angle <= angle1); + else + return (angle >= angle1 && angle <= angle2); +} + +function pointWithinPad(x, y, pad) { + var v = [x - pad.pos[0], y - pad.pos[1]]; + v = rotateVector(v, -pad.angle); + if (pad.offset) { + v[0] -= pad.offset[0]; + v[1] -= pad.offset[1]; + } + return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v); +} + +function netHitScan(layer, x, y) { + // Check track segments + if (settings.renderTracks && pcbdata.tracks) { + for (var track of pcbdata.tracks[layer]) { + if ('radius' in track) { + if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) { + return track.net; + } + } else { + if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) { + return track.net; + } + } + } + } + // Check pads + if (settings.renderPads) { + for (var footprint of pcbdata.footprints) { + for (var pad of footprint.pads) { + if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) { + return pad.net; + } + } + } + } + return null; +} + +function pointWithinFootprintBbox(x, y, bbox) { + var v = [x - bbox.pos[0], y - bbox.pos[1]]; + v = rotateVector(v, bbox.angle); + return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] && + bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1]; +} + +function bboxHitScan(layer, x, y) { + var result = []; + for (var i = 0; i < pcbdata.footprints.length; i++) { + var footprint = pcbdata.footprints[i]; + if (footprint.layer == layer) { + if (pointWithinFootprintBbox(x, y, footprint.bbox)) { + result.push(i); + } + } + } + return result; +} + +function handlePointerDown(e, layerdict) { + if (e.button != 0 && e.button != 1) { + return; + } + e.preventDefault(); + e.stopPropagation(); + + if (!e.hasOwnProperty("offsetX")) { + // The polyfill doesn't set this properly + e.offsetX = e.pageX - e.currentTarget.offsetLeft; + e.offsetY = e.pageY - e.currentTarget.offsetTop; + } + + layerdict.pointerStates[e.pointerId] = { + distanceTravelled: 0, + lastX: e.offsetX, + lastY: e.offsetY, + downTime: Date.now(), + }; +} + +function handleMouseClick(e, layerdict) { + if (!e.hasOwnProperty("offsetX")) { + // The polyfill doesn't set this properly + e.offsetX = e.pageX - e.currentTarget.offsetLeft; + e.offsetY = e.pageY - e.currentTarget.offsetTop; + } + + var x = e.offsetX; + var y = e.offsetY; + var t = layerdict.transform; + if (layerdict.layer == "B") { + x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s; + } else { + x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s; + } + y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s; + var v = rotateVector([x, y], -settings.boardRotation); + if ("nets" in pcbdata) { + var net = netHitScan(layerdict.layer, ...v); + if (net !== highlightedNet) { + netClicked(net); + } + } + if (highlightedNet === null) { + var footprints = bboxHitScan(layerdict.layer, ...v); + if (footprints.length > 0) { + footprintsClicked(footprints); + } + } +} + +function handlePointerLeave(e, layerdict) { + e.preventDefault(); + e.stopPropagation(); + + if (!settings.redrawOnDrag) { + redrawCanvas(layerdict); + } + + delete layerdict.pointerStates[e.pointerId]; +} + +function resetTransform(layerdict) { + layerdict.transform.panx = 0; + layerdict.transform.pany = 0; + layerdict.transform.zoom = 1; + redrawCanvas(layerdict); +} + +function handlePointerUp(e, layerdict) { + if (!e.hasOwnProperty("offsetX")) { + // The polyfill doesn't set this properly + e.offsetX = e.pageX - e.currentTarget.offsetLeft; + e.offsetY = e.pageY - e.currentTarget.offsetTop; + } + + e.preventDefault(); + e.stopPropagation(); + + if (e.button == 2) { + // Reset pan and zoom on right click. + resetTransform(layerdict); + layerdict.anotherPointerTapped = false; + return; + } + + // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now + var ptr = layerdict.pointerStates[e.pointerId]; + ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY); + + if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) { + if (Object.keys(layerdict.pointerStates).length == 1) { + if (layerdict.anotherPointerTapped) { + // This is the second pointer coming off of a two-finger tap + resetTransform(layerdict); + } else { + // This is just a regular tap + handleMouseClick(e, layerdict); + } + layerdict.anotherPointerTapped = false; + } else { + // This is the first finger coming off of what could become a two-finger tap + layerdict.anotherPointerTapped = true; + } + } else { + if (!settings.redrawOnDrag) { + redrawCanvas(layerdict); + } + layerdict.anotherPointerTapped = false; + } + + delete layerdict.pointerStates[e.pointerId]; +} + +function handlePointerMove(e, layerdict) { + if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) { + return; + } + e.preventDefault(); + e.stopPropagation(); + + if (!e.hasOwnProperty("offsetX")) { + // The polyfill doesn't set this properly + e.offsetX = e.pageX - e.currentTarget.offsetLeft; + e.offsetY = e.pageY - e.currentTarget.offsetTop; + } + + var thisPtr = layerdict.pointerStates[e.pointerId]; + + var dx = e.offsetX - thisPtr.lastX; + var dy = e.offsetY - thisPtr.lastY; + + // If this number is low on pointer up, we count the action as a click + thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy); + + if (Object.keys(layerdict.pointerStates).length == 1) { + // This is a simple drag + layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom; + layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom; + } else if (Object.keys(layerdict.pointerStates).length == 2) { + var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0]; + + var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2)); + var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2)); + + var scaleFactor = newDist / oldDist; + + if (scaleFactor != NaN) { + layerdict.transform.zoom *= scaleFactor; + + var zoomd = (1 - scaleFactor) / layerdict.transform.zoom; + layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd; + layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd; + } + } + + thisPtr.lastX = e.offsetX; + thisPtr.lastY = e.offsetY; + + if (settings.redrawOnDrag) { + redrawCanvas(layerdict); + } +} + +function handleMouseWheel(e, layerdict) { + e.preventDefault(); + e.stopPropagation(); + var t = layerdict.transform; + var wheeldelta = e.deltaY; + if (e.deltaMode == 1) { + // FF only, scroll by lines + wheeldelta *= 30; + } else if (e.deltaMode == 2) { + wheeldelta *= 300; + } + var m = Math.pow(1.1, -wheeldelta / 40); + // Limit amount of zoom per tick. + if (m > 2) { + m = 2; + } else if (m < 0.5) { + m = 0.5; + } + t.zoom *= m; + var zoomd = (1 - m) / t.zoom; + t.panx += devicePixelRatio * e.offsetX * zoomd; + t.pany += devicePixelRatio * e.offsetY * zoomd; + redrawCanvas(layerdict); +} + +function addMouseHandlers(div, layerdict) { + div.addEventListener("pointerdown", function(e) { + handlePointerDown(e, layerdict); + }); + div.addEventListener("pointermove", function(e) { + handlePointerMove(e, layerdict); + }); + div.addEventListener("pointerup", function(e) { + handlePointerUp(e, layerdict); + }); + var pointerleave = function(e) { + handlePointerLeave(e, layerdict); + } + div.addEventListener("pointercancel", pointerleave); + div.addEventListener("pointerleave", pointerleave); + div.addEventListener("pointerout", pointerleave); + + div.onwheel = function(e) { + handleMouseWheel(e, layerdict); + } + for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) { + element.addEventListener("contextmenu", function(e) { + e.preventDefault(); + }, false); + } +} + +function setRedrawOnDrag(value) { + settings.redrawOnDrag = value; + writeStorage("redrawOnDrag", value); +} + +function setBoardRotation(value) { + settings.boardRotation = value * 5; + writeStorage("boardRotation", settings.boardRotation); + document.getElementById("rotationDegree").textContent = settings.boardRotation; + resizeAll(); +} + +function initRender() { + allcanvas = { + front: { + transform: { + x: 0, + y: 0, + s: 1, + panx: 0, + pany: 0, + zoom: 1, + }, + pointerStates: {}, + anotherPointerTapped: false, + bg: document.getElementById("F_bg"), + fab: document.getElementById("F_fab"), + silk: document.getElementById("F_slk"), + highlight: document.getElementById("F_hl"), + layer: "F", + }, + back: { + transform: { + x: 0, + y: 0, + s: 1, + panx: 0, + pany: 0, + zoom: 1, + }, + pointerStates: {}, + anotherPointerTapped: false, + bg: document.getElementById("B_bg"), + fab: document.getElementById("B_fab"), + silk: document.getElementById("B_slk"), + highlight: document.getElementById("B_hl"), + layer: "B", + } + }; + addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front); + addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back); +} + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +/* + * Table reordering via Drag'n'Drop + * Inspired by: https://htmldom.dev/drag-and-drop-table-column + */ + +function setBomHandlers() { + + const bom = document.getElementById('bomtable'); + + let dragName; + let placeHolderElements; + let draggingElement; + let forcePopulation; + let xOffset; + let yOffset; + let wasDragged; + + const mouseUpHandler = function(e) { + // Delete dragging element + draggingElement.remove(); + + // Make BOM selectable again + bom.style.removeProperty("userSelect"); + + // Remove listeners + document.removeEventListener('mousemove', mouseMoveHandler); + document.removeEventListener('mouseup', mouseUpHandler); + + if (wasDragged) { + // Redraw whole BOM + populateBomTable(); + } + } + + const mouseMoveHandler = function(e) { + // Notice the dragging + wasDragged = true; + + // Make the dragged element visible + draggingElement.style.removeProperty("display"); + + // Set elements position to mouse position + draggingElement.style.left = `${e.screenX - xOffset}px`; + draggingElement.style.top = `${e.screenY - yOffset}px`; + + // Forced redrawing of BOM table + if (forcePopulation) { + forcePopulation = false; + // Copy array + phe = Array.from(placeHolderElements); + // populate BOM table again + populateBomHeader(dragName, phe); + populateBomBody(dragName, phe); + } + + // Set up array of hidden columns + var hiddenColumns = Array.from(settings.hiddenColumns); + // In the ungrouped mode, quantity don't exist + if (settings.bommode === "ungrouped") + hiddenColumns.push("Quantity"); + // If no checkbox fields can be found, we consider them hidden + if (settings.checkboxes.length == 0) + hiddenColumns.push("checkboxes"); + + // Get table headers and group them into checkboxes, extrafields and normal headers + const bh = document.getElementById("bomhead"); + headers = Array.from(bh.querySelectorAll("th")) + headers.shift() // numCol is not part of the columnOrder + headerGroups = [] + lastCompoundClass = null; + for (i = 0; i < settings.columnOrder.length; i++) { + cElem = settings.columnOrder[i]; + if (hiddenColumns.includes(cElem)) { + // Hidden columns appear as a dummy element + headerGroups.push([]); + continue; + } + elem = headers.filter(e => getColumnOrderName(e) === cElem)[0]; + if (elem.classList.contains("bom-checkbox")) { + if (lastCompoundClass === "bom-checkbox") { + cbGroup = headerGroups.pop(); + cbGroup.push(elem); + headerGroups.push(cbGroup); + } else { + lastCompoundClass = "bom-checkbox"; + headerGroups.push([elem]) + } + } else { + headerGroups.push([elem]) + } + } + + // Copy settings.columnOrder + var columns = Array.from(settings.columnOrder) + + // Set up array with indices of hidden columns + var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e)); + var dragIndex = columns.indexOf(dragName); + var swapIndex = dragIndex; + var swapDone = false; + + // Check if the current dragged element is swapable with the left or right element + if (dragIndex > 0) { + // Get left headers boundingbox + swapIndex = dragIndex - 1; + while (hiddenIndices.includes(swapIndex) && swapIndex > 0) + swapIndex--; + if (!hiddenIndices.includes(swapIndex)) { + box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]); + if (e.clientX < box.left + window.scrollX + (box.width / 2)) { + swapElement = columns[dragIndex]; + columns.splice(dragIndex, 1); + columns.splice(swapIndex, 0, swapElement); + forcePopulation = true; + swapDone = true; + } + } + } + if ((!swapDone) && dragIndex < headerGroups.length - 1) { + // Get right headers boundingbox + swapIndex = dragIndex + 1; + while (hiddenIndices.includes(swapIndex)) + swapIndex++; + if (swapIndex < headerGroups.length) { + box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]); + if (e.clientX > box.left + window.scrollX + (box.width / 2)) { + swapElement = columns[dragIndex]; + columns.splice(dragIndex, 1); + columns.splice(swapIndex, 0, swapElement); + forcePopulation = true; + swapDone = true; + } + } + } + + // Write back change to storage + if (swapDone) { + settings.columnOrder = columns + writeStorage("columnOrder", JSON.stringify(columns)); + } + + } + + const mouseDownHandler = function(e) { + var target = e.target; + if (target.tagName.toLowerCase() != "td") + target = target.parentElement; + + // Used to check if a dragging has ever happened + wasDragged = false; + + // Create new element which will be displayed as the dragged column + draggingElement = document.createElement("div") + draggingElement.classList.add("dragging"); + draggingElement.style.display = "none"; + draggingElement.style.position = "absolute"; + draggingElement.style.overflow = "hidden"; + + // Get bomhead and bombody elements + const bh = document.getElementById("bomhead"); + const bb = document.getElementById("bombody"); + + // Get all compound headers for the current column + var compoundHeaders; + if (target.classList.contains("bom-checkbox")) { + compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox")); + } else { + compoundHeaders = [target]; + } + + // Create new table which will display the column + var newTable = document.createElement("table"); + newTable.classList.add("bom"); + newTable.style.background = "white"; + draggingElement.append(newTable); + + // Create new header element + var newHeader = document.createElement("thead"); + newTable.append(newHeader); + + // Set up array for storing all placeholder elements + placeHolderElements = []; + + // Add all compound headers to the new thead element and placeholders + compoundHeaders.forEach(function(h) { + clone = cloneElementWithDimensions(h); + newHeader.append(clone); + placeHolderElements.push(clone); + }); + + // Create new body element + var newBody = document.createElement("tbody"); + newTable.append(newBody); + + // Get indices for compound headers + var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e)); + + // For each row in the BOM body... + var rows = bb.querySelectorAll("tr"); + rows.forEach(function(row) { + // ..get the cells for the compound column + const tds = row.querySelectorAll("td"); + var copytds = idxs.map(i => tds[i]); + // Add them to the new element and the placeholders + var newRow = document.createElement("tr"); + copytds.forEach(function(td) { + clone = cloneElementWithDimensions(td); + newRow.append(clone); + placeHolderElements.push(clone); + }); + newBody.append(newRow); + }); + + // Compute width for compound header + var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0); + draggingElement.style.width = `${width}px`; + + // Insert the new dragging element and disable selection on BOM + bom.insertBefore(draggingElement, null); + bom.style.userSelect = "none"; + + // Determine the mouse position offset + xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft); + yOffset = e.screenY - compoundHeaders[0].offsetTop; + + // Get name for the column in settings.columnOrder + dragName = getColumnOrderName(target); + + // Change text and class for placeholder elements + placeHolderElements = placeHolderElements.map(function(e) { + newElem = cloneElementWithDimensions(e); + newElem.textContent = ""; + newElem.classList.add("placeholder"); + return newElem; + }); + + // On next mouse move, the whole BOM needs to be redrawn to show the placeholders + forcePopulation = true; + + // Add listeners for move and up on mouse + document.addEventListener('mousemove', mouseMoveHandler); + document.addEventListener('mouseup', mouseUpHandler); + } + + // In netlist mode, there is nothing to reorder + if (settings.bommode === "netlist") + return; + + // Add mouseDownHandler to every column except the numCol + bom.querySelectorAll("th") + .forEach(function(head) { + if (!head.classList.contains("numCol")) { + head.onmousedown = mouseDownHandler; + } + }); + +} + +function getBoundingClientRectFromMultiple(elements) { + var elems = Array.from(elements); + + if (elems.length == 0) + return null; + + var box = elems.shift() + .getBoundingClientRect(); + + elems.forEach(function(elem) { + var elembox = elem.getBoundingClientRect(); + box.left = Math.min(elembox.left, box.left); + box.top = Math.min(elembox.top, box.top); + box.width += elembox.width; + box.height = Math.max(elembox.height, box.height); + }); + + return box; +} + +function cloneElementWithDimensions(elem) { + var newElem = elem.cloneNode(true); + newElem.style.height = window.getComputedStyle(elem).height; + newElem.style.width = window.getComputedStyle(elem).width; + return newElem; +} + +function getBomTableHeaderIndex(elem) { + const bh = document.getElementById('bomhead'); + const ths = Array.from(bh.querySelectorAll("th")); + return ths.indexOf(elem); +} + +function getColumnOrderName(elem) { + var cname = elem.getAttribute("col_name"); + if (cname === "bom-checkbox") + return "checkboxes"; + else + return cname; +} + +function resizableGrid(tablehead) { + var cols = tablehead.firstElementChild.children; + var rowWidth = tablehead.offsetWidth; + + for (var i = 1; i < cols.length; i++) { + if (cols[i].classList.contains("bom-checkbox")) + continue; + cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%'; + } + + for (var i = 1; i < cols.length - 1; i++) { + var div = document.createElement('div'); + div.className = "column-width-handle"; + cols[i].appendChild(div); + setListeners(div); + } + + function setListeners(div) { + var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth; + + div.addEventListener('mousedown', function(e) { + e.preventDefault(); + e.stopPropagation(); + + curCol = e.target.parentElement; + nxtCol = curCol.nextElementSibling; + startX = e.pageX; + + var padding = paddingDiff(curCol); + + rowWidth = curCol.parentElement.offsetWidth; + curColWidth = curCol.clientWidth - padding; + nxtColWidth = nxtCol.clientWidth - padding; + }); + + document.addEventListener('mousemove', function(e) { + if (startX) { + var diffX = e.pageX - startX; + diffX = -Math.min(-diffX, curColWidth - 20); + diffX = Math.min(diffX, nxtColWidth - 20); + + curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%'; + nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%'; + console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`); + } + }); + + document.addEventListener('mouseup', function(e) { + curCol = undefined; + nxtCol = undefined; + startX = undefined; + nxtColWidth = undefined; + curColWidth = undefined + }); + } + + function paddingDiff(col) { + + if (getStyleVal(col, 'box-sizing') == 'border-box') { + return 0; + } + + var padLeft = getStyleVal(col, 'padding-left'); + var padRight = getStyleVal(col, 'padding-right'); + return (parseInt(padLeft) + parseInt(padRight)); + + } + + function getStyleVal(elm, css) { + return (window.getComputedStyle(elm, null).getPropertyValue(css)) + } +} + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// +/* DOM manipulation and misc code */ + +var bomsplit; +var canvassplit; +var initDone = false; +var bomSortFunction = null; +var currentSortColumn = null; +var currentSortOrder = null; +var currentHighlightedRowId; +var highlightHandlers = []; +var footprintIndexToHandler = {}; +var netsToHandler = {}; +var markedFootprints = new Set(); +var highlightedFootprints = []; +var highlightedNet = null; +var lastClicked; + +function dbg(html) { + dbgdiv.innerHTML = html; +} + +function redrawIfInitDone() { + if (initDone) { + redrawCanvas(allcanvas.front); + redrawCanvas(allcanvas.back); + } +} + +function padsVisible(value) { + writeStorage("padsVisible", value); + settings.renderPads = value; + redrawIfInitDone(); +} + +function referencesVisible(value) { + writeStorage("referencesVisible", value); + settings.renderReferences = value; + redrawIfInitDone(); +} + +function valuesVisible(value) { + writeStorage("valuesVisible", value); + settings.renderValues = value; + redrawIfInitDone(); +} + +function tracksVisible(value) { + writeStorage("tracksVisible", value); + settings.renderTracks = value; + redrawIfInitDone(); +} + +function zonesVisible(value) { + writeStorage("zonesVisible", value); + settings.renderZones = value; + redrawIfInitDone(); +} + +function dnpOutline(value) { + writeStorage("dnpOutline", value); + settings.renderDnpOutline = value; + redrawIfInitDone(); +} + +function setDarkMode(value) { + if (value) { + topmostdiv.classList.add("dark"); + } else { + topmostdiv.classList.remove("dark"); + } + writeStorage("darkmode", value); + settings.darkMode = value; + redrawIfInitDone(); +} + +function setShowBOMColumn(field, value) { + if (field === "references") { + var rl = document.getElementById("reflookup"); + rl.disabled = !value; + if (!value) { + rl.value = ""; + updateRefLookup(""); + } + } + + var n = settings.hiddenColumns.indexOf(field); + if (value) { + if (n != -1) { + settings.hiddenColumns.splice(n, 1); + } + } else { + if (n == -1) { + settings.hiddenColumns.push(field); + } + } + + writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns)); + + if (initDone) { + populateBomTable(); + } + + redrawIfInitDone(); +} + + +function setFullscreen(value) { + if (value) { + document.documentElement.requestFullscreen(); + } else { + document.exitFullscreen(); + } +} + +function fabricationVisible(value) { + writeStorage("fabricationVisible", value); + settings.renderFabrication = value; + redrawIfInitDone(); +} + +function silkscreenVisible(value) { + writeStorage("silkscreenVisible", value); + settings.renderSilkscreen = value; + redrawIfInitDone(); +} + +function setHighlightPin1(value) { + writeStorage("highlightpin1", value); + settings.highlightpin1 = value; + redrawIfInitDone(); +} + +function getStoredCheckboxRefs(checkbox) { + function convert(ref) { + var intref = parseInt(ref); + if (isNaN(intref)) { + for (var i = 0; i < pcbdata.footprints.length; i++) { + if (pcbdata.footprints[i].ref == ref) { + return i; + } + } + return -1; + } else { + return intref; + } + } + if (!(checkbox in settings.checkboxStoredRefs)) { + var val = readStorage("checkbox_" + checkbox); + settings.checkboxStoredRefs[checkbox] = val ? val : ""; + } + if (!settings.checkboxStoredRefs[checkbox]) { + return new Set(); + } else { + return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0)); + } +} + +function getCheckboxState(checkbox, references) { + var storedRefsSet = getStoredCheckboxRefs(checkbox); + var currentRefsSet = new Set(references.map(r => r[1])); + // Get difference of current - stored + var difference = new Set(currentRefsSet); + for (ref of storedRefsSet) { + difference.delete(ref); + } + if (difference.size == 0) { + // All the current refs are stored + return "checked"; + } else if (difference.size == currentRefsSet.size) { + // None of the current refs are stored + return "unchecked"; + } else { + // Some of the refs are stored + return "indeterminate"; + } +} + +function setBomCheckboxState(checkbox, element, references) { + var state = getCheckboxState(checkbox, references); + element.checked = (state == "checked"); + element.indeterminate = (state == "indeterminate"); +} + +function createCheckboxChangeHandler(checkbox, references, row) { + return function () { + refsSet = getStoredCheckboxRefs(checkbox); + var markWhenChecked = settings.markWhenChecked == checkbox; + eventArgs = { + checkbox: checkbox, + refs: references, + } + if (this.checked) { + // checkbox ticked + for (var ref of references) { + refsSet.add(ref[1]); + } + if (markWhenChecked) { + row.classList.add("checked"); + for (var ref of references) { + markedFootprints.add(ref[1]); + } + drawHighlights(); + } + eventArgs.state = 'checked'; + } else { + // checkbox unticked + for (var ref of references) { + refsSet.delete(ref[1]); + } + if (markWhenChecked) { + row.classList.remove("checked"); + for (var ref of references) { + markedFootprints.delete(ref[1]); + } + drawHighlights(); + } + eventArgs.state = 'unchecked'; + } + settings.checkboxStoredRefs[checkbox] = [...refsSet].join(","); + writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]); + updateCheckboxStats(checkbox); + EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs); + } +} + +function clearHighlightedFootprints() { + if (currentHighlightedRowId) { + document.getElementById(currentHighlightedRowId).classList.remove("highlighted"); + currentHighlightedRowId = null; + highlightedFootprints = []; + highlightedNet = null; + } +} + +function createRowHighlightHandler(rowid, refs, net) { + return function () { + if (currentHighlightedRowId) { + if (currentHighlightedRowId == rowid) { + return; + } + document.getElementById(currentHighlightedRowId).classList.remove("highlighted"); + } + document.getElementById(rowid).classList.add("highlighted"); + currentHighlightedRowId = rowid; + highlightedFootprints = refs ? refs.map(r => r[1]) : []; + highlightedNet = net; + drawHighlights(); + EventHandler.emitEvent( + IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, { + rowid: rowid, + refs: refs, + net: net + }); + } +} + +function entryMatches(entry) { + if (settings.bommode == "netlist") { + // entry is just a net name + return entry.toLowerCase().indexOf(filter) >= 0; + } + // check refs + if (!settings.hiddenColumns.includes("references")) { + for (var ref of entry) { + if (ref[0].toLowerCase().indexOf(filter) >= 0) { + return true; + } + } + } + // check fields + for (var i in config.fields) { + var f = config.fields[i]; + if (!settings.hiddenColumns.includes(f)) { + for (var ref of entry) { + if (pcbdata.bom.fields[ref[1]][i].toLowerCase().indexOf(filter) >= 0) { + return true; + } + } + } + } + return false; +} + +function findRefInEntry(entry) { + return entry.filter(r => r[0].toLowerCase() == reflookup); +} + +function highlightFilter(s) { + if (!filter) { + return s; + } + var parts = s.toLowerCase().split(filter); + if (parts.length == 1) { + return s; + } + var r = ""; + var pos = 0; + for (var i in parts) { + if (i > 0) { + r += '<mark class="highlight">' + + s.substring(pos, pos + filter.length) + + '</mark>'; + pos += filter.length; + } + r += s.substring(pos, pos + parts[i].length); + pos += parts[i].length; + } + return r; +} + +function checkboxSetUnsetAllHandler(checkboxname) { + return function () { + var checkboxnum = 0; + while (checkboxnum < settings.checkboxes.length && + settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) { + checkboxnum++; + } + if (checkboxnum >= settings.checkboxes.length) { + return; + } + var allset = true; + var checkbox; + var row; + for (row of bombody.childNodes) { + checkbox = row.childNodes[checkboxnum + 1].childNodes[0]; + if (!checkbox.checked || checkbox.indeterminate) { + allset = false; + break; + } + } + for (row of bombody.childNodes) { + checkbox = row.childNodes[checkboxnum + 1].childNodes[0]; + checkbox.checked = !allset; + checkbox.indeterminate = false; + checkbox.onchange(); + } + } +} + +function createColumnHeader(name, cls, comparator, is_checkbox = false) { + var th = document.createElement("TH"); + th.innerHTML = name; + th.classList.add(cls); + if (is_checkbox) + th.setAttribute("col_name", "bom-checkbox"); + else + th.setAttribute("col_name", name); + var span = document.createElement("SPAN"); + span.classList.add("sortmark"); + span.classList.add("none"); + th.appendChild(span); + var spacer = document.createElement("div"); + spacer.className = "column-spacer"; + th.appendChild(spacer); + spacer.onclick = function () { + if (currentSortColumn && th !== currentSortColumn) { + // Currently sorted by another column + currentSortColumn.childNodes[1].classList.remove(currentSortOrder); + currentSortColumn.childNodes[1].classList.add("none"); + currentSortColumn = null; + currentSortOrder = null; + } + if (currentSortColumn && th === currentSortColumn) { + // Already sorted by this column + if (currentSortOrder == "asc") { + // Sort by this column, descending order + bomSortFunction = function (a, b) { + return -comparator(a, b); + } + currentSortColumn.childNodes[1].classList.remove("asc"); + currentSortColumn.childNodes[1].classList.add("desc"); + currentSortOrder = "desc"; + } else { + // Unsort + bomSortFunction = null; + currentSortColumn.childNodes[1].classList.remove("desc"); + currentSortColumn.childNodes[1].classList.add("none"); + currentSortColumn = null; + currentSortOrder = null; + } + } else { + // Sort by this column, ascending order + bomSortFunction = comparator; + currentSortColumn = th; + currentSortColumn.childNodes[1].classList.remove("none"); + currentSortColumn.childNodes[1].classList.add("asc"); + currentSortOrder = "asc"; + } + populateBomBody(); + } + if (is_checkbox) { + spacer.onclick = fancyDblClickHandler( + spacer, spacer.onclick, checkboxSetUnsetAllHandler(name)); + } + return th; +} + +function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) { + while (bomhead.firstChild) { + bomhead.removeChild(bomhead.firstChild); + } + var tr = document.createElement("TR"); + var th = document.createElement("TH"); + th.classList.add("numCol"); + + var vismenu = document.createElement("div"); + vismenu.id = "vismenu"; + vismenu.classList.add("menu"); + + var visbutton = document.createElement("div"); + visbutton.classList.add("visbtn"); + visbutton.classList.add("hideonprint"); + + var viscontent = document.createElement("div"); + viscontent.classList.add("menu-content"); + viscontent.id = "vismenu-content"; + + settings.columnOrder.forEach(column => { + if (typeof column !== "string") + return; + + // Skip empty columns + if (column === "checkboxes" && settings.checkboxes.length == 0) + return; + else if (column === "Quantity" && settings.bommode == "ungrouped") + return; + + var label = document.createElement("label"); + label.classList.add("menu-label"); + + var input = document.createElement("input"); + input.classList.add("visibility_checkbox"); + input.type = "checkbox"; + input.onchange = function (e) { + setShowBOMColumn(column, e.target.checked) + }; + input.checked = !(settings.hiddenColumns.includes(column)); + + label.appendChild(input); + if (column.length > 0) + label.append(column[0].toUpperCase() + column.slice(1)); + + viscontent.appendChild(label); + }); + + viscontent.childNodes[0].classList.add("menu-label-top"); + + vismenu.appendChild(visbutton); + if (settings.bommode != "netlist") { + vismenu.appendChild(viscontent); + th.appendChild(vismenu); + } + tr.appendChild(th); + + var checkboxCompareClosure = function (checkbox) { + return (a, b) => { + var stateA = getCheckboxState(checkbox, a); + var stateB = getCheckboxState(checkbox, b); + if (stateA > stateB) return -1; + if (stateA < stateB) return 1; + return 0; + } + } + var stringFieldCompareClosure = function (fieldIndex) { + return (a, b) => { + var fa = pcbdata.bom.fields[a[0][1]][fieldIndex]; + var fb = pcbdata.bom.fields[b[0][1]][fieldIndex]; + if (fa != fb) return fa > fb ? 1 : -1; + else return 0; + } + } + var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/; + var compareRefs = (a, b) => { + var ra = referenceRegex.exec(a); + var rb = referenceRegex.exec(b); + if (ra === null || rb === null) { + if (a != b) return a > b ? 1 : -1; + return 0; + } else { + if (ra.groups.prefix != rb.groups.prefix) { + return ra.groups.prefix > rb.groups.prefix ? 1 : -1; + } + if (ra.groups.number != rb.groups.number) { + return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1; + } + return 0; + } + } + if (settings.bommode == "netlist") { + th = createColumnHeader("Net name", "bom-netname", (a, b) => { + if (a > b) return -1; + if (a < b) return 1; + return 0; + }); + tr.appendChild(th); + } else { + // Filter hidden columns + var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e)); + var valueIndex = config.fields.indexOf("Value"); + var footprintIndex = config.fields.indexOf("Footprint"); + columns.forEach((column) => { + if (column === placeHolderColumn) { + var n = 1; + if (column === "checkboxes") + n = settings.checkboxes.length; + for (i = 0; i < n; i++) { + td = placeHolderElements.shift(); + tr.appendChild(td); + } + return; + } else if (column === "checkboxes") { + for (var checkbox of settings.checkboxes) { + th = createColumnHeader( + checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true); + tr.appendChild(th); + } + } else if (column === "References") { + tr.appendChild(createColumnHeader("References", "references", (a, b) => { + var i = 0; + while (i < a.length && i < b.length) { + if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]); + i++; + } + return a.length - b.length; + })); + } else if (column === "Value") { + tr.appendChild(createColumnHeader("Value", "value", (a, b) => { + var ra = a[0][1], rb = b[0][1]; + return valueCompare( + pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb], + pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]); + })); + return; + } else if (column === "Footprint") { + tr.appendChild(createColumnHeader( + "Footprint", "footprint", stringFieldCompareClosure(footprintIndex))); + } else if (column === "Quantity" && settings.bommode == "grouped") { + tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => { + return a.length - b.length; + })); + } else { + // Other fields + var i = config.fields.indexOf(column); + if (i < 0) + return; + tr.appendChild(createColumnHeader( + column, `field${i + 1}`, stringFieldCompareClosure(i))); + } + }); + } + bomhead.appendChild(tr); +} + +function populateBomBody(placeholderColumn = null, placeHolderElements = null) { + while (bom.firstChild) { + bom.removeChild(bom.firstChild); + } + highlightHandlers = []; + footprintIndexToHandler = {}; + netsToHandler = {}; + currentHighlightedRowId = null; + var first = true; + if (settings.bommode == "netlist") { + bomtable = pcbdata.nets.slice(); + } else { + switch (settings.canvaslayout) { + case 'F': + bomtable = pcbdata.bom.F.slice(); + break; + case 'FB': + bomtable = pcbdata.bom.both.slice(); + break; + case 'B': + bomtable = pcbdata.bom.B.slice(); + break; + } + if (settings.bommode == "ungrouped") { + // expand bom table + expandedTable = [] + for (var bomentry of bomtable) { + for (var ref of bomentry) { + expandedTable.push([ref]); + } + } + bomtable = expandedTable; + } + } + if (bomSortFunction) { + bomtable = bomtable.sort(bomSortFunction); + } + for (var i in bomtable) { + var bomentry = bomtable[i]; + if (filter && !entryMatches(bomentry)) { + continue; + } + var references = null; + var netname = null; + var tr = document.createElement("TR"); + var td = document.createElement("TD"); + var rownum = +i + 1; + tr.id = "bomrow" + rownum; + td.textContent = rownum; + tr.appendChild(td); + if (settings.bommode == "netlist") { + netname = bomentry; + td = document.createElement("TD"); + td.innerHTML = highlightFilter(netname ? netname : "<no net>"); + tr.appendChild(td); + } else { + if (reflookup) { + references = findRefInEntry(bomentry); + if (references.length == 0) { + continue; + } + } else { + references = bomentry; + } + // Filter hidden columns + var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e)); + columns.forEach((column) => { + if (column === placeholderColumn) { + var n = 1; + if (column === "checkboxes") + n = settings.checkboxes.length; + for (i = 0; i < n; i++) { + td = placeHolderElements.shift(); + tr.appendChild(td); + } + return; + } else if (column === "checkboxes") { + for (var checkbox of settings.checkboxes) { + if (checkbox) { + td = document.createElement("TD"); + var input = document.createElement("input"); + input.type = "checkbox"; + input.onchange = createCheckboxChangeHandler(checkbox, references, tr); + setBomCheckboxState(checkbox, input, references); + if (input.checked && settings.markWhenChecked == checkbox) { + tr.classList.add("checked"); + } + td.appendChild(input); + tr.appendChild(td); + } + } + } else if (column === "References") { + td = document.createElement("TD"); + td.innerHTML = highlightFilter(references.map(r => r[0]).join(", ")); + tr.appendChild(td); + } else if (column === "Quantity" && settings.bommode == "grouped") { + // Quantity + td = document.createElement("TD"); + td.textContent = references.length; + tr.appendChild(td); + } else { + // All the other fields + var field_index = config.fields.indexOf(column) + if (field_index < 0) + return; + var valueSet = new Set(); + references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index])); + td = document.createElement("TD"); + td.innerHTML = highlightFilter(Array.from(valueSet).join(", ")); + tr.appendChild(td); + } + }); + } + bom.appendChild(tr); + var handler = createRowHighlightHandler(tr.id, references, netname); + tr.onmousemove = handler; + highlightHandlers.push({ + id: tr.id, + handler: handler, + }); + if (references !== null) { + for (var refIndex of references.map(r => r[1])) { + footprintIndexToHandler[refIndex] = handler; + } + } + if (netname !== null) { + netsToHandler[netname] = handler; + } + if ((filter || reflookup) && first) { + handler(); + first = false; + } + } + EventHandler.emitEvent( + IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, { + filter: filter, + reflookup: reflookup, + checkboxes: settings.checkboxes, + bommode: settings.bommode, + }); +} + +function highlightPreviousRow() { + if (!currentHighlightedRowId) { + highlightHandlers[highlightHandlers.length - 1].handler(); + } else { + if (highlightHandlers.length > 1 && + highlightHandlers[0].id == currentHighlightedRowId) { + highlightHandlers[highlightHandlers.length - 1].handler(); + } else { + for (var i = 0; i < highlightHandlers.length - 1; i++) { + if (highlightHandlers[i + 1].id == currentHighlightedRowId) { + highlightHandlers[i].handler(); + break; + } + } + } + } + smoothScrollToRow(currentHighlightedRowId); +} + +function highlightNextRow() { + if (!currentHighlightedRowId) { + highlightHandlers[0].handler(); + } else { + if (highlightHandlers.length > 1 && + highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) { + highlightHandlers[0].handler(); + } else { + for (var i = 1; i < highlightHandlers.length; i++) { + if (highlightHandlers[i - 1].id == currentHighlightedRowId) { + highlightHandlers[i].handler(); + break; + } + } + } + } + smoothScrollToRow(currentHighlightedRowId); +} + +function populateBomTable() { + populateBomHeader(); + populateBomBody(); + setBomHandlers(); + resizableGrid(bomhead); +} + +function footprintsClicked(footprintIndexes) { + var lastClickedIndex = footprintIndexes.indexOf(lastClicked); + for (var i = 1; i <= footprintIndexes.length; i++) { + var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length]; + if (refIndex in footprintIndexToHandler) { + lastClicked = refIndex; + footprintIndexToHandler[refIndex](); + smoothScrollToRow(currentHighlightedRowId); + break; + } + } +} + +function netClicked(net) { + if (net in netsToHandler) { + netsToHandler[net](); + smoothScrollToRow(currentHighlightedRowId); + } else { + clearHighlightedFootprints(); + highlightedNet = net; + drawHighlights(); + } +} + +function updateFilter(input) { + filter = input.toLowerCase(); + populateBomTable(); +} + +function updateRefLookup(input) { + reflookup = input.toLowerCase(); + populateBomTable(); +} + +function changeCanvasLayout(layout) { + document.getElementById("fl-btn").classList.remove("depressed"); + document.getElementById("fb-btn").classList.remove("depressed"); + document.getElementById("bl-btn").classList.remove("depressed"); + switch (layout) { + case 'F': + document.getElementById("fl-btn").classList.add("depressed"); + if (settings.bomlayout != "bom-only") { + canvassplit.collapse(1); + } + break; + case 'B': + document.getElementById("bl-btn").classList.add("depressed"); + if (settings.bomlayout != "bom-only") { + canvassplit.collapse(0); + } + break; + default: + document.getElementById("fb-btn").classList.add("depressed"); + if (settings.bomlayout != "bom-only") { + canvassplit.setSizes([50, 50]); + } + } + settings.canvaslayout = layout; + writeStorage("canvaslayout", layout); + resizeAll(); + changeBomMode(settings.bommode); +} + +function populateMetadata() { + document.getElementById("title").innerHTML = pcbdata.metadata.title; + document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision; + document.getElementById("company").innerHTML = pcbdata.metadata.company; + document.getElementById("filedate").innerHTML = pcbdata.metadata.date; + if (pcbdata.metadata.title != "") { + document.title = pcbdata.metadata.title + " BOM"; + } + // Calculate board stats + var fp_f = 0, + fp_b = 0, + pads_f = 0, + pads_b = 0, + pads_th = 0; + for (var i = 0; i < pcbdata.footprints.length; i++) { + if (pcbdata.bom.skipped.includes(i)) continue; + var mod = pcbdata.footprints[i]; + if (mod.layer == "F") { + fp_f++; + } else { + fp_b++; + } + for (var pad of mod.pads) { + if (pad.type == "th") { + pads_th++; + } else { + if (pad.layers.includes("F")) { + pads_f++; + } + if (pad.layers.includes("B")) { + pads_b++; + } + } + } + } + document.getElementById("stats-components-front").innerHTML = fp_f; + document.getElementById("stats-components-back").innerHTML = fp_b; + document.getElementById("stats-components-total").innerHTML = fp_f + fp_b; + document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length; + document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length; + document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length; + document.getElementById("stats-smd-pads-front").innerHTML = pads_f; + document.getElementById("stats-smd-pads-back").innerHTML = pads_b; + document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b; + document.getElementById("stats-th-pads").innerHTML = pads_th; + // Update version string + document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " + + /^v\d+\.\d+/.exec(pcbdata.ibom_version)[0]; +} + +function changeBomLayout(layout) { + document.getElementById("bom-btn").classList.remove("depressed"); + document.getElementById("lr-btn").classList.remove("depressed"); + document.getElementById("tb-btn").classList.remove("depressed"); + switch (layout) { + case 'bom-only': + document.getElementById("bom-btn").classList.add("depressed"); + if (bomsplit) { + bomsplit.destroy(); + bomsplit = null; + canvassplit.destroy(); + canvassplit = null; + } + document.getElementById("frontcanvas").style.display = "none"; + document.getElementById("backcanvas").style.display = "none"; + document.getElementById("bot").style.height = ""; + break; + case 'top-bottom': + document.getElementById("tb-btn").classList.add("depressed"); + document.getElementById("frontcanvas").style.display = ""; + document.getElementById("backcanvas").style.display = ""; + document.getElementById("bot").style.height = "calc(100% - 80px)"; + document.getElementById("bomdiv").classList.remove("split-horizontal"); + document.getElementById("canvasdiv").classList.remove("split-horizontal"); + document.getElementById("frontcanvas").classList.add("split-horizontal"); + document.getElementById("backcanvas").classList.add("split-horizontal"); + if (bomsplit) { + bomsplit.destroy(); + bomsplit = null; + canvassplit.destroy(); + canvassplit = null; + } + bomsplit = Split(['#bomdiv', '#canvasdiv'], { + sizes: [50, 50], + onDragEnd: resizeAll, + direction: "vertical", + gutterSize: 5 + }); + canvassplit = Split(['#frontcanvas', '#backcanvas'], { + sizes: [50, 50], + gutterSize: 5, + onDragEnd: resizeAll + }); + break; + case 'left-right': + document.getElementById("lr-btn").classList.add("depressed"); + document.getElementById("frontcanvas").style.display = ""; + document.getElementById("backcanvas").style.display = ""; + document.getElementById("bot").style.height = "calc(100% - 80px)"; + document.getElementById("bomdiv").classList.add("split-horizontal"); + document.getElementById("canvasdiv").classList.add("split-horizontal"); + document.getElementById("frontcanvas").classList.remove("split-horizontal"); + document.getElementById("backcanvas").classList.remove("split-horizontal"); + if (bomsplit) { + bomsplit.destroy(); + bomsplit = null; + canvassplit.destroy(); + canvassplit = null; + } + bomsplit = Split(['#bomdiv', '#canvasdiv'], { + sizes: [50, 50], + onDragEnd: resizeAll, + gutterSize: 5 + }); + canvassplit = Split(['#frontcanvas', '#backcanvas'], { + sizes: [50, 50], + gutterSize: 5, + direction: "vertical", + onDragEnd: resizeAll + }); + } + settings.bomlayout = layout; + writeStorage("bomlayout", layout); + changeCanvasLayout(settings.canvaslayout); +} + +function changeBomMode(mode) { + document.getElementById("bom-grouped-btn").classList.remove("depressed"); + document.getElementById("bom-ungrouped-btn").classList.remove("depressed"); + document.getElementById("bom-netlist-btn").classList.remove("depressed"); + var chkbxs = document.getElementsByClassName("visibility_checkbox"); + + switch (mode) { + case 'grouped': + document.getElementById("bom-grouped-btn").classList.add("depressed"); + for (var i = 0; i < chkbxs.length; i++) { + chkbxs[i].disabled = false; + } + break; + case 'ungrouped': + document.getElementById("bom-ungrouped-btn").classList.add("depressed"); + for (var i = 0; i < chkbxs.length; i++) { + chkbxs[i].disabled = false; + } + break; + case 'netlist': + document.getElementById("bom-netlist-btn").classList.add("depressed"); + for (var i = 0; i < chkbxs.length; i++) { + chkbxs[i].disabled = true; + } + } + + writeStorage("bommode", mode); + if (mode != settings.bommode) { + settings.bommode = mode; + bomSortFunction = null; + currentSortColumn = null; + currentSortOrder = null; + clearHighlightedFootprints(); + } + populateBomTable(); +} + +function focusFilterField() { + focusInputField(document.getElementById("filter")); +} + +function focusRefLookupField() { + focusInputField(document.getElementById("reflookup")); +} + +function toggleBomCheckbox(bomrowid, checkboxnum) { + if (!bomrowid || checkboxnum > settings.checkboxes.length) { + return; + } + var bomrow = document.getElementById(bomrowid); + var checkbox = bomrow.childNodes[checkboxnum].childNodes[0]; + checkbox.checked = !checkbox.checked; + checkbox.indeterminate = false; + checkbox.onchange(); +} + +function checkBomCheckbox(bomrowid, checkboxname) { + var checkboxnum = 0; + while (checkboxnum < settings.checkboxes.length && + settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) { + checkboxnum++; + } + if (!bomrowid || checkboxnum >= settings.checkboxes.length) { + return; + } + var bomrow = document.getElementById(bomrowid); + var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0]; + checkbox.checked = true; + checkbox.indeterminate = false; + checkbox.onchange(); +} + +function setBomCheckboxes(value) { + writeStorage("bomCheckboxes", value); + settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e); + prepCheckboxes(); + populateMarkWhenCheckedOptions(); + setMarkWhenChecked(settings.markWhenChecked); +} + +function setMarkWhenChecked(value) { + writeStorage("markWhenChecked", value); + settings.markWhenChecked = value; + markedFootprints.clear(); + for (var ref of (value ? getStoredCheckboxRefs(value) : [])) { + markedFootprints.add(ref); + } + populateBomTable(); + drawHighlights(); +} + +function prepCheckboxes() { + var table = document.getElementById("checkbox-stats"); + while (table.childElementCount > 1) { + table.removeChild(table.lastChild); + } + if (settings.checkboxes.length) { + table.style.display = ""; + } else { + table.style.display = "none"; + } + for (var checkbox of settings.checkboxes) { + var tr = document.createElement("TR"); + var td = document.createElement("TD"); + td.innerHTML = checkbox; + tr.appendChild(td); + td = document.createElement("TD"); + td.id = "checkbox-stats-" + checkbox; + var progressbar = document.createElement("div"); + progressbar.classList.add("bar"); + td.appendChild(progressbar); + var text = document.createElement("div"); + text.classList.add("text"); + td.appendChild(text); + tr.appendChild(td); + table.appendChild(tr); + updateCheckboxStats(checkbox); + } +} + +function populateMarkWhenCheckedOptions() { + var container = document.getElementById("markWhenCheckedContainer"); + + if (settings.checkboxes.length == 0) { + container.parentElement.style.display = "none"; + return; + } + + container.innerHTML = ''; + container.parentElement.style.display = "inline-block"; + + function createOption(name, displayName) { + var id = "markWhenChecked-" + name; + + var div = document.createElement("div"); + div.classList.add("radio-container"); + + var input = document.createElement("input"); + input.type = "radio"; + input.name = "markWhenChecked"; + input.value = name; + input.id = id; + input.onchange = () => setMarkWhenChecked(name); + div.appendChild(input); + + // Preserve the selected element when the checkboxes change + if (name == settings.markWhenChecked) { + input.checked = true; + } + + var label = document.createElement("label"); + label.innerHTML = displayName; + label.htmlFor = id; + div.appendChild(label); + + container.appendChild(div); + } + createOption("", "None"); + for (var checkbox of settings.checkboxes) { + createOption(checkbox, checkbox); + } +} + +function updateCheckboxStats(checkbox) { + var checked = getStoredCheckboxRefs(checkbox).size; + var total = pcbdata.footprints.length - pcbdata.bom.skipped.length; + var percent = checked * 100.0 / total; + var td = document.getElementById("checkbox-stats-" + checkbox); + td.firstChild.style.width = percent + "%"; + td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)"; +} + +document.onkeydown = function (e) { + switch (e.key) { + case "n": + if (document.activeElement.type == "text") { + return; + } + if (currentHighlightedRowId !== null) { + checkBomCheckbox(currentHighlightedRowId, "placed"); + highlightNextRow(); + e.preventDefault(); + } + break; + case "ArrowUp": + highlightPreviousRow(); + e.preventDefault(); + break; + case "ArrowDown": + highlightNextRow(); + e.preventDefault(); + break; + default: + break; + } + if (e.altKey) { + switch (e.key) { + case "f": + focusFilterField(); + e.preventDefault(); + break; + case "r": + focusRefLookupField(); + e.preventDefault(); + break; + case "z": + changeBomLayout("bom-only"); + e.preventDefault(); + break; + case "x": + changeBomLayout("left-right"); + e.preventDefault(); + break; + case "c": + changeBomLayout("top-bottom"); + e.preventDefault(); + break; + case "v": + changeCanvasLayout("F"); + e.preventDefault(); + break; + case "b": + changeCanvasLayout("FB"); + e.preventDefault(); + break; + case "n": + changeCanvasLayout("B"); + e.preventDefault(); + break; + default: + break; + } + if (e.key >= '1' && e.key <= '9') { + toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key)); + e.preventDefault(); + } + } +} + +function hideNetlistButton() { + document.getElementById("bom-ungrouped-btn").classList.remove("middle-button"); + document.getElementById("bom-ungrouped-btn").classList.add("right-most-button"); + document.getElementById("bom-netlist-btn").style.display = "none"; +} + +window.onload = function (e) { + initUtils(); + initRender(); + initStorage(); + initDefaults(); + cleanGutters(); + populateMetadata(); + dbgdiv = document.getElementById("dbg"); + bom = document.getElementById("bombody"); + bomhead = document.getElementById("bomhead"); + filter = ""; + reflookup = ""; + if (!("nets" in pcbdata)) { + hideNetlistButton(); + } + initDone = true; + setBomCheckboxes(document.getElementById("bomCheckboxes").value); + // Triggers render + changeBomLayout(settings.bomlayout); + + // Users may leave fullscreen without touching the checkbox. Uncheck. + document.addEventListener('fullscreenchange', () => { + if (!document.fullscreenElement) + document.getElementById('fullscreenCheckbox').checked = false; + }); +} + +window.onresize = resizeAll; +window.matchMedia("print").addListener(resizeAll); + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// + +/////////////////////////////////////////////// + </script> +</head> + +<body> + +<div id="topmostdiv" class="topmostdiv"> + <div id="top"> + <div style="float: right; height: 100%;"> + <div class="hideonprint menu" style="float: right; top: 8px;"> + <button class="menubtn"></button> + <div class="menu-content"> + <label class="menu-label menu-label-top" style="width: calc(50% - 18px)"> + <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)"> + Dark mode + </label><!-- This comment eats space! All of it! + --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;"> + <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)"> + Full Screen + </label> + <label class="menu-label" style="width: calc(50% - 18px)"> + <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)"> + Fab layer + </label><!-- This comment eats space! All of it! + --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;"> + <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)"> + Silkscreen + </label> + <label class="menu-label" style="width: calc(50% - 18px)"> + <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)"> + References + </label><!-- This comment eats space! All of it! + --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;"> + <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)"> + Values + </label> + <div id="tracksAndZonesCheckboxes"> + <label class="menu-label" style="width: calc(50% - 18px)"> + <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)"> + Tracks + </label><!-- This comment eats space! All of it! + --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;"> + <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)"> + Zones + </label> + </div> + <label class="menu-label" style="width: calc(50% - 18px)"> + <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)"> + Pads + </label><!-- This comment eats space! All of it! + --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;"> + <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)"> + DNP outlined + </label> + <label class="menu-label"> + <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)"> + Highlight first pin + </label> + <label class="menu-label"> + <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)"> + Continuous redraw on drag + </label> + <label class="menu-label"> + <span>Board rotation</span> + <span style="float: right"><span id="rotationDegree">0</span>°</span> + <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)"> + </label> + <label class="menu-label"> + <div style="margin-left: 5px">Bom checkboxes</div> + <input id="bomCheckboxes" class="menu-textbox" type=text + oninput="setBomCheckboxes(this.value)"> + </label> + <label class="menu-label"> + <div style="margin-left: 5px">Mark when checked</div> + <div id="markWhenCheckedContainer"></div> + </label> + <label class="menu-label"> + <span class="shameless-plug"> + <span>Created using</span> + <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a> + </span> + </label> + </div> + </div> + <div class="button-container hideonprint" + style="float: right; position: relative; top: 8px"> + <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')" + title="Front only">F + </button> + <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')" + title="Front and Back">FB + </button> + <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')" + title="Back only">B + </button> + </div> + <div class="button-container hideonprint" + style="float: right; position: relative; top: 8px"> + <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')" + title="BOM only"></button> + <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')" + title="BOM left, drawings right"></button> + <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')" + title="BOM top, drawings bot"></button> + </div> + <div class="button-container hideonprint" + style="float: right; position: relative; top: 8px"> + <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')" + title="Grouped BOM"></button> + <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')" + title="Ungrouped BOM"></button> + <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')" + title="Netlist"></button> + </div> + <div class="hideonprint menu" style="float: right; top: 8px;"> + <button class="statsbtn"></button> + <div class="menu-content"> + <table class="stats"> + <tbody> + <tr> + <td width="40%">Board stats</td> + <td>Front</td> + <td>Back</td> + <td>Total</td> + </tr> + <tr> + <td>Components</td> + <td id="stats-components-front">~</td> + <td id="stats-components-back">~</td> + <td id="stats-components-total">~</td> + </tr> + <tr> + <td>Groups</td> + <td id="stats-groups-front">~</td> + <td id="stats-groups-back">~</td> + <td id="stats-groups-total">~</td> + </tr> + <tr> + <td>SMD pads</td> + <td id="stats-smd-pads-front">~</td> + <td id="stats-smd-pads-back">~</td> + <td id="stats-smd-pads-total">~</td> + </tr> + <tr> + <td>TH pads</td> + <td colspan=3 id="stats-th-pads">~</td> + </tr> + </tbody> + </table> + <table class="stats"> + <col width="40%"/><col /> + <tbody id="checkbox-stats"> + <tr> + <td colspan=2 style="border-top: 0">Checkboxes</td> + </tr> + </tbody> + </table> + </div> + </div> + <div class="hideonprint menu" style="float: right; top: 8px;"> + <button class="iobtn"></button> + <div class="menu-content"> + <div class="menu-label menu-label-top"> + <div style="margin-left: 5px;">Save board image</div> + <div class="flexbox"> + <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width" + style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)"> + <span>X</span> + <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height" + style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)"> + </div> + <label> + <input id="render-save-transparent" type="checkbox"> + Transparent background + </label> + <div class="flexbox"> + <button class="savebtn" onclick="saveImage('F')">Front</button> + <button class="savebtn" onclick="saveImage('B')">Back</button> + </div> + </div> + <div class="menu-label"> + <span style="margin-left: 5px;">Config and checkbox state</span> + <div class="flexbox"> + <button class="savebtn" onclick="saveSettings()">Export</button> + <button class="savebtn" onclick="loadSettings()">Import</button> + </div> + </div> + </div> + </div> + </div> + <div id="fileinfodiv" style="overflow: auto;"> + <table class="fileinfo"> + <tbody> + <tr> + <td id="title" class="title" style="width: 70%"> + Title + </td> + <td id="revision" class="title" style="width: 30%"> + Revision + </td> + </tr> + <tr> + <td id="company"> + Company + </td> + <td id="filedate"> + Date + </td> + </tr> + </tbody> + </table> + </div> + </div> + <div id="bot" class="split" style="height: calc(100% - 80px)"> + <div id="bomdiv" class="split split-horizontal"> + <div style="width: 100%"> + <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup" + oninput="updateRefLookup(this.value)"> + <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter" + oninput="updateFilter(this.value)"> + <div class="button-container hideonprint" style="float: left; margin: 0;"> + <button id="copy" title="Copy bom table to clipboard" + onclick="copyToClipboard()"></button> + </div> + </div> + <div id="dbg"></div> + <table class="bom" id="bomtable"> + <thead id="bomhead"> + </thead> + <tbody id="bombody"> + </tbody> + </table> + </div> + <div id="canvasdiv" class="split split-horizontal"> + <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden"> + <div style="position: relative; width: 100%; height: 100%;"> + <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas> + <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas> + <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas> + <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas> + </div> + </div> + <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden"> + <div style="position: relative; width: 100%; height: 100%;"> + <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas> + <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas> + <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas> + <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas> + </div> + </div> + </div> + </div> +</div> + +</body> + +</html> diff --git a/pcb/interposer_footprint.kicad_mod b/pcb/interposer_footprint.kicad_mod new file mode 100644 index 0000000..e38cac7 --- /dev/null +++ b/pcb/interposer_footprint.kicad_mod @@ -0,0 +1,248 @@ +(footprint "ut_glitcher_interposer" (version 20211014) (generator pcbnew) + (layer "F.Cu") + (tedit 62261FD6) + (attr smd) + (fp_text reference "REF**" (at 46.2 -27.4 unlocked) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 4c9fdea7-ba0c-45cc-8f66-240980c37d5c) + ) + (fp_text value "ut_glitcher_interposer" (at 57.8 -25.1 unlocked) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp c58960d9-4cac-4036-ad2e-1aef26946dae) + ) + (fp_text user "${REFERENCE}" (at 45.8 -25 unlocked) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 5b96c1ad-46ba-4366-8241-fbc1cd0e9bbd) + ) + (fp_line (start 38.323399 -45.189993) (end 38.323399 -45.189993) (layer "Edge.Cuts") (width 0.1) (tstamp 000b46d6-b833-4804-8f56-56d539f76d09)) + (fp_line (start 33.996975 -60.655741) (end 38.978215 -60.655741) (layer "Edge.Cuts") (width 0.1) (tstamp 099473f1-6598-46ff-a50f-4c520832170d)) + (fp_line (start 78.448956 0) (end 78.448956 0) (layer "Edge.Cuts") (width 0.1) (tstamp 0c5dddf1-38df-43d2-b49c-e7b691dab0ab)) + (fp_line (start 78.448956 -17.78149) (end 78.448956 0) (layer "Edge.Cuts") (width 0.1) (tstamp 0ce1dd44-f307-4f98-9f0d-478fd87daa64)) + (fp_line (start 35.259819 -45.189993) (end 35.259819 -45.189993) (layer "Edge.Cuts") (width 0.1) (tstamp 113ffcdf-4c54-4e37-81dc-f91efa934ba7)) + (fp_line (start 42.065178 -43.646507) (end 42.065178 -43.646507) (layer "Edge.Cuts") (width 0.1) (tstamp 15699041-ed40-45ee-87d8-f5e206a88536)) + (fp_line (start 29.646199 -29.966616) (end 29.693934 -30.012423) (layer "Edge.Cuts") (width 0.1) (tstamp 162e5bdd-61a8-46a3-8485-826b5d58e1a1)) + (fp_line (start 0 -16.191239) (end 0 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp 1855ca44-ab48-4b76-a210-97fc81d916c4)) + (fp_line (start 33.996975 -60.655741) (end 33.996975 -60.655741) (layer "Edge.Cuts") (width 0.1) (tstamp 1876c30c-72b2-4a8d-9f32-bf8b213530b4)) + (fp_line (start 38.978215 -60.655741) (end 38.978215 -49.352712) (layer "Edge.Cuts") (width 0.1) (tstamp 199124ca-dd64-45cf-a063-97cc545cbea7)) + (fp_line (start 42.065178 -49.352712) (end 42.065178 -49.352712) (layer "Edge.Cuts") (width 0.1) (tstamp 1bd80cf9-f42a-4aee-a408-9dbf4e81e625)) + (fp_line (start 16.480797 -16.191239) (end 16.480797 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp 1bf7d0f9-0dcf-4d7c-b58c-318e3dc42bc9)) + (fp_line (start 24.555453 -27.6147) (end 24.555453 -27.6147) (layer "Edge.Cuts") (width 0.1) (tstamp 1cacb878-9da4-41fc-aa80-018bc841e19a)) + (fp_line (start 24.710388 -27.769634) (end 29.59199 -32.651247) (layer "Edge.Cuts") (width 0.1) (tstamp 1de61170-5337-44c5-ba28-bd477db4bff1)) + (fp_line (start 29.693934 -30.012423) (end 32.243016 -32.561508) (layer "Edge.Cuts") (width 0.1) (tstamp 2102c637-9f11-48f1-aae6-b4139dc22be2)) + (fp_line (start 26.115862 -25.826309) (end 24.411946 -27.471192) (layer "Edge.Cuts") (width 0.1) (tstamp 247ebffd-2cb6-4379-ba6e-21861fea3913)) + (fp_line (start 0 0) (end 0 0) (layer "Edge.Cuts") (width 0.1) (tstamp 254f7cc6-cee1-44ca-9afe-939b318201aa)) + (fp_line (start 37.820595 -43.646507) (end 37.820595 -43.646507) (layer "Edge.Cuts") (width 0.1) (tstamp 26a22c19-4cc5-4237-9651-0edc4f854154)) + (fp_line (start 32.243016 -32.561508) (end 32.384506 -32.703005) (layer "Edge.Cuts") (width 0.1) (tstamp 272c2a78-b5f5-4b61-aed3-ec69e0e92729)) + (fp_line (start 31.553124 -28.059693) (end 31.553124 -28.059693) (layer "Edge.Cuts") (width 0.1) (tstamp 2b25e886-ded1-450a-ada1-ece4208052e4)) + (fp_line (start 0 -16.191239) (end 15.171174 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp 3457afc5-3e4f-4220-81d1-b079f653a722)) + (fp_line (start 35.259819 -47.318126) (end 38.323399 -47.318126) (layer "Edge.Cuts") (width 0.1) (tstamp 3a1a39fc-8030-4c93-9d9c-d79ba6824099)) + (fp_line (start 37.820595 -40.746632) (end 38.744343 -40.746632) (layer "Edge.Cuts") (width 0.1) (tstamp 3b65c51e-c243-447e-bee9-832d94c1630e)) + (fp_line (start 40.241055 -22.787239) (end 40.241055 -22.787239) (layer "Edge.Cuts") (width 0.1) (tstamp 3bbbbb7d-391c-4fee-ac81-3c47878edc38)) + (fp_line (start 32.243016 -32.561508) (end 32.243016 -32.561508) (layer "Edge.Cuts") (width 0.1) (tstamp 3f2a6679-91d7-4b6c-bf5c-c4d5abb2bc44)) + (fp_line (start 37.820595 -40.746632) (end 37.820595 -40.746632) (layer "Edge.Cuts") (width 0.1) (tstamp 402c62e6-8d8e-473a-a0cf-2b86e4908cd7)) + (fp_line (start 29.646199 -29.966616) (end 29.646199 -29.966616) (layer "Edge.Cuts") (width 0.1) (tstamp 456c5e47-d71e-4708-b061-1e61634d8648)) + (fp_line (start 48.964062 -17.78149) (end 78.448956 -17.78149) (layer "Edge.Cuts") (width 0.1) (tstamp 4970ec6e-3725-4619-b57d-dc2c2cb86ed0)) + (fp_line (start 38.323399 -47.318126) (end 38.323399 -47.318126) (layer "Edge.Cuts") (width 0.1) (tstamp 49b5f540-e128-4e08-bb09-f321f8e64056)) + (fp_line (start 40.241055 -22.787239) (end 48.964062 -22.787239) (layer "Edge.Cuts") (width 0.1) (tstamp 4a53fa56-d65b-42a4-a4be-8f49c4c015bb)) + (fp_line (start 29.689041 -47.453547) (end 29.689041 -47.453547) (layer "Edge.Cuts") (width 0.1) (tstamp 4bbde53d-6894-4e18-9480-84a6a26d5f6b)) + (fp_line (start 24.555453 -27.6147) (end 24.710388 -27.769634) (layer "Edge.Cuts") (width 0.1) (tstamp 4ce9470f-5633-41bf-89ac-74a810939893)) + (fp_line (start 22.688019 -39.55522) (end 22.688019 -39.55522) (layer "Edge.Cuts") (width 0.1) (tstamp 4cfd9a02-97ef-4af4-a6b8-db9be1a8fda5)) + (fp_line (start 24.519421 -27.578663) (end 24.519421 -27.578663) (layer "Edge.Cuts") (width 0.1) (tstamp 51cc007a-3378-4ce3-909c-71e94822f8d1)) + (fp_line (start 30.278254 -36.115635) (end 30.352667 -36.041222) (layer "Edge.Cuts") (width 0.1) (tstamp 54ed3ee1-891b-418e-ab9c-6a18747d7388)) + (fp_line (start 24.519421 -27.578663) (end 24.555453 -27.6147) (layer "Edge.Cuts") (width 0.1) (tstamp 5576cd03-3bad-40c5-9316-1d286895d52a)) + (fp_line (start 38.978215 -49.352712) (end 42.065178 -49.352712) (layer "Edge.Cuts") (width 0.1) (tstamp 57f248a7-365e-4c42-b80d-5a7d1f9dfaf3)) + (fp_line (start 15.966301 -16.191239) (end 15.966301 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp 58390862-1833-41dd-9c4e-98073ea0da33)) + (fp_line (start 40.241055 -29.942255) (end 40.241055 -29.942255) (layer "Edge.Cuts") (width 0.1) (tstamp 5bab6a37-1fdf-4cf8-b571-44c962ed86e9)) + (fp_line (start 15.171174 -16.191239) (end 15.966301 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp 5e755161-24a5-4650-a6e3-9836bf074412)) + (fp_line (start 0 0) (end 0 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp 5f48b0f2-82cf-40ce-afac-440f97643c36)) + (fp_line (start 48.964062 -22.787239) (end 48.964062 -22.787239) (layer "Edge.Cuts") (width 0.1) (tstamp 6150c02b-beb5-4af1-951e-3666a285a6ea)) + (fp_line (start 34.220314 -30.867199) (end 34.220314 -30.867199) (layer "Edge.Cuts") (width 0.1) (tstamp 62f15a9a-9893-486e-9ad0-ea43f88fc9e7)) + (fp_line (start 40.241055 -29.942255) (end 40.241055 -23.16029) (layer "Edge.Cuts") (width 0.1) (tstamp 706c1cb9-5d96-4282-9efc-6147f0125147)) + (fp_line (start 32.384506 -32.703005) (end 34.220314 -30.867199) (layer "Edge.Cuts") (width 0.1) (tstamp 7273dd21-e834-41d3-b279-d7de727709ca)) + (fp_line (start 30.278254 -36.115635) (end 30.278254 -36.115635) (layer "Edge.Cuts") (width 0.1) (tstamp 749d9ed0-2ff2-4b55-abc5-f7231ec3aa28)) + (fp_line (start 29.59199 -32.651247) (end 22.688019 -39.55522) (layer "Edge.Cuts") (width 0.1) (tstamp 751d823e-1d7b-4501-9658-d06d459b0e16)) + (fp_line (start 48.964062 -17.78149) (end 48.964062 -17.78149) (layer "Edge.Cuts") (width 0.1) (tstamp 755f94aa-38f0-4a64-a7c7-6c71cb18cddf)) + (fp_line (start 42.065178 -49.352712) (end 42.065178 -43.646507) (layer "Edge.Cuts") (width 0.1) (tstamp 80095e91-6317-4cfb-9aea-884c9a1accc5)) + (fp_line (start 24.411946 -27.471192) (end 24.496271 -27.555515) (layer "Edge.Cuts") (width 0.1) (tstamp 83184391-76ed-44f0-8cd0-01f89f157bdb)) + (fp_line (start 38.744343 -40.746632) (end 38.744343 -29.942255) (layer "Edge.Cuts") (width 0.1) (tstamp 88deea08-baa5-4041-beb7-01c299cf00e6)) + (fp_line (start 24.763346 -41.630545) (end 30.278254 -36.115635) (layer "Edge.Cuts") (width 0.1) (tstamp 8a8c373f-9bc3-4cf7-8f41-4802da916698)) + (fp_line (start 33.996975 -51.761479) (end 33.996975 -60.655741) (layer "Edge.Cuts") (width 0.1) (tstamp 9112ddd5-10d5-48b8-954f-f1d5adcacbd9)) + (fp_line (start 15.966301 -16.191239) (end 16.480797 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp 9208ea78-8dde-4b3d-91e9-5755ab5efd9a)) + (fp_line (start 24.763346 -41.630545) (end 24.763346 -41.630545) (layer "Edge.Cuts") (width 0.1) (tstamp 92761c09-a591-4c8e-af4d-e0e2262cb01d)) + (fp_line (start 38.744343 -29.942255) (end 40.241055 -29.942255) (layer "Edge.Cuts") (width 0.1) (tstamp 92f063a3-7cce-4a96-8a3a-cf5767f700c6)) + (fp_line (start 26.115862 -25.826309) (end 26.115862 -25.826309) (layer "Edge.Cuts") (width 0.1) (tstamp 94d24676-7ae3-483c-8bd6-88d31adf00b4)) + (fp_line (start 24.411946 -27.471192) (end 24.411946 -27.471192) (layer "Edge.Cuts") (width 0.1) (tstamp 966ee9ec-860e-45bb-af89-30bda72b2032)) + (fp_line (start 42.065178 -43.646507) (end 37.820595 -43.646507) (layer "Edge.Cuts") (width 0.1) (tstamp 968a6172-7a4e-40ab-a78a-e4d03671e136)) + (fp_line (start 24.496271 -27.555515) (end 24.519421 -27.578663) (layer "Edge.Cuts") (width 0.1) (tstamp 96ef76a5-90c3-4767-98ba-2b61887e28d3)) + (fp_line (start 48.964062 -22.787239) (end 48.964062 -17.78149) (layer "Edge.Cuts") (width 0.1) (tstamp 9c2999b2-1cf1-4204-9d23-243401b77aa3)) + (fp_line (start 40.241055 -23.16029) (end 40.241055 -22.787239) (layer "Edge.Cuts") (width 0.1) (tstamp 9ed09117-33cf-45a3-85a7-2606522feaf8)) + (fp_line (start 38.744343 -40.746632) (end 38.744343 -40.746632) (layer "Edge.Cuts") (width 0.1) (tstamp a177c3b4-b04c-490e-b3fe-d3d4d7aa24a7)) + (fp_line (start 32.384506 -32.703005) (end 32.384506 -32.703005) (layer "Edge.Cuts") (width 0.1) (tstamp a3fab380-991d-404b-95d5-1c209b047b6e)) + (fp_line (start 24.710388 -27.769634) (end 24.710388 -27.769634) (layer "Edge.Cuts") (width 0.1) (tstamp aa23bfe3-454b-4a2b-bfe1-101c747eb84e)) + (fp_line (start 22.688019 -39.55522) (end 24.763346 -41.630545) (layer "Edge.Cuts") (width 0.1) (tstamp aadc3df5-0e2d-4f3d-b72e-6f184da74c89)) + (fp_line (start 38.744343 -29.942255) (end 38.744343 -29.942255) (layer "Edge.Cuts") (width 0.1) (tstamp ad4d05f5-6957-42f8-b65c-c657b9a26485)) + (fp_line (start 30.352667 -36.041222) (end 35.727013 -41.415571) (layer "Edge.Cuts") (width 0.1) (tstamp af76ce95-feca-41fb-bf31-edaa26d6766a)) + (fp_line (start 34.220314 -30.867199) (end 34.290474 -30.797041) (layer "Edge.Cuts") (width 0.1) (tstamp b2b363dd-8e47-4a76-a142-e00e28334875)) + (fp_line (start 34.290474 -30.797041) (end 34.290474 -30.797041) (layer "Edge.Cuts") (width 0.1) (tstamp c15b2f75-2e10-4b71-bebb-e2b872171b92)) + (fp_line (start 37.820595 -43.646507) (end 37.820595 -40.746632) (layer "Edge.Cuts") (width 0.1) (tstamp c1b11207-7c0a-49b3-a41d-2fe677d5f3b8)) + (fp_line (start 38.978215 -49.352712) (end 38.978215 -49.352712) (layer "Edge.Cuts") (width 0.1) (tstamp c346b00c-b5e0-4939-beb4-7f48172ef334)) + (fp_line (start 33.996975 -51.761479) (end 33.996975 -51.761479) (layer "Edge.Cuts") (width 0.1) (tstamp c3d5daf8-d359-42b2-a7c2-0d080ba7e212)) + (fp_line (start 35.259819 -45.189993) (end 35.259819 -47.318126) (layer "Edge.Cuts") (width 0.1) (tstamp c7cd39db-931a-4d86-96b8-57e6b39f58f9)) + (fp_line (start 78.448956 0) (end 0 0) (layer "Edge.Cuts") (width 0.1) (tstamp ca56e1ad-54bf-4df5-a4f7-99f5d61d0de9)) + (fp_line (start 38.978215 -60.655741) (end 38.978215 -60.655741) (layer "Edge.Cuts") (width 0.1) (tstamp ca9b74ce-0dee-401c-9544-f599f4cf538d)) + (fp_line (start 38.323399 -45.189993) (end 35.259819 -45.189993) (layer "Edge.Cuts") (width 0.1) (tstamp ceb12634-32ca-4cbf-9ff5-5e8b53ab18ad)) + (fp_line (start 29.689041 -47.453547) (end 33.996975 -51.761479) (layer "Edge.Cuts") (width 0.1) (tstamp d3dd7cdb-b730-487d-804d-99150ba318ef)) + (fp_line (start 24.496271 -27.555515) (end 24.496271 -27.555515) (layer "Edge.Cuts") (width 0.1) (tstamp db6412d3-e6c3-4bdd-abf4-a8f55d56df31)) + (fp_line (start 38.323399 -47.318126) (end 38.323399 -45.189993) (layer "Edge.Cuts") (width 0.1) (tstamp dd70858b-2f9a-4b3f-9af5-ead3a9ba57e9)) + (fp_line (start 35.727013 -41.415571) (end 35.727013 -41.415571) (layer "Edge.Cuts") (width 0.1) (tstamp e11ae5a5-aa10-4f10-b346-f16e33c7899a)) + (fp_line (start 16.480797 -16.191239) (end 26.115862 -25.826309) (layer "Edge.Cuts") (width 0.1) (tstamp e45aa7d8-0254-4176-afd9-766820762e19)) + (fp_line (start 15.171174 -16.191239) (end 15.171174 -16.191239) (layer "Edge.Cuts") (width 0.1) (tstamp e86e4fae-9ca7-4857-a93c-bc6a3048f887)) + (fp_line (start 40.241055 -23.16029) (end 40.241055 -23.16029) (layer "Edge.Cuts") (width 0.1) (tstamp eb391a95-1c1d-4613-b508-c76b8bc13a73)) + (fp_line (start 35.727013 -41.415571) (end 29.689041 -47.453547) (layer "Edge.Cuts") (width 0.1) (tstamp f23ac723-a36d-491d-9473-7ec0ffed332d)) + (fp_line (start 34.290474 -30.797041) (end 31.553124 -28.059693) (layer "Edge.Cuts") (width 0.1) (tstamp f6a5c856-f2b5-40eb-a958-b666a0d408a0)) + (fp_line (start 78.448956 -17.78149) (end 78.448956 -17.78149) (layer "Edge.Cuts") (width 0.1) (tstamp f8b47531-6c06-4e54-9fc9-cd9d0f3dd69f)) + (fp_line (start 30.352667 -36.041222) (end 30.352667 -36.041222) (layer "Edge.Cuts") (width 0.1) (tstamp fd60415a-f01a-46c5-9369-ea970e435e5b)) + (fp_line (start 31.553124 -28.059693) (end 29.646199 -29.966616) (layer "Edge.Cuts") (width 0.1) (tstamp ffa442c7-cbef-461f-8613-c211201cec06)) + (pad "1" thru_hole rect (at 36.2 -45.2 90) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 1087999d-983e-42bf-b325-b81c766947cc)) + (pad "1" thru_hole rect (at 32.516117 -38.216117 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 3da59bc6-70b3-471f-bbfc-55990eeb98e5)) + (pad "1" thru_hole rect (at 34.283883 -39.983883 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 6e2f7fa6-1ee9-4775-917f-ada02dc13bcd)) + (pad "1" thru_hole rect (at 31.632233 -37.332233 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 99f4f4aa-2f14-4bf9-b8a7-da1480e9e168)) + (pad "1" thru_hole rect (at 33.4 -39.1 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp b80aa845-c1c7-4a36-86eb-13202c5b8807)) + (pad "1" thru_hole rect (at 37.45 -45.2 90) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp e0a50294-8c6e-4d53-aeda-b230ef3f0916)) + (pad "2" thru_hole rect (at 25.167767 -37.132233 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 0a1ac2c6-8da8-4410-b772-69afa2855077)) + (pad "2" thru_hole rect (at 28.7033 -33.5967 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 11547ba3-d459-4ced-9333-92979d5b86e1)) + (pad "2" thru_hole rect (at 27.819417 -34.480583 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 26584013-aa69-4f6e-9469-cf96829118fe)) + (pad "2" thru_hole rect (at 23.4 -38.9 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 7efaeda2-e767-44b9-adb2-3a0c3f4d2f1d)) + (pad "2" thru_hole rect (at 26.935533 -35.364467 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 8157d0c3-4115-4fef-882d-18ff9f3b1e49)) + (pad "2" thru_hole rect (at 26.05165 -36.24835 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 9d221b3b-0bfe-4439-a426-0f2594b9c7bf)) + (pad "2" thru_hole rect (at 24.283883 -38.016117 135) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp dff62e1d-c592-4963-80cb-25d776cdc1f4)) + (pad "3" thru_hole rect (at 49 -18.9 180) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 9c5eb8ba-0370-4530-b0dd-d326ff9cd796)) + (pad "3" thru_hole rect (at 49 -21.4 180) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp 9d5e7df5-7472-4dc8-a9fc-73987a422b16)) + (pad "3" thru_hole rect (at 49 -20.150001 180) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp acdd6813-47a9-43b9-8c0d-c0787f18321e)) + (pad "4" thru_hole rect (at 37.45 -47.3 90) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp b7986f62-ea7a-4dc5-91cd-26acb8e0379b)) + (pad "4" thru_hole rect (at 36.2 -47.3 90) (size 1 1) (drill 0.6) (layers *.Cu *.Mask) (tstamp d0e758c8-d140-4a8a-8239-760094b94ecd)) + (group "" (id 2a6753e8-f9e7-4c11-a472-dc9c7e1759c8) + (members + 1087999d-983e-42bf-b325-b81c766947cc + e0a50294-8c6e-4d53-aeda-b230ef3f0916 + ) + ) + (group "" (id 319c683d-aed6-4e7d-aee2-ff9871746d52) + (members + 000b46d6-b833-4804-8f56-56d539f76d09 + 099473f1-6598-46ff-a50f-4c520832170d + 0c5dddf1-38df-43d2-b49c-e7b691dab0ab + 0ce1dd44-f307-4f98-9f0d-478fd87daa64 + 113ffcdf-4c54-4e37-81dc-f91efa934ba7 + 15699041-ed40-45ee-87d8-f5e206a88536 + 162e5bdd-61a8-46a3-8485-826b5d58e1a1 + 1855ca44-ab48-4b76-a210-97fc81d916c4 + 1876c30c-72b2-4a8d-9f32-bf8b213530b4 + 199124ca-dd64-45cf-a063-97cc545cbea7 + 1bd80cf9-f42a-4aee-a408-9dbf4e81e625 + 1bf7d0f9-0dcf-4d7c-b58c-318e3dc42bc9 + 1cacb878-9da4-41fc-aa80-018bc841e19a + 1de61170-5337-44c5-ba28-bd477db4bff1 + 2102c637-9f11-48f1-aae6-b4139dc22be2 + 247ebffd-2cb6-4379-ba6e-21861fea3913 + 254f7cc6-cee1-44ca-9afe-939b318201aa + 26a22c19-4cc5-4237-9651-0edc4f854154 + 272c2a78-b5f5-4b61-aed3-ec69e0e92729 + 2b25e886-ded1-450a-ada1-ece4208052e4 + 3457afc5-3e4f-4220-81d1-b079f653a722 + 3a1a39fc-8030-4c93-9d9c-d79ba6824099 + 3b65c51e-c243-447e-bee9-832d94c1630e + 3bbbbb7d-391c-4fee-ac81-3c47878edc38 + 3f2a6679-91d7-4b6c-bf5c-c4d5abb2bc44 + 402c62e6-8d8e-473a-a0cf-2b86e4908cd7 + 456c5e47-d71e-4708-b061-1e61634d8648 + 4970ec6e-3725-4619-b57d-dc2c2cb86ed0 + 49b5f540-e128-4e08-bb09-f321f8e64056 + 4a53fa56-d65b-42a4-a4be-8f49c4c015bb + 4bbde53d-6894-4e18-9480-84a6a26d5f6b + 4ce9470f-5633-41bf-89ac-74a810939893 + 4cfd9a02-97ef-4af4-a6b8-db9be1a8fda5 + 51cc007a-3378-4ce3-909c-71e94822f8d1 + 54ed3ee1-891b-418e-ab9c-6a18747d7388 + 5576cd03-3bad-40c5-9316-1d286895d52a + 57f248a7-365e-4c42-b80d-5a7d1f9dfaf3 + 58390862-1833-41dd-9c4e-98073ea0da33 + 5bab6a37-1fdf-4cf8-b571-44c962ed86e9 + 5e755161-24a5-4650-a6e3-9836bf074412 + 5f48b0f2-82cf-40ce-afac-440f97643c36 + 6150c02b-beb5-4af1-951e-3666a285a6ea + 62f15a9a-9893-486e-9ad0-ea43f88fc9e7 + 706c1cb9-5d96-4282-9efc-6147f0125147 + 7273dd21-e834-41d3-b279-d7de727709ca + 749d9ed0-2ff2-4b55-abc5-f7231ec3aa28 + 751d823e-1d7b-4501-9658-d06d459b0e16 + 755f94aa-38f0-4a64-a7c7-6c71cb18cddf + 80095e91-6317-4cfb-9aea-884c9a1accc5 + 83184391-76ed-44f0-8cd0-01f89f157bdb + 88deea08-baa5-4041-beb7-01c299cf00e6 + 8a8c373f-9bc3-4cf7-8f41-4802da916698 + 9112ddd5-10d5-48b8-954f-f1d5adcacbd9 + 9208ea78-8dde-4b3d-91e9-5755ab5efd9a + 92761c09-a591-4c8e-af4d-e0e2262cb01d + 92f063a3-7cce-4a96-8a3a-cf5767f700c6 + 94d24676-7ae3-483c-8bd6-88d31adf00b4 + 966ee9ec-860e-45bb-af89-30bda72b2032 + 968a6172-7a4e-40ab-a78a-e4d03671e136 + 96ef76a5-90c3-4767-98ba-2b61887e28d3 + 9c2999b2-1cf1-4204-9d23-243401b77aa3 + 9ed09117-33cf-45a3-85a7-2606522feaf8 + a177c3b4-b04c-490e-b3fe-d3d4d7aa24a7 + a3fab380-991d-404b-95d5-1c209b047b6e + aa23bfe3-454b-4a2b-bfe1-101c747eb84e + aadc3df5-0e2d-4f3d-b72e-6f184da74c89 + ad4d05f5-6957-42f8-b65c-c657b9a26485 + af76ce95-feca-41fb-bf31-edaa26d6766a + b2b363dd-8e47-4a76-a142-e00e28334875 + c15b2f75-2e10-4b71-bebb-e2b872171b92 + c1b11207-7c0a-49b3-a41d-2fe677d5f3b8 + c346b00c-b5e0-4939-beb4-7f48172ef334 + c3d5daf8-d359-42b2-a7c2-0d080ba7e212 + c7cd39db-931a-4d86-96b8-57e6b39f58f9 + ca56e1ad-54bf-4df5-a4f7-99f5d61d0de9 + ca9b74ce-0dee-401c-9544-f599f4cf538d + ceb12634-32ca-4cbf-9ff5-5e8b53ab18ad + d3dd7cdb-b730-487d-804d-99150ba318ef + db6412d3-e6c3-4bdd-abf4-a8f55d56df31 + dd70858b-2f9a-4b3f-9af5-ead3a9ba57e9 + e11ae5a5-aa10-4f10-b346-f16e33c7899a + e45aa7d8-0254-4176-afd9-766820762e19 + e86e4fae-9ca7-4857-a93c-bc6a3048f887 + eb391a95-1c1d-4613-b508-c76b8bc13a73 + f23ac723-a36d-491d-9473-7ec0ffed332d + f6a5c856-f2b5-40eb-a958-b666a0d408a0 + f8b47531-6c06-4e54-9fc9-cd9d0f3dd69f + fd60415a-f01a-46c5-9369-ea970e435e5b + ffa442c7-cbef-461f-8613-c211201cec06 + ) + ) + (group "" (id 7c0cf58c-e25b-422b-8099-af386f9b94eb) + (members + b7986f62-ea7a-4dc5-91cd-26acb8e0379b + d0e758c8-d140-4a8a-8239-760094b94ecd + ) + ) + (group "" (id b81cd904-69d1-4c8b-81f2-302fdf1cfeb0) + (members + 0a1ac2c6-8da8-4410-b772-69afa2855077 + 11547ba3-d459-4ced-9333-92979d5b86e1 + 26584013-aa69-4f6e-9469-cf96829118fe + 7efaeda2-e767-44b9-adb2-3a0c3f4d2f1d + 8157d0c3-4115-4fef-882d-18ff9f3b1e49 + 9d221b3b-0bfe-4439-a426-0f2594b9c7bf + dff62e1d-c592-4963-80cb-25d776cdc1f4 + ) + ) + (group "" (id dd7274bb-36be-4baa-903e-939c1f1b99f6) + (members + 3da59bc6-70b3-471f-bbfc-55990eeb98e5 + 6e2f7fa6-1ee9-4775-917f-ada02dc13bcd + 99f4f4aa-2f14-4bf9-b8a7-da1480e9e168 + b80aa845-c1c7-4a36-86eb-13202c5b8807 + ) + ) +) diff --git a/pcb/interposer_symbol.kicad_sym b/pcb/interposer_symbol.kicad_sym new file mode 100644 index 0000000..faf8831 --- /dev/null +++ b/pcb/interposer_symbol.kicad_sym @@ -0,0 +1,40 @@ +(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) + (symbol "interposer_conn" (in_bom yes) (on_board yes) + (property "Reference" "U" (id 0) (at 5.08 -1.27 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "interposer_conn" (id 1) (at 5.08 20.32 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "interposer_conn_0_1" + (rectangle (start 0 19.05) (end 10.16 0) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "interposer_conn_1_1" + (pin input line (at 0 16.51 0) (length 2.54) + (name "VCore" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 0 10.16 0) (length 2.54) + (name "GND1" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 0 6.35 0) (length 2.54) + (name "GND2" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 0 2.54 0) (length 2.54) + (name "GND3" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + ) + ) +) diff --git a/pcb/schematic.pdf b/pcb/schematic.pdf Binary files differnew file mode 100644 index 0000000..bcff61d --- /dev/null +++ b/pcb/schematic.pdf diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..068ad8a --- /dev/null +++ b/src/README.md @@ -0,0 +1,15 @@ +## Modchip software + +The firmware for the RP2040 microcontroller can be found in the `modchipfw` folder. You can compile this by running the following commands from within the `modchipfw` folder: + +``` +mkdir build && cd build +cmake .. +make +``` + +To update the firmware on the RP2040 you can simply press the button on the modchip before plugging it in. It should now enumerate as a removable disk, copy the `utglitcher.uf2` to this removable disk to update the firmware. + +## Host Python software +In the Python folder you can find `pulsegen.py`, this file contains the `PicoPulseGen` class that handles communication with the modchip. +The `example.py` script is a basic example to demonstrate how you can interact with the modchip and how you can set glitch parameters.
\ No newline at end of file diff --git a/src/modchipfw/CMakeLists.txt b/src/modchipfw/CMakeLists.txt new file mode 100644 index 0000000..9367d0f --- /dev/null +++ b/src/modchipfw/CMakeLists.txt @@ -0,0 +1,40 @@ +# Generated Cmake Pico project file + +cmake_minimum_required(VERSION 3.13) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) + +# Initialise pico_sdk from installed location +# (note this can come from environment, CMake cache etc) +# set(PICO_SDK_PATH "~/pico/pico-sdk") + +# Pull in Raspberry Pi Pico SDK (must be before project) +include(pico_sdk_import.cmake) + +project(utglitcher C CXX ASM) + +# Initialise the Raspberry Pi Pico SDK +pico_sdk_init() + +# Add executable. Default name is the project name, version 0.1 + +add_executable(utglitcher utglitcher.c ) + +pico_set_program_name(utglitcher "utglitcher") +pico_set_program_version(utglitcher "0.3") + +pico_enable_stdio_uart(utglitcher 0) +pico_enable_stdio_usb(utglitcher 1) + +# Add the standard library to the build +target_link_libraries(utglitcher pico_stdlib) + +# Add any user requested libraries +target_link_libraries(utglitcher + hardware_pio + pico_multicore + ) + +pico_generate_pio_header(utglitcher ${CMAKE_CURRENT_LIST_DIR}/pulsegen.pio) +pico_add_extra_outputs(utglitcher) diff --git a/src/modchipfw/pico_sdk_import.cmake b/src/modchipfw/pico_sdk_import.cmake new file mode 100644 index 0000000..28efe9e --- /dev/null +++ b/src/modchipfw/pico_sdk_import.cmake @@ -0,0 +1,62 @@ +# This is a copy of <PICO_SDK_PATH>/external/pico_sdk_import.cmake + +# This can be dropped into an external project to help locate this SDK +# It should be include()ed prior to project() + +if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) + set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) + message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) + set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) + message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) + set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) + message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") +endif () + +set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") +set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") +set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") + +if (NOT PICO_SDK_PATH) + if (PICO_SDK_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_SDK_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG master + ) + if (NOT pico_sdk) + message("Downloading Raspberry Pi Pico SDK") + FetchContent_Populate(pico_sdk) + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + message(FATAL_ERROR + "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." + ) + endif () +endif () + +get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${PICO_SDK_PATH}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") +endif () + +set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) +if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") +endif () + +set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) + +include(${PICO_SDK_INIT_CMAKE_FILE}) diff --git a/src/modchipfw/pulsegen.pio b/src/modchipfw/pulsegen.pio new file mode 100644 index 0000000..4068940 --- /dev/null +++ b/src/modchipfw/pulsegen.pio @@ -0,0 +1,70 @@ +.program pulsegen + +; we use 2 bits from the delay bits for side set +.side_set 2 + +entry: + ; Could probably get rid of these blocking PULLs by enabling autopull and writing to the fifo before enabling the SM? + ; Read number of edges + PULL BLOCK side 0 + MOV X, OSR side 0 ; Might want to use OUT here instead of MOV + + ; Read pulse offset + PULL BLOCK side 0 + MOV Y, OSR side 0 + + ; Clear interrupt (might not be needed if we clear it on the M0 side of things?) + IRQ CLEAR 0 side 0 + +nedges: + ; Wait for rising-edges + WAIT 0 PIN 0 side 0 + WAIT 1 PIN 0 side 0 + JMP X-- nedges side 0 + + ; Read pulse width + ; This will cause a fixed delay between the trigger event and the glitch insertion. Fine for our purposes. + PULL BLOCK side 0 + MOV X, OSR side 0 + +; Loop for pulse offset cycles +poffset: + JMP Y-- poffset side 2 + +; Loop for pulse width cycles +pwidth: + JMP X-- pwidth side 3 + + + SET Y, 31 side 2 ; A fixed delay to ensure that the glitch has been inserted before the capacitors are enabled again. +delay: + NOP side 2 [7] + NOP side 2 [7] + NOP side 2 [7] + NOP side 2 [7] + NOP side 2 [7] + JMP Y-- delay side 2 + + ; Signal that the pulse has been inserted, and disable the pulse using sideset + IRQ WAIT 0 side 0 + + +% c-sdk { +void pulsegen_program_init(PIO pio, uint sm, uint offset, uint trigger_pin, uint pulse_pin, uint caps_pin) { + pio_sm_config c = pulsegen_program_get_default_config(offset); + + sm_config_set_sideset_pins(&c, pulse_pin); + sm_config_set_in_pins(&c, trigger_pin); + sm_config_set_in_shift(&c, false, false, 32); + + pio_gpio_init(pio, trigger_pin); + pio_gpio_init(pio, pulse_pin); + pio_gpio_init(pio, caps_pin); + + pio_sm_set_consecutive_pindirs(pio, sm, trigger_pin, 1, false); + pio_sm_set_consecutive_pindirs(pio, sm, pulse_pin, 2, true); + + sm_config_set_clkdiv(&c, 1); + pio_sm_init(pio, sm, offset, &c); +} +%}
\ No newline at end of file diff --git a/src/modchipfw/utglitcher.c b/src/modchipfw/utglitcher.c new file mode 100644 index 0000000..5ba5c94 --- /dev/null +++ b/src/modchipfw/utglitcher.c @@ -0,0 +1,158 @@ +#include <stdio.h> +#include "pico/stdlib.h" +#include "hardware/uart.h" +#include "hardware/gpio.h" +#include "hardware/pio.h" +#include "hardware/clocks.h" +#include "hardware/vreg.h" +#include "pulsegen.pio.h" + +#define PIN_NRST 7 +#define PIN_TRIG 6 +#define PIN_PULSE 0 +#define PIN_CAPS 1 + +#define PIN_LED1 16 +#define PIN_LED2 17 + +int main() +{ + /* + * For some reason the serial communication fails after some time when running at 200MHz + * For me everything worked fine at 250 MHz without changing the core voltage (vreg_set_voltage) + */ + set_sys_clock_khz(250000, true); + + stdio_init_all(); + + // GPIO initialisation. + gpio_init(PIN_NRST); + gpio_init(PIN_TRIG); + gpio_init(PIN_PULSE); + gpio_init(PIN_CAPS); + gpio_init(PIN_LED1); + gpio_init(PIN_LED2); + gpio_set_dir(PIN_NRST, GPIO_OUT); + gpio_set_dir(PIN_TRIG, GPIO_IN); + gpio_set_dir(PIN_PULSE, GPIO_OUT); + gpio_set_dir(PIN_CAPS, GPIO_OUT); + gpio_set_dir(PIN_LED1, GPIO_OUT); + gpio_set_dir(PIN_LED2, GPIO_OUT); + gpio_set_pulls(PIN_CAPS, true, false); + gpio_set_drive_strength(PIN_PULSE, GPIO_DRIVE_STRENGTH_12MA); + gpio_set_drive_strength(PIN_CAPS, GPIO_DRIVE_STRENGTH_12MA); + gpio_set_slew_rate(PIN_PULSE, GPIO_SLEW_RATE_FAST); + + // Setup PIO + PIO pio = pio0; + uint32_t sm = pio_claim_unused_sm(pio, true); + uint32_t pio_offset = pio_add_program(pio, &pulsegen_program); + pulsegen_program_init(pio, sm, pio_offset, PIN_TRIG, PIN_PULSE, PIN_CAPS); + + // Wait for serial connection + while (!stdio_usb_connected()) { + sleep_ms(500); + } + + gpio_put(PIN_LED1, true); + gpio_put(PIN_NRST, false); + + char cmd; + uint32_t pulse_offset = 0; + uint32_t pulse_width = 0; + uint32_t trig_edges = 1; + uint32_t gpio_states = 0; + + uint8_t gpio_pin = 0; + uint8_t gpio_state = 0; + + while (true) { + cmd = getchar(); + + switch (cmd) + { + // Enable glitch SM + case 'A': + gpio_put(PIN_LED2, true); + pio_sm_put_blocking(pio, sm, trig_edges); + pio_sm_put_blocking(pio, sm, pulse_offset); + pio_sm_put_blocking(pio, sm, pulse_width); + + gpio_put(PIN_NRST, true); + sleep_ms(46); // Delay to make sure all UT signals are stable + + pio_sm_set_enabled(pio, sm, true); + printf("A\n"); + break; + + // Wait for trigger + case 'B': + while(!pio_interrupt_get(pio0, 0)) { + cmd = getchar_timeout_us(1); + if (cmd == 'D') break; // Disarm + }; + + pio_sm_set_enabled(pio, sm, false); + pio_interrupt_clear(pio, 0); + pio_sm_clear_fifos(pio, sm); + pio_sm_drain_tx_fifo(pio, sm); + pio_sm_restart(pio, sm); + pio_sm_set_enabled(pio, sm, false); + + pio_sm_exec_wait_blocking(pio, sm, pio_encode_set(pio_x, pio_offset)); + pio_sm_exec_wait_blocking(pio, sm, pio_encode_mov(pio_pc, pio_x)); + printf("T\n"); + gpio_put(PIN_LED2, false); + break; + + // Set the number of edges before inserting a pulse + case 'E': + fread(&trig_edges, 1, 4, stdin); + printf("%d\n", trig_edges); + break; + + // Set the pulse offset + case 'O': + fread(&pulse_offset, 1, 4, stdin); + printf("%d\n", pulse_offset); + break; + + // Set the pulse width + case 'W': + fread(&pulse_width, 1, 4, stdin); + printf("%d\n", pulse_width); + break; + + // print the current pulse offset and width + case 'S': + printf("PulseGenerator offset: %d, width: %d, edges: %d\n", pulse_offset, pulse_width, trig_edges); + break; + + // control a gpio pin, can be expanded to handle multiple pins + case 'G': + fread(&gpio_pin, 1, 1, stdin); + fread(&gpio_state, 1, 1, stdin); + + if (gpio_pin == PIN_NRST) { + if (gpio_state == 0) { + gpio_put(PIN_NRST, false); + } else { + gpio_put(PIN_NRST, true); + } + } + printf("G\n"); + break; + + // Read state of GPIOs + case 'R': + gpio_states = gpio_get_all(); + printf("%d\n", gpio_states); + break; + + default: + break; + } + } + + return 0; +}
\ No newline at end of file diff --git a/src/python/example.py b/src/python/example.py new file mode 100644 index 0000000..6995940 --- /dev/null +++ b/src/python/example.py @@ -0,0 +1,72 @@ +import numpy as np +import time +import serial +from tqdm import tnrange, tqdm +import random +from pulsegen import PicoPulseGen + +# Open serial interface +# I'm using this to detect when the glitch was successful +try: + ser = serial.Serial('/dev/ttyUSB0', 115200) + +except Exception as e: + print('Could not open /dev/ttyUSB0') + exit() + +# Connect to modchip +try: + glitcher = PicoPulseGen('/dev/ttyACM0') + logger.info('Connected to modchip') + + # You have to figure out the trig_edges parameter + # You have to figure out ranges for the pulse_offset and pulse_width parameters + glitcher.trig_edges = 0 + glitcher.pulse_offset = 0 + glitcher.pulse_width = 0 + glitcher.set_gpio(0) + +except Exception as e: + print('Could not connect to modchip') + exit() + +input("Press enter to start.") + +def generator(): + while True: + yield + +idx = 0 +success = False +for _ in tqdm(generator()): + if idx % 10 == 0: + # Pulse width and offset are expressed in number of cycles of the PIO state machine operating frequency (default in the provided fw is 250MHz). + glitch_width = random.randint(A, B) # You have to figure out good ranges here + glitch_offset = random.randint(C, D) + + glitcher.pulse_offset = glitch_offset + glitcher.pulse_width = glitch_width + + ser.reset_input_buffer() + glitcher.arm() # Arm the modchip, it will try to power up the UT and will wait for the number of set trigger pulses to occur before inserting a glitch + glitcher.wait_trig(timeout=5) # Waits for the modchip to signal it has triggered. The modchip will be disarmed if no glitch has occurred within 5 seconds. + + time.sleep(0.55) # Have to wait for the second stage to start to see serial output + data = ser.read(ser.in_waiting) + + if b'LENNERT' in data: # a check to determine if the glitch was successful. My BL2 has been modified to print LENNERT. + success = True + break + + glitcher.set_gpio(0) # Disables the core voltage regulator. The modchip firmware will re-enable the regulator automatically on the next glitch attempt. + time.sleep(0.1) + + idx += 1 + +if success: + print('Glitch successul!') + logger.debug('%d, %d, %d' %(idx, glitch_width, glitch_offset)) + logger.debug(data.decode('utf-8', 'ignore')) + +ser.close() +glitcher.close()
\ No newline at end of file diff --git a/src/python/pulsegen.py b/src/python/pulsegen.py new file mode 100644 index 0000000..161625a --- /dev/null +++ b/src/python/pulsegen.py @@ -0,0 +1,130 @@ +import serial +import time +import signal + +class PicoPulseGen: + def __init__(self, port='/dev/ttyACM0'): + self._pulse_offset = 0 + self._pulse_width = 0 + self._trig_edges = 0 + + self.pico = serial.Serial(port, 115200) + time.sleep(0.1) + self.pico.write(b'S') + + test = self.pico.readline() + if b'PulseGenerator' not in test: + raise ConnectionError('Could not connect to the PulseGenerator :(') + + signal.signal(signal.SIGALRM, self.arm_abort) + + + @property + def pulse_offset(self): + return self._pulse_offset + + + @pulse_offset.setter + def pulse_offset(self, offset): + if type(offset) != int or offset < 0 or offset > 0xFFFFFFFF: + raise ValueError('Offset has to be an int between 0 and 0xFFFFFFFF') + + self._pulse_offset = offset + + self.pico.flushInput() + self.pico.write(b'O') + self.pico.write((self._pulse_offset).to_bytes(4, 'little')) + ret = self.pico.readline() + assert int(ret.strip()) == self._pulse_offset, ret + + + @property + def pulse_width(self): + return self._pulse_offset + + + @pulse_width.setter + def pulse_width(self, width): + if type(width) != int or width < 0 or width > 0xFFFFFFFF: + raise ValueError('Width has to be an int between 0 and 0xFFFFFFFF') + + self._pulse_width = width + + self.pico.flushInput() + self.pico.write(b'W') + self.pico.write((self._pulse_width).to_bytes(4, 'little')) + ret = self.pico.readline() + assert int(ret.strip()) == self._pulse_width, ret + + + @property + def trig_edges(self): + return self._trig_edges + + + @trig_edges.setter + def trig_edges(self, edges): + if type(edges) != int or edges < 0 or edges > 0xFFFFFFFF: + raise ValueError('Width has to be an int between 0 and 0xFFFFFFFF') + + self._trig_edges = edges + + self.pico.write(b'E') + self.pico.write((self._trig_edges).to_bytes(4, 'little')) + ret = self.pico.readline() + assert int(ret.strip()) == self._trig_edges, ret + + + def arm(self): + self.pico.write(b'A') + ret = self.pico.readline() + assert b'A' in ret + + + def wait_trig(self, timeout=5): + self.pico.write(b'B') + signal.alarm(timeout) + ret = self.pico.readline() + signal.alarm(0) + assert b'T' in ret + + + def arm_abort(self, signum, frame): + print('No trigger observed, disarming!') + self.pico.write(b'D') + + + def status(self): + self.pico.write(b'S') + ret = self.pico.readline() + print(ret.decode('utf-8')) + + + def set_gpio(self, state): + if type(state) != int or state < 0: + raise ValueError('State has to be zero (GPIO 0) or a positive value larger than zero (GPIO 1)') + + self.pico.write(b'G') + self.pico.write(bytes([7])) # For now there is only one GPIO pin used for this functionality + if state: + self.pico.write(bytes([1])) + else: + self.pico.write(bytes([0])) + + ret = self.pico.readline() + assert b'G' in ret + + + def read_gpios(self): + self.pico.write(b'R') + ret = self.pico.readline() + ret = int(ret.strip()) + return ret + + + def close(self): + self.pico.close() + + + def __del__(self): + self.pico.close()
\ No newline at end of file |