Ergogen Split Typematrix 2022 initial work

This commit is contained in:
Tilman Baumann 2023-05-04 20:47:15 +01:00
parent fc3018e56b
commit 9d93302eae
22 changed files with 3868 additions and 1202 deletions

View File

@ -10,17 +10,17 @@ setup:
npm install
# outputs from
output/pcbs/board.kicad_pcb output/pcbs/top_plate.kicad_pcb output/pcbs/bottom_plate.kicad_pcb &: samoklava.yaml
output/pcbs/left.kicad_pcb output/pcbs/right.kicad_pcb &: input/config.yaml
npm run gen
output/pcbs/%.dsn: output/pcbs/%.kicad_pcb
# file can not be present or the script will refuse to run
if [ -f "$@" ] ; then rm $@ ; fi
if [ -f "$@" ] ; then rm -f $@ ; fi
${container_cmd} run ${container_args} soundmonster/kicad-automation-scripts:latest /usr/lib/python2.7/dist-packages/kicad-automation/pcbnew_automation/export_dsn.py $< $@
output/routed_pcbs/%.ses: output/pcbs/%.dsn
mkdir -p $(shell dirname $@)
${container_cmd} run ${container_args} soundmonster/freerouting_cli:v0.1.0 java -jar /opt/freerouting_cli.jar -de $< -do $@
${container_cmd} run ${container_args} soundmonster/freerouting_cli:v0.1.0 java -jar /opt/freerouting_cli.jar -ap 10 -mt 26 -de $< -do $@
output/routed_pcbs/%.kicad_pcb: output/routed_pcbs/%.ses output/pcbs/%.kicad_pcb
mkdir -p $(shell dirname $@)
@ -40,6 +40,14 @@ output/routed_pcbs/%-back.png: output/routed_pcbs/%.kicad_pcb
mkdir -p $(shell dirname $@)
${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 pcbdraw -b --style builtin:oshpark-afterdark.json $< $@
output/pcbs/%-front.png: output/pcbs/%.kicad_pcb
mkdir -p $(shell dirname $@)
${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 pcbdraw --style builtin:oshpark-afterdark.json $< $@
output/pcbs/%-back.png: output/pcbs/%.kicad_pcb
mkdir -p $(shell dirname $@)
${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 pcbdraw -b --style builtin:oshpark-afterdark.json $< $@
output/gerbers/%/gerbers.zip: output/routed_pcbs/%.kicad_pcb
mkdir -p $(shell dirname $@)
${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 kikit fab jlcpcb --no-assembly $< $(shell dirname $@)
@ -48,9 +56,16 @@ clean:
rm -rf output
all: \
output/routed_pcbs/board-front.png \
output/routed_pcbs/board-back.png \
output/gerbers/top_plate/gerbers.zip \
output/gerbers/bottom_plate/gerbers.zip \
output/gerbers/board/gerbers.zip
output/routed_pcbs/left-front.png \
output/routed_pcbs/left-back.png \
output/routed_pcbs/right-front.png \
output/routed_pcbs/right-back.png \
output/gerbers/left/gerbers.zip \
output/gerbers/right/gerbers.zip
preview: \
output/pcbs/left-front.png \
output/pcbs/left-back.png \
output/pcbs/right-front.png \
output/pcbs/right-back.png \

View File

@ -1,42 +1,48 @@
# samoklava
## An autogenerated split 36 key keyboard
# Split Typematrix 2022
## A Typematrix 2022 style autogenerated keyboard
## Disclaimer
This is an early experimental prototype. Please do not rely on the autogenerated files and double check them manually
before sending them off to a PCB fab. The author and other random strangers on the internet have been able to produce
working keyboard prototypes from this repo; this does not mean that everything will work every time.
The author(s) waive(s) responsibility for any damage or regulatory violations caused by using this software (see
license). Please consult your local regulations around radio frequencies and what's allowed for DIY projects in your
country.
## Layout
The Typematrix 2022 was one of the first ortholinear ergo keyboards and arguably the best layout ever made `[citation needed]`
See [An evaluation of the TypeMatrix ergonomic keyboard](http://www.typematrix.com/documents/TypeMatrix_study.pdf)
left | right
-|-
![left](images/board-front.png) | ![right](images/board-back.png)
![left](images/left-front.png) | ![right](images/right-front.png)
backside|backside
![left bottom](images/left-back.png) | ![right bottom](images/right-back.png)
A 5x3 split keyboard with 3 thumb keys. There is nothing unique about the keyboard layout. It's inspired by Corne and
Kyria, and has the exact number of keys needed for the [Miryoku](https://github.com/manna-harbour/miryoku) layout.
The interesting thing about this keyboard is that it's a declarative design:
* Layout is declared using [Ergogen](https://github.com/mrzealot/ergogen/). See [this fork](https://github.com/soundmonster/ergogen).
* Layout is declared using [Ergogen](https://github.com/mrzealot/ergogen/).
* The build system uses Ergogen to translate YAML to a KiCad PCB and plate files for FR-4 fab or laser cutting
* uses [kicad-automation-scripts](https://github.com/productize/kicad-automation-scripts) and [FreeRouting](https://github.com/freerouting/freerouting) to **automatically route the traces on the PCB**
* uses [KiKit](https://github.com/yaqwsx/KiKit) to render PCB previews (see top of this file) and production-ready **Gerber files**
## Features
* Extra pins and a slider switch for battery for wireless Promicro clones (tested with nice!nano); the slider can be
shorted with a jumper if `CONFIG_ZMK_SLEEP` is preferred.
* Wired operation with QMK should be possible but is not tested; TRRS footprints are included and routed. The pinout is
identical with a five-column Corne sans the RGBLEDs.
* Reset switches are easily accessible. The footprints used are the same as on the Corne.
* **Typematrix 2022** inspired split layout
* **Kailh Choc PG1232** choc mini, ulta low profile key switches
* [Nice!nano](https://nicekeyboards.com/nice-nano) optimised, but any promicro should work (bottom up)
* [Nice!view](https://nicekeyboards.com/nice-view) support
## Todo
* Remove clutter and unnecesary outlines
* Top plate generation
* Bottom Plate (Thick PCB with cutouts for all components placed at the bottom. Optimised for maximum thinness)
* Remove or document magic numbers
* Backlight
* 3D models for 2x1.5u big enter key caps
* SMD diodes
* Better nice!nano footprint, steal from https://github.com/bstiq/nice-nano-kicad
* Middle bracked PCB with touchpad (Holds both halves together rigidly)
* Align board edges with actual keycap size
## How to
If you would like to modify this:
* fork it
* change `samoklava.yaml` to your liking
* change `input/config.yaml` to your liking
* push your changes; the `build.yml` GitHub Workflow will pick it up, autoroute and generate Gerbers, all in a zip file.
See https://github.com/soundmonster/samoklava/actions
* or:
@ -45,4 +51,13 @@ If you would like to modify this:
* check the `output` folder for KiCad PCBs and Gerbers
See the [workflow](.github/workflows/build.yml) or the [Makefile](Makefile) for more details.
See [my ZMK config](https://github.com/soundmonster/samoklava-zmk-config) for a suggested keymap.
## Disclaimer
**Work in progress!**
Based on the work of Soundmonster https://github.com/soundmonster/samoklava/
Requires ergogen 4.x
Only connect battery if a nice!nano board is used!

Binary file not shown.

Before

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

BIN
images/left-back.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

BIN
images/left-front.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

BIN
images/right-back.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

BIN
images/right-front.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

560
input/config.yaml Normal file
View File

@ -0,0 +1,560 @@
units:
kx: cx
ky: cy
px: cx
py: cy
kxo: 0.5 * cx
kyo: 0.5 * cy
# Font units
font_x: 1
font_y: 1
font_xo: 0.5 font_x
font_yo: 0.5 * font_y
# Nice Nano
# The nice nano footprint's center doesn't account
# for the 2.54mm "overhang" of the PCB beyond the pins.
mcu_overhang_y: 2.54
mcu_spacing_x: 2.72
mcu_x: 17.78 + mcu_spacing_x
mcu_y: 30.48 + mcu_overhang_y
mcu_xo: 0.5 * mcu_x
mcu_yo: 0.5 * mcu_y + 0.5 * mcu_overhang_y
# Nice!View display
disp_x: 14
disp_y: 36
disp_jumper_y: 2.6
disp_xo: 0.5 * disp_x
disp_yo: 0.5 * disp_y
# Battery Connector
batc_x: 4.3
batc_y: 4.6
batc_xo: 0.5 * batc_x
batc_yo: 0.5 * batc_y
# Battery Pads
batp_x: 3.75
batp_y: 2.5
batp_xo: 0.5 * batp_x
batp_yo: 0.5 * batp_y
# Power Switch
sw_power_x: 3.1
sw_power_y: 8.3
sw_power_xo: 0.5 * sw_power_x
sw_power_yo: 0.5 * sw_power_y
# Reset Switch
sw_reset_x: 3.4
sw_reset_y: 5
sw_reset_xo: 0.5 * sw_reset_x
sw_reset_yo: 0.5 * sw_reset_y
points:
key:
padding: ky
spread: kx
width: kx
height: ky
zones:
matrix:
# Fix placement on KiCAD sheet.
anchor:
shift: [35, -100]
key.tags: key
columns:
left:
key:
spread: cx * 0.25
width: cx * 1.5
asym: left
column_net: C0
q:
key:
spread: cx * 1.25
column_net: C1
w:
key.column_net: C2
e:
key.column_net: C3
r:
key.column_net: C4
t:
key.column_net: C5
rows:
bottom:
row_net: R4
home:
row_net: R3
top:
row_net: R2
num:
row_net: R1
f:
row_net: R0
leftcluster:
key:
spread: cx * 1.5
width: cx * 1.5
kx: cx * 1.5
asym: left
tags: key
anchor:
ref: matrix_left_bottom
shift: [0, -2cy]
columns:
one:
key.column_net: C0
two:
key.column_net: C1
three:
key.column_net: C2
rows:
down:
row_net: R7
up:
row_net: R6
rightcluster:
key:
asym: right
tags: key
anchor:
ref: matrix_left_bottom
shift: [0.25 * cx, -2cy]
columns:
one:
key.column_net: C0
two:
key.column_net: C1
three:
key.column_net: C2
rows:
down:
row_net: R7
up:
row_net: R7
bigenters:
key:
spread: cx * 1.5
width: cx * 1.5
kx: cx * 1.5
padding: 2cy
height: 2cy
tags: [key, enter]
anchor:
ref: matrix_t_top
shift: [cx * 1.25, -1.5cy]
columns:
one:
key.column_net: C6
rows:
enter:
row_net: R2
back:
padding: cy * 1.5
row_net: R1
f:
height: cy
tags: key
row_net: R0
spaces:
key.tags: key
anchor:
ref: leftcluster_three_up
shift: [0.25 * cx , 0]
columns:
alt:
key:
asym: right
column_net: C3
space:
key:
width: 3.5cx
spread: 2.25cx
column_net: C4
tags: [key,space]
rows:
space:
row_net: R6
rightsym:
anchor:
ref: matrix_q_bottom
shift: [-cx, 0]
key:
asym: right
tags: key
columns:
sym:
key.column_net: C0
rows:
bottom:
row_net: R4
home:
row_net: R3
top:
row_net: R2
num:
row_net: R1
f:
row_net: R0
right:
anchor:
ref: rightsym_sym_bottom
shift: [-cx * 1.25 , -2cy]
key:
asym: right
spread: cx * 1.5
width: cx * 1.5
kx: cx * 1.5
tags: key
columns:
sym:
key.column_net: C7
rows:
ctl_down:
row_net: R6
ctl_up:
row_net: R5
bottom:
row_net: R4
home:
row_net: R3
top:
row_net: R2
num:
row_net: R1
f:
row_net: R0
#
# Controller
#
controller:
anchor:
ref: bigenters_one_f
shift: [0.75 * kx + mcu_xo, kyo -2.25 - mcu_yo]
key:
name: mcu
width: mcu_x
height: mcu_y
mirror: &mirror
ref: bigenters_one_f
distance: 100
outlines:
keys:
- what: rectangle
where: [key]
size: [kx - 3, ky - 5] # FIXME hole sizes
plateoutline:
- what: polygon
operation: stack
fillet: 2
points:
- ref: matrix_left_f
shift: [-cx * 0.75, cy * 0.5]
- ref: bigenters_one_f
shift: [cx * 0.75, cy * 0.5]
- ref: spaces_space_space
shift: [cx * 1.75, -cy * 0.5]
- ref: leftcluster_three_down
shift: [cx * 0.75 , cy * 0.5]
- ref: leftcluster_three_down
shift: [cx * 0.75 , -cy * 0.5]
- ref: leftcluster_one_down
shift: [-cx * 0.75, -cy * 0.5]
mirrorplateoutline:
- what: polygon
operation: stack
fillet: 2
points:
- ref: mirror_rightsym_sym_f
shift: [-cx * 2, cy * 0.5]
- ref: mirror_bigenters_one_f
shift: [cx * 0.75, cy * 0.5]
- ref: mirror_spaces_space_space
shift: [cx * 1.75, -cy * 0.5]
- ref: mirror_rightcluster_three_down
shift: [cx * 0.75 , cy * 0.5]
- ref: mirror_rightcluster_three_down
shift: [cx * 0.75 , -cy * 0.5]
- ref: mirror_rightcluster_one_down
shift: [-cx * 2, -cy * 0.5]
# Combination preview showing outline and keys.
topleft:
- name: plateoutline
- operation: subtract
name: keys
topright:
- name: mirrorplateoutline
- operation: subtract
name: keys
mcuears:
- what: rectangle
size: [mcu_x +10 , 6cy]
fillet: 2
pcb_left:
- name: plateoutline
- operation: add
name: mcuears
where:
ref: bigenters_one_f
shift: [0.75 * cx + mcu_x/2 -5, -2.5cy ]
pcb_right:
- name: mirrorplateoutline
- operation: add
name: mcuears
where:
ref: mirror_bigenters_one_f
shift: [0.75 * cx + mcu_x/2 -5 , -2.5cy ]
toprightpcb:
- name: pcb_right
- operation: subtract
name: keys
topleftpcb:
- name: pcb_left
- operation: subtract
name: keys
all:
- name: topleftpcb
- operation: stack
name: toprightpcb
pcb_both:
- name: pcb_left
- operation: stack
name: pcb_right
pcbs:
left:
outlines:
left:
outline: pcb_left
footprints:
choc:
what: chocmini
where:
- /^matrix_.*/
- /leftcluster_.*/
- [/^bigenters_.*/, key, -enter]
- /^spaces_.*/
params:
keycaps: true
reverse: false
from: "{{colrow}}"
to: "{{column_net}}"
choc_enter:
what: chocmini
where:
- [/^bigenters_.*/, enter]
params:
keycaps: true
reverse: false
from: "{{colrow}}"
to: "{{column_net}}"
adjust:
rotate: 90
diode:
what: diode
where:
- /^matrix_.*/
- /leftcluster_.*/
- /^bigenters_.*/
- /^spaces_.*/
params:
from: "{{colrow}}"
to: "{{row_net}}"
adjust:
shift: [-8, 0]
rotate: 270
# Controller Area
promicro:
what: promicro
params:
# Pin Assignments (Controller on top facing down)
# Right Side
P0: 'DPD' # Display Data
P1: 'DPC' # Display Clock
# GND
# GND
P2: 'DPE' # Display CS (nice!view only) FIXME? ZPM default?
P3: 'R1' # Row
P4: 'R2' # Row
P5: 'R3' # Row
P6: 'R4' # Row
P7: 'R5' # Row
P8: 'R6' # Row
P9: 'R7' # Row
# Left Side
RAW: 'BAT_P' # Battery Pos
# GND # Ground / Battery Neg
# RST # Reset pin
# VCC # External Power
P21: 'C0' # Column
P20: 'C1' # Column
P19: 'C2' # Column
P18: 'C3' # Column
P15: 'C4' # Column
P14: 'C5' # Column
P16: 'C6' # Column
P10: 'F10' # Free
where:
ref: mcu
shift: [0,0]
rotate: -90
display:
what: nice_view
params:
reverse: true
MOSI: DPD
SCK: DPC
CS: DPE
show_labels: false
jumpers_at_bottom: false
where:
ref: mcu
shift: [0, -1] # Move the display down a bit to be sure the cable fits between the headers
pads_bat:
what: jstph
params:
pos: BAT_P
neg: GND
where:
ref: mcu
shift: [-batc_x, -mcu_y/2 - 5]
#rotate: 270
reset:
what: button
params:
from: GND
to: RST
where:
ref: mcu
shift: [batc_x, -mcu_y/2 - 8]
right:
outlines:
right:
outline: pcb_right
footprints:
choc:
what: chocmini
where:
- [/^mirror.*/, key, -enter]
- /rightcluster_.*/
params:
keycaps: true
reverse: false
from: "{{colrow}}"
to: "{{column_net}}"
choc_enter:
what: chocmini
where:
- [/^mirror.*/, key, enter]
params:
keycaps: true
reverse: false
from: "{{colrow}}"
to: "{{column_net}}"
adjust:
rotate: 270
diode:
what: diode
where:
- [/^mirror.*/, key ]
- /rightcluster_.*/
params:
from: "{{colrow}}"
to: "{{row_net}}"
adjust:
shift: [-8, 0]
rotate: 90
# Controller Area
promicro:
what: promicro
params:
# Pin Assignments (Controller on top facing down)
# Right Side
P0: 'DPD' # Display Data
P1: 'DPC' # Display Clock
# GND
# GND
P2: 'DPE' # Display CS (nice!view only) FIXME? ZPM default?
P3: 'R1' # Row
P4: 'R2' # Row
P5: 'R3' # Row
P6: 'R4' # Row
P7: 'R5' # Row
P8: 'R6' # Row
P9: 'R7' # Row
# Left Side
RAW: 'BAT_P' # Battery Pos
# GND # Ground / Battery Neg
# RST # Reset pin
# VCC # External Power
P21: 'C0' # Column
P20: 'C1' # Column
P19: 'C2' # Column
P18: 'C3' # Column
P15: 'C4' # Column
P14: 'C5' # Column
P16: 'C6' # Column
P10: 'C7' # Column
where:
ref: mirror_mcu
shift: [0,0]
rotate: 90
display:
what: nice_view
params:
reverse: true
MOSI: DPD
SCK: DPC
CS: DPE
show_labels: false
jumpers_at_bottom: false
where:
ref: mirror_mcu
shift: [0, -1] # Move the display down a bit to be sure the cable fits between the headers
pads_bat:
what: jstph
params:
pos: BAT_P
neg: GND
where:
ref: mirror_mcu
shift: [-batc_x, -mcu_y/2 - 5]
#rotate: 270
reset:
what: button
params:
from: GND
to: RST
where:
ref: mirror_mcu
shift: [batc_x, -mcu_y/2 - 8]

199
input/footprints/choc.js Normal file
View File

@ -0,0 +1,199 @@
// Kailh Choc PG1350
// Nets
// from: corresponds to pin 1
// to: corresponds to pin 2
// Params
// hotswap: default is false
// if true, will include holes and pads for Kailh choc hotswap sockets
// reverse: default is false
// if true, will flip the footprint such that the pcb can be reversible
// keycaps: default is false
// if true, will add choc sized keycap box around the footprint
//
// note: hotswap and reverse can be used simultaneously
//
// Changes compared to original ergogen footprint:
// - Added hotswap socket outlines to silk screen
// - Moved switch corner marks from user layer to silk screen
// - Added option to show 1.5u keycap outline
// - Changed keycap outline to show the exact choc keycap dimensions instead of padded dimensions (17.5mm length vs 18mm)
module.exports = {
params: {
designator: 'S',
hotswap: false,
hotswap_tht: false,
reverse: false,
keycaps: false,
keycaps_x: 18,
keycaps_y: 17,
show_1_5u_outline: false,
from: undefined,
to: undefined
},
body: p => {
const keycap_xo = 0.5 * p.keycaps_x;
const keycap_yo = 0.5 * p.keycaps_y;
const standard = `
(module PG1350 (layer F.Cu) (tedit 5DD50112)
${p.at /* parametric position */}
(attr virtual)
${'' /* footprint reference */}
(fp_text reference "${p.ref}" (at 0 0) (layer F.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15))))
(fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
${''/* corner marks - front */}
(fp_line (start -7 -6) (end -7 -7) (layer F.SilkS) (width 0.15))
(fp_line (start -7 7) (end -6 7) (layer F.SilkS) (width 0.15))
(fp_line (start -6 -7) (end -7 -7) (layer F.SilkS) (width 0.15))
(fp_line (start -7 7) (end -7 6) (layer F.SilkS) (width 0.15))
(fp_line (start 7 6) (end 7 7) (layer F.SilkS) (width 0.15))
(fp_line (start 7 -7) (end 6 -7) (layer F.SilkS) (width 0.15))
(fp_line (start 6 7) (end 7 7) (layer F.SilkS) (width 0.15))
(fp_line (start 7 -7) (end 7 -6) (layer F.SilkS) (width 0.15))
${''/* corner marks - back */}
(fp_line (start -7 -6) (end -7 -7) (layer B.SilkS) (width 0.15))
(fp_line (start -7 7) (end -6 7) (layer B.SilkS) (width 0.15))
(fp_line (start -6 -7) (end -7 -7) (layer B.SilkS) (width 0.15))
(fp_line (start -7 7) (end -7 6) (layer B.SilkS) (width 0.15))
(fp_line (start 7 6) (end 7 7) (layer B.SilkS) (width 0.15))
(fp_line (start 7 -7) (end 6 -7) (layer B.SilkS) (width 0.15))
(fp_line (start 6 7) (end 7 7) (layer B.SilkS) (width 0.15))
(fp_line (start 7 -7) (end 7 -6) (layer B.SilkS) (width 0.15))
${''/* middle shaft */}
(pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask))
${''/* stabilizers */}
(pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
(pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask))
`
const hotswap = `
${''/* Middle hole for hot swap sockets */}
(pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask))
`
const hotswap_tht = `
(pad 2 thru_hole circle (at 0 5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.to.str})
`
const tht = `
(pad 2 thru_hole circle (at 0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.to.str})
`
const keycap = `
${'' /* keycap marks - 1u */}
(fp_line (start ${ -keycap_xo } ${ -keycap_yo }) (end ${ keycap_xo } ${ -keycap_yo }) (layer Dwgs.User) (width 0.15))
(fp_line (start ${ keycap_xo } ${ -keycap_yo }) (end ${ keycap_xo } ${ keycap_yo }) (layer Dwgs.User) (width 0.15))
(fp_line (start ${ keycap_xo } ${ keycap_yo }) (end ${ -keycap_xo } ${ keycap_yo }) (layer Dwgs.User) (width 0.15))
(fp_line (start ${ -keycap_xo } ${ keycap_yo }) (end ${ -keycap_xo } ${ -keycap_yo }) (layer Dwgs.User) (width 0.15))
`
function pins(def_neg, def_pos, def_side) {
let pad_1 = `
(pad 1 connect custom (at ${def_neg}3.275 -5.95 ${p.rot}) (size 0.5 0.5) (layers ${def_side}.Cu ${def_side}.Mask)
(zone_connect 0)
(options (clearance outline) (anchor rect))
(primitives
(gr_poly (pts
(xy -1.3 -1.3) (xy -1.3 1.3) (xy 0.05 1.3) (xy 1.3 0.25) (xy 1.3 -1.3)
) (width 0))
) ${p.from.str})
`;
if(def_side == 'B') {
pad_1 = `
(pad 1 connect custom (at ${def_neg}3.275 -5.95 ${p.rot}) (size 0.5 0.5) (layers ${def_side}.Cu ${def_side}.Mask)
(zone_connect 0)
(options (clearance outline) (anchor rect))
(primitives
(gr_poly (pts
(xy -1.3 -1.3) (xy -1.3 0.25) (xy -0.05 1.3) (xy 1.3 1.3) (xy 1.3 -1.3)
) (width 0))
) ${p.from.str})
`
}
const hotswap = `
${'' /* holes */}
(pad "" np_thru_hole circle (at ${def_pos}5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask))
${'' /* net pads */}
${pad_1}
(pad 2 smd rect (at ${def_pos}8.275 -3.75 ${p.rot}) (size 2.6 2.6) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.to.str})
${''/* hotswap outline - front */}
(fp_line (start -2 -6.7) (end -2 -7.7) (layer "F.SilkS") (width 0.15) (tstamp 1da291cc-3aa5-4632-8f99-7dae246a7f56))
(fp_line (start -7 -1.5) (end -7 -2) (layer "F.SilkS") (width 0.15) (tstamp 238b4f36-a253-431c-a93e-34af7da002ac))
(fp_line (start -7 -6.2) (end -2.5 -6.2) (layer "F.SilkS") (width 0.15) (tstamp 4bee3b93-9a25-4a62-bc3b-7a216b6aba9d))
(fp_line (start -2.5 -2.2) (end -2.5 -1.5) (layer "F.SilkS") (width 0.15) (tstamp 5193b92c-0f95-414f-9c12-4288fbf1289f))
(fp_line (start -7 -5.6) (end -7 -6.2) (layer "F.SilkS") (width 0.15) (tstamp 7b669a9c-8885-4737-8192-e35d45fe2c93))
(fp_line (start -1.5 -8.2) (end -2 -7.7) (layer "F.SilkS") (width 0.15) (tstamp 7e881b05-98b1-4290-99fa-d895271485f2))
(fp_line (start -2.5 -1.5) (end -7 -1.5) (layer "F.SilkS") (width 0.15) (tstamp 8ef8ab63-d78b-49e0-89aa-d7de17fdbe74))
(fp_line (start 2 -7.7) (end 1.5 -8.2) (layer "F.SilkS") (width 0.15) (tstamp 9b4b514c-b288-40ab-af4d-fb8827371f01))
(fp_line (start 1.5 -3.7) (end -1 -3.7) (layer "F.SilkS") (width 0.15) (tstamp 9d6f01bf-507b-4b70-82a7-182a04da9e3f))
(fp_line (start 1.5 -8.2) (end -1.5 -8.2) (layer "F.SilkS") (width 0.15) (tstamp c1815e63-5999-4d25-8dc0-c63ae372e426))
(fp_line (start 2 -4.2) (end 1.5 -3.7) (layer "F.SilkS") (width 0.15) (tstamp d868ec48-42f4-4608-baef-8e135bf87a69))
(fp_arc (start -0.91 -2.11) (end -0.8 -3.7) (angle -90) (layer F.SilkS) (width 0.15))
(fp_arc (start -2.55 -6.75) (end -2.52 -6.2) (angle -90) (layer F.SilkS) (width 0.15))
${''/* hotswap outline - back */}
(fp_line (start -1.5 -3.7) (end 1 -3.7) (layer "B.SilkS") (width 0.15) (tstamp 0ebc7e3d-c040-4c6e-aaf8-1870c68a4ff3))
(fp_line (start 2 -6.7) (end 2 -7.7) (layer "B.SilkS") (width 0.15) (tstamp 119cd2ee-6025-406f-acfc-adcac3592135))
(fp_line (start -2 -4.2) (end -1.5 -3.7) (layer "B.SilkS") (width 0.15) (tstamp 21f7e9f1-0a4c-49be-a4ca-8c8253ab27e6))
(fp_line (start 1.5 -8.2) (end 2 -7.7) (layer "B.SilkS") (width 0.15) (tstamp 5d8b52e3-6cf3-4957-a7be-c8e9a1edb540))
(fp_line (start -2 -7.7) (end -1.5 -8.2) (layer "B.SilkS") (width 0.15) (tstamp 6752af1f-7117-4db8-a4d6-67772bc5edb1))
(fp_line (start -1.5 -8.2) (end 1.5 -8.2) (layer "B.SilkS") (width 0.15) (tstamp 6a9026f4-97ad-4ca6-b8a7-4b78e7eaa11b))
(fp_line (start 2.5 -2.2) (end 2.5 -1.5) (layer "B.SilkS") (width 0.15) (tstamp 7982b0aa-ef8e-47f9-a2a9-295924d921de))
(fp_line (start 2.5 -1.5) (end 7 -1.5) (layer "B.SilkS") (width 0.15) (tstamp 9ceea79f-ef80-4e41-a251-1e78376f0a53))
(fp_line (start 7 -5.6) (end 7 -6.2) (layer "B.SilkS") (width 0.15) (tstamp a587fbd2-119d-431c-964c-d65c1fee09ba))
(fp_line (start 7 -1.5) (end 7 -2) (layer "B.SilkS") (width 0.15) (tstamp aede887e-5713-4410-b301-8003185f738f))
(fp_line (start 7 -6.2) (end 2.5 -6.2) (layer "B.SilkS") (width 0.15) (tstamp c0ed410a-0280-4a8c-8ff3-f58b7b1340fc))
(fp_arc (start 0.97 -2.17) (end 2.5 -2.17) (angle -90) (layer B.SilkS) (width 0.15))
(fp_arc (start 2.499999 -6.7) (end 2 -6.690001) (angle -88.9) (layer B.SilkS) (width 0.15))
`;
const tht = `
${''/* pins */}
(pad 1 thru_hole circle (at ${def_pos}5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.from.str})
`
const hotswap_tht = `
${''/* pins - with inverse y direction */}
(pad 1 thru_hole circle (at ${def_pos}5 3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.from.str})
`
let final = '';
if(p.hotswap) {
final += hotswap;
if(p.hotswap_tht) {
final += hotswap_tht;
}
} else {
final += tht;
}
return final;
}
if(p.reverse) {
return `
${standard}
${p.keycaps ? keycap : ''}
${p.hotswap ? hotswap : tht}
${p.hotswap && p.hotswap_tht ? hotswap_tht : ''}
${pins('-', '', 'B')}
${pins('', '-', 'F')})
`
} else {
return `
${standard}
${p.keycaps ? keycap : ''}
${pins('-', '', 'B')})
`
}
}
}

53
input/footprints/diode.js Normal file
View File

@ -0,0 +1,53 @@
module.exports = {
params: {
designator: 'D',
include_tht: true,
from: undefined,
to: undefined
},
body: p => {
const tht = `
(pad 1 thru_hole rect (at -3.81 0 ${p.rot}) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) ${p.to.str})
(pad 2 thru_hole circle (at 3.81 0 ${p.rot}) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) ${p.from.str})
`;
const footprint = `
(module ComboDiode (layer F.Cu) (tedit 5B24D78E)
${p.at /* parametric position */}
(attr virtual)
${'' /* footprint reference */}
(fp_text reference "${p.ref}" (at 0 0) (layer F.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15))))
(fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15))))
${''/* diode symbols */}
(fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1))
(fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1))
(fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1))
(fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1))
(fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1))
(fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1))
(fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1))
(fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1))
(fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1))
(fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1))
(fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1))
(fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1))
(fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1))
(fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1))
${''/* SMD pads on both sides */}
(pad 1 smd rect (at -1.65 0 ${p.rot}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.to.str})
(pad 2 smd rect (at 1.65 0 ${p.rot}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.from.str})
(pad 1 smd rect (at -1.65 0 ${p.rot}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.to.str})
(pad 2 smd rect (at 1.65 0 ${p.rot}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.from.str})
${''/* THT terminals */}
${ p.include_tht ? tht : '' }
)
`
return footprint;
}
}

View File

@ -0,0 +1,56 @@
module.exports = {
params: {
designator: 'ICON',
side: 'F',
reverse: false,
spacing: 1
},
body: p => {
const spacing_adj = p.spacing / 2;
const top = `
(module icon_bat (layer F.Cu) (tedit 64461058)
${p.at /* parametric position */}
(attr virtual)
`;
const front = `
(fp_text reference "${p.ref}" (at 0 3 ${p.rot}) (layer F.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_circle (center ${-0.55 - spacing_adj} 0) (end ${-0.05 - spacing_adj} 0) (layer F.SilkS) (width 0.1))
(fp_line (start ${-0.55 - spacing_adj} -0.3) (end ${-0.55 - spacing_adj} 0.3) (layer F.SilkS) (width 0.1))
(fp_line (start ${-0.85 - spacing_adj} 0) (end ${-0.25 - spacing_adj} 0) (layer F.SilkS) (width 0.1))
(fp_circle (center ${0.55 + spacing_adj} 0) (end ${1.05 + spacing_adj} 0) (layer F.SilkS) (width 0.1))
(fp_line (start ${0.25 + spacing_adj} 0) (end ${0.85 + spacing_adj} 0) (layer F.SilkS) (width 0.1))
`
const back = `
(fp_circle (center ${-0.55 - spacing_adj} 0) (end ${-1.05 - spacing_adj} 0) (layer B.SilkS) (width 0.1))
(fp_line (start ${-0.25 - spacing_adj} 0) (end ${-0.85 - spacing_adj} 0) (layer B.SilkS) (width 0.1))
(fp_circle (center ${0.55 + spacing_adj} 0) (end ${0.05 + spacing_adj} 0) (layer B.SilkS) (width 0.1))
(fp_line (start ${0.55 + spacing_adj} -0.3) (end ${0.55 + spacing_adj} 0.3) (layer B.SilkS) (width 0.1))
(fp_line (start ${0.85 + spacing_adj} 0) (end ${0.25 + spacing_adj} 0) (layer B.SilkS) (width 0.1))
`
const bottom = `
)
`
let final = top;
if(p.side == "F" || p.reverse) {
final += front;
}
if(p.side == "B" || p.reverse) {
final += back;
}
final += bottom;
return final;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,236 @@
module.exports = {
params: {
designator: 'DISP',
side: 'F',
reverse: false,
MOSI: {type: 'net', value: 'MOSI'},
SCK: {type: 'net', value: 'SCK'},
VCC: {type: 'net', value: 'VCC'},
GND: {type: 'net', value: 'GND'},
CS: {type: 'net', value: 'CS'},
show_labels: {type: 'boolean', value: true},
jumpers_at_bottom: false,
},
body: p => {
let dst_nets = [
p.MOSI.str,
p.SCK.str,
p.VCC.str,
p.GND.str,
p.CS.str,
];
local_nets = [
p.local_net("1").str,
p.local_net("2").str,
p.VCC.str,
p.local_net("4").str,
p.local_net("5").str,
];
let socket_nets = dst_nets;
if(p.reverse) {
socket_nets = local_nets;
} else if(p.side == 'B') {
socket_nets = dst_nets.slice().reverse();
}
let jumpers_offset = 0;
let jumpers_rot = 0;
let labels_offset = 0;
let label_vcc_offset = 0;
let jumpers_front_top = dst_nets;
let jumpers_front_bottom = local_nets;
let jumpers_back_top = dst_nets;
let jumpers_back_bottom = local_nets.slice().reverse();
if(p.jumpers_at_bottom) {
jumpers_offset = 5.7;
jumpers_rot = 180;
labels_offset = jumpers_offset + 2 + 1 + 0.1;
label_vcc_offset = 4.85;
jumpers_front_top = local_nets;
jumpers_front_bottom = dst_nets;
jumpers_back_top = local_nets.slice().reverse();
jumpers_back_bottom = dst_nets;
}
const top = `
(module nice!view (layer F.Cu) (tedit 6448AF5B)
${p.at /* parametric position */}
(attr virtual)
(fp_text reference "${p.ref}" (at 0 20 ${p.rot}) (layer ${p.side}.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)))
)
`
const front = `
(fp_line (start -6.5 -18) (end 6.5 -18) (layer F.Fab) (width 0.15))
(fp_line (start 6.5 18) (end -6.5 18) (layer F.Fab) (width 0.15))
(fp_line (start -7 17.5) (end -7 -17.5) (layer F.Fab) (width 0.15))
(fp_line (start 7 17.5) (end 7 -17.5) (layer F.Fab) (width 0.15))
(fp_line (start -6.41 15.37) (end -6.41 18.03) (layer F.SilkS) (width 0.12))
(fp_line (start 6.41 18.03) (end -6.41 18.03) (layer F.SilkS) (width 0.12))
(fp_line (start 6.88 14.9) (end 6.88 18.45) (layer F.CrtYd) (width 0.15))
(fp_line (start 6.88 18.45) (end -6.82 18.45) (layer F.CrtYd) (width 0.15))
(fp_line (start -6.82 18.45) (end -6.82 14.9) (layer F.CrtYd) (width 0.15))
(fp_line (start -6.82 14.9) (end 6.88 14.9) (layer F.CrtYd) (width 0.15))
(fp_line (start 6.41 15.37) (end 6.41 18.03) (layer F.SilkS) (width 0.12))
(fp_line (start 6.41 15.37) (end -6.41 15.37) (layer F.SilkS) (width 0.12))
(fp_arc (start -6.5 17.5) (end -7 17.5) (angle -90) (layer F.Fab) (width 0.15))
(fp_arc (start 6.5 17.5) (end 6.5 18) (angle -90) (layer F.Fab) (width 0.15))
(fp_arc (start 6.5 -17.5) (end 6.5 -18) (angle 90) (layer F.Fab) (width 0.15))
(fp_arc (start -6.5 -17.5) (end -6.5 -18) (angle -90) (layer F.Fab) (width 0.15))
(fp_text user %R (at 0 20 ${p.rot}) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
`
const front_jumpers = `
(fp_line (start 5.93 ${12.9 + jumpers_offset}) (end 5.93 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -5.93 ${14.9 + jumpers_offset}) (end -5.93 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -5.93 ${12.9 + jumpers_offset}) (end -4.23 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -4.23 ${14.9 + jumpers_offset}) (end -5.93 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -4.23 ${12.9 + jumpers_offset}) (end -4.23 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -3.39 ${14.9 + jumpers_offset}) (end -3.39 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -3.39 ${12.9 + jumpers_offset}) (end -1.69 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -1.69 ${14.9 + jumpers_offset}) (end -3.39 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start -1.69 ${12.9 + jumpers_offset}) (end -1.69 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start 3.39 ${12.9 + jumpers_offset}) (end 3.39 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start 3.39 ${14.9 + jumpers_offset}) (end 1.69 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start 1.69 ${14.9 + jumpers_offset}) (end 1.69 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start 1.69 ${12.9 + jumpers_offset}) (end 3.39 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start 5.93 ${14.9 + jumpers_offset}) (end 4.23 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start 4.23 ${14.9 + jumpers_offset}) (end 4.23 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(fp_line (start 4.23 ${12.9 + jumpers_offset}) (end 5.93 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15))
(pad 14 smd rect (at -5.08 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[0] })
(pad 15 smd rect (at -2.54 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[1] })
(pad 16 smd rect (at 2.54 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[3] })
(pad 17 smd rect (at 5.08 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[4] })
(pad 10 smd rect (at -5.08 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[0] })
(pad 11 smd rect (at -2.54 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[1] })
(pad 12 smd rect (at 2.54 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[3] })
(pad 13 smd rect (at 5.08 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[4] })
`
const back = `
(fp_line (start 6.41 15.37) (end 6.41 18.03) (layer B.SilkS) (width 0.12))
(fp_line (start 6.41 15.37) (end -6.41 15.37) (layer B.SilkS) (width 0.12))
(fp_line (start 6.41 18.03) (end -6.41 18.03) (layer B.SilkS) (width 0.12))
(fp_line (start 6.88 14.9) (end 6.88 18.45) (layer B.CrtYd) (width 0.15))
(fp_line (start 6.88 18.45) (end -6.82 18.45) (layer B.CrtYd) (width 0.15))
(fp_line (start -6.82 18.45) (end -6.82 14.9) (layer B.CrtYd) (width 0.15))
(fp_line (start -6.82 14.9) (end 6.88 14.9) (layer B.CrtYd) (width 0.15))
(fp_line (start -6.41 15.37) (end -6.41 18.03) (layer B.SilkS) (width 0.12))
(fp_line (start -6.5 18) (end 6.5 18) (layer B.Fab) (width 0.15))
(fp_line (start 7 -17.5) (end 7 17.5) (layer B.Fab) (width 0.15))
(fp_line (start 6.5 -18) (end -6.5 -18) (layer B.Fab) (width 0.15))
(fp_line (start -7 -17.5) (end -7 17.5) (layer B.Fab) (width 0.15))
(fp_arc (start -6.5 -17.5) (end -7 -17.5) (angle 90) (layer B.Fab) (width 0.15))
(fp_arc (start 6.5 -17.5) (end 6.5 -18) (angle 90) (layer B.Fab) (width 0.15))
(fp_arc (start 6.5 17.5) (end 6.5 18) (angle -90) (layer B.Fab) (width 0.15))
(fp_arc (start -6.5 17.5) (end -6.5 18) (angle 90) (layer B.Fab) (width 0.15))
`
const back_jumpers = `
(fp_line (start -5.93 ${12.9 + jumpers_offset}) (end -5.93 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start -5.93 ${14.9 + jumpers_offset}) (end -4.23 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start -4.23 ${12.9 + jumpers_offset}) (end -5.93 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start -4.23 ${14.9 + jumpers_offset}) (end -4.23 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start -3.39 ${14.9 + jumpers_offset}) (end -1.69 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start -1.69 ${12.9 + jumpers_offset}) (end -3.39 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 4.23 ${14.9 + jumpers_offset}) (end 5.93 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 5.93 ${14.9 + jumpers_offset}) (end 5.93 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 3.39 ${12.9 + jumpers_offset}) (end 1.69 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start -1.69 ${14.9 + jumpers_offset}) (end -1.69 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start -3.39 ${12.9 + jumpers_offset}) (end -3.39 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 1.69 ${12.9 + jumpers_offset}) (end 1.69 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 1.69 ${14.9 + jumpers_offset}) (end 3.39 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 3.39 ${14.9 + jumpers_offset}) (end 3.39 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 5.93 ${12.9 + jumpers_offset}) (end 4.23 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(fp_line (start 4.23 ${12.9 + jumpers_offset}) (end 4.23 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15))
(pad 24 smd rect (at 5.08 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[0] })
(pad 25 smd rect (at 2.54 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[1] })
(pad 26 smd rect (at -2.54 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[3] })
(pad 27 smd rect (at -5.08 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[4] })
(pad 20 smd rect (at 5.08 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[0] })
(pad 21 smd rect (at 2.54 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[1] })
(pad 22 smd rect (at -2.54 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[3] })
(pad 23 smd rect (at -5.08 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[4] })
`
const labels = `
(fp_text user DA (at -5.08 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)))
)
(fp_text user CS (at 5.12 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)))
)
(fp_text user GND (at 2.62 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)))
)
(fp_text user VCC (at 0.15 ${14.4 + label_vcc_offset} ${p.rot}) (layer F.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)))
)
(fp_text user CL (at -2.48 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)))
)
(fp_text user CS (at -4.98 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)) (justify mirror))
)
(fp_text user VCC (at 0.15 ${14.4 + label_vcc_offset} ${p.rot}) (layer B.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)) (justify mirror))
)
(fp_text user DA (at 5.22 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)) (justify mirror))
)
(fp_text user CL (at 2.72 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)) (justify mirror))
)
(fp_text user GND (at -2.38 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS)
(effects (font (size 1 0.7) (thickness 0.1)) (justify mirror))
)
`
const bottom = `
(pad 1 thru_hole oval (at -5.08 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[0] })
(pad 2 thru_hole oval (at -2.54 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[1] })
(pad 3 thru_hole oval (at 0 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[2] })
(pad 4 thru_hole oval (at 2.54 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[3] })
(pad 5 thru_hole circle (at 5.08 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[4] })
(fp_line (start 5.4 13.4) (end 5.4 -11.9) (layer Dwgs.User) (width 0.15))
(fp_line (start -5.4 13.4) (end -5.4 -11.9) (layer Dwgs.User) (width 0.15))
(fp_line (start 5.4 -11.9) (end -5.4 -11.9) (layer Dwgs.User) (width 0.15))
(fp_line (start -5.4 13.4) (end 5.4 13.4) (layer Dwgs.User) (width 0.15))
)
`
let final = top;
if(p.side == "F" || p.reverse) {
final += front;
}
if(p.side == "B" || p.reverse) {
final += back;
}
if(p.reverse) {
final += front_jumpers;
final += back_jumpers;
if(p.show_labels) {
final += labels;
}
}
final += bottom;
return final;
}
}

175
input/footprints/pads.js Normal file
View File

@ -0,0 +1,175 @@
module.exports = {
params: {
designator: 'PAD',
side: 'F',
reverse: true,
width: 1.25,
height: 2.5,
space: 2,
mirror: true,
pads: 2,
net_1: {type: 'net', value: 'PAD_1'},
net_2: {type: 'net', value: 'PAD_2'},
net_3: {type: 'net', value: 'PAD_3'},
net_4: {type: 'net', value: 'PAD_4'},
net_5: {type: 'net', value: 'PAD_5'},
net_6: {type: 'net', value: 'PAD_5'},
label_1: '',
label_2: '',
label_3: '',
label_4: '',
label_5: '',
label_6: '',
label_at_bottom: false,
},
body: p => {
const gen_nets = (p) => {
const all_nets = [
p.net_1.str, p.net_2.str, p.net_3.str,
p.net_4.str, p.net_5.str, p.net_6.str,
];
const all_labels = [
p.label_1, p.label_2, p.label_3,
p.label_4, p.label_5, p.label_6,
];
pad_cnt = p.pads;
if(pad_cnt > all_nets.length || pad_cnt > all_labels.length) {
pad_cnt = Math.min(all_nets.length, all_labels.length);
}
let nets = [];
for(let i = 0; i < pad_cnt; i++) {
let net = [
all_nets[i],
all_labels[i],
];
nets.push(net);
}
return nets;
}
const gen_pad = (pad_idx, pad_cnt, net_str, net_label, width, height, space, rot, layer, label_at_bottom) =>
{
// Calculate the pad position from center
const pos_x_raw = (width + space) * pad_idx;
// Adjust it so that the pads are centered in the middle
const pos_x = (
pos_x_raw - (width + space) * (pad_cnt - 1) / 2
);
let label_pos_y = -1 * (height / 2 + 0.2);
let label_justify_direction = "left";
if(label_at_bottom) {
label_pos_y = label_pos_y * -1;
label_justify_direction = "right";
}
if(label_at_bottom == false || layer == 'B') {
if((rot > 0 && rot <= 180) || (rot <= -180)) {
label_justify_direction = "right";
} else {
label_justify_direction = "left";
}
} else {
if((rot > 0 && rot <= 180) || (rot <= -180)) {
label_justify_direction = "left";
} else {
label_justify_direction = "right";
}
}
let justify_mirror = '';
if(layer == 'B') {
justify_mirror = 'mirror'
}
let label_justify = '';
if(justify_mirror != '' || label_justify_direction != '') {
label_justify = `(justify ${label_justify_direction} ${justify_mirror})`;
}
let pad = `
(pad ${pad_idx + 1} smd rect (at ${pos_x} 0 ${rot}) (size ${width} ${height}) (layers ${layer}.Cu ${layer}.Paste ${layer}.Mask) ${net_str})
`
if(net_label) {
pad += `
(fp_text user "${net_label}" (at ${pos_x} ${label_pos_y} ${90 + rot}) (layer ${layer}.SilkS)
(effects (font (size 1 1) (thickness 0.1)) ${label_justify})
)
`
}
return pad;
}
const gen_pads = (nets, width, height, space, rot, layer, label_at_bottom, mirror) => {
if(mirror) {
nets = nets.slice().reverse();
}
let pads = '';
for (let [net_idx, net] of nets.entries()) {
const net_str = net[0];
const net_label = net[1];
const pad = gen_pad(
net_idx,
nets.length,
net_str,
net_label,
width,
height,
space,
rot,
layer,
label_at_bottom,
);
pads += pad;
}
return pads;
}
const nets = gen_nets(p);
let pads_front = '';
if(p.side == 'F' || p.reverse) {
pads_front = gen_pads(
nets,
p.width, p.height, p.space, p.rot, "F",
p.label_at_bottom, false,
);
}
let pads_back = '';
if(p.side == 'B' || p.reverse) {
pads_back = gen_pads(
nets,
p.width, p.height, p.space, p.rot, "B",
p.label_at_bottom, p.mirror,
);
}
const fp = `
(module pads (layer F.Cu) (tedit 6446BF3D)
${p.at /* parametric position */}
(attr smd)
(fp_text reference "${p.ref}" (at 0 2.2) (layer F.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)))
)
${pads_front}
${pads_back}
)
`
return fp;
}
}

View File

@ -0,0 +1,220 @@
module.exports = {
params: {
designator: 'SMD',
side: 'F',
reverse: true,
space: 2,
mirror: true,
swap_pad_direction: false,
components: 2,
net_1_from: {type: 'net', value: 'SMD_1_F'},
net_1_to: {type: 'net', value: 'SMD_1_T'},
net_2_from: {type: 'net', value: 'SMD_2_F'},
net_2_to: {type: 'net', value: 'SMD_2_T'},
net_3_from: {type: 'net', value: 'SMD_3_F'},
net_3_to: {type: 'net', value: 'SMD_3_T'},
net_4_from: {type: 'net', value: 'SMD_4_F'},
net_4_to: {type: 'net', value: 'SMD_4_T'},
net_5_from: {type: 'net', value: 'SMD_5_F'},
net_5_to: {type: 'net', value: 'SMD_5_T'},
net_6_from: {type: 'net', value: 'SMD_6_F'},
net_6_to: {type: 'net', value: 'SMD_6_T'},
label_1: '',
label_2: '',
label_3: '',
label_4: '',
label_5: '',
label_6: '',
label_at_bottom: false,
},
body: p => {
const gen_nets = (p) => {
const all_nets_from = [
p.net_1_from.str, p.net_2_from.str, p.net_3_from.str,
p.net_4_from.str, p.net_5_from.str, p.net_6_from.str,
];
const all_nets_to = [
p.net_1_to.str, p.net_2_to.str, p.net_3_to.str,
p.net_4_to.str, p.net_5_to.str, p.net_6_to.str,
];
const all_labels = [
p.label_1, p.label_2, p.label_3,
p.label_4, p.label_5, p.label_6,
];
pad_cnt = p.components;
if(pad_cnt > all_nets_from.length || pad_cnt > all_nets_to.length ||
pad_cnt > all_labels.length) {
pad_cnt = Math.min(
all_nets_from.length, all_nets_to.length, all_labels.length
);
}
let nets = [];
for(let i = 0; i < pad_cnt; i++) {
let net = [
all_nets_from[i],
all_nets_to[i],
all_labels[i],
];
nets.push(net);
}
return nets;
}
const gen_pad = (pad_idx, pad_cnt, net_from, net_to, net_label, space, rot, layer, label_at_bottom) =>
{
const width = 1.025;
const height= 3.36;
// Calculate the pad position from center
const pos_x_raw = (width + space) * pad_idx;
// Adjust it so that the pads are centered in the middle
const pos_x = (
pos_x_raw - (width + space) * (pad_cnt - 1) / 2
);
let label_pos_y = -1 * (height / 2 + 0.2);
let label_justify_direction = "left";
if(label_at_bottom) {
label_pos_y = label_pos_y * -1;
label_justify_direction = "right";
}
if(label_at_bottom == false || layer == 'B') {
if((rot > 0 && rot <= 180) || (rot <= -180)) {
label_justify_direction = "right";
} else {
label_justify_direction = "left";
}
} else {
if((rot > 0 && rot <= 180) || (rot <= -180)) {
label_justify_direction = "left";
} else {
label_justify_direction = "right";
}
}
let justify_mirror = '';
if(layer == 'B') {
justify_mirror = 'mirror'
}
let label_justify = '';
if(justify_mirror != '' || label_justify_direction != '') {
label_justify = `(justify ${label_justify_direction} ${justify_mirror})`;
}
let label_fab_justify = '';
if(justify_mirror) {
label_fab_justify = `(justify ${justify_mirror})`;
}
const pad_num = pad_idx*2+1;
let pad = `
(fp_line (start ${0.625 + pos_x} -1) (end ${0.625 + pos_x} 1) (layer ${layer}.Fab) (width 0.1))
(fp_line (start ${-0.625 + pos_x} -1) (end ${0.625 + pos_x} -1) (layer ${layer}.Fab) (width 0.1))
(fp_line (start ${-0.625 + pos_x} 1) (end ${-0.625 + pos_x} -1) (layer ${layer}.Fab) (width 0.1))
(fp_line (start ${0.625 + pos_x} 1) (end ${-0.625 + pos_x} 1) (layer ${layer}.Fab) (width 0.1))
(fp_line (start ${0.95 + pos_x} -1.68) (end ${0.95 + pos_x} 1.68) (layer ${layer}.CrtYd) (width 0.05))
(fp_line (start ${-0.95 + pos_x} -1.68) (end ${0.95 + pos_x} -1.68) (layer ${layer}.CrtYd) (width 0.05))
(fp_line (start ${-0.95 + pos_x} 1.68) (end ${-0.95 + pos_x} -1.68) (layer ${layer}.CrtYd) (width 0.05))
(fp_line (start ${0.95 + pos_x} 1.68) (end ${-0.95 + pos_x} 1.68) (layer ${layer}.CrtYd) (width 0.05))
(fp_line (start ${0.735 + pos_x} 0.227064) (end ${0.735 + pos_x} -0.227064) (layer ${layer}.SilkS) (width 0.12))
(fp_line (start ${-0.735 + pos_x} 0.227064) (end ${-0.735 + pos_x} -0.227064) (layer ${layer}.SilkS) (width 0.12))
(pad ${pad_num} smd roundrect (at ${0 + pos_x} 0.9125 ${90 + rot}) (size 1.025 1.4) (layers ${layer}.Cu ${layer}.Paste ${layer}.Mask) (roundrect_rratio 0.243902) ${net_from})
(pad ${pad_num + 1} smd roundrect (at ${0 + pos_x} -0.9125 ${90 + rot}) (size 1.025 1.4) (layers ${layer}.Cu ${layer}.Paste ${layer}.Mask) (roundrect_rratio 0.243902) ${net_to})
`
if(net_label) {
pad += `
(fp_text user "${net_label}" (at ${0 + pos_x} 0 ${90 + rot}) (layer ${layer}.Fab)
(effects (font (size 0.5 0.5) (thickness 0.08)) ${label_fab_justify})
)
(fp_text user "${net_label}" (at ${pos_x} ${label_pos_y} ${90 + rot}) (layer ${layer}.SilkS)
(effects (font (size 1 1) (thickness 0.1)) ${label_justify})
)
`
}
return pad;
}
const gen_pads = (nets, space, rot, layer, label_at_bottom, mirror, swap_pad_direction) => {
if(mirror) {
nets = nets.slice().reverse();
}
let pads = '';
for (let [net_idx, net] of nets.entries()) {
let net_from = net[0];
let net_to = net[1];
const net_label = net[2];
if(swap_pad_direction) {
net_from = net[1];
net_to = net[0];
}
const pad = gen_pad(
net_idx,
nets.length,
net_from,
net_to,
net_label,
space,
rot,
layer,
label_at_bottom,
swap_pad_direction,
);
pads += pad;
}
return pads;
}
const nets = gen_nets(p);
let pads_front = '';
if(p.side == 'F' || p.reverse) {
pads_front = gen_pads(
nets,
p.space, p.rot, "F",
p.label_at_bottom, false, p.swap_pad_direction,
);
}
let pads_back = '';
if(p.side == 'B' || p.reverse) {
pads_back = gen_pads(
nets,
p.space, p.rot, "B",
p.label_at_bottom, p.mirror, p.swap_pad_direction,
);
}
const fp = `
(module smd_805 (layer F.Cu) (tedit 6446BF3D)
${p.at /* parametric position */}
(attr smd)
(fp_text reference "${p.ref}" (at 0 3) (layer F.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)))
)
${pads_front}
${pads_back}
)
`
return fp;
}
}

View File

@ -0,0 +1,116 @@
// Should be compatible with:
// - G-Switch MK-12C02-G015
// - Alps SSSS811101
// - PCM12SMTR
module.exports = {
params: {
designator: 'SW',
side: 'F',
from: {type: 'net', value: 'BAT_P'},
to: {type: 'net', value: 'RAW'},
reverse: false,
},
body: p => {
const shared_1 = `
(module power_switch (layer F.Cu) (tedit 644556E6)
${p.at /* parametric position */}
(attr smd)
`;
const front_switch = `
(fp_text reference "${p.ref}" (at -3.6 0 ${-90 + p.rot}) (layer F.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start 0.415 -3.45) (end -0.375 -3.45) (layer F.SilkS) (width 0.12))
(fp_line (start -0.375 3.45) (end 0.415 3.45) (layer F.SilkS) (width 0.12))
(fp_line (start -1.425 1.6) (end -1.425 -0.1) (layer F.SilkS) (width 0.12))
(fp_line (start 1.425 2.85) (end 1.425 -2.85) (layer F.SilkS) (width 0.12))
(fp_line (start 1.795 4.4) (end -2.755 4.4) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.795 1.65) (end 1.795 4.4) (layer F.CrtYd) (width 0.05))
(fp_line (start 3.095 1.65) (end 1.795 1.65) (layer F.CrtYd) (width 0.05))
(fp_line (start 3.095 -1.65) (end 3.095 1.65) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.795 -1.65) (end 3.095 -1.65) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.795 -4.4) (end 1.795 -1.65) (layer F.CrtYd) (width 0.05))
(fp_line (start -2.755 -4.4) (end 1.795 -4.4) (layer F.CrtYd) (width 0.05))
(fp_line (start -2.755 4.4) (end -2.755 -4.4) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.425 -1.4) (end -1.425 -1.6) (layer F.SilkS) (width 0.12))
(fp_line (start -1.305 -3.35) (end -1.305 3.35) (layer F.Fab) (width 0.1))
(fp_line (start 1.295 -3.35) (end -1.305 -3.35) (layer F.Fab) (width 0.1))
(fp_line (start 1.295 3.35) (end 1.295 -3.35) (layer F.Fab) (width 0.1))
(fp_line (start -1.305 3.35) (end 1.295 3.35) (layer F.Fab) (width 0.1))
(fp_line (start 2.595 0.1) (end 1.295 0.1) (layer F.Fab) (width 0.1))
(fp_line (start 2.645 0.15) (end 2.595 0.1) (layer F.Fab) (width 0.1))
(fp_line (start 2.845 0.35) (end 2.645 0.15) (layer F.Fab) (width 0.1))
(fp_line (start 2.845 1.2) (end 2.845 0.35) (layer F.Fab) (width 0.1))
(fp_line (start 2.645 1.4) (end 2.845 1.2) (layer F.Fab) (width 0.1))
(fp_line (start 1.345 1.4) (end 2.645 1.4) (layer F.Fab) (width 0.1))
(pad "" smd rect (at 1.125 -3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask))
(pad "" smd rect (at -1.085 -3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask))
(pad "" smd rect (at -1.085 3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask))
(pad 1 smd rect (at -1.735 2.25 ${90 + p.rot}) (size 0.7 1.5) (layers F.Cu F.Paste F.Mask))
(pad 2 smd rect (at -1.735 -0.75 ${90 + p.rot}) (size 0.7 1.5) (layers F.Cu F.Paste F.Mask) ${p.from.str})
(pad 3 smd rect (at -1.735 -2.25 ${90 + p.rot}) (size 0.7 1.5) (layers F.Cu F.Paste F.Mask) ${p.to.str})
(pad "" smd rect (at 1.125 3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask))
`
const back_switch = `
${'' /* Add the optional parts here */}
(fp_text user "${p.ref}" (at -3.5 0 ${90 + p.rot}) (layer B.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
(fp_line (start 2.595 -0.1) (end 1.295 -0.1) (layer B.Fab) (width 0.1))
(fp_line (start -1.305 3.35) (end -1.305 -3.35) (layer B.Fab) (width 0.1))
(fp_line (start 2.645 -0.15) (end 2.595 -0.1) (layer B.Fab) (width 0.1))
(fp_line (start -1.425 1.4) (end -1.425 1.6) (layer B.SilkS) (width 0.12))
(fp_line (start 0.415 3.45) (end -0.375 3.45) (layer B.SilkS) (width 0.12))
(fp_line (start -0.375 -3.45) (end 0.415 -3.45) (layer B.SilkS) (width 0.12))
(fp_line (start -1.425 -1.6) (end -1.425 0.1) (layer B.SilkS) (width 0.12))
(fp_line (start 1.425 -2.85) (end 1.425 2.85) (layer B.SilkS) (width 0.12))
(fp_line (start 1.795 4.4) (end 1.795 1.65) (layer B.CrtYd) (width 0.05))
(fp_line (start -2.755 4.4) (end 1.795 4.4) (layer B.CrtYd) (width 0.05))
(fp_line (start 2.845 -1.2) (end 2.845 -0.35) (layer B.Fab) (width 0.1))
(fp_line (start 1.345 -1.4) (end 2.645 -1.4) (layer B.Fab) (width 0.1))
(fp_line (start 1.795 -4.4) (end -2.755 -4.4) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.795 -1.65) (end 1.795 -4.4) (layer B.CrtYd) (width 0.05))
(fp_line (start 3.095 -1.65) (end 1.795 -1.65) (layer B.CrtYd) (width 0.05))
(fp_line (start 2.845 -0.35) (end 2.645 -0.15) (layer B.Fab) (width 0.1))
(fp_line (start 2.645 -1.4) (end 2.845 -1.2) (layer B.Fab) (width 0.1))
(fp_line (start 1.295 -3.35) (end 1.295 3.35) (layer B.Fab) (width 0.1))
(fp_line (start 1.295 3.35) (end -1.305 3.35) (layer B.Fab) (width 0.1))
(fp_line (start -1.305 -3.35) (end 1.295 -3.35) (layer B.Fab) (width 0.1))
(fp_line (start -2.755 -4.4) (end -2.755 4.4) (layer B.CrtYd) (width 0.05))
(fp_line (start 3.095 1.65) (end 3.095 -1.65) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.795 1.65) (end 3.095 1.65) (layer B.CrtYd) (width 0.05))
(pad "" smd rect (at -1.085 -3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask))
(pad "" smd rect (at 1.125 -3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask))
(pad 4 smd rect (at -1.735 2.25 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask))
(pad "" smd rect (at -1.085 3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask))
(pad 5 smd rect (at -1.735 0.75 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask) ${p.from.str})
(pad 6 smd rect (at -1.735 -2.25 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask) ${p.to.str})
(pad "" smd rect (at 1.125 3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask))
`
const shared_2 = `
(pad "" np_thru_hole circle (at 0.025 -1.5 ${90 + p.rot}) (size 0.9 0.9) (drill 0.9) (layers *.Cu *.Mask))
(pad "" np_thru_hole circle (at 0.025 1.5 ${90 + p.rot}) (size 0.9 0.9) (drill 0.9) (layers *.Cu *.Mask))
)
`
let final = shared_1;
if(p.side == "F" || p.reverse) {
final += front_switch;
}
if(p.side == "B" || p.reverse) {
final += back_switch;
}
final += shared_2;
return final;
}
}

View File

@ -0,0 +1,90 @@
// Compatible with
// EVQ-P7A01P
module.exports = {
params: {
designator: 'SW',
side: 'F',
reverse: false,
from: {type: 'net', value: 'GND'},
to: {type: 'net', value: 'RST'},
},
body: p => {
const top = `
(module sw_reset_side (layer F.Cu) (tedit 64473C6F)
${p.at /* parametric position */}
(attr smd)
(fp_text reference "${p.ref}" (at 0 3.5 ${p.rot}) (layer ${p.side}.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)))
)
`
const front = `
(fp_line (start 1.7 2.75) (end -1.7 2.75) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.7 2.75) (end -1.7 -2.75) (layer F.CrtYd) (width 0.05))
(fp_line (start 2.1 0.85) (end 2.1 -0.85) (layer F.Fab) (width 0.1))
(fp_line (start 1.7 -1.1) (end 2.35 -1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.7 -2.75) (end 1.7 -2.75) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.45 -1.75) (end 1.45 1.75) (layer F.Fab) (width 0.1))
(fp_line (start 1.7 1.1) (end 1.7 2.75) (layer F.CrtYd) (width 0.05))
(fp_line (start 2.35 1.1) (end 1.7 1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.7 -2.75) (end 1.7 -1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.55 -1.75) (end 1.55 1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 2.1 -0.85) (end 1.45 -0.85) (layer F.Fab) (width 0.1))
(fp_line (start 2.35 -1.1) (end 2.35 1.1) (layer F.CrtYd) (width 0.05))
(fp_line (start 2.1 0.85) (end 1.45 0.85) (layer F.Fab) (width 0.1))
(fp_line (start -1.55 1.75) (end -1.55 -1.75) (layer F.SilkS) (width 0.12))
(fp_line (start 1.45 1.75) (end -1.4 1.75) (layer F.Fab) (width 0.1))
(fp_line (start -1.45 1.75) (end -1.45 -1.75) (layer F.Fab) (width 0.1))
(fp_line (start -1.45 -1.75) (end 1.45 -1.75) (layer F.Fab) (width 0.1))
(pad 1 smd rect (at -0.72 -1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.from.str})
(pad 1 smd rect (at -0.72 1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.from.str})
(pad 2 smd rect (at 0.72 -1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.to.str})
(pad 2 smd rect (at 0.72 1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.to.str})
`
const back = `
(fp_line (start -1.45 1.75) (end 1.45 1.75) (layer B.Fab) (width 0.1))
(fp_line (start 1.45 1.75) (end 1.45 -1.75) (layer B.Fab) (width 0.1))
(fp_line (start 1.7 -1.1) (end 1.7 -2.75) (layer B.CrtYd) (width 0.05))
(fp_line (start 2.35 -1.1) (end 1.7 -1.1) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.7 2.75) (end 1.7 1.1) (layer B.CrtYd) (width 0.05))
(fp_line (start 1.55 1.75) (end 1.55 -1.75) (layer B.SilkS) (width 0.12))
(fp_line (start 2.1 0.85) (end 1.45 0.85) (layer B.Fab) (width 0.1))
(fp_line (start 2.35 1.1) (end 2.35 -1.1) (layer B.CrtYd) (width 0.05))
(fp_line (start 2.1 -0.85) (end 1.45 -0.85) (layer B.Fab) (width 0.1))
(fp_line (start -1.55 -1.75) (end -1.55 1.75) (layer B.SilkS) (width 0.12))
(fp_line (start 1.45 -1.75) (end -1.4 -1.75) (layer B.Fab) (width 0.1))
(fp_line (start -1.45 -1.75) (end -1.45 1.75) (layer B.Fab) (width 0.1))
(fp_line (start 1.7 -2.75) (end -1.7 -2.75) (layer B.CrtYd) (width 0.05))
(fp_line (start -1.7 -2.75) (end -1.7 2.75) (layer B.CrtYd) (width 0.05))
(fp_line (start 2.1 -0.85) (end 2.1 0.85) (layer B.Fab) (width 0.1))
(fp_line (start 1.7 1.1) (end 2.35 1.1) (layer B.CrtYd) (width 0.05))
(fp_line (start -1.7 2.75) (end 1.7 2.75) (layer B.CrtYd) (width 0.05))
(pad 1 smd rect (at -0.72 -1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.from.str})
(pad 2 smd rect (at 0.72 1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.to.str})
(pad 2 smd rect (at 0.72 -1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.to.str})
(pad 1 smd rect (at -0.72 1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.from.str})
(fp_text user ${p.ref} (at 0 3.5 ${p.rot}) (layer B.SilkS) ${p.ref_hide}
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
`
const bottom = `
)
`
let final = top;
if(p.side == "F" || p.reverse) {
final += front;
}
if(p.side == "B" || p.reverse) {
final += back;
}
final += bottom;
return final;
}
}

44
input/footprints/text.js Normal file
View File

@ -0,0 +1,44 @@
module.exports = {
params: {
designator: 'TXT',
side: 'F',
reverse: false,
text: 'Awesomeness',
},
body: p => {
const top = `
(module text (layer F.Cu) (tedit 6449CD11)
${p.at /* parametric position */}
(attr virtual)
`;
const front = `
(fp_text user "${p.text}" (at 0 0) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
`
const back = `
(fp_text user "${p.text}" (at 0 0) (layer B.SilkS)
(effects (font (size 1 1) (thickness 0.15)) (justify mirror))
)
`
const bottom = `
)
`
let final = top;
if(p.side == "F" || p.reverse) {
final += front;
}
if(p.side == "B" || p.reverse) {
final += back;
}
final += bottom;
return final;
}
}

965
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
{
"scripts": {
"gen": "ergogen samoklava.yaml"
"gen": "ergogen input/"
},
"dependencies": {
"ergogen": "github:soundmonster/ergogen#samoklava"
"ergogen": "github:ergogen/ergogen"
}
}

View File

@ -1,444 +0,0 @@
units:
kx: cx
ky: cy
px: 2
py: 2
points:
key:
footprints:
choc_hotswap:
type: choc
params:
hotswap: true
reverse: true
keycaps: true
nets:
# from: P1
# to: P2
from: =colrow
to: =column_net
diode:
type: diode
nets:
# from: P3
# to: P4
from: =colrow
to: =row_net
anchor:
shift: [0, -5]
zones:
matrix:
# anchor:
# rotate: 5
key.padding: ky
columns:
pinky:
stagger: 0 ky
spread: kx
key:
column_net: P20
ring:
stagger: 0.7 ky
spread: kx
key:
column_net: P19
middle:
stagger: 0.2 ky
spread: kx
key:
column_net: P18
index:
stagger: -0.2 ky
spread: kx
key:
column_net: P15
inner:
stagger: -0.1 ky
spread: kx
key:
column_net: P14
rows:
bottom:
row_net: P6
home:
row_net: P5
top:
row_net: P4
thumbfan:
anchor:
ref: matrix_inner_bottom
shift: [-1.5 kx, -1 ky]
columns:
near:
spread: kx
rotate: -15
origin: [-0.5 kx, -0.5 ky]
key:
column_net: P18
home:
spread: kx
rotate: -15
origin: [-0.5 kx, -0.5 ky]
key:
column_net: P15
far:
spread: kx
rotate: -15
origin: [-0.5 kx, -0.5 ky]
key:
column_net: P14
rows:
thumb:
row_net: P7
outlines:
# board dimensions according to JLCPCB: 122.28 mm x 101.05 mm
exports:
raw:
- type: keys
side: left
size: [kx + px, ky + py]
corner: px
thumbfan_glue:
- type: polygon
points:
- ref: matrix_inner_bottom
shift: [0.5 kx + 0.5px, -0.5 ky + 0.5 py]
- ref: thumbfan_far_thumb
shift: [0.5 kx - 0.5px, 0.5 ky + 0.5 py]
- ref: thumbfan_far_thumb
shift: [0.5 kx - 0.5px, -0.5 ky - 0.5 py]
- ref: thumbfan_near_thumb
shift: [-0.5 kx + 0.5 px, -0.5 ky - 0.5 py]
- ref: matrix_pinky_bottom
shift: [0.5 kx - 0.5 py, -0.5 ky - 0.5 py]
- ref: matrix_pinky_home
- ref: matrix_inner_home
patch_outer:
- type: polygon
points:
- ref: matrix_ring_top
- ref: matrix_ring_bottom
- ref: matrix_pinky_bottom
shift: [-0.5 (kx + px), 0]
- ref: matrix_pinky_top
shift: [-0.5 (kx + px), 0]
patch_inner:
- type: polygon
points:
- ref: matrix_inner_top
shift: [0.5 (kx + px), 0]
- ref: matrix_inner_bottom
shift: [0.5 (kx + px), 0]
- ref: matrix_index_bottom
- ref: matrix_index_top
controller_area:
main:
type: rectangle
anchor:
ref:
- matrix_inner_top
shift: [0 kx, -4.05 ky]
size: [32, 76.5]
corner: px
switches:
main:
type: keys
side: left
size: 14
bound: false
keycaps:
main:
type: keys
side: left
size: [kx, ky]
bound: false
corner: 1
keywell:
main:
type: outline
name: raw
patch_inner:
type: outline
name: patch_inner
operation: add
patch_outer:
type: outline
name: patch_outer
operation: add
thumbfan_glue:
type: outline
name: thumbfan_glue
operation: add
base_outline:
main:
type: outline
name: keywell
controller:
type: outline
name: controller_area
operation: add
screw_holes:
top_left:
type: circle
anchor:
- ref: matrix_ring_home
shift: [-0.5 kx, 0 ky]
radius: 1.05
bottom_left:
type: circle
anchor:
- ref: matrix_pinky_bottom
shift: [0.5 kx, 0]
radius: 1.05
top_right:
type: circle
anchor:
- ref: matrix_inner_top
shift: [-0.5 kx, 0]
radius: 1.05
palm:
type: circle
anchor:
- ref: matrix_index_bottom
shift: [0, -1.06 ky]
radius: 1.05
thumb:
type: circle
anchor:
- ref: thumbfan_far_thumb
shift: [-0.55 kx, 0]
radius: 1.05
mounting_holes:
$extends: outlines.exports.screw_holes
top_left:
radius: 2.05
bottom_left:
radius: 2.05
top_right:
radius: 2.05
palm:
radius: 2.05
thumb:
radius: 2.05
bottom_outline:
main:
type: outline
name: base_outline
screw_holes:
type: outline
# TODO use footprints with pad + via reinforcement as mounting holes
name: screw_holes
operation: subtract
plate:
main:
type: outline
name: keywell
switches:
type: outline
name: switches
operation: subtract
mounting_holes:
type: outline
# TODO use footprints with pad + via reinforcement as mounting holes
name: screw_holes
operation: subtract
pcb:
main:
type: outline
name: base_outline
mounting_holes:
type: outline
# TODO use plated through hole footprints as mounting holes
name: mounting_holes
operation: subtract
pcbs:
top_plate:
include_keys: false
outlines:
edge:
outline: plate
layer: Edge.Cuts
footprints:
jlc_order_number:
type: text
anchor:
ref:
- matrix_ring_home
shift: [-0.25 kx, 0.5 ky]
params:
text: "JLCJLCJLCJLC"
justify: left
bottom_plate:
include_keys: false
outlines:
edge:
outline: bottom_outline
layer: Edge.Cuts
board:
outlines:
edge:
outline: pcb
layer: Edge.Cuts
footprints:
mcu_l:
type: promicro
params:
orientation: up
anchor:
ref:
- matrix_inner_top
shift: [20, -11]
rotate: 270
mcu_r:
type: promicro
params:
orientation: down
anchor:
ref:
- matrix_inner_top
shift: [22.5, -12.25]
rotate: 270
pad_plus:
type: pad
anchor:
ref:
- matrix_inner_top
shift: [23, -6]
rotate: 0
params:
front: true
back: true
width: 1.5
height: 1.5
text: "B+"
nets:
net: Bplus
pad_minus:
type: pad
anchor:
ref:
- matrix_inner_top
shift: [23, -3]
rotate: 0
params:
front: true
back: true
width: 1.5
height: 1.5
text: "B-"
nets:
net: GND
trrs_l:
type: trrs
anchor:
ref:
- matrix_inner_bottom
shift: [32, -15]
rotate: 270
params:
reverse: false
symmetric: false
# The naming of the nets on this footprint is different from the Corne schematics.
nets:
A: ""
B: VCC
C: GND
D: P0
trrs_r:
type: trrs
anchor:
ref:
- matrix_inner_bottom
shift: [32, -13]
rotate: 270
params:
reverse: true
symmetric: false
# The naming of the nets on this footprint is different from the Corne schematics.
nets:
A: ""
B: VCC
C: GND
D: P0
jumper_l:
type: jumper
anchor:
ref:
- matrix_inner_bottom
shift: [23.5, 0]
rotate: 270
params:
side: B
nets:
from: Bplus
to: RAW
jumper_r:
type: jumper
anchor:
ref:
- matrix_inner_bottom
shift: [23.5, 0]
rotate: 270
params:
side: F
nets:
from: Bplus
to: RAW
slider_l:
type: slider
anchor:
ref:
- matrix_inner_bottom
shift: [30, 0]
rotate: 270
params:
side: F
nets:
from: RAW
left: Bplus
right: ''
slider_r:
type: slider
anchor:
ref:
- matrix_inner_bottom
shift: [30, 0]
rotate: 270
params:
side: B
nets:
from: RAW
left: ''
right: Bplus
reset:
type: button
anchor:
ref:
- matrix_inner_bottom
shift: [17, 0]
rotate: 270
params:
variant: 2_pin_th
nets:
from: GND
to: RST
info_l:
type: text
anchor:
ref:
- matrix_pinky_bottom
shift: [0.75 kx, 0]
params:
text: "samoklava v0.1\\nby soundmonster"
justify: left
info_r:
type: text
anchor:
ref:
- matrix_pinky_bottom
shift: [0.75 kx, 0]
params:
layer: B.SilkS
text: "samoklava v0.1\\nby soundmonster"
justify: right mirror