diff --git a/ergogen/config.yaml b/ergogen/config.yaml index 7b20778..e9dbd75 100644 --- a/ergogen/config.yaml +++ b/ergogen/config.yaml @@ -211,7 +211,7 @@ points: home.key: led_prev: LED_11 led_next: LED_12 - middle: + mid: key: splay: -splay_thumb_middle column_net: C4 @@ -646,7 +646,130 @@ pcbs: adjust: shift: [-1 * horizontal_diode_shift,vertical_diode_shift] rotate: 90 + diode_rotation + + routes_inter_switch_column_net_1: + what: router + where: ["/matrix_[^_]+_top/", "/matrix_[^_]+_home/"] + params: + locked: false + routes: + - "B(-7.085,-2.54)(-7.085,16.46)" # net: {{column_net}} + net: "{{column_net}}" + + routes_inter_switch_column_net_2: + what: router + where: /matrix_middle_bottom/ + params: + locked: false + routes: + - "B(2.415,19.46)(-7.085,9.96)(-7.085,-2.54)" # net: {{column_net}} + net: "{{column_net}}" + + routes_inter_switch_column_net_3: + what: router + where: /matrix_index_bottom/ + params: + locked: false + routes: + - "B(-7.085,-2.54)(-7.085,5.689)(5.31382,18.08782)" # net: {{column_net}} + net: "{{column_net}}" + routes_inter_switch_column_net_4: + what: router + where: /matrix_inner_bottom/ + params: + locked: false + routes: + - "B(-7.085,-2.54)(-7.085,8.35548)(-1.17721,14.26326)(0.84826,14.26326)(2.88,16.295)(2.88,24.14453)(6.99908,28.26361)" # net: {{column_net}} + net: "{{column_net}}" + + routes_inter_switch_row_net_1: + what: router + where: /matrix_outer_.*/ + params: + locked: false + routes: + - "F(12,0.325)(11.205,1.12)(6.08,1.12)(6.06,1.14)" # net: {{row_net}} + net: "{{row_net}}" + + routes_inter_switch_row_net_2: + what: router + where: /matrix_pinky_.*/ + params: + locked: false + routes: + - "F(12,-4.425)(6.435,1.14)(6.06,1.14)" # net: {{row_net}} + net: "{{row_net}}" + + routes_inter_switch_row_net_3: + what: router + where: /matrix_ring_.*/ + params: + locked: false + routes: + - "F(6.06,1.14)(8.81,1.14)(12,-2.05)" # net: {{row_net}} + net: "{{row_net}}" + + routes_inter_switch_row_net_4: + what: router + where: ["/matrix_middle_.*/", "/matrix_index_.*/"] + params: + locked: false + routes: + - "F(4.8291,2.3709)(5.1582,2.7)(12,2.7)" # net: {{row_net}} + net: "{{row_net}}" + + routes_inter_switch_row_net_5: + what: router + where: /thumbfan_near_home/ + params: + locked: false + routes: + - "F(14.1544,1.25219)(6.17219,1.25219)(6.06,1.14)" # net: {{row_net}} + net: "{{row_net}}" + + routes_inter_switch_row_net_6: + what: router + where: /thumbfan_mid_home/ + params: + locked: false + routes: + - "F(20.96519,4.7236)(15.0242,6.31548)(6.06,1.14)" # net: {{row_net}} + net: "{{row_net}}" + + routes_switch_hotswap_column_net: + what: router + where: /key/ + params: + locked: false + routes: + - "F(7.085,-2.54)(7.085,-4.67813)(4.42113,-7.342)(-6.867,-7.342)(-7.7705,-6.4385)(-7.7705,-4.495)V(-7.7705,-3.2255)(-7.085,-2.54)" # net: {{column_net}} + net: "{{column_net}}" + adjust: + rotate: switch_rotation + + routes_switch_hotswap_colrow_net: + what: router + where: /key/ + params: + locked: false + routes: + - "B(7,-2.975)(7,-3.922)(5.842,-5.08)(4.357,-6.565)(4.17,-6.565)V(3.774,-6.961)(-3.961,-6.961)(-5.842,-5.08)(-7,-3.922)(-7,-2.975)" # net: {{colrow}} + net: "{{colrow}}" + adjust: + rotate: switch_rotation + + routes_switch_diode_row_net: + what: router + where: /key/ + params: + locked: false + routes: + - "B(7,0.325)(6.185,1.14)(6.06,1.14)V(4.8291,2.3709)(-4.9541,2.3709)(-7,0.325)" # net: {{row_net}} + net: "{{row_net}}" + adjust: + rotate: switch_rotation + per_key_leds: what: sk6812mini-e where: /key/ @@ -658,6 +781,8 @@ pcbs: reversible: true reverse_mount: true add_traces_vias: true + gnd_trace_width: 0.25 + pwr_trace_width: 0.25 adjust: shift: [led_pos_x, led_pos_y] rotate: led_rotation @@ -679,6 +804,8 @@ pcbs: reversible: true reverse_mount: false add_traces_vias: true + gnd_trace_width: 0.25 + pwr_trace_width: 0.25 adjust: shift: [0, vertical_underglow_shift] @@ -699,14 +826,14 @@ pcbs: P6: R1 P7: R2 P8: R3 - traces: false + traces: true show_instructions: false - show_silk_labels: false + show_silk_labels: true show_via_labels: true adjust: shift: [19.704, 0.375 kp -18.37] - oled: + display: what: combo_display where: matrix_inner_top params: diff --git a/ergogen/footprints/router.js b/ergogen/footprints/router.js new file mode 100644 index 0000000..8741f77 --- /dev/null +++ b/ergogen/footprints/router.js @@ -0,0 +1,180 @@ +// Router +// Version: 0.1 + +// Snippets of code used here were taken from https://github.com/infused-kim/kb_ergogen_fp (adjust_oint) +// Credits goes to Github infused-kim, Thanks! + +module.exports = { + params: { + net: { type: "net", value: "" }, + width: { type: "number", value: 0.25 }, + route: { type: "string", value: "" }, + routes: { type: "array", value: [] }, + via_size: { type: "number", value: 0.8 }, + via_drill: { type: "number", value: 0.4 }, + locked: false, + }, + + body: (p) => { + const get_at_coordinates = () => { + const pattern = /\(at (-?[\d\.]*) (-?[\d\.]*) (-?[\d\.]*)\)/ + const matches = p.at.match(pattern) + if (matches && matches.length == 4) { + return [ + parseFloat(matches[1]), + parseFloat(matches[2]), + parseFloat(matches[3]), + ] + } else { + return null + } + } + + const adjust_point = (x, y) => { + const at_l = get_at_coordinates() + if (at_l == null) { + throw new Error(`Could not get x and y coordinates from p.at: ${p.at}`) + } + const at_x = at_l[0] + const at_y = at_l[1] + const at_angle = at_l[2] + + const radians = (Math.PI / 180) * at_angle, + cos = Math.cos(radians), + sin = Math.sin(radians), + nx = cos * x + sin * y + at_x, + ny = cos * y - sin * x + at_y + + const point_str = `${nx.toFixed(5)/1} ${ny.toFixed(5)/1}` // the division by 1 is to remove trailing zeros + return point_str + } + + // (segment (start 108.8 108) (end 109.7 108) (width 0.2) (layer "F.Cu") (net 0)) + const get_segment = (start, end, layer, net) => { + if (!layer) { + throw new Error( + "Can't place segment before layer is set, use 'f' or 'b', to set starting layer" + ) + } + return `(segment ${locked}(start ${adjust_point( + start[0], + start[1] + )}) (end ${adjust_point(end[0], end[1])}) (width ${ + p.width + }) (layer ${layer}) (net ${net}))` + } + + // (via (at 108.8 108) (size 0.8) (drill 0.4) (layers "F.Cu" "B.Cu") (net 0)) + const get_via = (pos, net) => { + if (!pos) { + throw new Error( + "Can't place via when position is not set, use (x,y) to set position" + ) + } + return `(via ${locked}(at ${adjust_point(pos[0], pos[1])}) (size ${ + p.via_size + }) (drill ${p.via_drill}) (layers "F.Cu" "B.Cu") (net ${net}))` + } + + const parse_tuple = (t) => { + let str_tuple = JSON.parse(t.replace(/\(/g, "[").replace(/\)/g, "]")) + let num_tuple = str_tuple.map((v) => Number(v)) + if (isNaN(num_tuple[0] || isNaN(num_tuple[1]))) { + throw new Error(`Invalid position encountered: ${str_tuple}`) + } + return num_tuple + } + + const get_traces = (route, net) => { + let traces = "" + let layer = undefined + let start = undefined // [x, y] + + for (let i = 0; i < route.length; i++) { + ch = route[i].toLowerCase() + switch (ch) { + case "f": + layer = "F.Cu" + break + case "b": + layer = "B.Cu" + break + case "v": + traces = traces + get_via(start, net) + "\n" + switch (layer) { + case "F.Cu": + layer = "B.Cu" + break + case "B.Cu": + layer = "F.Cu" + break + } + break + case "(": + let tuple_str = "(" + let parenthesis_idx = i + for (i = i + 1; i < route.length; i++) { + let ch = route[i] + tuple_str += ch + if (route[i] == ")") { + break + } + if (i > route.length) { + throw new Error( + `Unclosed position parenthesis in ${route} at character position ${parenthesis_idx}` + ) + } + } + let pos = parse_tuple(tuple_str) + if (start) { + traces = traces + get_segment(start, pos, layer, net) + "\n" + } + start = pos + break + case "<": + let net_name = "" + let lt_idx = i + for (i = i + 1; i < route.length; i++) { + let ch = route[i] + if (route[i] == ">") { + break + } + net_name += ch + if (i > route.length) { + throw new Error( + `Unclosed net parenthesis in ${route} at character position ${lt_idx}` + ) + } + } + net = p.global_net(net_name) + case "x": + case "|": + start = undefined + break + default: + throw new Error(`Unsupported character '${ch}' at position ${i}.`) + } + } + + return traces + } + + const get_routes_traces = (routes, net) => { + let routes_traces = routes.reduce((acc_traces, route) => { + return acc_traces + get_traces(route, net) + }, "") + return routes_traces + } + + let combined_traces = "" + let locked = p.locked ? 'locked ' : '' + if (p.route) { + combined_traces += get_traces(p.route, p.net.index) + } + if (p.routes) { + combined_traces += get_routes_traces(p.routes, p.net.index) + } + + return combined_traces + }, +} \ No newline at end of file