From e3a21348c3879c11072c7c42d3b4d04b022f4fe2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 16 Oct 2019 13:11:22 -0700 Subject: [Keymap] Drashna's Hardware Features Experimentations (#6920) * Change RGBLight pin for Planck Light Move it to A0, so that the SPI? pins are available for BT hackery * Add QMK DFU bootloader info * Add Solenoid * Disable annoying white LED on bottom * Enable Solenoid on Corne * Remove bounds for animations * Increase debounce for Ergodox EZ to reduce repeat key issues * Set swap hands key to be a hold-tap key This way, it's not ANNOYING and doesn't swap the hands inteniontally * Move MT Alt in Corne keymap * Re-Add fine tuned control of secrets * Squash mods to single row * Add LRA settings to haptic feedback settings for Rev6 * Fix issue with non-Planck EZ keymaps * Add 40 Percent Nano with Analog Joystick * Add Collide39 keymap * Fix OLED printing to be more flavorful * Fix up Iris GamePad and come cleanup * Expand OLED char map further * Add modded characters to keylogger * Here be dragons Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com> * Fix up rules for community layouts * Some more OLED tweaks * Add mod mask check function * Change QMK DFU Audio pin to be correct * Use manual STM config instead of CTPC for Collide 39 --- .../40percentclub/nano/keymaps/drashna/keymap.c | 111 +++++++++++++++++++++ .../40percentclub/nano/keymaps/drashna/rules.mk | 5 + 2 files changed, 116 insertions(+) create mode 100644 keyboards/40percentclub/nano/keymaps/drashna/keymap.c create mode 100644 keyboards/40percentclub/nano/keymaps/drashna/rules.mk (limited to 'keyboards/40percentclub') diff --git a/keyboards/40percentclub/nano/keymaps/drashna/keymap.c b/keyboards/40percentclub/nano/keymaps/drashna/keymap.c new file mode 100644 index 0000000000..6c5b974572 --- /dev/null +++ b/keyboards/40percentclub/nano/keymaps/drashna/keymap.c @@ -0,0 +1,111 @@ +#include QMK_KEYBOARD_H +#include "drashna.h" +#include "analog.c" +#include "pointing_device.h" +#include "pincontrol.h" + + +#define KC_X0 LT(_FN, KC_ESC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT( + KC_VOLU, KC_MPLY, KC_MPRV, RESET, + KC_VOLD, KC_MUTE, KC_MNXT, RESET + ), + +}; + +// Joystick +// Set Pins +uint8_t xPin = 8; // VRx / /B4 +uint8_t yPin = 7; // VRy // B5 +uint8_t swPin = E6; // SW + +// Set Parameters +uint16_t minAxisValue = 0; +uint16_t maxAxisValue = 1023; + +uint8_t maxCursorSpeed = 2; +uint8_t precisionSpeed = 1; +uint8_t speedRegulator = 20; // Lower Values Create Faster Movement + +int8_t xPolarity = 1; +int8_t yPolarity = 1; + +uint8_t cursorTimeout = 10; + +int16_t xOrigin, yOrigin; + +uint16_t lastCursor = 0; + +int16_t axisCoordinate(uint8_t pin, uint16_t origin) { + int8_t direction; + int16_t distanceFromOrigin; + int16_t range; + + int16_t position = analogRead(pin); + + if (origin == position) { + return 0; + } else if (origin > position) { + distanceFromOrigin = origin - position; + range = origin - minAxisValue; + direction = -1; + } else { + distanceFromOrigin = position - origin; + range = maxAxisValue - origin; + direction = 1; + } + + float percent = (float)distanceFromOrigin / range; + int16_t coordinate = (int16_t)(percent * 100); + if (coordinate < 0) { + return 0; + } else if (coordinate > 100) { + return 100 * direction; + } else { + return coordinate * direction; + } +} + +int8_t axisToMouseComponent(uint8_t pin, int16_t origin, uint8_t maxSpeed, int8_t polarity) { + int coordinate = axisCoordinate(pin, origin); + if (coordinate == 0) { + return 0; + } else { + float percent = (float)coordinate / 100; + if (keyboard_report->mods & MOD_BIT(KC_LSFT)) { + return percent * precisionSpeed * polarity * (abs(coordinate) / speedRegulator); + } else { + return percent * maxCursorSpeed * polarity * (abs(coordinate) / speedRegulator); + } + } +} + +void pointing_device_task(void) { + report_mouse_t report = pointing_device_get_report(); + + // todo read as one vector + if (timer_elapsed(lastCursor) > cursorTimeout) { + lastCursor = timer_read(); + report.x = axisToMouseComponent(xPin, xOrigin, maxCursorSpeed, xPolarity); + report.y = axisToMouseComponent(yPin, yOrigin, maxCursorSpeed, yPolarity); + } + // + if (!readPin(swPin)) { + report.buttons |= MOUSE_BTN1; + } else { + report.buttons &= ~MOUSE_BTN1; + } + + pointing_device_set_report(report); + pointing_device_send(); +} + +void matrix_init_keymap(void) { + // init pin? Is needed? + setPinInputHigh(swPin); + // Account for drift + xOrigin = analogRead(xPin); + yOrigin = analogRead(yPin); +} diff --git a/keyboards/40percentclub/nano/keymaps/drashna/rules.mk b/keyboards/40percentclub/nano/keymaps/drashna/rules.mk new file mode 100644 index 0000000000..06110a0a2e --- /dev/null +++ b/keyboards/40percentclub/nano/keymaps/drashna/rules.mk @@ -0,0 +1,5 @@ +POINTING_DEVICE_ENABLE = yes +RGBLIGHT_ENABLE = no +CONSOLE_ENABLE = no + +BOOTLOADER = qmk-dfu -- cgit v1.2.3