]> git.armaanb.net Git - atreides.git/commitdiff
Add love2d typing simulation.
authorPhil Hagelberg <phil@hagelb.org>
Mon, 2 Mar 2020 16:37:31 +0000 (08:37 -0800)
committerPhil Hagelberg <phil@hagelb.org>
Mon, 2 Mar 2020 16:37:31 +0000 (08:37 -0800)
sim.fnl [new file with mode: 0644]

diff --git a/sim.fnl b/sim.fnl
new file mode 100644 (file)
index 0000000..f27fc9b
--- /dev/null
+++ b/sim.fnl
@@ -0,0 +1,159 @@
+;; 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)))