diff --git a/generate_layout.rb b/generate_layout.rb new file mode 100755 index 0000000..86fabfb --- /dev/null +++ b/generate_layout.rb @@ -0,0 +1,337 @@ +#!/usr/bin/env ruby +# -*- encoding: utf-8 -*- +# Copyright muflax , 2015 +# License: GNU GPLv3 (or later) + +require "muflax" + +LayoutDir = "src/keyboard/ergodox/layout" +LayoutFile = "#{LayoutDir}/saneo-mod_generated.c" + +puts "generating #{LayoutFile}..." + +Layer = Struct.new :code, :up, :down + +class Key + attr_reader :layers + + Layers = [ :basic, :mod3, :mod4, :mod5 ] + + Functions = { + # down up + "basic" => [ "&kbfun_press_release", ], + "toggle" => [ "&kbfun_toggle", ], + "transparent" => [ "&kbfun_transparent", ], + # down up + "mod3" => [ "&kbfun_layer_push_1", "&kbfun_layer_pop_1" ], + "mod4" => [ "&kbfun_layer_push_2", "&kbfun_layer_pop_2" ], + "mod5" => [ "&kbfun_layer_push_3", "&kbfun_layer_pop_3" ], + "latch_mod3" => [ "&kbfun_layer_sticky_1", ], + "latch_mod4" => [ "&kbfun_layer_sticky_2", ], + "latch_mod5" => [ "&kbfun_layer_sticky_3", ], + # down up + "shifted" => [ "&kbfun_shift_press_release", ], + "ctrled" => [ "&kbfun_control_press_release", ], + "capslock" => [ "&kbfun_2_keys_capslock_press_release", ], + } + + Keys = { + "a" => "KEY_a_A", + "b" => "KEY_b_B", + "c" => "KEY_c_C", + "d" => "KEY_d_D", + "e" => "KEY_e_E", + "f" => "KEY_f_F", + "g" => "KEY_g_G", + "h" => "KEY_h_H", + "i" => "KEY_i_I", + "j" => "KEY_j_J", + "k" => "KEY_k_K", + "l" => "KEY_l_L", + "m" => "KEY_m_M", + "n" => "KEY_n_N", + "o" => "KEY_o_O", + "p" => "KEY_p_P", + "q" => "KEY_q_Q", + "r" => "KEY_r_R", + "s" => "KEY_s_S", + "t" => "KEY_t_T", + "u" => "KEY_u_U", + "v" => "KEY_v_V", + "w" => "KEY_w_W", + "x" => "KEY_x_X", + "y" => "KEY_y_Y", + "z" => "KEY_z_Z", + # + "0" => "KEY_0_RightParenthesis", + "1" => "KEY_1_Exclamation", + "2" => "KEY_2_At", + "3" => "KEY_3_Pound", + "4" => "KEY_4_Dollar", + "5" => "KEY_5_Percent", + "6" => "KEY_6_Caret", + "7" => "KEY_7_Ampersand", + "8" => "KEY_8_Asterisk", + "9" => "KEY_9_LeftParenthesis", + # + "f1" => "KEY_F1", + "f2" => "KEY_F2", + "f3" => "KEY_F3", + "f4" => "KEY_F4", + "f5" => "KEY_F5", + "f6" => "KEY_F6", + "f7" => "KEY_F7", + "f8" => "KEY_F8", + "f9" => "KEY_F9", + "f10" => "KEY_F10", + "f11" => "KEY_F11", + "f12" => "KEY_F12", + "f13" => "KEY_F13", + "f14" => "KEY_F14", + "f15" => "KEY_F15", + "f16" => "KEY_F16", + "f17" => "KEY_F17", + "f18" => "KEY_F18", + "f19" => "KEY_F19", + "f20" => "KEY_F20", + "f21" => "KEY_F21", + "f22" => "KEY_F22", + "f23" => "KEY_F23", + "f24" => "KEY_F24", + # + "\\" => "KEY_Backslash_Pipe", + "[" => "KEY_LeftBracket_LeftBrace", + "]" => "KEY_RightBracket_RightBrace", + "," => "KEY_Comma_LessThan", + "-" => "KEY_Dash_Underscore", + "=" => "KEY_Equal_Plus", + "`" => "KEY_GraveAccent_Tilde", + "." => "KEY_Period_GreaterThan", + "\'" => "KEY_SingleQuote_DoubleQuote", + ";" => "KEY_Semicolon_Colon", + "/" => "KEY_Slash_Question", + "~" => "KEY_GraveAccent_Tilde", + "%" => "KEY_5_Percent", + "*" => "KEY_8_Asterisk", + ":" => "KEY_Semicolon_Colon", + # + "enter" => "KEY_ReturnEnter", + "space" => "KEY_Spacebar", + "tab" => "KEY_Tab", + "backspace" => "KEY_DeleteBackspace", + "delete" => "KEY_DeleteForward", + "home" => "KEY_Home", + "end" => "KEY_End", + "page_up" => "KEY_PageUp", + "page_down" => "KEY_PageDown", + "up" => "KEY_UpArrow", + "down" => "KEY_DownArrow", + "left" => "KEY_LeftArrow", + "right" => "KEY_RightArrow", + "escape" => "KEY_Escape", + "insert" => "KEY_Insert", + "menu" => "KEY_Application", + # + "alt" => "KEY_LeftAlt", + "alt_gr" => "KEY_RightAlt", + "umlaut" => "KEY_RightAlt", + "control" => "KEY_LeftControl", + "control_l" => "KEY_LeftControl", + "control_r" => "KEY_RightControl", + "win" => "KEY_LeftGUI", + "shift_l" => "KEY_LeftShift", + "shift_r" => "KEY_RightShift", + "scroll_lock" => "KEY_ScrollLock", + # + "mod3" => "NULL", + "mod4" => "NULL", + "mod5" => "NULL", + } + + def initialize layers + @layers = layers.map do |key, type| + raise "key not found: #{key}" if not Keys.include? key and not key.nil? + raise "type not found: #{type}" if not Functions.include? type and not type.nil? + + key = Keys[key] || "NULL" + up, down = Functions[type] || Functions["basic"] + down ||= up + + Layer.new key, down, up + end + end +end + +class Layout + def initialize name, keys + @name = name + @keys = keys + end + + def keys_to_matrix method + Key::Layers.map.with_index do |_, layer| + "KB_MATRIX_LAYER(\n#{@keys.map{|key| key.layers[layer].send(method)}.join(",\n")}),\n" + end.join("\n") + end + + def save! file + puts "saving #{@name}..." + + header =<
+#include +#include +#include "../../../lib/data-types/misc.h" +#include "../../../lib/usb/usage-page/keyboard--short-names.h" +#include "../../../lib/key-functions/public.h" +#include "../matrix.h" +#include "../layout.h" +// ---------------------------------------------------------------------------- + +HEADER + + keys = keys_to_matrix :code + downs = keys_to_matrix :down + ups = keys_to_matrix :up + + File.save(LayoutFile) do |f| + f.puts header + f.puts "const uint8_t PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { #{keys} };" + f.puts "const void_funptr_t PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { #{downs} };" + f.puts "const void_funptr_t PROGMEM _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { #{ups} };" + end + end +end + +keys = [ + # letter type mod3 type mod4 type mod5 type + %w{ }, %w{ }, %w{ }, %w{ }, # dummy key + # + # left hand + # number + # letter type mod3 type mod4 type mod5 type + %w{ 0 }, %w{ }, %w{ }, %w{ }, # 1.5 + %w{ 1 }, %w{ }, %w{ }, %w{ }, + %w{ 2 }, %w{ }, %w{ }, %w{ }, + %w{ 3 }, %w{ }, %w{ }, %w{ }, + %w{ 4 }, %w{ }, %w{ }, %w{ }, + %w{ 5 }, %w{ }, %w{ }, %w{ }, + %w{ 6 }, %w{ }, %w{ }, %w{ }, + # top + # letter type mod3 type mod4 type mod5 type + %w{ x }, %w{ }, %w{ }, %w{ }, # 1.5 + %w{ x }, %w{ ~ }, %w{ escape }, %w{ }, + %w{ v }, %w{ }, %w{ }, %w{ }, + %w{ l }, %w{ }, %w{ }, %w{ }, + %w{ c }, %w{ }, %w{ }, %w{ }, + %w{ w }, %w{ }, %w{ }, %w{ }, + %w{ }, %w{ }, %w{ }, %w{ }, # 1.5 + # home + # letter type mod3 type mod4 type mod5 type + %w{ umlaut }, %w{ }, %w{ }, %w{ }, # 1.5 + %w{ u }, %w{ }, %w{ }, %w{ }, + %w{ i }, %w{ }, %w{ }, %w{ }, + %w{ a }, %w{ }, %w{ }, %w{ }, + %w{ e }, %w{ }, %w{ }, %w{ }, + %w{ o }, %w{ }, %w{ }, %w{ }, + # bottom + # letter type mod3 type mod4 type mod5 type + %w{ shift_l }, %w{ }, %w{ }, %w{ }, # 1.5 + %w{ % }, %w{ }, %w{ }, %w{ }, + %w{ * }, %w{ }, %w{ }, %w{ }, + %w{ : }, %w{ }, %w{ }, %w{ }, + %w{ p }, %w{ }, %w{ }, %w{ }, + %w{ z }, %w{ }, %w{ }, %w{ }, + %w{ enter }, %w{ }, %w{ }, %w{ }, # 1.5 + # underbottom + # letter type mod3 type mod4 type mod5 type + %w{ left }, %w{ }, %w{ }, %w{ }, + %w{ up }, %w{ }, %w{ }, %w{ }, + %w{ down }, %w{ }, %w{ }, %w{ }, + %w{ right }, %w{ }, %w{ }, %w{ }, + %w{ win }, %w{ }, %w{ }, %w{ }, + # thumb-top + # letter type mod3 type mod4 type mod5 type + %w{ scroll_lock }, %w{ }, %w{ }, %w{ }, + %w{ scroll_lock }, %w{ }, %w{ }, %w{ }, + # thumb-double + # letter type mod3 type mod4 type mod5 type + %w{ space }, %w{ }, %w{ }, %w{ }, + %w{ control }, %w{ }, %w{ }, %w{ }, + %w{ alt }, %w{ }, %w{ }, %w{ }, + # thumb-home + # letter type mod3 type mod4 type mod5 type + %w{ space }, %w{ }, %w{ }, %w{ }, + %w{ control }, %w{ }, %w{ }, %w{ }, + %w{ alt }, %w{ }, %w{ }, %w{ }, + # + # right hand + # + # number + # letter type mod3 type mod4 type mod5 type + %w{ 5 }, %w{ }, %w{ }, %w{ }, # 1.5 + %w{ 6 }, %w{ }, %w{ }, %w{ }, + %w{ 7 }, %w{ }, %w{ }, %w{ }, + %w{ 8 }, %w{ }, %w{ }, %w{ }, + %w{ 9 }, %w{ }, %w{ }, %w{ }, + %w{ 0 }, %w{ }, %w{ }, %w{ }, + %w{ 0 }, %w{ }, %w{ }, %w{ }, + # top + # letter type mod3 type mod4 type mod5 type + %w{ }, %w{ }, %w{ }, %w{ }, # 1.5 + %w{ k }, %w{ }, %w{ }, %w{ }, + %w{ h }, %w{ }, %w{ }, %w{ }, + %w{ g }, %w{ }, %w{ }, %w{ }, + %w{ f }, %w{ }, %w{ }, %w{ }, + %w{ q }, %w{ }, %w{ }, %w{ }, + %w{ q }, %w{ }, %w{ }, %w{ }, # 1.5 + # home + # letter type mod3 type mod4 type mod5 type + %w{ s }, %w{ }, %w{ }, %w{ }, + %w{ n }, %w{ }, %w{ }, %w{ }, + %w{ r }, %w{ }, %w{ }, %w{ }, + %w{ t }, %w{ }, %w{ }, %w{ }, + %w{ d }, %w{ }, %w{ }, %w{ }, + %w{ umlaut }, %w{ }, %w{ }, %w{ }, # 1.5 + # bottom + # letter type mod3 type mod4 type mod5 type + %w{ enter }, %w{ }, %w{ }, %w{ }, # 1.5 + %w{ b }, %w{ }, %w{ }, %w{ }, + %w{ m }, %w{ }, %w{ }, %w{ }, + %w{ j }, %w{ }, %w{ }, %w{ }, + %w{ y }, %w{ }, %w{ }, %w{ }, + %w{ ; }, %w{ }, %w{ }, %w{ }, + %w{ shift_r }, %w{ }, %w{ }, %w{ }, # 1.5 + # underbottom + # letter type mod3 type mod4 type mod5 type + %w{ mod4 }, %w{ }, %w{ }, %w{ }, + %w{ left }, %w{ }, %w{ }, %w{ }, + %w{ up }, %w{ }, %w{ }, %w{ }, + %w{ down }, %w{ }, %w{ }, %w{ }, + %w{ right }, %w{ }, %w{ }, %w{ }, + # thumb-top + # letter type mod3 type mod4 type mod5 type + %w{ }, %w{ }, %w{ }, %w{ }, + %w{ }, %w{ }, %w{ }, %w{ }, + # thumb-double + # letter type mod3 type mod4 type mod5 type + %w{ menu }, %w{ }, %w{ }, %w{ }, + %w{ alt }, %w{ }, %w{ }, %w{ }, + %w{ mod3 }, %w{ }, %w{ }, %w{ }, + # thumb-home + # letter type mod3 type mod4 type mod5 type + %w{ menu }, %w{ }, %w{ }, %w{ }, + %w{ alt }, %w{ }, %w{ }, %w{ }, + %w{ mod3 }, %w{ }, %w{ }, %w{ }, + +].each_slice(Key::Layers.size).map do |layers| + Key.new layers +end + +ap keys + +saneo = Layout.new :saneo, keys +saneo.save! LayoutFile diff --git a/makefile b/makefile index 158c10e..0edf5ad 100644 --- a/makefile +++ b/makefile @@ -2,20 +2,15 @@ # makefile for the ergoDOX project # ----------------------------------------------------------------------------- -# directories -BUILD := build -ROOT := $(BUILD)/$(TARGET) -SCRIPTS := build-scripts - -# ----------------------------------------------------------------------------- -# ----------------------------------------------------------------------------- - -.PHONY: all clean firmware +.PHONY: all clean firmware layout all: firmware clean: cd src; $(MAKE) clean -firmware: clean +firmware: clean layout cd src; $(MAKE) all + +layout: + ./generate_layout.rb diff --git a/src/keyboard/ergodox/layout/saneo-mod_generated.h b/src/keyboard/ergodox/layout/saneo-mod_generated.h new file mode 120000 index 0000000..bd3f920 --- /dev/null +++ b/src/keyboard/ergodox/layout/saneo-mod_generated.h @@ -0,0 +1 @@ +saneo-mod.h \ No newline at end of file