// Author: @infused-kim + @ceoloide improvements // // Description: // SMD side-operated on-off switch, compatible with Alps SSSS811101 // as sold on Typeractive.xyz. These switches are shorter than the height of hotswap // sockets, so they can be mounted on the same side. // // Should be compatible with: // - G-Switch MK-12C02-G015 (untested) // - PCM12SMTR (untested) // // Datasheet: // https://cdn.shopify.com/s/files/1/0618/5674/3655/files/ALPS-SSSS811101.pdf?v=1670451309 // // Nets // from: corresponds to pin 1 on the Front and 3 on the back // to: corresponds to pin 2 on both sides // // Params // reversible: default is false // if true, it will include pads on both Front and Back to make the footprint reversible // side: default is F for Front // the side on which to place the single-side footprint and designator, either F (Front) // or B (Back) // silkscreen: default is true // if true it will include silkscreen markings // courtyard: default is false // if true it will include the part courtyard // invert_behavior: default is false // if true, pin 3 will connect to the "from" net, and if false it will connect to pin 1, // effectively inverting the behavior of the switch. // // @ceoloide's improvements: // - Added ability to set text on both sides // - Added ability to adjust font thickness and size module.exports = { params: { designator: 'SW', reversible: false, side: 'F', silkscreen: true, courtyard: false, invert_behavior: true, from: {type: 'net', value: 'BAT_P'}, to: {type: 'net', value: 'RAW'}, }, body: p => { const common_start = ` (module power_switch (layer ${p.side}.Cu) (tedit 64473C6F) ${p.at /* parametric position */} (attr smd) (fp_text value "reset_button" (at 0 2.5 ${p.rot}) (layer ${p.side}.Fab) (effects (font (size 1 1) (thickness 0.15))) ) ` const silkscreen_front = ` (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_text user "ON" (at 0 ${p.invert_behavior ? '-' : ''}4.5 ${p.rot}) (layer "F.SilkS") (effects (font (size 1 1) (thickness 0.15)) (justify ${p.invert_behavior ? 'bottom' : 'top'})) ) (fp_text user "OFF" (at 0 ${p.invert_behavior ? '' : '-'}4.5 ${p.rot}) (layer "F.SilkS") (effects (font (size 1 1) (thickness 0.15)) (justify ${p.invert_behavior ? 'top' : 'bottom'})) ) (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.425 -1.4) (end -1.425 -1.6) (layer F.SilkS) (width 0.12)) ` const silkscreen_back = ` (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_text user "ON" (at 0 ${p.invert_behavior ? '-' : ''}4.5 ${p.rot}) (layer "B.SilkS") (effects (font (size 1 1) (thickness 0.15)) (justify ${p.invert_behavior ? 'bottom' : 'top'} mirror)) ) (fp_text user "OFF" (at 0 ${p.invert_behavior ? '' : '-'}4.5 ${p.rot}) (layer "B.SilkS") (effects (font (size 1 1) (thickness 0.15)) (justify ${p.invert_behavior ? 'top' : 'bottom'} mirror)) ) (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)) ` const courtyard_front = ` (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)) ` const courtyard_back = ` (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)) (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 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)) ` const pads_front = ` (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 "" smd rect (at 1.125 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) ${p.invert_behavior ? '' : p.from.str}) (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.to.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.invert_behavior ? p.from.str : ''}) ` const pads_back = ` (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 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 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)) (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 "" 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 1 smd rect (at -1.735 -2.25 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask) ${p.invert_behavior ? p.from.str : ''}) (pad 2 smd rect (at -1.735 0.75 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask) ${p.to.str}) (pad 3 smd rect (at -1.735 2.25 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask) ${p.invert_behavior ? '' : p.from.str}) ` const common_end = ` (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 = common_start; if(p.side == "F" || p.reversible) { final += pads_front if(p.silkscreen){ final += silkscreen_front } if(p.courtyard){ final += courtyard_front } } if(p.side == "B" || p.reversible) { final += pads_back if(p.silkscreen){ final += silkscreen_back } if(p.courtyard){ final += courtyard_back } } final += common_end; return final; } }