Created
April 19, 2023 23:45
-
-
Save hasumikin/736abd5f93d677891975988b23a1908d to your computer and use it in GitHub Desktop.
PRK Firmware I2C example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# Pin assignment: | |
# switch matrix: | |
# row: 1, 2, 3, 4 | |
# col: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 | |
# RGBLED: 0 | |
# I2C0: trackball and RTC | |
# sda_pin: 20 | |
# scl_pin: 21 | |
# SPI1: | |
# cipo_pin(rx): 24 (-> SD card miso) | |
# cs_pin: 25 (-> SD card cs) | |
# sck_pin: 26 (-> SD card sck) | |
# copi_pin(tx): 27 (-> SD card mosi) | |
# | |
require "i2c" | |
require "mouse" | |
require "consumer_key" | |
# Initialize a Keyboard | |
kbd = Keyboard.new | |
# Initialize GPIO assign | |
kbd.init_pins( | |
[ 1, 2, 3, 4 ], # row | |
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] # col | |
) | |
kbd.add_layer :default, %i[ | |
KC_ESCAPE KC_Q KC_W KC_E KC_R KC_T KC_NO KC_NO KC_Y KC_U KC_I KC_O KC_P KC_MINUS | |
KC_TAB KC_A KC_S KC_D KC_F KC_G KC_NO KC_NO KC_H KC_J KC_K KC_L KC_SCOLON KC_BSPACE | |
KC_LSFT KC_Z KC_X KC_C KC_V KC_B KC_BTN1 KC_BTN2 KC_N KC_M KC_COMMA KC_DOT KC_SLASH KC_RSFT | |
KC_NO KC_NO KC_NO RGB_MOD KC_LALT KC_LCTL LOWER_SPC RAISE_ENT SPC_CTL KC_RGUI RGB_TOG KC_NO KC_NO KC_NO | |
] | |
kbd.add_layer :raise, %i[ | |
KC_GRAVE KC_EXLM KC_AT KC_HASH KC_DLR KC_PERC KC_NO KC_NO KC_CIRC KC_AMPR KC_ASTER KC_LPRN KC_RPRN KC_EQUAL | |
KC_TAB KC_LABK KC_LCBR KC_LBRACKET KC_LPRN KC_QUOTE KC_NO KC_NO KC_LEFT KC_DOWN KC_UP KC_RIGHT KC_UNDS KC_PIPE | |
KC_LSFT KC_RABK KC_RCBR KC_RBRACKET KC_RPRN KC_DQUO DSK_LEFT DSK_RIGHT KC_TILD KC_BSLASH KC_COMMA KC_DOT KC_SLASH KC_RSFT | |
KC_NO KC_NO KC_NO RGB_SPI KC_LALT KC_LCTL ADJUST RAISE_ENT SPC_CTL KC_RGUI BOOTSEL KC_NO KC_NO KC_NO | |
] | |
kbd.add_layer :lower, %i[ | |
KC_ESCAPE KC_1 KC_2 KC_3 KC_4 KC_5 KC_NO KC_NO KC_6 KC_7 KC_8 KC_9 KC_0 KC_EQUAL | |
KC_TAB KC_LABK KC_LCBR KC_LBRACKET KC_LPRN KC_QUOTE KC_NO KC_NO KC_DOT KC_4 KC_5 KC_6 KC_PLUS KC_DEL | |
KC_LSFT KC_RABK KC_RCBR KC_RBRACKET KC_RPRN KC_DQUO DSK_LEFT DSK_RIGHT KC_0 KC_1 KC_2 KC_3 KC_SLASH KC_COMMA | |
KC_NO KC_NO KC_NO RGB_SPD KC_LALT KC_LCTL LOWER_SPC ADJUST SPC_CTL KC_RGUI BOOTSEL KC_NO KC_NO KC_NO | |
] | |
kbd.add_layer :adjust, %i[ | |
KC_F1 KC_F2 KC_F3 KC_F4 KC_F5 KC_F6 KC_NO KC_NO KC_F7 KC_F8 KC_F9 KC_F10 KC_F11 KC_F12 | |
RGB_TOG RGB_SPI RGB_HUI RGB_SAI RGB_VAI RGB_MOD KC_NO KC_NO KC_NO KC_NO KC_NO KC_NO KC_NO KC_DEL | |
RGB_TOG RGB_SPD RGB_HUD RGB_SAD RGB_VAD RGB_RMOD KC_VOLU KC_VOLD KC_NO KC_NO KC_NO KC_NO KC_NO STATS | |
KC_NO KC_NO KC_NO KC_NO KC_LALT KC_LCTL ADJUST ADJUST SPC_CTL KC_RGUI BOOTSEL KC_NO KC_NO KC_NO | |
] | |
kbd.define_composite_key :SPC_CTL, %i(KC_SPACE KC_RCTL) | |
kbd.define_composite_key :DSK_LEFT, %i(KC_LALT KC_LEFT) | |
kbd.define_composite_key :DSK_RIGHT, %i(KC_LALT KC_RIGHT) | |
kbd.define_mode_key :RAISE_ENT, [ :KC_ENTER, :raise, 150, 150 ] | |
kbd.define_mode_key :LOWER_SPC, [ :KC_SPACE, :lower, 150, 150 ] | |
kbd.define_mode_key :STATS, [ Proc.new { PicoRubyVM.print_alloc_stats }, nil, 300, nil ] | |
kbd.define_mode_key :ADJUST, [ nil, :adjust, nil, nil ] | |
kbd.define_mode_key :BOOTSEL, [ Proc.new { kbd.bootsel! }, nil, 300, nil ] | |
# Initialize RGBLED with pin, underglow_size, backlight_size and is_rgbw. | |
rgb = RGB.new( | |
0, # pin number | |
8, # size of underglow pixel | |
0, # size of backlight pixel | |
false # 32bit data will be sent to a pixel if true while 24bit if false | |
) | |
rgb.effect = :breath | |
rgb.hue = 0 | |
rgb.speed = 25 | |
kbd.append rgb | |
kbd.output_report_changed do |output| | |
if output & Keyboard::LED_CAPSLOCK > 0 | |
rgb.hue = 100 | |
else | |
rgb.hue = 0 | |
end | |
end | |
i2c = I2C.new( | |
unit: :RP2040_I2C0, | |
frequency: 100 * 1000, | |
sda_pin: 20, | |
scl_pin: 21 | |
) | |
begin | |
# 0x0a is the I2C address of AZ1UBALL (PIM447) | |
i2c.write(0x0a, 0x91) # Set acceleration mode | |
i2c_valid = true | |
rescue | |
puts "No valid I2C mouse found" | |
i2c_valid = false | |
end | |
if i2c_valid | |
mouse = Mouse.new(driver: i2c) | |
mouse.task do |mouse, keyboard| | |
left, x, up, y, push = mouse.driver.read(0x0a, 5).bytes | |
x = -left if 0 < left | |
y = -up if 0 < up | |
# LEFT: 0b001, RIGHT: 0b010, MIDDLE: 0b100 | |
button = (push == 128 ? 0b100 : 0) | |
if keyboard.layer == :default | |
# 4x speed if the value is larger than 3 | |
3 < x.abs ? x *= 4 : x *= 2 | |
3 < y.abs ? y *= 4 : y *= 2 | |
USB.merge_mouse_report(button, x, y, 0, 0) | |
else | |
# Works as a scroll wheel when layer is changed | |
USB.merge_mouse_report(button, 0, 0, x, -y) | |
end | |
end | |
kbd.append mouse | |
end | |
kbd.start! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment