Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Keyboard] Tractyl Manuform - configuration updates #14314

Merged
merged 6 commits into from
Sep 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 21 additions & 11 deletions keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COL_PINS \
{ A15, B3, B4, B5, B6, B7 }
#define MATRIX_ROW_PINS \
{ B12, B13, B14, B15, A8, A9 }
{ B12, B13, B14, B15, A8, A10 }

#define UNUSED_PINS \
{ C15 }
// B2 used for BOOT1, has internal pull down?
// A9 has internal pull-down
// A11 and A12 are used for USB sense. DO NOT USE.

#define DIODE_DIRECTION COL2ROW

Expand All @@ -45,12 +51,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define RGBLED_SPLIT \
{ 10, 10 }

#define DEBUG_LED_PIN C13
#define DEBUG_LED_PIN C13

#define AUDIO_PIN A0
#define AUDIO_PWM_DRIVER PWMD5
#define AUDIO_PWM_CHANNEL 1
#define AUDIO_STATE_TIMER GPTD4
/* Audio config */
#define AUDIO_PIN B1
#define AUDIO_PWM_DRIVER PWMD3
#define AUDIO_PWM_CHANNEL 4
#define AUDIO_PWM_PAL_MODE 2
#define AUDIO_STATE_TIMER GPTD4

/* serial.c configuration for split keyboard */
#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
Expand All @@ -60,10 +68,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
#define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
#define SERIAL_USART_TIMEOUT 100 // USART driver timeout. default 100
#undef SOFT_SERIAL_PIN

// #define EE_HANDS

/* i2c config for oleds */
#define I2C_DRIVER I2CD1
#define I2C1_SCL_BANK GPIOB
#define I2C1_SDA_BANK GPIOB
Expand All @@ -73,11 +79,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define I2C1_SDA_PAL_MODE 4
#define I2C1_CLOCK_SPEED 400000

/* encoder config */
#define ENCODERS_PAD_A \
{ B1 }
{ A13 }
#define ENCODERS_PAD_B \
{ B2 }
{ A14 }

/* spi config for eeprom and pmw3360 sensor */
#define SPI_DRIVER SPID1
#define SPI_SCK_PIN A5
#define SPI_SCK_PAL_MODE 5
Expand All @@ -86,13 +94,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define SPI_MISO_PIN A6
#define SPI_MISO_PAL_MODE 5

/* eeprom config */
#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN A4
#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 8
// #define EXTERNAL_EEPROM_BYTE_COUNT 8196
// #define EXTERNAL_EEPROM_PAGE_SIZE 32
// #define EXTERNAL_EEPROM_ADDRESS_SIZE 2
// #define DEBUG_EEPROM_OUTPUT

/* pmw3360 config */
#define PMW3360_CS_PIN B0
#define PMW3360_SPI_MODE 3
#define PMW3360_SPI_DIVISOR 4
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/
#pragma once

// #define HAL_USE_DAC TRUE
#define HAL_USE_PWM TRUE
#define HAL_USE_SERIAL TRUE
#define HAL_USE_I2C TRUE
Expand Down
7 changes: 5 additions & 2 deletions keyboards/handwired/tractyl_manuform/5x6_right/f411/mcuconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@
#undef STM32_PWM_USE_TIM5
#define STM32_PWM_USE_TIM5 TRUE

#undef STM32_GPT_USE_TIM4
#define STM32_GPT_USE_TIM4 TRUE
#undef STM32_PWM_USE_TIM3
#define STM32_PWM_USE_TIM3 TRUE

#undef STM32_SPI_USE_SPI1
#define STM32_SPI_USE_SPI1 TRUE

#undef STM32_SERIAL_USE_USART2
#define STM32_SERIAL_USE_USART2 TRUE

#undef STM32_GPT_USE_TIM4
#define STM32_GPT_USE_TIM4 TRUE
24 changes: 24 additions & 0 deletions keyboards/handwired/tractyl_manuform/5x6_right/f411/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Drashna's Blackpill Tractyl Manuform (5x6) with a right side trackball

* VBUS mod, using PB10
* Split Hand Pin, using PC14
* Full Duplex Serial/USART using PA3 and PA4 on USART2
* PWM Audio using PB1 and TIM3 and GPT on TIM4
* PWM RGB using PA1 TIM5
* pmw3360 sensor sharing PA5-PA7 on SPI1, with B0 as CS pin
* 8KB SPI EEPROM chip sharing PA5-PA7 on SPI1 with PA4 as CS pin
* Encoder using PA10 and PA12
* SSD1306 OLED display (128x64) using PB8-PB9 on I2C1

* Keyboard Maintainer: [Drashna Jael're](https://github.com/drashna)
* Hardware Supported: [Design files](https://gitlab.com/keyboards1/dm_r_track/-/tree/master/boolean), [WeAct BlackPill (F411)](https://github.com/WeActTC/MiniSTM32F4x1), [PMW3360 Optical Sensor](https://www.tindie.com/products/jkicklighter/pmw3360-motion-sensor/)

Make example for this keyboard (after setting up your build environment):

make handwired/tractyl_manuform/5x6_right/f411:default

Flashing example for this keyboard:

make handwired/tractyl_manuform/5x6_right/f411:default:flash

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,14 @@ const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_LOWER] = { { RGB_MOD, RGB_RMOD}, { RGB_HUD, RGB_HUI } },
[_ADJUST] = { { CK_DOWN, CK_UP }, { _______, _______ } },
};
// clang-format on
#else
bool encoder_update_user(uint8_t index, bool clockwise) {
# ifdef SWAP_HANDS_ENABLE
if (swap_hands) {
index ^= 1;
}
# endif
if (index == 0) {
tap_code_delay(clockwise ? KC_VOLD : KC_VOLU, 5);
} else if (index == 1) {
Expand All @@ -152,7 +158,6 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
return false;
}
#endif
// clang-format on

#ifdef POINTING_DEVICE_ENABLE
static uint16_t mouse_timer = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ HAPTIC_ENABLE = no
COMMAND_ENABLE = no
TAP_DANCE_ENABLE = yes
UNICODE_ENABLE = yes
OLED_ENABLE = yes
OLED_ENABLE = yes
WPM_ENABLE = yes
ENCODER_ENABLE = yes
ENCODER_MAP_ENABLE = yes
Expand Down
8 changes: 4 additions & 4 deletions keyboards/handwired/tractyl_manuform/5x6_right/readme.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Drashna's Dactyl Manuform (5x6) with a right side trackball
# Drashna's Tractyl Manuform (5x6) with a right side trackball

![](https://preview.redd.it/zwt91036m3y51.jpg?width=960&crop=smart&auto=webp&s=e030deb7d8285c95a1a30c69a7e7a71f750e87bb)

It's a Dactyl Manuform with an integrated thumb based trackball, using the pmw3360 optical sensor.
It's a Tractyl Manuform with an integrated thumb based trackball, using the pmw3360 optical sensor.

It's powered by 2x Teensy++ 2.0's, using Drashna's [Teensy VBUS Hack](https://docs.qmk.fm/#/feature_split_keyboard?id=hardware-considerations-and-mods) for better detection.

Expand All @@ -12,10 +12,10 @@ It's powered by 2x Teensy++ 2.0's, using Drashna's [Teensy VBUS Hack](https://do

Make example for this keyboard (after setting up your build environment):

make handwired/dactyl_manuform/5x6_right_trackball:default
make handwired/tractyl_manuform/5x6_right:default

Flashing example for this keyboard:

make handwired/dactyl_manuform/5x6_right_trackball:default:flash
make handwired/tractyl_manuform/5x6_right:default:flash

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
4 changes: 2 additions & 2 deletions keyboards/handwired/tractyl_manuform/post_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once

// mouse config
#ifdef MOUSEKEY_ENABLE
# ifndef MOUSEKEY_MOVE_DELTA
# ifndef MK_KINETIC_SPEED
# define MOUSEKEY_MOVE_DELTA 5
Expand Down Expand Up @@ -59,7 +60,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define MOUSEKEY_ACCELERATED_SPEED 3000
# endif


// mouse scroll config
# ifndef MOUSEKEY_WHEEL_DELAY
# define MOUSEKEY_WHEEL_DELAY 15
Expand Down Expand Up @@ -89,7 +89,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# ifndef MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS
# define MOUSEKEY_WHEEL_DECELERATED_MOVEMENTS 8
# endif

#endif

#ifndef DEBOUNCE
# define DEBOUNCE 5
Expand Down
66 changes: 17 additions & 49 deletions keyboards/handwired/tractyl_manuform/tm_sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,43 +20,40 @@
#include "drivers/sensors/pmw3360.h"

kb_config_data_t kb_config;
kb_pointer_data_t kb_pointer;
kb_mouse_report_t sync_mouse_report;

void kb_pointer_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
if (target2initiator_buffer_size == sizeof(sync_mouse_report)) {
memcpy(target2initiator_buffer, &sync_mouse_report, sizeof(sync_mouse_report));
}
sync_mouse_report.x = 0;
sync_mouse_report.y = 0;
}

void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
if (initiator2target_buffer_size == sizeof(kb_config)) {
memcpy(&kb_config, initiator2target_buffer, sizeof(kb_config));
}
}
void kb_pointer_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
if (target2initiator_buffer_size == sizeof(kb_pointer)) {
memcpy(target2initiator_buffer, &kb_pointer, sizeof(kb_pointer));

static uint16_t cpi = 0;
// Check if the state values are different
if (cpi != kb_config.device_cpi) {
cpi = kb_config.device_cpi;
}
}

void keyboard_pre_init_sync(void) {
memset(&kb_config, 0, sizeof(kb_config));
memset(&kb_pointer, 0, sizeof(kb_pointer));
memset(&sync_mouse_report, 0, sizeof(sync_mouse_report));
}

void keyboard_post_init_kb(void) {
void keyboard_post_init_sync(void) {
// Register keyboard state sync split transaction
transaction_register_rpc(RPC_ID_KB_CONFIG_SYNC, kb_config_sync_handler);
transaction_register_rpc(RPC_ID_POINTER_STATE_SYNC, kb_pointer_sync_handler);

keyboard_post_init_user();
}

void kb_config_update(void) {
if (is_keyboard_master()) {
static uint16_t cpi = 0;
if (cpi != kb_config.device_cpi) {
cpi = kb_config.device_cpi;
pmw_set_cpi(cpi);
}
}
}

void kb_config_sync(void) {
void housekeeping_task_sync(void) {
if (is_keyboard_master()) {
// Keep track of the last state, so that we can tell if we need to propagate to slave
static kb_config_data_t last_kb_config;
Expand All @@ -82,35 +79,6 @@ void kb_config_sync(void) {
}
}

void kb_pointer_sync(void) {
if (is_keyboard_master() && is_keyboard_left()) {
// Keep track of the last state, so that we can tell if we need to propagate to slave
static uint32_t last_sync = 0;

// Perform the sync if requested
if (timer_elapsed32(last_sync) >= 5) {
if (transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(kb_pointer), &kb_pointer)) {
last_sync = timer_read32();
}
}
}
}

void housekeeping_task_kb(void) {
// Update kb_config so we can send to slave
kb_config_update();
// Data sync from master to slave
kb_config_sync();
kb_pointer_sync();
}

void kb_pointer_sync_send(int8_t x, int8_t y) {
kb_pointer.mouse_x = x;
kb_pointer.mouse_y = y;
}

kb_pointer_data_t kb_pointer_sync_get(void) { return (kb_pointer_data_t){.mouse_x = kb_pointer.mouse_x, .mouse_y = kb_pointer.mouse_y}; }

void trackball_set_cpi(uint16_t cpi) {
kb_config.device_cpi = cpi;
if (!is_keyboard_left()) {
Expand Down
Loading