Ergogen Split Typematrix 2022 initial work
This commit is contained in:
parent
fc3018e56b
commit
9d93302eae
31
Makefile
31
Makefile
|
|
@ -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 \
|
||||
|
||||
|
|
|
|||
57
README.md
57
README.md
|
|
@ -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
|
||||
-|-
|
||||
 | 
|
||||
 | 
|
||||
backside|backside
|
||||
 | 
|
||||
|
||||
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 |
Binary file not shown.
|
After Width: | Height: | Size: 285 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 297 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 331 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 348 KiB |
|
|
@ -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]
|
||||
|
|
@ -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')})
|
||||
`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"scripts": {
|
||||
"gen": "ergogen samoklava.yaml"
|
||||
"gen": "ergogen input/"
|
||||
},
|
||||
"dependencies": {
|
||||
"ergogen": "github:soundmonster/ergogen#samoklava"
|
||||
"ergogen": "github:ergogen/ergogen"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
444
samoklava.yaml
444
samoklava.yaml
|
|
@ -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
|
||||
|
||||
Loading…
Reference in New Issue