diff --git a/ci/hardware_tests/tpmb/LICENSE b/ci/hardware_tests/tpmb/LICENSE new file mode 100644 index 000000000..59e66c1c3 --- /dev/null +++ b/ci/hardware_tests/tpmb/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Marek Mahut + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ci/hardware_tests/tpmb/Makefile b/ci/hardware_tests/tpmb/Makefile new file mode 100644 index 000000000..c8280fd0e --- /dev/null +++ b/ci/hardware_tests/tpmb/Makefile @@ -0,0 +1,4 @@ +default: compile + +compile: + arduino --upload tpmb.ino --port /dev/ttyACM1 diff --git a/ci/hardware_tests/tpmb/README.md b/ci/hardware_tests/tpmb/README.md new file mode 100644 index 000000000..7fe99e126 --- /dev/null +++ b/ci/hardware_tests/tpmb/README.md @@ -0,0 +1,21 @@ +# Trezor (one), press my buttons. + +A simple hardware testing drone for Trezor One. + +![](demo.gif) + +## Hardware + +To build this simple bot, we are using: + +* Arduino UNO R3 (or compatible) +* 2x Tower Pro Micro Servo 9g SG9 + +## Software + +* ```arduino/``` includes the code for the hardware +* ```scripts/``` includes the control scripts + +## 3D Models + +* ```model/``` includes the STL as well as OpenSCAD files diff --git a/ci/hardware_tests/tpmb/arduino/default.nix b/ci/hardware_tests/tpmb/arduino/default.nix new file mode 100644 index 000000000..875d072e0 --- /dev/null +++ b/ci/hardware_tests/tpmb/arduino/default.nix @@ -0,0 +1,5 @@ +with import {}; +stdenv.mkDerivation rec { + name = "tpmb-arduino"; + buildInputs = [ arduino ]; +} diff --git a/ci/hardware_tests/tpmb/arduino/tpmb.ino b/ci/hardware_tests/tpmb/arduino/tpmb.ino new file mode 100644 index 000000000..edb347dbb --- /dev/null +++ b/ci/hardware_tests/tpmb/arduino/tpmb.ino @@ -0,0 +1,77 @@ +#include + +#define right_unpressed 79 +#define right_pressed 0 +#define left_unpressed 0 +#define left_pressed 79 + + +String command; +Servo servo_right; +Servo servo_left; + +void setup() { + // Starting the serial console + Serial.begin(9600); + + // Attaching both servos + servo_right.attach(7); + servo_left.attach(8); + + // Setting them un unpressed position + servo_right.write(right_unpressed); + servo_left.write(left_unpressed); + Serial.println("Ready for commands, press my buttons!"); +} + +void loop() { + if(Serial.available()){ + command = Serial.readStringUntil('\n'); + + if(command.equals("right press")){ + Serial.println("Pressing right button."); + servo_right.write(right_pressed); + } + + else if(command.equals("right unpress")){ + Serial.println("Unpressing right button."); + servo_right.write(right_unpressed); + } + + else if(command.equals("left press")){ + Serial.println("Pressing the left button."); + servo_left.write(left_pressed); + } + + else if(command.equals("left unpress")){ + Serial.println("Unpressing the left button."); + servo_left.write(left_unpressed); + } + + else if(command.equals("left click")){ + Serial.println("Clicking the left button."); + servo_left.write(left_pressed); + delay(500); + servo_left.write(left_unpressed); + } + + else if(command.equals("right click")){ + Serial.println("Clicking the right button."); + servo_right.write(right_pressed); + delay(500); + servo_right.write(right_unpressed); + } + + else if(command.equals("all press")){ + Serial.println("Pressing all buttons."); + servo_right.write(right_pressed); + servo_left.write(left_pressed); + } + + else if(command.equals("all unpress")){ + Serial.println("Unpressing all buttons."); + servo_right.write(right_unpressed); + servo_left.write(left_unpressed); + } + } +} diff --git a/ci/hardware_tests/tpmb/ci_video_demo.mp4 b/ci/hardware_tests/tpmb/ci_video_demo.mp4 new file mode 100644 index 000000000..90f648acc Binary files /dev/null and b/ci/hardware_tests/tpmb/ci_video_demo.mp4 differ diff --git a/ci/hardware_tests/tpmb/demo.gif b/ci/hardware_tests/tpmb/demo.gif new file mode 100644 index 000000000..f41c75c6d Binary files /dev/null and b/ci/hardware_tests/tpmb/demo.gif differ diff --git a/ci/hardware_tests/tpmb/model/README.md b/ci/hardware_tests/tpmb/model/README.md new file mode 100644 index 000000000..3f4415fbb --- /dev/null +++ b/ci/hardware_tests/tpmb/model/README.md @@ -0,0 +1,8 @@ +# 3D print model for tpmb + +This is pretty easy to print. First open ```base.scad``` with OpenSCAD and +export your ```.stl``` file with it. + +Open it with your slider, we are using +Original Priska i3 MK3 to print our models. 0.15mm quality setting with standard +PLA works fine for us. diff --git a/ci/hardware_tests/tpmb/model/base.scad b/ci/hardware_tests/tpmb/model/base.scad new file mode 100644 index 000000000..afa7e82e8 --- /dev/null +++ b/ci/hardware_tests/tpmb/model/base.scad @@ -0,0 +1,61 @@ +// Version: 0.8 + +// Horizontal wall +difference() { + // Creating the base + cube([100,80,7]); + + // Cutting a hole for trezor to sit in + translate([0,25,2]) + cube([65,30,10]); + } + +// Vertical wall +difference() { + // Creating the vertical block + cube([10, 80, 98]); + // Cutting an opening for stuck trezor + translate([0,26,-2]) + cube([10,28,12]); + + // Creating opening for right servo + translate([0,7-3,12]) + cube([10,23,92]); + translate([0,0,40]) + cube([10,23,92]); + + // Creating opening for left servo + translate([0,50+3,12]) + cube([10,23,92]); + translate([0,50+8,40]) + cube([10,23,92]); + + // Holes + translate([5,2,20]) + rotate([0,90,0]) + cylinder(40,1); + + // Holes + translate([5,2+27,20]) + rotate([0,90,0]) + cylinder(40,1); + + // Holes + translate([5,80-29,20]) + rotate([0,90,0]) + cylinder(40,1); + + // Holes + translate([5,80-2,20]) + rotate([0,90,0]) + cylinder(40,1); +} + +// Creating stopper +translate([0,25,0]) + cube([5, 6,10]); + + +// Creating the blocker block +translate([0,85,0]) + cube([28, 6,10]); diff --git a/ci/hardware_tests/tpmb/model/base.stl b/ci/hardware_tests/tpmb/model/base.stl new file mode 100644 index 000000000..58576a5d4 --- /dev/null +++ b/ci/hardware_tests/tpmb/model/base.stl @@ -0,0 +1,1318 @@ +solid OpenSCAD_Model + facet normal 1 -0 0 + outer loop + vertex 100 0 7 + vertex 100 80 0 + vertex 100 80 7 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 100 80 0 + vertex 100 0 7 + vertex 100 0 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 100 80 7 + vertex 65 55 7 + vertex 100 0 7 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 10 80 7 + vertex 65 55 7 + vertex 100 80 7 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 65 55 7 + vertex 10 80 7 + vertex 10 55 7 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 65 25 7 + vertex 100 0 7 + vertex 65 55 7 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 0 7 + vertex 65 25 7 + vertex 10 25 7 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 65 25 7 + vertex 10 0 7 + vertex 100 0 7 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 0 0 0 + vertex 100 80 0 + vertex 100 0 0 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 100 80 0 + vertex 0 0 0 + vertex 0 80 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 80 0 + vertex 0 76 12 + vertex 0 80 40 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 80 0 + vertex 0 54 2 + vertex 0 76 12 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 80 0 + vertex 0 31 2 + vertex 0 54 2 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 31 2 + vertex 0 27 12 + vertex 0 31 10 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 31 2 + vertex 0 4 12 + vertex 0 27 12 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 0 0 + vertex 0 31 2 + vertex 0 80 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 0 0 + vertex 0 4 12 + vertex 0 31 2 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 0 40 + vertex 0 4 12 + vertex 0 0 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 4 12 + vertex 0 0 40 + vertex 0 4 40 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 0 80 40 + vertex 0 76 12 + vertex 0 76 40 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 54 10 + vertex 0 76 12 + vertex 0 54 2 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 54 10 + vertex 0 53 12 + vertex 0 76 12 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 31 10 + vertex 0 53 12 + vertex 0 54 10 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 27 12 + vertex 0 53 12 + vertex 0 31 10 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 53 12 + vertex 0 27 12 + vertex 0 53 98 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 0 53 98 + vertex 0 27 12 + vertex 0 27 98 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 100 80 7 + vertex 100 80 0 + vertex 10 80 7 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 10 80 7 + vertex 0 80 40 + vertex 10 80 40 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 10 80 7 + vertex 0 80 0 + vertex 0 80 40 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 0 80 0 + vertex 10 80 7 + vertex 100 80 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 0 40 + vertex 10 0 7 + vertex 10 0 40 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 0 0 + vertex 10 0 7 + vertex 0 0 40 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 100 0 0 + vertex 10 0 7 + vertex 0 0 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 10 0 7 + vertex 100 0 0 + vertex 100 0 7 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 65 25 2 + vertex 65 55 7 + vertex 65 55 2 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 65 55 7 + vertex 65 25 2 + vertex 65 25 7 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 54 2 + vertex 5 31 2 + vertex 10 26 2 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 0 54 2 + vertex 5 31 2 + vertex 10 54 2 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 5 31 2 + vertex 0 54 2 + vertex 0 31 2 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 54 2 + vertex 65 55 2 + vertex 10 55 2 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 65 55 2 + vertex 10 54 2 + vertex 65 25 2 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 10 26 2 + vertex 65 25 2 + vertex 10 54 2 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 65 25 2 + vertex 10 26 2 + vertex 10 25 2 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 26 2 + vertex 5 31 2 + vertex 5 26 2 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 10 55 2 + vertex 65 55 7 + vertex 10 55 7 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 65 55 7 + vertex 10 55 2 + vertex 65 55 2 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 65 25 2 + vertex 10 25 7 + vertex 65 25 7 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 10 25 7 + vertex 65 25 2 + vertex 10 25 2 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 4 40 + vertex 10 2.95106 19.691 + vertex 10 4 12 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 4 40 + vertex 10 2.58778 20.809 + vertex 10 2.95106 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 4 40 + vertex 10 1.41221 20.809 + vertex 10 2.58778 20.809 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 0 40 + vertex 10 1.41221 20.809 + vertex 10 4 40 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 1.41221 20.809 + vertex 10 0 40 + vertex 10 1.04894 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 26 2 + vertex 10 25 7 + vertex 10 25 2 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 53 98 + vertex 10 51.9511 19.691 + vertex 10 53 12 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 53 98 + vertex 10 51.5878 20.809 + vertex 10 51.9511 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 53 98 + vertex 10 50.4122 20.809 + vertex 10 51.5878 20.809 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 29.5878 20.809 + vertex 10 50.4122 20.809 + vertex 10 53 98 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 50.4122 20.809 + vertex 10 29.5878 20.809 + vertex 10 50.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 50.0489 19.691 + vertex 10 29.5878 20.809 + vertex 10 29.9511 19.691 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 27 98 + vertex 10 29.5878 20.809 + vertex 10 53 98 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 29.5878 20.809 + vertex 10 27 98 + vertex 10 28.4122 20.809 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 28.4122 20.809 + vertex 10 27 98 + vertex 10 28.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 55 7 + vertex 10 54 2 + vertex 10 55 2 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 80 40 + vertex 10 78.9511 19.691 + vertex 10 80 7 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 80 40 + vertex 10 78.5878 20.809 + vertex 10 78.9511 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 80 40 + vertex 10 77.4122 20.809 + vertex 10 78.5878 20.809 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 76 40 + vertex 10 77.4122 20.809 + vertex 10 80 40 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 77.4122 20.809 + vertex 10 76 40 + vertex 10 77.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 76 12 + vertex 10 78.9511 19.691 + vertex 10 78 19 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 76 12 + vertex 10 78 19 + vertex 10 77.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 76 12 + vertex 10 77.0489 19.691 + vertex 10 76 40 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 78.9511 19.691 + vertex 10 76 12 + vertex 10 80 7 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 76 12 + vertex 10 55 7 + vertex 10 80 7 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 54 2 + vertex 10 55 7 + vertex 10 54 10 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 76 12 + vertex 10 54 10 + vertex 10 55 7 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 53 12 + vertex 10 54 10 + vertex 10 76 12 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 51 19 + vertex 10 53 12 + vertex 10 51.9511 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 50.0489 19.691 + vertex 10 53 12 + vertex 10 51 19 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 29.9511 19.691 + vertex 10 53 12 + vertex 10 50.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 27 12 + vertex 10 53 12 + vertex 10 29.9511 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 27 12 + vertex 10 29.9511 19.691 + vertex 10 29 19 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 27 12 + vertex 10 28.0489 19.691 + vertex 10 27 98 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 27 12 + vertex 10 29 19 + vertex 10 28.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 53 12 + vertex 10 27 12 + vertex 10 54 10 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 27 12 + vertex 10 26 10 + vertex 10 54 10 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 26 10 + vertex 10 25 7 + vertex 10 26 2 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 4 12 + vertex 10 26 10 + vertex 10 27 12 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 4 12 + vertex 10 25 7 + vertex 10 26 10 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 10 2 19 + vertex 10 4 12 + vertex 10 2.95106 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 1.04894 19.691 + vertex 10 4 12 + vertex 10 2 19 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 4 12 + vertex 10 0 7 + vertex 10 25 7 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 1.04894 19.691 + vertex 10 0 7 + vertex 10 4 12 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 10 0 7 + vertex 10 1.04894 19.691 + vertex 10 0 40 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 0 53 98 + vertex 10 27 98 + vertex 10 53 98 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 27 98 + vertex 0 53 98 + vertex 0 27 98 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 5 31 10 + vertex 10 26 10 + vertex 5 26 10 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 10 26 10 + vertex 5 31 10 + vertex 10 54 10 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 0 54 10 + vertex 5 31 10 + vertex 0 31 10 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 5 31 10 + vertex 0 54 10 + vertex 10 54 10 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 54 2 + vertex 10 54 10 + vertex 0 54 10 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 10 54 10 + vertex 0 54 2 + vertex 10 54 2 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 10 26 2 + vertex 5 26 10 + vertex 10 26 10 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 5 26 10 + vertex 10 26 2 + vertex 5 26 2 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 0 27 12 + vertex 10 4 12 + vertex 10 27 12 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 4 12 + vertex 0 27 12 + vertex 0 4 12 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 27 12 + vertex 10 27 98 + vertex 0 27 98 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 10 27 98 + vertex 0 27 12 + vertex 10 27 12 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 10 4 12 + vertex 0 4 40 + vertex 10 4 40 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 0 4 40 + vertex 10 4 12 + vertex 0 4 12 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 0 4 40 + vertex 10 0 40 + vertex 10 4 40 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 0 40 + vertex 0 4 40 + vertex 0 0 40 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 0 76 12 + vertex 10 53 12 + vertex 10 76 12 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 53 12 + vertex 0 76 12 + vertex 0 53 12 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 76 12 + vertex 10 76 40 + vertex 0 76 40 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 10 76 40 + vertex 0 76 12 + vertex 10 76 12 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 10 53 12 + vertex 0 53 98 + vertex 10 53 98 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 0 53 98 + vertex 10 53 12 + vertex 0 53 12 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 0 80 40 + vertex 10 76 40 + vertex 10 80 40 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 10 76 40 + vertex 0 80 40 + vertex 0 76 40 + endloop + endfacet + facet normal 0 -0.951052 -0.309032 + outer loop + vertex 5 2.95106 19.691 + vertex 10 2.58778 20.809 + vertex 5 2.58778 20.809 + endloop + endfacet + facet normal 0 -0.951052 -0.309032 + outer loop + vertex 10 2.58778 20.809 + vertex 5 2.95106 19.691 + vertex 10 2.95106 19.691 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 5 1.41221 20.809 + vertex 10 2.58778 20.809 + vertex 10 1.41221 20.809 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 10 2.58778 20.809 + vertex 5 1.41221 20.809 + vertex 5 2.58778 20.809 + endloop + endfacet + facet normal 0 0.951054 -0.309025 + outer loop + vertex 10 1.04894 19.691 + vertex 5 1.41221 20.809 + vertex 10 1.41221 20.809 + endloop + endfacet + facet normal 0 0.951054 -0.309025 + outer loop + vertex 5 1.41221 20.809 + vertex 10 1.04894 19.691 + vertex 5 1.04894 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 2.58778 20.809 + vertex 5 2 19 + vertex 5 2.95106 19.691 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 5 1.41221 20.809 + vertex 5 2 19 + vertex 5 2.58778 20.809 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 2 19 + vertex 5 1.41221 20.809 + vertex 5 1.04894 19.691 + endloop + endfacet + facet normal 0 -0.587793 0.809011 + outer loop + vertex 5 2.95106 19.691 + vertex 10 2 19 + vertex 10 2.95106 19.691 + endloop + endfacet + facet normal 0 -0.587793 0.809011 + outer loop + vertex 10 2 19 + vertex 5 2.95106 19.691 + vertex 5 2 19 + endloop + endfacet + facet normal -0 0.587793 0.809011 + outer loop + vertex 5 2 19 + vertex 10 1.04894 19.691 + vertex 10 2 19 + endloop + endfacet + facet normal 0 0.587793 0.809011 + outer loop + vertex 10 1.04894 19.691 + vertex 5 2 19 + vertex 5 1.04894 19.691 + endloop + endfacet + facet normal 0 -0.951047 -0.309048 + outer loop + vertex 5 29.9511 19.691 + vertex 10 29.5878 20.809 + vertex 5 29.5878 20.809 + endloop + endfacet + facet normal 0 -0.951047 -0.309048 + outer loop + vertex 10 29.5878 20.809 + vertex 5 29.9511 19.691 + vertex 10 29.9511 19.691 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 5 28.4122 20.809 + vertex 10 29.5878 20.809 + vertex 10 28.4122 20.809 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 10 29.5878 20.809 + vertex 5 28.4122 20.809 + vertex 5 29.5878 20.809 + endloop + endfacet + facet normal 0 0.951047 -0.309048 + outer loop + vertex 10 28.0489 19.691 + vertex 5 28.4122 20.809 + vertex 10 28.4122 20.809 + endloop + endfacet + facet normal 0 0.951047 -0.309048 + outer loop + vertex 5 28.4122 20.809 + vertex 10 28.0489 19.691 + vertex 5 28.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 29.5878 20.809 + vertex 5 29 19 + vertex 5 29.9511 19.691 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 5 28.4122 20.809 + vertex 5 29 19 + vertex 5 29.5878 20.809 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 29 19 + vertex 5 28.4122 20.809 + vertex 5 28.0489 19.691 + endloop + endfacet + facet normal 0 -0.587777 0.809023 + outer loop + vertex 5 29.9511 19.691 + vertex 10 29 19 + vertex 10 29.9511 19.691 + endloop + endfacet + facet normal 0 -0.587777 0.809023 + outer loop + vertex 10 29 19 + vertex 5 29.9511 19.691 + vertex 5 29 19 + endloop + endfacet + facet normal -0 0.587777 0.809023 + outer loop + vertex 5 29 19 + vertex 10 28.0489 19.691 + vertex 10 29 19 + endloop + endfacet + facet normal 0 0.587777 0.809023 + outer loop + vertex 10 28.0489 19.691 + vertex 5 29 19 + vertex 5 28.0489 19.691 + endloop + endfacet + facet normal 0 -0.951047 -0.309048 + outer loop + vertex 5 51.9511 19.691 + vertex 10 51.5878 20.809 + vertex 5 51.5878 20.809 + endloop + endfacet + facet normal 0 -0.951047 -0.309048 + outer loop + vertex 10 51.5878 20.809 + vertex 5 51.9511 19.691 + vertex 10 51.9511 19.691 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 5 50.4122 20.809 + vertex 10 51.5878 20.809 + vertex 10 50.4122 20.809 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 10 51.5878 20.809 + vertex 5 50.4122 20.809 + vertex 5 51.5878 20.809 + endloop + endfacet + facet normal 0 0.951047 -0.309048 + outer loop + vertex 10 50.0489 19.691 + vertex 5 50.4122 20.809 + vertex 10 50.4122 20.809 + endloop + endfacet + facet normal 0 0.951047 -0.309048 + outer loop + vertex 5 50.4122 20.809 + vertex 10 50.0489 19.691 + vertex 5 50.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 51.5878 20.809 + vertex 5 51 19 + vertex 5 51.9511 19.691 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 5 50.4122 20.809 + vertex 5 51 19 + vertex 5 51.5878 20.809 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 51 19 + vertex 5 50.4122 20.809 + vertex 5 50.0489 19.691 + endloop + endfacet + facet normal 0 -0.587777 0.809023 + outer loop + vertex 5 51.9511 19.691 + vertex 10 51 19 + vertex 10 51.9511 19.691 + endloop + endfacet + facet normal 0 -0.587777 0.809023 + outer loop + vertex 10 51 19 + vertex 5 51.9511 19.691 + vertex 5 51 19 + endloop + endfacet + facet normal -0 0.587777 0.809023 + outer loop + vertex 5 51 19 + vertex 10 50.0489 19.691 + vertex 10 51 19 + endloop + endfacet + facet normal 0 0.587777 0.809023 + outer loop + vertex 10 50.0489 19.691 + vertex 5 51 19 + vertex 5 50.0489 19.691 + endloop + endfacet + facet normal 0 -0.951047 -0.309048 + outer loop + vertex 5 78.9511 19.691 + vertex 10 78.5878 20.809 + vertex 5 78.5878 20.809 + endloop + endfacet + facet normal 0 -0.951047 -0.309048 + outer loop + vertex 10 78.5878 20.809 + vertex 5 78.9511 19.691 + vertex 10 78.9511 19.691 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 5 77.4122 20.809 + vertex 10 78.5878 20.809 + vertex 10 77.4122 20.809 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 10 78.5878 20.809 + vertex 5 77.4122 20.809 + vertex 5 78.5878 20.809 + endloop + endfacet + facet normal 0 0.951047 -0.309048 + outer loop + vertex 10 77.0489 19.691 + vertex 5 77.4122 20.809 + vertex 10 77.4122 20.809 + endloop + endfacet + facet normal 0 0.951047 -0.309048 + outer loop + vertex 5 77.4122 20.809 + vertex 10 77.0489 19.691 + vertex 5 77.0489 19.691 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 78.5878 20.809 + vertex 5 78 19 + vertex 5 78.9511 19.691 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 5 77.4122 20.809 + vertex 5 78 19 + vertex 5 78.5878 20.809 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 78 19 + vertex 5 77.4122 20.809 + vertex 5 77.0489 19.691 + endloop + endfacet + facet normal 0 -0.587777 0.809023 + outer loop + vertex 5 78.9511 19.691 + vertex 10 78 19 + vertex 10 78.9511 19.691 + endloop + endfacet + facet normal 0 -0.587777 0.809023 + outer loop + vertex 10 78 19 + vertex 5 78.9511 19.691 + vertex 5 78 19 + endloop + endfacet + facet normal -0 0.587777 0.809023 + outer loop + vertex 5 78 19 + vertex 10 77.0489 19.691 + vertex 10 78 19 + endloop + endfacet + facet normal 0 0.587777 0.809023 + outer loop + vertex 10 77.0489 19.691 + vertex 5 78 19 + vertex 5 77.0489 19.691 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 5 26 10 + vertex 5 31 2 + vertex 5 31 10 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 5 31 2 + vertex 5 26 10 + vertex 5 26 2 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 5 31 2 + vertex 0 31 10 + vertex 5 31 10 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 0 31 10 + vertex 5 31 2 + vertex 0 31 2 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 28 85 10 + vertex 28 91 0 + vertex 28 91 10 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 28 91 0 + vertex 28 85 10 + vertex 28 85 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 0 91 10 + vertex 28 85 10 + vertex 28 91 10 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 28 85 10 + vertex 0 91 10 + vertex 0 85 10 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 0 85 0 + vertex 28 91 0 + vertex 28 85 0 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 28 91 0 + vertex 0 85 0 + vertex 0 91 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 0 85 0 + vertex 0 91 10 + vertex 0 91 0 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 0 91 10 + vertex 0 85 0 + vertex 0 85 10 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 28 91 0 + vertex 0 91 10 + vertex 28 91 10 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 0 91 10 + vertex 28 91 0 + vertex 0 91 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 0 85 0 + vertex 28 85 10 + vertex 0 85 10 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 28 85 10 + vertex 0 85 0 + vertex 28 85 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/ci/hardware_tests/tpmb/model/default.nix b/ci/hardware_tests/tpmb/model/default.nix new file mode 100644 index 000000000..c802a88cf --- /dev/null +++ b/ci/hardware_tests/tpmb/model/default.nix @@ -0,0 +1,5 @@ +with import {}; +stdenv.mkDerivation rec { + name = "tpmb-model"; + buildInputs = [ openscad prusa-slicer ]; +}