[Keyboard] 201909 s75 custom encoder (#6745)

* Handle custom encoder configuration

* Whitespace changes

* Undo broken stuff

* more

* Remove printfs

* fix the dumb bug
master
Andrew Kannan 2019-09-18 20:41:46 -04:00 committed by Drashna Jaelre
parent 6f5f943bb9
commit e5aa28455e
4 changed files with 129 additions and 67 deletions

View File

@ -71,15 +71,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// TODO: refactor with new user EEPROM code (coming soon) // TODO: refactor with new user EEPROM code (coming soon)
#define EEPROM_MAGIC 0x451F #define EEPROM_MAGIC 0x451F
#define EEPROM_MAGIC_ADDR 32 #define EEPROM_MAGIC_ADDR 40
// Bump this every time we change what we store // Bump this every time we change what we store
// This will automatically reset the EEPROM with defaults // This will automatically reset the EEPROM with defaults
// and avoid loading invalid data from the EEPROM // and avoid loading invalid data from the EEPROM
#define EEPROM_VERSION 0x01 #define EEPROM_VERSION 0x01
#define EEPROM_VERSION_ADDR 34 #define EEPROM_VERSION_ADDR 42
// Dynamic keymap starts after EEPROM version // Dynamic keymap starts after EEPROM version
#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 #define DYNAMIC_KEYMAP_EEPROM_ADDR 43
// Dynamic macro starts after dynamic keymaps (35+(4*6*16*2)) = (35+768) = 803 // Dynamic macro starts after dynamic keymaps (35+(4*6*16*2)) = (35+768) = 803
@ -89,13 +89,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// 1 for OLED default mode // 1 for OLED default mode
// 6 for 3x custom encoder settings, left, right, and press (18 total) // 6 for 3x custom encoder settings, left, right, and press (18 total)
#define DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES 803 #define DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES 811
#define DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT 804 #define DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT 812
#define DYNAMIC_KEYMAP_DEFAULT_OLED 805 #define DYNAMIC_KEYMAP_DEFAULT_OLED 813
#define DYNAMIC_KEYMAP_CUSTOM_ENCODER 806 #define DYNAMIC_KEYMAP_CUSTOM_ENCODER 814
#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 824 #define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 832
#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 200 #define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
#define DYNAMIC_KEYMAP_MACRO_COUNT 16 #define DYNAMIC_KEYMAP_MACRO_COUNT 16

View File

@ -94,51 +94,53 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
} }
case id_get_keyboard_value: case id_get_keyboard_value:
{ {
switch( command_data[0]) switch( command_data[0])
{ {
case id_uptime: case id_uptime:
{ {
uint32_t value = timer_read32(); uint32_t value = timer_read32();
command_data[1] = (value >> 24 ) & 0xFF; command_data[1] = (value >> 24 ) & 0xFF;
command_data[2] = (value >> 16 ) & 0xFF; command_data[2] = (value >> 16 ) & 0xFF;
command_data[3] = (value >> 8 ) & 0xFF; command_data[3] = (value >> 8 ) & 0xFF;
command_data[4] = value & 0xFF; command_data[4] = value & 0xFF;
break; break;
} }
case id_oled_default_mode: case id_oled_default_mode:
{ {
uint8_t default_oled = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED); uint8_t default_oled = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED);
command_data[1] = default_oled; command_data[1] = default_oled;
break; break;
} }
case id_oled_mode: case id_oled_mode:
{ {
command_data[1] = oled_mode; command_data[1] = oled_mode;
break; break;
}
} case id_encoder_modes:
case id_encoder_modes: {
{ command_data[1] = enabled_encoder_modes;
command_data[1] = enabled_encoder_modes; break;
break; }
} case id_encoder_custom:
case id_encoder_custom: {
{ uint8_t custom_encoder_idx = command_data[1];
// uint8_t custom_encoder_idx = command_data[1]; uint16_t keycode = retrieve_custom_encoder_config(custom_encoder_idx, ENC_CUSTOM_CW);
// command_data[2] = 0x00; command_data[2] = keycode >> 8;
// command_data[3] = 0x00; command_data[3] = keycode & 0xFF;
// command_data[4] = 0x00; keycode = retrieve_custom_encoder_config(custom_encoder_idx, ENC_CUSTOM_CCW);
// command_data[5] = 0x00; command_data[4] = keycode >> 8;
// command_data[6] = 0x00; command_data[5] = keycode & 0xFF;
// command_data[7] = 0x00; keycode = retrieve_custom_encoder_config(custom_encoder_idx, ENC_CUSTOM_PRESS);
break; command_data[6] = keycode >> 8;
} command_data[7] = keycode & 0xFF;
default: break;
{ }
*command_id = id_unhandled; default:
break; {
} *command_id = id_unhandled;
} break;
}
}
break; break;
} }
#ifdef DYNAMIC_KEYMAP_ENABLE #ifdef DYNAMIC_KEYMAP_ENABLE
@ -164,7 +166,10 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
} }
case id_encoder_custom: case id_encoder_custom:
{ {
// uint8_t custom_encoder_idx = command_data[1]; uint8_t custom_encoder_idx = command_data[1];
uint8_t encoder_behavior = command_data[2];
uint16_t keycode = (command_data[3] << 8) | command_data[4];
set_custom_encoder_config(custom_encoder_idx, encoder_behavior, keycode);
break; break;
} }
default: default:
@ -205,13 +210,6 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
break; break;
} }
case id_dynamic_keymap_macro_get_buffer: case id_dynamic_keymap_macro_get_buffer:
{
uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
uint16_t size = command_data[2]; // size <= 28
dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] );
break;
}
case id_dynamic_keymap_macro_set_buffer:
{ {
uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
uint16_t size = command_data[2]; // size <= 28 uint16_t size = command_data[2]; // size <= 28
@ -339,9 +337,9 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
uint16_t mapped_code = handle_encoder_press(); uint16_t mapped_code = handle_encoder_press();
uint16_t held_keycode_timer = timer_read(); uint16_t held_keycode_timer = timer_read();
if(mapped_code != 0){ if(mapped_code != 0){
register_code(mapped_code); register_code16(mapped_code);
while (timer_elapsed(held_keycode_timer) < MEDIA_KEY_DELAY){ /* no-op */ } while (timer_elapsed(held_keycode_timer) < MEDIA_KEY_DELAY){ /* no-op */ }
unregister_code(mapped_code); unregister_code16(mapped_code);
} }
} else { } else {
// Do something else when release // Do something else when release
@ -380,9 +378,9 @@ void encoder_update_kb(uint8_t index, bool clockwise) {
} }
uint16_t held_keycode_timer = timer_read(); uint16_t held_keycode_timer = timer_read();
if(mapped_code != 0){ if(mapped_code != 0){
register_code(mapped_code); register_code16(mapped_code);
while (timer_elapsed(held_keycode_timer) < MEDIA_KEY_DELAY){ /* no-op */ } while (timer_elapsed(held_keycode_timer) < MEDIA_KEY_DELAY){ /* no-op */ }
unregister_code(mapped_code); unregister_code16(mapped_code);
} }
} else { } else {
if(clockwise){ if(clockwise){

View File

@ -47,6 +47,12 @@ enum encoder_modes {
ENC_MODE_CLOCK_SET // This shouldn't be included in the default modes, so we put it after NUM_ENCODER_MODES ENC_MODE_CLOCK_SET // This shouldn't be included in the default modes, so we put it after NUM_ENCODER_MODES
}; };
enum custom_encoder_behavior {
ENC_CUSTOM_CW = 0,
ENC_CUSTOM_CCW,
ENC_CUSTOM_PRESS
};
enum oled_modes { enum oled_modes {
OLED_DEFAULT, OLED_DEFAULT,
OLED_TIME, OLED_TIME,
@ -96,6 +102,8 @@ void change_encoder_mode(bool negative);
uint16_t handle_encoder_clockwise(void); uint16_t handle_encoder_clockwise(void);
uint16_t handle_encoder_ccw(void); uint16_t handle_encoder_ccw(void);
uint16_t handle_encoder_press(void); uint16_t handle_encoder_press(void);
uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior);
void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code);
void update_time_config(int8_t increment); void update_time_config(int8_t increment);

View File

@ -1,4 +1,5 @@
#include "satisfaction75.h" #include "satisfaction75.h"
#include "tmk_core/common/eeprom.h"
void pre_encoder_mode_change(){ void pre_encoder_mode_change(){
if(encoder_mode == ENC_MODE_CLOCK_SET){ if(encoder_mode == ENC_MODE_CLOCK_SET){
@ -111,6 +112,17 @@ uint16_t handle_encoder_clockwise(){
case ENC_MODE_BRIGHTNESS: case ENC_MODE_BRIGHTNESS:
mapped_code = KC_BRIGHTNESS_UP; mapped_code = KC_BRIGHTNESS_UP;
break; break;
#ifdef DYNAMIC_KEYMAP_ENABLE
case ENC_MODE_CUSTOM0:
mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CW);
break;
case ENC_MODE_CUSTOM1:
mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CW);
break;
case ENC_MODE_CUSTOM2:
mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CW);
break;
#endif
case ENC_MODE_CLOCK_SET: case ENC_MODE_CLOCK_SET:
update_time_config(1); update_time_config(1);
queue_for_send = true; queue_for_send = true;
@ -145,6 +157,18 @@ uint16_t handle_encoder_ccw(){
case ENC_MODE_BRIGHTNESS: case ENC_MODE_BRIGHTNESS:
mapped_code = KC_BRIGHTNESS_DOWN; mapped_code = KC_BRIGHTNESS_DOWN;
break; break;
#ifdef DYNAMIC_KEYMAP_ENABLE
case ENC_MODE_CUSTOM0:
mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_CCW);
break;
case ENC_MODE_CUSTOM1:
mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_CCW);
break;
case ENC_MODE_CUSTOM2:
mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_CCW);
break;
#endif
case ENC_MODE_CLOCK_SET: case ENC_MODE_CLOCK_SET:
update_time_config(-1); update_time_config(-1);
queue_for_send = true; queue_for_send = true;
@ -159,6 +183,7 @@ uint16_t handle_encoder_press(){
case ENC_MODE_VOLUME: case ENC_MODE_VOLUME:
mapped_code = KC_MUTE; mapped_code = KC_MUTE;
break; break;
default:
case ENC_MODE_MEDIA: case ENC_MODE_MEDIA:
mapped_code = KC_MEDIA_PLAY_PAUSE; mapped_code = KC_MEDIA_PLAY_PAUSE;
break; break;
@ -174,11 +199,42 @@ uint16_t handle_encoder_press(){
breathing_enable(); breathing_enable();
} }
break; break;
#ifdef DYNAMIC_KEYMAP_ENABLE
case ENC_MODE_CUSTOM0:
mapped_code = retrieve_custom_encoder_config(0, ENC_CUSTOM_PRESS);
break;
case ENC_MODE_CUSTOM1:
mapped_code = retrieve_custom_encoder_config(1, ENC_CUSTOM_PRESS);
break;
case ENC_MODE_CUSTOM2:
mapped_code = retrieve_custom_encoder_config(2, ENC_CUSTOM_PRESS);
break;
#endif
case ENC_MODE_CLOCK_SET: case ENC_MODE_CLOCK_SET:
time_config_idx = (time_config_idx + 1) % 5; time_config_idx = (time_config_idx + 1) % 5;
default:
case ENC_MODE_BRIGHTNESS: case ENC_MODE_BRIGHTNESS:
break; break;
} }
return mapped_code; return mapped_code;
} }
uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
#ifdef DYNAMIC_KEYMAP_ENABLE
void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
//big endian
uint16_t keycode = eeprom_read_byte(addr) << 8;
keycode |= eeprom_read_byte(addr + 1);
return keycode;
#else
return 0;
#endif
}
void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){
#ifdef DYNAMIC_KEYMAP_ENABLE
void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
eeprom_update_byte(addr, (uint8_t)(new_code >> 8));
eeprom_update_byte(addr + 1, (uint8_t)(new_code & 0xFF));
#endif
}