~ruther/qmk_firmware

82bb7d2852c76c7b2c8970bebd47bbd701d9416d — pcoleman 5 years ago 1044519
Adding Chimera Ortho Plus (#9093)

* Added Chimera Ortho keymap

* Cleaning up the rules

* Removing firmware sizes

* Modified URLs to point to new locations

* Remove _quantum functions from custom matrix.c code

* Fix 1<col instead of 1<<col typo in matrix_is_on()

* Make PREVENT_STUCK_MODIFIERS the default

* Removing the IS_COMMAND custom definition

* Adding info.json

* Adding config overrides

* Adjusting for the reformat

* removing backlight reference

* fixing some compile issues

* Fixing a matrix issue

* Update keyboards/chimera_ortho_plus/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/chimera_ortho_plus.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/chimera_ortho_plus.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/chimera_ortho_plus.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/chimera_ortho_plus.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/chimera_ortho_plus.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* lining up the matrix

* Update keyboards/chimera_ortho_plus/readme.md

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/chimera_ortho_plus/readme.md

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/chimera_ortho_plus/info.json

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/chimera_ortho_plus/chimera_ortho_plus.h

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/chimera_ortho_plus/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/chimera_ortho_plus/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
A keyboards/chimera_ortho_plus/chimera_ortho_plus.c => keyboards/chimera_ortho_plus/chimera_ortho_plus.c +23 -0
@@ 0,0 1,23 @@
#include "chimera_ortho_plus.h"

void uart_init(void) {
	SERIAL_UART_INIT();
}

void led_init(void) {
    setPinOutput(D1);
    setPinOutput(F4);
    setPinOutput(F5);
    writePinHigh(D1);
    writePinHigh(F4);
    writePinHigh(F5);
}


void matrix_init_kb(void) {
	// put your keyboard start-up code here
	// runs once when the firmware starts up
	matrix_init_user();
	uart_init();
	led_init();
}

A keyboards/chimera_ortho_plus/chimera_ortho_plus.h => keyboards/chimera_ortho_plus/chimera_ortho_plus.h +38 -0
@@ 0,0 1,38 @@
#pragma once

#include "quantum.h"

#define red_led_off   PORTF |= (1<<5)
#define red_led_on    PORTF &= ~(1<<5)
#define blu_led_off   PORTF |= (1<<4)
#define blu_led_on    PORTF &= ~(1<<4)
#define grn_led_off   PORTD |= (1<<1)
#define grn_led_on    PORTD &= ~(1<<1)

#define set_led_off     red_led_off; grn_led_off; blu_led_off
#define set_led_red     red_led_on;  grn_led_off; blu_led_off
#define set_led_blue    red_led_off; grn_led_off; blu_led_on
#define set_led_green   red_led_off; grn_led_on;  blu_led_off
#define set_led_yellow  red_led_on;  grn_led_on;  blu_led_off
#define set_led_magenta red_led_on;  grn_led_off; blu_led_on
#define set_led_cyan    red_led_off; grn_led_on;  blu_led_on
#define set_led_white   red_led_on;  grn_led_on;  blu_led_on

// This a shortcut to help you visually see your layout.
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array

#define LAYOUT( \
  k00, k01, k02, k03, k04, k05,      k06, k07, k08, k09, k10, k11, \
  k12, k13, k14, k15, k16, k17,      k18, k19, k20, k21, k22, k23, \
  k24, k25, k26, k27, k28, k29,      k30, k31, k32, k33, k34, k35, \
  k36, k37, k38, k39, k40, k41,      k42, k43, k44, k45, k46, k47, \
                      k48, k49,      k50, k51 \
) \
{ \
  { k03, k40, k26,   k15,   k28,   k01,   k42, k31, k20,   k33,   k08,   k10   }, \
  { k00, k37, k14,   k27,   k16,   k36,   k47, k19, k32,   k21,   k46,   k11   }, \
  { k12, k25, k02,   k39,   k17,   k49,   k50, k18, k44,   k09,   k34,   k23   }, \
  { k24, k13, k38,   k04,   k05,   k48,   k51, k06, k07,   k45,   k22,   k35   }, \
  { k29, k41, KC_NO, KC_NO, KC_NO, KC_NO, k30, k43, KC_NO, KC_NO, KC_NO, KC_NO }  \
}

A keyboards/chimera_ortho_plus/config.h => keyboards/chimera_ortho_plus/config.h +76 -0
@@ 0,0 1,76 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */

#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0xDE1D
#define DEVICE_VER      0x0001
#define MANUFACTURER    unknown
#define PRODUCT         Chimera Ortho Plus
#define DESCRIPTION     q.m.k. keyboard firmware for Chimera Ortho Plus

/* key matrix size */
#define MATRIX_ROWS 6
#define MATRIX_COLS 12

/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST

/* number of backlight levels */
//#define BACKLIGHT_LEVELS 3

#define ONESHOT_TIMEOUT 500

/*
 * Feature disable options
 *  These options are also useful to firmware size reduction.
 */

/* disable debug print */
//#define NO_DEBUG

/* disable print */
//#define NO_PRINT

/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION

//UART settings for communication with the RF microcontroller
#define SERIAL_UART_BAUD 1000000
#define SERIAL_UART_DATA UDR1
#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
#define SERIAL_UART_INIT() do { \
    	/* baud rate */ \
    	UBRR1L = SERIAL_UART_UBRR; \
    	/* baud rate */ \
    	UBRR1H = SERIAL_UART_UBRR >> 8; \
    	/* enable TX and RX */ \
    	UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
    	/* 8-bit data */ \
    	UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
  	} while(0)

A keyboards/chimera_ortho_plus/info.json => keyboards/chimera_ortho_plus/info.json +65 -0
@@ 0,0 1,65 @@
{
  "keyboard_name": "Chimera Ortho Plus",
  "keyboard_folder": "chimera_ortho_plus", 
  "maintainer": "qmk",
  "width": 13.5,
  "height": 6,
  "layouts": {
    "LAYOUT": {
      "layout": [
        {"label": "{", "x": 0, "y": 0},
        {"label": "1", "x": 1, "y": 0},
        {"label": "2", "x": 2, "y": 0},
        {"label": "3", "x": 3, "y": 0},
        {"label": "4", "x": 4, "y": 0},
        {"label": "5", "x": 5, "y": 0},
        {"label": "6", "x": 7.5, "y": 0},
        {"label": "7", "x": 8.5, "y": 0},
        {"label": "8", "x": 9.5, "y": 0},
        {"label": "9", "x": 10.5, "y": 0},
        {"label": "0", "x": 11.5, "y": 0},
        {"label": "}", "x": 12.5, "y": 0},
        {"label": "Esc", "x": 0, "y": 1},
        {"label": "Q", "x": 1, "y": 1},
        {"label": "W", "x": 2, "y": 1},
        {"label": "E", "x": 3, "y": 1},
        {"label": "R", "x": 4, "y": 1},
        {"label": "T", "x": 5, "y": 1},
        {"label": "Y", "x": 7.5, "y": 1},
        {"label": "U", "x": 8.5, "y": 1},
        {"label": "I", "x": 9.5, "y": 1},
        {"label": "O", "x": 10.5, "y": 1},
        {"label": "P", "x": 11.5, "y": 1},
        {"label": "\"", "x": 12.5, "y": 1},
        {"label": "Tab", "x": 0, "y": 2},
        {"label": "A", "x": 1, "y": 2},
        {"label": "S", "x": 2, "y": 2},
        {"label": "D", "x": 3, "y": 2},
        {"label": "F", "x": 4, "y": 2},
        {"label": "G", "x": 5, "y": 2},
        {"label": "H", "x": 7.5, "y": 2},
        {"label": "J", "x": 8.5, "y": 2},
        {"label": "K", "x": 9.5, "y": 2},
        {"label": "L", "x": 10.5, "y": 2},
        {"label": ";", "x": 11.5, "y": 2},
        {"label": "Enter", "x": 12.5, "y": 2},
        {"label": "(", "x": 0, "y": 3},
        {"label": "Z", "x": 1, "y": 3},
        {"label": "X", "x": 2, "y": 3},
        {"label": "C", "x": 3, "y": 3},
        {"label": "V", "x": 4, "y": 3},
        {"label": "B", "x": 5, "y": 3},
        {"label": "N", "x": 7.5, "y": 3},
        {"label": "M", "x": 8.5, "y": 3},
        {"label": ",", "x": 9.5, "y": 3},
        {"label": ".", "x": 10.5, "y": 3},
        {"label": "/", "x": 11.5, "y": 3},
        {"label": ")", "x": 12.5, "y": 3},
        {"label": "Num Layer", "x": 4, "y": 4},
        {"label": "Back Space", "x": 5, "y": 4},
        {"label": "Space", "x": 7.5, "y": 4},
        {"label": "Symbol Layer", "x": 8.5, "y": 4}
      ]
    }
  }
}

A keyboards/chimera_ortho_plus/keymaps/default/config.h => keyboards/chimera_ortho_plus/keymaps/default/config.h +5 -0
@@ 0,0 1,5 @@
#pragma once

// place overrides here
#define LONGPRESS_DELAY 150
//#define LAYER_TOGGLE_DELAY 300

A keyboards/chimera_ortho_plus/keymaps/default/keymap.c => keyboards/chimera_ortho_plus/keymaps/default/keymap.c +185 -0
@@ 0,0 1,185 @@
#include QMK_KEYBOARD_H

// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum chimera_ortho_plus_layers {
  _QWERTY,
  _CAPS,
  _NUMPAD,
  _SYMBOLS,
  _MACROS,
  _NAV
};

#define KC_NMPD TG(_NUMPAD)
#define KC_SYMB TG(_SYMBOLS)
#define KC_SPFN LT(_NAV,KC_4)
#define KC_SCTL MT(MOD_LCTL, KC_2)
#define KC_SCTR MT(MOD_LCTL, KC_9)
#define KC_SPLT MT(MOD_LALT, KC_3)
#define KC_SPRT MT(MOD_LALT, KC_8)
#define KC_GBRC MT(MOD_RGUI, KC_7)
#define KC_GQOT MT(MOD_LGUI, KC_QUOT)
#define KC_MESC LT(_MACROS, KC_ESC)
#define KC_CAD LALT(LCTL(KC_DEL))

enum custom_keycodes {
  KC_INCL = SAFE_RANGE,
  KC_PULL,
  KC_PUSH,
  KC_SCAP,
  KC_SCOF
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

  [_QWERTY] = LAYOUT(
  //,-------+-------+-------+-------+-------+-------.     ,-------+-------+-------+-------+-------+-------.
     KC_LBRC, KC_1  ,KC_SCTL,KC_SPLT,KC_SPFN, KC_5  ,       KC_6  ,KC_GBRC,KC_SPRT,KC_SCTR, KC_0  ,KC_RBRC,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     KC_MESC, KC_Q  , KC_W  , KC_E  , KC_R  , KC_T  ,       KC_Y  , KC_U  , KC_I  , KC_O  , KC_P  ,KC_QUOT,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     KC_TAB , KC_A  , KC_S  , KC_D  , KC_F  , KC_G  ,       KC_H  , KC_J  , KC_K  , KC_L  ,KC_SCLN,KC_ENT ,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     KC_LSPO, KC_Z  , KC_X  , KC_C  , KC_V  , KC_B  ,       KC_N  , KC_M  ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSPC,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
                                     KC_NMPD,KC_BSPC,      KC_SPC ,KC_SYMB
  //|-------------------------------+-------+-------|     |-------+-------+-------------------------------|
  ),

  [_CAPS] = LAYOUT(
  //,-------+-------+-------+-------+-------+-------.     ,-------+-------+-------+-------+-------+-------.
     _______,KC_UNDS,_______,_______,_______,_______,      _______,_______,_______,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,_______,_______,_______,      _______,_______,_______,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,_______,_______,_______,      _______,_______,_______,_______,KC_COLN,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     KC_SCOF,_______,_______,_______,_______,_______,      _______,_______,_______,_______,_______,KC_SCOF,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
                                     _______,_______,      _______,_______
  //|-------------------------------+-------+-------|     |-------+-------+-------------------------------|
  ),

  [_NUMPAD] = LAYOUT(
  //,-------+-------+-------+-------+-------+-------.     ,-------+-------+-------+-------+-------+-------.
     _______,_______,_______,_______,_______,_______,      _______,_______,_______,_______,KC_MINS,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,KC_COLN,_______,_______,_______,      _______, KC_7  , KC_8  , KC_9  ,KC_ASTR,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,KC_DOT ,_______,_______,_______,      _______, KC_4  , KC_5  , KC_6  ,KC_PLUS,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,_______,_______,_______,      _______, KC_1  , KC_2  , KC_3  ,KC_SLSH,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
                                     _______,_______,      _______, KC_0
  //|-------------------------------+-------+-------/     |-------+-------+-------------------------------|
  ),

  [_SYMBOLS] = LAYOUT(
  //,-------+-------+-------+-------+-------+-------.     ,-------+-------+-------+-------+-------+-------.
     _______,_______,_______,_______,_______,_______,      _______,_______,_______,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,KC_EXLM, KC_AT ,KC_HASH,KC_DLR ,KC_PERC,      KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_BSLS,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
      KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 ,      KC_TILD,KC_EQL ,KC_UNDS,KC_LCBR,KC_RCBR,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
      KC_F7 , KC_F8 , KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,      KC_GRV ,KC_PLUS,KC_MINS,KC_LBRC,KC_RBRC,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
                                     KC_PIPE,_______,      _______,_______
  //|-------------------------------+-------+-------|     |-------+-------+-------------------------------|
  ),

  [_MACROS] = LAYOUT(  
  //,-------+-------+-------+-------+-------+-------.     ,-------+-------+-------+-------+-------+-------.
     _______,_______,_______,_______,_______,_______,    _______  ,_______,_______,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,_______,_______,_______,    _______  ,_______,KC_INCL,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,KC_CAD ,_______,_______,    _______  ,_______,_______,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     KC_SCAP,_______,_______,_______,_______,_______,    _______  ,_______,KC_PULL,KC_PUSH,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
                                     _______,_______,      _______,_______    
  //|-------------------------------+-------+-------|     |-------+-------+-------------------------------|
  ),

  [_NAV] = LAYOUT(  
  //,-------+-------+-------+-------+-------+-------.     ,-------+-------+-------+-------+-------+-------.
     _______,_______,_______,_______,_______,_______,      _______,_______,_______,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,_______,_______,_______,      _______,KC_PGUP, KC_UP ,KC_PGDN,KC_PSCR,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,_______,_______,_______,      _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
     _______,_______,_______,_______,_______,_______,      _______,_______,_______,_______,_______,_______,
  //|-------+-------+-------+-------+-------+-------|     |-------+-------+-------+-------+-------+-------|
                                     _______,KC_DEL ,      _______,_______    
  //|-------------------------------+-------+-------|     |-------+-------+-------------------------------|
  )
};


bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch(keycode) {
    /* include some kind of library or header */
    case KC_INCL:
      if (record->event.pressed) {
        SEND_STRING("#include <>" SS_TAP(X_LEFT));
      }
      return false;
    case KC_PULL:
      if (record->event.pressed) {
        SEND_STRING("git pull\n");
      }
      return false;
    case KC_PUSH:
      if (record->event.pressed){
        SEND_STRING("git push\n");
      }
      return false;
	case KC_SCAP:
      if (record->event.pressed){
        layer_on(_CAPS);
        tap_code(KC_CAPS);
      }
      return false;
    case KC_SCOF:
      if (record->event.pressed){
        layer_off(_CAPS);
        tap_code(KC_CAPS);
      }
      return false;
  }
  return true;
};
 

void matrix_scan_user(void) {
    uint8_t layer = get_highest_layer(layer_state);
	
    switch (layer) {
    	case _QWERTY:
    	    set_led_green;
    	    break;
	    case _CAPS:
			set_led_white;
			break;
	    case _NUMPAD:
            set_led_blue;
            break;
	    case _SYMBOLS:
            set_led_red;
            break;
	    case _MACROS:
			set_led_cyan;
			break;
		case _NAV:
			set_led_magenta;
			break;
        default:
            set_led_green;
            break;
    }
};

A keyboards/chimera_ortho_plus/matrix.c => keyboards/chimera_ortho_plus/matrix.c +154 -0
@@ 0,0 1,154 @@
/*
Copyright 2012 Jun Wako
Copyright 2014 Jack Humbert

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#if defined(__AVR__)
#include <avr/io.h>
#endif
#include "wait.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "timer.h"

#if (MATRIX_COLS <= 8)
#    define print_matrix_header()  print("\nr/c 01234567\n")
#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row))
#    define matrix_bitpop(i)       bitpop(matrix[i])
#    define ROW_SHIFTER ((uint8_t)1)
#elif (MATRIX_COLS <= 16)
#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n")
#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row))
#    define matrix_bitpop(i)       bitpop16(matrix[i])
#    define ROW_SHIFTER ((uint16_t)1)
#elif (MATRIX_COLS <= 32)
#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row))
#    define matrix_bitpop(i)       bitpop32(matrix[i])
#    define ROW_SHIFTER  ((uint32_t)1)
#endif

/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];

__attribute__ ((weak))
void matrix_init_kb(void) {
    matrix_init_user();
}

__attribute__ ((weak))
void matrix_scan_kb(void) {
    matrix_scan_user();
}

__attribute__ ((weak))
void matrix_init_user(void) {
}

__attribute__ ((weak))
void matrix_scan_user(void) {
}

inline
uint8_t matrix_rows(void) {
    return MATRIX_ROWS;
}

inline
uint8_t matrix_cols(void) {
    return MATRIX_COLS;
}

void matrix_init(void) {

    matrix_init_quantum();
}

uint8_t matrix_scan(void)
{
    SERIAL_UART_INIT();

    uint32_t timeout = 0;

    //the s character requests the RF slave to send the matrix
    SERIAL_UART_DATA = 's';

    //trust the external keystates entirely, erase the last data
    uint8_t uart_data[14] = {0};

    //there are 10 bytes corresponding to 10 columns, and an end byte
    for (uint8_t i = 0; i < 14; i++) {
        //wait for the serial data, timeout if it's been too long
        //this only happened in testing with a loose wire, but does no
        //harm to leave it in here
        while(!SERIAL_UART_RXD_PRESENT){
            timeout++;
            if (timeout > 10000){
                break;
            }
        }
        uart_data[i] = SERIAL_UART_DATA;
    }

    //check for the end packet, the key state bytes use the LSBs, so 0xE0
    //will only show up here if the correct bytes were recieved
    if (uart_data[10] == 0xE0)
    {
        //shifting and transferring the keystates to the QMK matrix variable
        for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
            matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 6;
        }
    }


    matrix_scan_quantum();
    return 1;
}

inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
    return (matrix[row] & ((matrix_row_t)1<<col));
}

inline
matrix_row_t matrix_get_row(uint8_t row)
{
    return matrix[row];
}

void matrix_print(void)
{
    print_matrix_header();

    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
        phex(row); print(": ");
        print_matrix_row(row);
        print("\n");
    }
}

uint8_t matrix_key_count(void)
{
    uint8_t count = 0;
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
        count += matrix_bitpop(i);
    }
    return count;
}

A keyboards/chimera_ortho_plus/readme.md => keyboards/chimera_ortho_plus/readme.md +15 -0
@@ 0,0 1,15 @@
# Chimera Ortho+

![Chimera Ortho+](https://i.imgur.com/tuDaGdTl.jpg)

A split wireless 50% ortholinear keyboard.

* Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle)
* Hardware Supported: Chimera Ortho+ PCB, WaveShare core nRF51822
* Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ortho_plus/gerbers)

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

    make chimera_ortho_plus:default

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).

A keyboards/chimera_ortho_plus/rules.mk => keyboards/chimera_ortho_plus/rules.mk +37 -0
@@ 0,0 1,37 @@
# MCU name
MCU = atmega32u4

# Bootloader
#   Teensy       halfkay
#   Pro Micro    caterina
#   Atmel DFU    atmel-dfu
#   LUFA DFU     lufa-dfu
#   QMK DFU      qmk-dfu
#   ATmega32A    bootloadHID
#   ATmega328P   USBasp
BOOTLOADER = caterina

# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes       # Mouse keys
EXTRAKEY_ENABLE = yes       # Audio control and System control
CONSOLE_ENABLE = yes        # Console for debug
COMMAND_ENABLE = yes        # Commands for debug and configuration
# 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 this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = yes           # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
MIDI_ENABLE = no            # MIDI support
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no           # Audio output
FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
HD44780_ENABLE = no         # Enable support for HD44780 based LCDs
UNICODE_ENABLE = yes
CUSTOM_MATRIX = yes

# project specific files
SRC = matrix.c