aboutsummaryrefslogtreecommitdiffstats
path: root/keyboards/ai03/orbit/split_util.c
diff options
context:
space:
mode:
authorGravatar ai03 <sarcaphx510@gmail.com>2019-03-10 19:57:36 -0700
committerGravatar Drashna Jaelre <drashna@live.com>2019-03-10 19:57:36 -0700
commit9bea41c9b239916ae8786e7df02c29fad79ef459 (patch)
treeb9b4b3cdacd87156ebc29e70a79e846cb32e8679 /keyboards/ai03/orbit/split_util.c
parentad12acd3c049e1eef02ac21bb749eda375e09cec (diff)
downloadqmk_firmware-9bea41c9b239916ae8786e7df02c29fad79ef459.tar.gz
[Keyboard] Add Orbit keyboard (#5306)
* Get things working except indicators * Attempt to get things working * hmm * Compiles but doesn't run * Make data transfer work * Get all indicators working * Remove old transport * Prepare for pullreq * Revert keymap from testing to production * Final error checking for pull request * Remove autogenerated is_command from config.h * Rewrite pin toggles using qmk functions
Diffstat (limited to 'keyboards/ai03/orbit/split_util.c')
-rw-r--r--keyboards/ai03/orbit/split_util.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/keyboards/ai03/orbit/split_util.c b/keyboards/ai03/orbit/split_util.c
new file mode 100644
index 000000000..5095cb8fd
--- /dev/null
+++ b/keyboards/ai03/orbit/split_util.c
@@ -0,0 +1,87 @@
+#include "split_util.h"
+#include "matrix.h"
+#include "keyboard.h"
+#include "config.h"
+#include "timer.h"
+#include "split_flags.h"
+#include "transport.h"
+#include "quantum.h"
+
+#ifdef EE_HANDS
+# include "tmk_core/common/eeprom.h"
+# include "eeconfig.h"
+#endif
+
+volatile bool isLeftHand = true;
+
+__attribute__((weak))
+bool is_keyboard_left(void) {
+ #ifdef SPLIT_HAND_PIN
+ // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand
+ setPinInput(SPLIT_HAND_PIN);
+ return readPin(SPLIT_HAND_PIN);
+ #else
+ #ifdef EE_HANDS
+ return eeprom_read_byte(EECONFIG_HANDEDNESS);
+ #else
+ #ifdef MASTER_RIGHT
+ return !is_keyboard_master();
+ #else
+ return is_keyboard_master();
+ #endif
+ #endif
+ #endif
+}
+
+bool is_keyboard_master(void)
+{
+#ifdef __AVR__
+ static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN;
+
+ // only check once, as this is called often
+ if (usbstate == UNKNOWN)
+ {
+ USBCON |= (1 << OTGPADE); // enables VBUS pad
+ wait_us(5);
+
+ usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS
+ }
+
+ return (usbstate == MASTER);
+#else
+ return true;
+#endif
+}
+
+static void keyboard_master_setup(void) {
+#if defined(USE_I2C) || defined(EH)
+ #ifdef SSD1306OLED
+ matrix_master_OLED_init ();
+ #endif
+#endif
+ transport_master_init();
+
+ // For master the Backlight info needs to be sent on startup
+ // Otherwise the salve won't start with the proper info until an update
+ BACKLIT_DIRTY = true;
+}
+
+static void keyboard_slave_setup(void)
+{
+ transport_slave_init();
+}
+
+// this code runs before the usb and keyboard is initialized
+void matrix_setup(void)
+{
+ isLeftHand = is_keyboard_left();
+
+ if (is_keyboard_master())
+ {
+ keyboard_master_setup();
+ }
+ else
+ {
+ keyboard_slave_setup();
+ }
+}