~ruther/qmk_firmware

6076ed85be111f0e88c7049aa3d2e69eed5005a1 — marksard 7 years ago 9d27d55
Keyboard: Partial refactor of the crkbd code (#3600)

* Add display to LED-parameters function
* Improvement of update timing for OLED display (Need TWI_Init)
M keyboards/crkbd/keymaps/default/config.h => keyboards/crkbd/keymaps/default/config.h +1 -5
@@ 18,10 18,7 @@ You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef CONFIG_USER_H
#define CONFIG_USER_H

#include "../../config.h"
#pragma once

/* Use I2C or Serial */



@@ 50,4 47,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
#endif

M keyboards/crkbd/keymaps/default/keymap.c => keyboards/crkbd/keymaps/default/keymap.c +18 -15
@@ 1,24 1,14 @@
#include "crkbd.h"
#include QMK_KEYBOARD_H
#include "bootloader.h"
#include "action_layer.h"
#include "action_util.h"
#include "eeconfig.h"
#ifdef PROTOCOL_LUFA
#include "lufa.h"
#include "split_util.h"
  #include "lufa.h"
  #include "split_util.h"
#endif
#include "LUFA/Drivers/Peripheral/TWI.h"
#ifdef SSD1306OLED
  #include "LUFA/Drivers/Peripheral/TWI.h"
  #include "ssd1306.h"
#endif

#include "../lib/mode_icon_reader.c"
#include "../lib/layer_state_reader.c"
#include "../lib/host_led_state_reader.c"
#include "../lib/logo_reader.c"
#include "../lib/keylogger.c"
#include "../lib/timelogger.c"

extern keymap_config_t keymap_config;

#ifdef RGBLIGHT_ENABLE


@@ 148,12 138,25 @@ void matrix_init_user(void) {
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED

// When add source files to SRC in rules.mk, you can use functions.
const char *read_layer_state(void);
const char *read_logo(void);
void set_keylog(uint16_t keycode, keyrecord_t *record);
const char *read_keylog(void);
const char *read_keylogs(void);

// const char *read_mode_icon(bool swap);
// const char *read_host_led_state(void);
// void set_timelog(void);
// const char *read_timelog(void);

void matrix_scan_user(void) {
   iota_gfx_task();
}

void matrix_render_user(struct CharacterMatrix *matrix) {
  if (is_master) {
    // If you want to change the display of OLED, you need to change here
    matrix_write_ln(matrix, read_layer_state());
    matrix_write_ln(matrix, read_keylog());
    matrix_write_ln(matrix, read_keylogs());


@@ 182,7 185,7 @@ void iota_gfx_task_user(void) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  if (record->event.pressed) {
    set_keylog(keycode, record);
    set_timelog();
    // set_timelog();
  }

  switch (keycode) {

M keyboards/crkbd/keymaps/default/rules.mk => keyboards/crkbd/keymaps/default/rules.mk +9 -4
@@ 15,11 15,16 @@ AUDIO_ENABLE = no           # Audio output on port C6
UNICODE_ENABLE = no         # Unicode
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
ONEHAND_ENABLE = no        # Enable one-hand typing
SWAP_HANDS_ENABLE = no        # Enable one-hand typing

# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend

ifndef QUANTUM_DIR
	include ../../../../Makefile
endif
# If you want to change the display of OLED, you need to change here
SRC +=  ../lib/rgb_state_reader.c \
        ../lib/layer_state_reader.c \
        ../lib/logo_reader.c \
        ../lib/keylogger.c \
        # ../lib/mode_icon_reader.c \
        # ../lib/host_led_state_reader.c \
        # ../lib/timelogger.c \

M keyboards/crkbd/keymaps/lib/host_led_state_reader.c => keyboards/crkbd/keymaps/lib/host_led_state_reader.c +9 -7
@@ 1,13 1,15 @@
#include <stdio.h>
#include "crkbd.h"

char host_led_state[40];
char host_led_state_str[24];

char *read_host_led_state(void)
const char *read_host_led_state(void)
{
  snprintf(host_led_state, sizeof(host_led_state), "\n%s  %s  %s",
           (host_keyboard_leds() & (1 << USB_LED_NUM_LOCK)) ? "NUMLOCK" : "       ",
           (host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK)) ? "CAPS" : "    ",
           (host_keyboard_leds() & (1 << USB_LED_SCROLL_LOCK)) ? "SCLK" : "    ");
  uint8_t leds = host_keyboard_leds();
  snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
           (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
           (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
           (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- ");

  return host_led_state;
  return host_led_state_str;
}

M keyboards/crkbd/keymaps/lib/keylogger.c => keyboards/crkbd/keymaps/lib/keylogger.c +21 -25
@@ 1,10 1,11 @@
#include <stdio.h>
#include "crkbd.h"

char keylog[40] = {};
char keylogs[21] = {};
int keylogs_idx = 0;
char keylog_str[24] = {};
char keylogs_str[21] = {};
int keylogs_str_idx = 0;

char code_to_name[60] = {
const char code_to_name[60] = {
    ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
    'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',


@@ 12,38 13,33 @@ char code_to_name[60] = {
    'R', 'E', 'B', 'T', ' ', ' ', ' ', ' ', ' ', ' ',
    ' ', ';', '\'', ' ', ',', '.', '/', ' ', ' ', ' '};

void set_keylog(uint16_t keycode, keyrecord_t *record)
{
void set_keylog(uint16_t keycode, keyrecord_t *record) {
  char name = ' ';
  if (keycode < 60)
  {
  if (keycode < 60) {
    name = code_to_name[keycode];
  }

  // update keylog
  snprintf(keylog, sizeof(keylog), "%dx%d, k%2d : %c",
           record->event.key.row,
           record->event.key.col,
           keycode,
           name);
  snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
           record->event.key.row, record->event.key.col,
           keycode, name);

  // update keylogs
  if (keylogs_idx == sizeof(keylogs) - 1)
  {
    keylogs_idx = 0;
    for (int i = 0; i < sizeof(keylogs) - 1; i++)
    {
      keylogs[i] = ' ';
  if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
    keylogs_str_idx = 0;
    for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
      keylogs_str[i] = ' ';
    }
  }
  keylogs[keylogs_idx] = name;
  keylogs_idx++;

  keylogs_str[keylogs_str_idx] = name;
  keylogs_str_idx++;
}

char *read_keylog(void) {
  return keylog;
const char *read_keylog(void) {
  return keylog_str;
}

char *read_keylogs(void) {
  return keylogs;
const char *read_keylogs(void) {
  return keylogs_str;
}

M keyboards/crkbd/keymaps/lib/layer_state_reader.c => keyboards/crkbd/keymaps/lib/layer_state_reader.c +20 -18
@@ 1,3 1,6 @@

#include QMK_KEYBOARD_H
#include <stdio.h>
#include "crkbd.h"

#define L_BASE 0


@@ 6,27 9,26 @@
#define L_ADJUST 65536
#define L_ADJUST_TRI 65560

char layer_state_str[40];
char layer_state_str[24];

char *read_layer_state(void)
{
const char *read_layer_state(void) {
  switch (layer_state)
  {
    case L_BASE:
       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Default");
       break;
    case L_RAISE:
       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise");
       break;
    case L_LOWER:
       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower");
       break;
    case L_ADJUST:
    case L_ADJUST_TRI:
       snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust");
       break;
    default:
       snprintf(layer_state_str,sizeof(layer_state_str), "Layer: Undef-%ld", layer_state);
  case L_BASE:
    snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Default");
    break;
  case L_RAISE:
    snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise");
    break;
  case L_LOWER:
    snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower");
    break;
  case L_ADJUST:
  case L_ADJUST_TRI:
    snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust");
    break;
  default:
    snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Undef-%ld", layer_state);
  }

  return layer_state_str;

M keyboards/crkbd/keymaps/lib/logo_reader.c => keyboards/crkbd/keymaps/lib/logo_reader.c +6 -7
@@ 1,12 1,11 @@
#include "crkbd.h"

char *read_logo(void)
{
  static char logo[]={
    0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
    0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
    0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
    0};
const char *read_logo(void) {
  static char logo[] = {
      0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
      0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
      0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
      0};

  return logo;
}

M keyboards/crkbd/keymaps/lib/mode_icon_reader.c => keyboards/crkbd/keymaps/lib/mode_icon_reader.c +6 -6
@@ 1,13 1,13 @@
#include <stdio.h>
#include "crkbd.h"

char mode_icon[40];
char mode_icon[24];

char *read_mode_icon(bool swap)
{
  static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
  if(swap == false){
const char *read_mode_icon(bool swap) {
  static char logo[][2][3] = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}};
  if (swap == false) {
    snprintf(mode_icon, sizeof(mode_icon), "%s\n%s", logo[0][0], logo[0][1]);
  }else{
  } else {
    snprintf(mode_icon, sizeof(mode_icon), "%s\n%s", logo[1][0], logo[1][1]);
  }


A keyboards/crkbd/keymaps/lib/rgb_state_reader.c => keyboards/crkbd/keymaps/lib/rgb_state_reader.c +15 -0
@@ 0,0 1,15 @@
#ifdef RGBLIGHT_ENABLE

#include QMK_KEYBOARD_H
#include <stdio.h>

extern rgblight_config_t rgblight_config;
char rbf_info_str[24];
const char *read_rgb_info(void) {

  snprintf(rbf_info_str, sizeof(rbf_info_str), "%s %2d h%3d s%3d v%3d",
    rgblight_config.enable ? "on" : "- ", rgblight_config.mode,
    rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
  return rbf_info_str;
}
#endif

M keyboards/crkbd/keymaps/lib/timelogger.c => keyboards/crkbd/keymaps/lib/timelogger.c +6 -7
@@ 1,17 1,16 @@
#include <stdio.h>
#include "crkbd.h"

char timelog[40] = {};
char timelog_str[24] = {};
int last_time = 0;
int elapsed_time = 0;

void set_timelog(void)
{
void set_timelog(void) {
  elapsed_time = timer_elapsed(last_time);
  last_time = timer_read();
  snprintf(timelog, sizeof(timelog), "lt:%5d, et:%5d", last_time, elapsed_time);
  snprintf(timelog_str, sizeof(timelog_str), "lt:%5d, et:%5d", last_time, elapsed_time);
}

char *read_timelog(void)
{
  return timelog;
const char *read_timelog(void) {
  return timelog_str;
}

M keyboards/crkbd/keymaps/like_jis/keymap.c => keyboards/crkbd/keymaps/like_jis/keymap.c +39 -20
@@ 5,16 5,10 @@
  #include "split_util.h"
#endif
#ifdef SSD1306OLED
  #include "LUFA/Drivers/Peripheral/TWI.h"
  #include "ssd1306.h"
#endif

#include "../lib/mode_icon_reader.c"
#include "../lib/layer_state_reader.c"
#include "../lib/host_led_state_reader.c"
#include "../lib/logo_reader.c"
#include "../lib/keylogger.c"
#include "../lib/timelogger.c"

extern keymap_config_t keymap_config;

#ifdef RGBLIGHT_ENABLE


@@ 84,7 78,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      _____,   F11,   F12, XXXXX, KANJI,   ENT,                  XXXXX, XXXXX,  COMM,   DOT,  SLSH,    RO,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  _____, _____,   DEL,    XXXXX, _____,   APP \
                                  _____, _____,   DEL,    _____, _____,   APP \
                              //`--------------------'  `--------------------'
  ),



@@ 96,19 90,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                      0,     1,     2,     3,   DOT, XXXXX,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  _____, _____, XXXXX,    XXXXX, _____,  LALT \
                                  _____, _____,  BSPC,    _____, _____,  LALT \
                              //`--------------------'  `--------------------'
  ),

  [_ADJUST] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        RST,  LRST,  KNRM,  KSWP, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LTOG,  LHUI,  LSAI,  LVAI, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX,  PGUP, XXXXX,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      LSMOD,  LHUD,  LSAD,  LVAD, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX,  HOME,  PGDN,   END,\
      _____,    RST,  LRST,  KNRM,  KSWP,XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
  //|------+-------+------+------+------+-----|                |------+------+------+------+------+------|
      _____,   LTOG,  LHUI,  LSAI,  LVAI,XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX,  PGUP, XXXXX,\
  //|------+-------+------+------+------+-----|                |------+------+------+------+------+------|
      _____,  LSMOD,  LHUD,  LSAD,  LVAD,XXXXX,                  XXXXX, XXXXX, XXXXX,  HOME,  PGDN,   END,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  _____, _____, XXXXX,    XXXXX, _____, XXXXX \
                                  _____, _____, XXXXX,    _____, _____, XXXXX \
                              //`--------------------'  `--------------------'
  )
};


@@ 130,6 124,7 @@ void matrix_init_user(void) {
    #endif
    //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
    #ifdef SSD1306OLED
        TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
        iota_gfx_init(!has_usb());   // turns on the display
    #endif
}


@@ 137,18 132,42 @@ void matrix_init_user(void) {
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED


// When add source files to SRC in rules.mk, you can use functions.
const char *read_layer_state(void);
const char *read_logo(void);
void set_keylog(uint16_t keycode, keyrecord_t *record);
const char *read_keylog(void);
const char *read_keylogs(void);

// const char *read_mode_icon(bool swap);
// const char *read_host_led_state(void);
// void set_timelog(void);
// const char *read_timelog(void);

#ifdef RGBLIGHT_ENABLE
  const char *read_rgb_info(void);
  #define RENDER_RGB_INFO(m) matrix_write_ln(m, (const char*)read_rgb_info())
#else
  #define RENDER_RGB_INFO(m)
#endif


void matrix_scan_user(void) {
   iota_gfx_task();
}

inline void matrix_render_user(struct CharacterMatrix *matrix) {
  if (is_master) {
    // If you want to change the display of OLED, you need to change here
    matrix_write_ln(matrix, read_layer_state());
    matrix_write_ln(matrix, read_keylog());
    matrix_write_ln(matrix, read_keylogs());
    //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
    //matrix_write_ln(matrix, read_host_led_state());
    //matrix_write_ln(matrix, read_timelog());
    RENDER_RGB_INFO(matrix);
    // matrix_write_ln(matrix, read_keylogs());
    // matrix_write_ln(matrix, read_host_led_state());

    // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
    // matrix_write_ln(matrix, read_timelog());
  } else {
    matrix_write(matrix, read_logo());
  }


@@ 174,7 193,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  #ifdef SSD1306OLED
    if (record->event.pressed) {
      set_keylog(keycode, record);
      set_timelog();
      // set_timelog();
    }
  #endif


M keyboards/crkbd/keymaps/like_jis/rules.mk => keyboards/crkbd/keymaps/like_jis/rules.mk +9 -0
@@ 19,3 19,12 @@ SWAP_HANDS_ENABLE = no        # Enable one-hand typing

# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend

# If you want to change the display of OLED, you need to change here
SRC +=  ../lib/rgb_state_reader.c \
        ../lib/layer_state_reader.c \
        ../lib/logo_reader.c \
        ../lib/keylogger.c \
        # ../lib/mode_icon_reader.c \
        # ../lib/host_led_state_reader.c \
        # ../lib/timelogger.c \