;; Atreus simulator ;; Copyright © 2020 Phil Hagelberg and contributors ;; released under the GPLv3 or later ;; main.lua: ;; dofile("../fennel/fennel.lua").dofile("sim.fnl", {correlate=true}) (var scale 2.5) (local width 260) (local height 150) (local cols 6) ; per hand (local rows 4) (local angle (math.rad 10)) (local corner-radius 8) (local bottom 100) ; outer bottom (local switch-height 13.72) (local switch-width 13.62) (local switch-spacing 18.6) ;;;; switches (local offsets [8.0 5.0 0.0 6.0 11.0 15.0]) (local hand-width 106.621) (local hand-height (+ (* switch-spacing rows) (- switch-spacing switch-height) (. offsets 1))) (local switch-x-offset (* 1.75 corner-radius)) (local switch-y-offset (- bottom hand-height (- (math.sqrt corner-radius)))) (local switches-left []) (local switches-right []) (local switches-fn-left []) (local switches-fn-right []) (local layout-l [["'" "," :. :p :y] [:a :o :e :u :i] [";" :q :j :k :x "`"] [:esc :tab :super :lshift :backspace :ctrl]]) (local layout-r [[:f :g :c :r :l] [:d :h :t :n :s] ["\\" :b :m :w :v :z] [:alt " " :fn :- :/ "\n"]]) (local layout-fl [["!" "@" :up "$" "%"] ["(" :left :down :right ")"] ["[" "]" "#" "{" "}" "^"] [:l2 :insert :super2 :rshift :backspace2 :ctrl2]]) (local layout-fr [[:pgup :7 :8 :9 :backspace3] [:pgdn :4 :5 :6 :blank] ["&" "*" :1 :2 :3 :+] [:alt2 :space2 :fn2 :.2 :0 :=]]) (local keys {}) (for [col 1 cols] ; switches (for [row 1 rows] (when (not (and (= 6 col) (<= row 2))) (let [lx (+ (* switch-spacing (- col 1))) rx (- (* (- cols 1) switch-spacing) lx) y (+ (* switch-spacing (- row 1)) (. offsets col)) fn-y (+ y bottom) kl (table.remove (. layout-l row) 1) kr (table.remove (. layout-r row)) kfl (table.remove (. layout-fl row) 1) kfr (table.remove (. layout-fr row))] (table.insert switches-left {:x lx :y y :p [] :k kl}) (table.insert switches-right {:x rx :y y :p [] :k kr}) (table.insert switches-fn-left {:x lx :y fn-y :p [] :k kfl :fn true}) (table.insert switches-fn-right {:x rx :y fn-y :p [] :k kfr :fn true}) (tset keys kl (. switches-left (# switches-left))) (tset keys kr (. switches-right (# switches-right))) (tset keys kfl (. switches-fn-left (# switches-fn-left))) (tset keys kfr (. switches-fn-right (# switches-fn-right))))))) (fn press [pressed] (let [key (. keys (pressed:lower))] (when key (table.insert key.p {:ox (love.math.randomNormal 2 0) :oy (love.math.randomNormal 2 0) :r (love.math.randomNormal 2 8)}) (when key.fn (press :fn)) (when (not= pressed (pressed:lower)) (press :lshift))))) (var text "The Atreus is a mechanical keyboard designed primarily to match the shape of human hands and to be as portable as possible. The case measures 26x12cm and lacks even a number row, relying heavily upon the =fn= key. There is a circuit board for this design, but it's also possible to [[http://wiki.geekhack.org/index.php?title=Hard-Wiring_How-To] [manually wire the matrix]]. ") (fn tick [] (when (< 0 (# text)) (let [key (text:sub 1 1)] (press key) (set text (text:sub 2))))) (var t 0) (fn love.update [dt] (set t (+ t dt)) (when (< 0.2 t) (tick) (set t 0))) (fn draw-switch [{: x : y : k : p}] (love.graphics.rectangle :line x y switch-width switch-height) (when (= (# k) 1) (love.graphics.print k (+ x 2) y)) (love.graphics.setColor 0 0.8 0.9 0.1) (each [_ p (ipairs p)] (love.graphics.circle :fill (+ x p.ox (/ switch-width 2)) (+ y p.oy (/ switch-height 2)) p.r)) (love.graphics.setColor 0 0 0)) (fn love.draw [] (let [(w h) (love.graphics.getDimensions)] (love.graphics.setColor 1 1 1) (love.graphics.rectangle :fill 0 0 w h) (love.graphics.setColor 0 0 0) (love.graphics.scale scale) (love.graphics.push) (love.graphics.translate (- width hand-width switch-x-offset) switch-y-offset) (love.graphics.rotate angle 0 hand-height) (love.graphics.translate (- hand-width) 0) (each [_ s (pairs switches-left)] (draw-switch s)) (each [_ s (pairs switches-fn-left)] (draw-switch s)) (love.graphics.pop) (love.graphics.push) (love.graphics.translate (- width hand-width switch-x-offset) switch-y-offset) (love.graphics.rotate (- angle)) (each [_ s (pairs switches-right)] (draw-switch s)) (each [_ s (pairs switches-fn-right)] (draw-switch s)) (love.graphics.pop))) (fn love.keypressed [key] (match key "=" (set scale (+ scale 0.2)) "-" (set scale (- scale 0.2)) "escape" (love.event.quit) "return" (let [fennel (dofile "../fennel/fennel.lua")] (fennel.dofile "sim.fnl")) key (press key)))