1
0
Fork 0
forked from forks/qmk_firmware
qmk_firmware/keyboards/bastardkb/charybdis
Stefan Kerkmann 3c58f98929
[Core] PMW33XX drivers overhaul (#17613)
* PMW33XX drivers overhaul

This combines the PMW3389 and PM3360 drivers as they only differ in the
firmware blobs and CPI get and set functions. The following changes have
been made:

* PMW3389 now gets the same multi-sensor feature that is already available on the
  PMW3360.

* Introduced a shared pmw33xx_report_t struct is now directly readable via SPI
  transactions instead of individual byte-sized reads, saving multiple
  copies and bitshift operations.

* pmw33(89/60)_get_report functions had unreachable branches in their motion
  detection logic these have been simplied as much as possible.

* The fast firmware upload option has been removed as this becomes obsolete by
  the newly introduced polled waiting functions for ChibiOS polled waiting

* PMW33(60/89)_SPI_LSBFIRST and PMW33(60/89)_SPI_MODE config options
  have been removed as they don't need to be configurable.

* All PMW3389 and PMW3360 defines have been unified to a PMW33XX prefix
  to reduce code duplication and make the defines interchangeable

* Adjust keyboards to PMW33XX naming scheme
2022-07-14 11:50:00 +02:00
..
3x5 [Core] PMW33XX drivers overhaul (#17613) 2022-07-14 11:50:00 +02:00
4x6 [Core] PMW33XX drivers overhaul (#17613) 2022-07-14 11:50:00 +02:00
charybdis.c [Keyboard] Update Charybdis code for Extended Mouse reports (#17435) 2022-07-02 23:58:40 +10:00
charybdis.h bastardkb/charybdis: add support for Charybdis (4x6 and 3x5) (#15333) 2022-01-21 21:55:04 -08:00
config.h bastardkb/charybdis: add support for Charybdis (4x6 and 3x5) (#15333) 2022-01-21 21:55:04 -08:00
post_config.h [Keyboard] Update Charybdis code for Extended Mouse reports (#17435) 2022-07-02 23:58:40 +10:00
readme.md [Keyboard] Update Charybdis code for Extended Mouse reports (#17435) 2022-07-02 23:58:40 +10:00

Charybdis (6x4, 5x3 "Nano")

An ergonomic keyboard with integrated trackball.

Engineered to be a full mouse replacement solution with high-quality, custom-developed components.

There are 6x4 and 5x3 "Nano" versions.

See the build environment setup and the make instructions for more information.

Brand new to QMK? Start with the Complete Newbs Guide.

Check out the keyboard build guides for the Charybdis and other ergonomic keyboards.

Building the firmware

Charybdis (4x6)

The default keymap is inspired from the original Dactyl Manuform layout.

qmk compile -kb bastardkb/charybdis/4x6 -km default

Check out the via layout if you're looking for VIA support:

qmk compile -kb bastardkb/charybdis/4x6 -km via

Charybdis (3x5)

The default keymap is inspired from the original Dactyl Manuform layout.

qmk compile -kb bastardkb/charybdis/3x5 -km default

Check out the via layout if you're looking for VIA support:

qmk compile -kb bastardkb/charybdis/3x5 -km via

Customizing the firmware

Dynamic DPI scaling

The pointer's DPI can be changed at runtime.

By default, the DPI is set to 400. The Charybdis supports up to 16 different DPI values. By default, it cycles between 400 and 3400, with a step of 200 (ie. 400, 600, 800, …, 3400).

Calling charybdis_cycle_pointer_default_dpi(bool forward) will cycle forward or backward the possible values.

Use charybdis_cycle_pointer_default_dpi_noeeprom(bool forward) to change the DPI value without persisting the change to EEPROM (ie. resetting the board will revert to the last saved value).

charybdis_get_pointer_default_dpi() returns the current DPI value.

This behavior can be further customized with the following defines:

#define CHARYBDIS_MINIMUM_DEFAULT_DPI 400
#define CHARYBDIS_DEFAULT_DPI_CONFIG_STEP 200

Drag-scroll

Drag-scroll enables scrolling with the trackball. When drag-scroll is enabled, the trackball's x and y movements are converted into h (horizontal) and v (vertical) movement, effectively sending scroll instructions to the host system.

Call charybdis_set_pointer_dragscroll_enabled(bool enable) to enable/disable drag-scroll.

charybdis_get_pointer_dragscroll_enabled() returns whether sniping mode is currently enabled.

To invert the horizontal scrolling direction, define CHARYBDIS_DRAGSCROLL_REVERSE_X:

#define CHARYBDIS_DRAGSCROLL_REVERSE_X

To invert the vertical scrolling direction (ie. mimic macOS "natural" scroll direction), define CHARYBDIS_DRAGSCROLL_REVERSE_Y:

#define CHARYBDIS_DRAGSCROLL_REVERSE_Y

This only affects the vertical scroll direction.

Sniping mode

Sniping mode slows down the pointer for more precise gestures. It is useful when combined with a higher default DPI.

Call charybdis_set_pointer_sniping_enabled(bool enable) to enable/disable sniping mode.

charybdis_get_pointer_sniping_enabled() returns whether sniping mode is currently enabled.

Like the default pointer's DPI, the sniper mode DPI can be changed at runtime.

By default, sniping mode lowers the DPI to 200. This can be changed at runtime: the Charybdis supports up to 4 different DPI values for sniping mode. By default, it cycles between 200, 300, 400 and 500.

Calling charybdis_cycle_pointer_sniping_dpi(bool forward) will cycle forward or backward the possible values.

Use charybdis_cycle_pointer_sniping_dpi_noeeprom(bool forward) to change the sniping mode DPI value without persisting the change to EEPROM (ie. resetting the board will revert to the last saved value).

charybdis_get_pointer_sniping_dpi() returns the current sniping mode DPI value.

This behavior can be further customized with the following defines:

#define CHARYBDIS_MINIMUM_SNIPING_DPI 200
#define CHARYBDIS_SNIPING_DPI_CONFIG_STEP 100

Acceleration

By default, the pointer's movements are linear. To enable acceleration, add the following define:

#define CHARYBDIS_POINTER_ACCELERATION_ENABLE

The acceleration factor can be further tune via the CHARYBDIS_POINTER_ACCELERATION_FACTOR:

#define CHARYBDIS_POINTER_ACCELERATION_FACTOR 24

Custom keycodes

The Charybdis firmware defines a number of keycodes to leverage its features, namely:

#ifndef NO_CHARYBDIS_KEYCODES
enum charybdis_keycodes {
  POINTER_DEFAULT_DPI_FORWARD = SAFE_RANGE,
  POINTER_DEFAULT_DPI_REVERSE,
  POINTER_SNIPING_DPI_FORWARD,
  POINTER_SNIPING_DPI_REVERSE,
  SNIPING_MODE,
  SNIPING_MODE_TOGGLE,
  DRAGSCROLL_MODE,
  DRAGSCROLL_MODE_TOGGLE,
  CHARYBDIS_SAFE_RANGE,
};

#define DPI_MOD POINTER_DEFAULT_DPI_FORWARD
#define DPI_RMOD POINTER_DEFAULT_DPI_REVERSE
#define S_D_MOD POINTER_SNIPING_DPI_FORWARD
#define S_D_RMOD POINTER_SNIPING_DPI_REVERSE
#define SNIPING SNIPING_MODE
#define SNP_TOG SNIPING_MODE_TOGGLE
#define DRGSCRL DRAGSCROLL_MODE
#define DRG_TOG DRAGSCROLL_MODE_TOGGLE
#endif // !NO_CHARYBDIS_KEYCODES

Users extending the keycode set themselves (either in their keymap, or in their userspace) must start at CHARYBDIS_SAFE_RANGE to avoid conflicts, eg.:

enum userspace_keycodes {
#ifndef NO_CHARYBDIS_KEYCODES
  MY_FIRST_KEYCODE = CHARYBDIS_SAFE_RANGE,
#else
  MY_FIRST_KEYCODE = SAFE_RANGE,
#endif // !NO_CHARYBDIS_KEYCODES
  MY_SECOND_KEYCODE,
  
};

To disable the custom keycodes, and reduce binary size, simply add a definition in config.h:

#define NO_CHARYBDIS_KEYCODES

Configuration Syncing

If you want/need to enable syncing of the charybdis config, such as to read the sniping or drag scroll modes on the other half (such as for displaying the status via rgb matrix, or added on screens, or what not), you can enabled this. To do so, add this to your config.h:

#define CHARYBDIS_CONFIG_SYNC

Note that you will need to reflash both sides when enabling this.

Enable Large Mouse Reports

By default, the X and Y motion for the pointing device/mouse reports is -127 to 127. You can definitely hit the limit for that with the sensors. You can enable support for -32767 to 32767 by adding this to your config.h:

#define MOUSE_EXTENDED_REPORT

Note that you will need to reflash both sides when enabling this.