summaryrefslogtreecommitdiff
path: root/keyboards/40percentclub/nano
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/40percentclub/nano')
-rw-r--r--keyboards/40percentclub/nano/keymaps/drashna/keymap.c111
-rw-r--r--keyboards/40percentclub/nano/keymaps/drashna/rules.mk5
-rw-r--r--keyboards/40percentclub/nano/rules.mk50
3 files changed, 118 insertions, 48 deletions
diff --git a/keyboards/40percentclub/nano/keymaps/drashna/keymap.c b/keyboards/40percentclub/nano/keymaps/drashna/keymap.c
new file mode 100644
index 0000000000..668178967b
--- /dev/null
+++ b/keyboards/40percentclub/nano/keymaps/drashna/keymap.c
@@ -0,0 +1,111 @@
+#include "drashna.h"
+#include "analog.c"
+#include "pointing_device.h"
+#include "pincontrol.h"
+
+#define KC_X0 LT(_FN, KC_ESC)
+
+// clang-format off
+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
+ ),
+
+};
+// clang-format on
+
+// 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
diff --git a/keyboards/40percentclub/nano/rules.mk b/keyboards/40percentclub/nano/rules.mk
index e3c97e0d44..d55a40889b 100644
--- a/keyboards/40percentclub/nano/rules.mk
+++ b/keyboards/40percentclub/nano/rules.mk
@@ -1,62 +1,16 @@
# MCU name
MCU = atmega32u4
-# Processor frequency.
-# This will define a symbol, F_CPU, in all source code files equal to the
-# processor frequency in Hz. You can then use this symbol in your source code to
-# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-# automatically to create a 32-bit value in your source code.
-#
-# This will be an integer division of F_USB below, as it is sourced by
-# F_USB after it has run through any CPU prescalers. Note that this value
-# does not *change* the processor frequency - it should merely be updated to
-# reflect the processor speed set externally so that the code can use accurate
-# software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-# This will define a symbol, F_USB, in all source code files equal to the
-# input clock frequency (before any prescaling is performed) in Hz. This value may
-# differ from F_CPU if prescaling is used on the latter, and is required as the
-# raw input clock is fed directly to the PLL sections of the AVR for high speed
-# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-# at the end, this will be done automatically to create a 32-bit value in your
-# source code.
-#
-# If no clock division is performed on the input clock inside the AVR (via the
-# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
-# atmega32a bootloadHID
+# ATmega32A bootloadHID
+# ATmega328P USBasp
BOOTLOADER = caterina
-
-# If you don't know the bootloader type, then you can specify the
-# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
-# Teensy halfKay 512
-# Teensy++ halfKay 1024
-# Atmel DFU loader 4096
-# LUFA bootloader 4096
-# USBaspLoader 2048
-# OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically