{ "keyboard_name": "TKC1800", "url": "", "maintainer": "qmk", "width": 19.5, "height": 7, "layouts": { "LAYOUT": { "key_count": 107, "layout": [ { "label": "Esc", "x": 0, "y": 0 }, { "label": "F1", "x": 1.25, "y": 0 }, { "label": "F2", "x": 2.25, "y": 0 }, { "label": "F3", "x": 3.25, "y": 0 }, { "label": "F4", "x": 4.25, "y": 0 }, { "label": "F5", "x": 5.5, "y": 0 }, { "label": "F6", "x": 6.5, "y": 0 }, { "label": "F7", "x": 7.5, "y": 0 }, { "label": "F8", "x": 8.5, "y": 0 }, { "label": "F9", "x": 9.75, "y": 0 }, { "label": "F10", "x": 10.75, "y": 0 }, { "label": "F11", "x": 11.75, "y": 0 }, { "label": "F12", "x": 12.75, "y": 0 }, { "label": "Insert", "x": 15.5, "y": 0 }, { "label": "Home", "x": 16.5, "y": 0 }, { "label": "Pg Up", "x": 17.5, "y": 0 }, { "label": "Prt Sc", "x": 18.5, "y": 0 }, { "label": "Delete", "x": 15.5, "y": 1 }, { "label": "End", "x": 16.5, "y": 1 }, { "label": "Pg Dn", "x": 17.5, "y": 1 }, { "label": "Scroll Lock", "x": 18.5, "y": 1 }, { "label": "~", "x": 0, "y": 2 }, { "label": "!", "x": 1, "y": 2 }, { "label": "@", "x": 2, "y": 2 }, { "label": "#", "x": 3, "y": 2 }, { "label": "$", "x": 4, "y": 2 }, { "label": "%", "x": 5, "y": 2 }, { "label": "^", "x": 6, "y": 2 }, { "label": "&", "x": 7, "y": 2 }, { "label": "*", "x": 8, "y": 2 }, { "label": "(", "x": 9, "y": 2 }, { "label": ")", "x": 10, "y": 2 }, { "label": "_", "x": 11, "y": 2 }, { "label": "+", "x": 12, "y": 2 }, { "label": "Backspace", "x": 13, "y": 2 }, { "x": 14, "y": 2 }, { "label": "Num Lock", "x": 15.5, "y": 2 }, { "label": "/", "x": 16.5, "y": 2 }, { "label": "*", "x": 17.5, "y": 2 }, { "label": "-", "x": 18.5, "y": 2 }, { "label": "Tab", "x": 0, "y": 3, "w": 1.5 }, { "label": "Q", "x": 1.5, "y": 3 }, { "label": "W", "x": 2.5, "y": 3 }, { "label": "E", "x": 3.5, "y": 3 }, { "label": "R", "x": 4.5, "y": 3 }, { "label": "T", "x": 5.5, "y": 3 }, { "label": "Y", "x": 6.5, "y": 3 }, { "label": "U", "x": 7.5, "y": 3 }, { "label": "I", "x": 8.5, "y": 3 }, { "label": "O", "x": 9.5, "y": 3 }, { "label": "P", "x": 10.5, "y": 3 }, { "label": "{", "x": 11.5, "y": 3 }, { "label": "}", "x": 12.5, "y": 3 }, { "label": "|", "x": 13.5, "y": 3, "w": 1.5 }, { "label": "7", "x": 15.5, "y": 3 }, { "label": "8", "x": 16.5, "y": 3 }, { "label": "9", "x": 17.5, "y": 3 }, { "label": "+", "x": 18.5, "y": 3 }, { "label": "Caps Lock", "x": 0, "y": 4, "w": 1.75 }, { "label": "A", "x": 1.75, "y": 4 }, { "label": "S", "x": 2.75, "y": 4 }, { "label": "D", "x": 3.75, "y": 4 }, { "label": "F", "x": 4.75, "y": 4 }, { "label": "G", "x": 5.75, "y": 4 }, { "label": "H", "x": 6.75, "y": 4 }, { "label": "J", "x": 7.75, "y": 4 }, { "label": "K", "x": 8.75, "y": 4 }, { "label": "L", "x": 9.75,
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include "split_util.h"
#include "matrix.h"
#include "keyboard.h"
#include "config.h"

#ifdef USE_I2C
#  include "i2c.h"
#else
#  include "serial.h"
#endif

volatile bool isLeftHand = true;

static void setup_handedness(void) {
  #ifdef EE_HANDS
    isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS);
  #else
    // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c
    #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT)
      isLeftHand = !has_usb();
    #else
      isLeftHand = has_usb();
    #endif
  #endif
}

static void keyboard_master_setup(void) {
#ifdef USE_I2C
    i2c_master_init();
#ifdef SSD1306OLED
    matrix_master_OLED_init ();
#endif
#else
    serial_master_init();
#endif
}

static void keyboard_slave_setup(void) {
#ifdef USE_I2C
    i2c_slave_init(SLAVE_I2C_ADDRESS);
#else
    serial_slave_init();
#endif
}

bool has_usb(void) {
   USBCON |= (1 << OTGPADE); //enables VBUS pad
   _delay_us(5);
   return (USBSTA & (1<<VBUS));  //checks state of VBUS
}

void split_keyboard_setup(void) {
   setup_handedness();

   if (has_usb()) {
      keyboard_master_setup();
   } else {
      keyboard_slave_setup();
   }
   sei();
}

void keyboard_slave_loop(void) {
   matrix_init();

   while (1) {
      matrix_slave_scan();
   }
}

// this code runs before the usb and keyboard is initialized
void matrix_setup(void) {
    split_keyboard_setup();

    if (!has_usb()) {
        keyboard_slave_loop();
    }
}