]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge pull request #1171 from ishtob/master
authorJack Humbert <jack.humb@gmail.com>
Tue, 28 Mar 2017 13:13:41 +0000 (09:13 -0400)
committerGitHub <noreply@github.com>
Tue, 28 Mar 2017 13:13:41 +0000 (09:13 -0400)
SSD1306 I2C OLED display support for let's split

18 files changed:
keyboards/lets_split/common/glcdfont.c [new file with mode: 0644]
keyboards/lets_split/i2c.h
keyboards/lets_split/keymaps/OLED_sample/Makefile [new file with mode: 0644]
keyboards/lets_split/keymaps/OLED_sample/config.h [new file with mode: 0644]
keyboards/lets_split/keymaps/OLED_sample/keymap.c [new file with mode: 0644]
keyboards/lets_split/keymaps/OLED_sample/readme.md [new file with mode: 0644]
keyboards/lets_split/matrix.c
keyboards/lets_split/rev2/rev2.c
keyboards/lets_split/rev2/rev2.h
keyboards/lets_split/rev2fliphalf/Makefile [deleted file]
keyboards/lets_split/rev2fliphalf/config.h [deleted file]
keyboards/lets_split/rev2fliphalf/rev2fliphalf.c [deleted file]
keyboards/lets_split/rev2fliphalf/rev2fliphalf.h [deleted file]
keyboards/lets_split/rev2fliphalf/rules.mk [deleted file]
keyboards/lets_split/rules.mk
keyboards/lets_split/split_util.c
keyboards/lets_split/split_util.h
keyboards/lets_split/ssd1306.c [new file with mode: 0644]

diff --git a/keyboards/lets_split/common/glcdfont.c b/keyboards/lets_split/common/glcdfont.c
new file mode 100644 (file)
index 0000000..6f88bd2
--- /dev/null
@@ -0,0 +1,276 @@
+// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
+// See gfxfont.h for newer custom bitmap font info.
+
+#ifndef FONT5X7_H
+#define FONT5X7_H
+
+#ifdef __AVR__
+ #include <avr/io.h>
+ #include <avr/pgmspace.h>
+#elif defined(ESP8266)
+ #include <pgmspace.h>
+#else
+ #define PROGMEM
+#endif
+
+// Standard ASCII 5x7 font
+
+static const unsigned char font[] PROGMEM = {
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       0x3E, 0x5B, 0x4F, 0x5B, 0x3E,
+       0x3E, 0x6B, 0x4F, 0x6B, 0x3E,
+       0x1C, 0x3E, 0x7C, 0x3E, 0x1C,
+       0x18, 0x3C, 0x7E, 0x3C, 0x18,
+       0x1C, 0x57, 0x7D, 0x57, 0x1C,
+       0x1C, 0x5E, 0x7F, 0x5E, 0x1C,
+       0x00, 0x18, 0x3C, 0x18, 0x00,
+       0xFF, 0xE7, 0xC3, 0xE7, 0xFF,
+       0x00, 0x18, 0x24, 0x18, 0x00,
+       0xFF, 0xE7, 0xDB, 0xE7, 0xFF,
+       0x30, 0x48, 0x3A, 0x06, 0x0E,
+       0x26, 0x29, 0x79, 0x29, 0x26,
+       0x40, 0x7F, 0x05, 0x05, 0x07,
+       0x40, 0x7F, 0x05, 0x25, 0x3F,
+       0x5A, 0x3C, 0xE7, 0x3C, 0x5A,
+       0x7F, 0x3E, 0x1C, 0x1C, 0x08,
+       0x08, 0x1C, 0x1C, 0x3E, 0x7F,
+       0x14, 0x22, 0x7F, 0x22, 0x14,
+       0x5F, 0x5F, 0x00, 0x5F, 0x5F,
+       0x06, 0x09, 0x7F, 0x01, 0x7F,
+       0x00, 0x66, 0x89, 0x95, 0x6A,
+       0x60, 0x60, 0x60, 0x60, 0x60,
+       0x94, 0xA2, 0xFF, 0xA2, 0x94,
+       0x08, 0x04, 0x7E, 0x04, 0x08,
+       0x10, 0x20, 0x7E, 0x20, 0x10,
+       0x08, 0x08, 0x2A, 0x1C, 0x08,
+       0x08, 0x1C, 0x2A, 0x08, 0x08,
+       0x1E, 0x10, 0x10, 0x10, 0x10,
+       0x0C, 0x1E, 0x0C, 0x1E, 0x0C,
+       0x30, 0x38, 0x3E, 0x38, 0x30,
+       0x06, 0x0E, 0x3E, 0x0E, 0x06,
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x5F, 0x00, 0x00,
+       0x00, 0x07, 0x00, 0x07, 0x00,
+       0x14, 0x7F, 0x14, 0x7F, 0x14,
+       0x24, 0x2A, 0x7F, 0x2A, 0x12,
+       0x23, 0x13, 0x08, 0x64, 0x62,
+       0x36, 0x49, 0x56, 0x20, 0x50,
+       0x00, 0x08, 0x07, 0x03, 0x00,
+       0x00, 0x1C, 0x22, 0x41, 0x00,
+       0x00, 0x41, 0x22, 0x1C, 0x00,
+       0x2A, 0x1C, 0x7F, 0x1C, 0x2A,
+       0x08, 0x08, 0x3E, 0x08, 0x08,
+       0x00, 0x80, 0x70, 0x30, 0x00,
+       0x08, 0x08, 0x08, 0x08, 0x08,
+       0x00, 0x00, 0x60, 0x60, 0x00,
+       0x20, 0x10, 0x08, 0x04, 0x02,
+       0x3E, 0x51, 0x49, 0x45, 0x3E,
+       0x00, 0x42, 0x7F, 0x40, 0x00,
+       0x72, 0x49, 0x49, 0x49, 0x46,
+       0x21, 0x41, 0x49, 0x4D, 0x33,
+       0x18, 0x14, 0x12, 0x7F, 0x10,
+       0x27, 0x45, 0x45, 0x45, 0x39,
+       0x3C, 0x4A, 0x49, 0x49, 0x31,
+       0x41, 0x21, 0x11, 0x09, 0x07,
+       0x36, 0x49, 0x49, 0x49, 0x36,
+       0x46, 0x49, 0x49, 0x29, 0x1E,
+       0x00, 0x00, 0x14, 0x00, 0x00,
+       0x00, 0x40, 0x34, 0x00, 0x00,
+       0x00, 0x08, 0x14, 0x22, 0x41,
+       0x14, 0x14, 0x14, 0x14, 0x14,
+       0x00, 0x41, 0x22, 0x14, 0x08,
+       0x02, 0x01, 0x59, 0x09, 0x06,
+       0x3E, 0x41, 0x5D, 0x59, 0x4E,
+       0x7C, 0x12, 0x11, 0x12, 0x7C,
+       0x7F, 0x49, 0x49, 0x49, 0x36,
+       0x3E, 0x41, 0x41, 0x41, 0x22,
+       0x7F, 0x41, 0x41, 0x41, 0x3E,
+       0x7F, 0x49, 0x49, 0x49, 0x41,
+       0x7F, 0x09, 0x09, 0x09, 0x01,
+       0x3E, 0x41, 0x41, 0x51, 0x73,
+       0x7F, 0x08, 0x08, 0x08, 0x7F,
+       0x00, 0x41, 0x7F, 0x41, 0x00,
+       0x20, 0x40, 0x41, 0x3F, 0x01,
+       0x7F, 0x08, 0x14, 0x22, 0x41,
+       0x7F, 0x40, 0x40, 0x40, 0x40,
+       0x7F, 0x02, 0x1C, 0x02, 0x7F,
+       0x7F, 0x04, 0x08, 0x10, 0x7F,
+       0x3E, 0x41, 0x41, 0x41, 0x3E,
+       0x7F, 0x09, 0x09, 0x09, 0x06,
+       0x3E, 0x41, 0x51, 0x21, 0x5E,
+       0x7F, 0x09, 0x19, 0x29, 0x46,
+       0x26, 0x49, 0x49, 0x49, 0x32,
+       0x03, 0x01, 0x7F, 0x01, 0x03,
+       0x3F, 0x40, 0x40, 0x40, 0x3F,
+       0x1F, 0x20, 0x40, 0x20, 0x1F,
+       0x3F, 0x40, 0x38, 0x40, 0x3F,
+       0x63, 0x14, 0x08, 0x14, 0x63,
+       0x03, 0x04, 0x78, 0x04, 0x03,
+       0x61, 0x59, 0x49, 0x4D, 0x43,
+       0x00, 0x7F, 0x41, 0x41, 0x41,
+       0x02, 0x04, 0x08, 0x10, 0x20,
+       0x00, 0x41, 0x41, 0x41, 0x7F,
+       0x04, 0x02, 0x01, 0x02, 0x04,
+       0x40, 0x40, 0x40, 0x40, 0x40,
+       0x00, 0x03, 0x07, 0x08, 0x00,
+       0x20, 0x54, 0x54, 0x78, 0x40,
+       0x7F, 0x28, 0x44, 0x44, 0x38,
+       0x38, 0x44, 0x44, 0x44, 0x28,
+       0x38, 0x44, 0x44, 0x28, 0x7F,
+       0x38, 0x54, 0x54, 0x54, 0x18,
+       0x00, 0x08, 0x7E, 0x09, 0x02,
+       0x18, 0xA4, 0xA4, 0x9C, 0x78,
+       0x7F, 0x08, 0x04, 0x04, 0x78,
+       0x00, 0x44, 0x7D, 0x40, 0x00,
+       0x20, 0x40, 0x40, 0x3D, 0x00,
+       0x7F, 0x10, 0x28, 0x44, 0x00,
+       0x00, 0x41, 0x7F, 0x40, 0x00,
+       0x7C, 0x04, 0x78, 0x04, 0x78,
+       0x7C, 0x08, 0x04, 0x04, 0x78,
+       0x38, 0x44, 0x44, 0x44, 0x38,
+       0xFC, 0x18, 0x24, 0x24, 0x18,
+       0x18, 0x24, 0x24, 0x18, 0xFC,
+       0x7C, 0x08, 0x04, 0x04, 0x08,
+       0x48, 0x54, 0x54, 0x54, 0x24,
+       0x04, 0x04, 0x3F, 0x44, 0x24,
+       0x3C, 0x40, 0x40, 0x20, 0x7C,
+       0x1C, 0x20, 0x40, 0x20, 0x1C,
+       0x3C, 0x40, 0x30, 0x40, 0x3C,
+       0x44, 0x28, 0x10, 0x28, 0x44,
+       0x4C, 0x90, 0x90, 0x90, 0x7C,
+       0x44, 0x64, 0x54, 0x4C, 0x44,
+       0x00, 0x08, 0x36, 0x41, 0x00,
+       0x00, 0x00, 0x77, 0x00, 0x00,
+       0x00, 0x41, 0x36, 0x08, 0x00,
+       0x02, 0x01, 0x02, 0x04, 0x02,
+       0x3C, 0x26, 0x23, 0x26, 0x3C,
+       0x1E, 0xA1, 0xA1, 0x61, 0x12,
+       0x3A, 0x40, 0x40, 0x20, 0x7A,
+       0x38, 0x54, 0x54, 0x55, 0x59,
+       0x21, 0x55, 0x55, 0x79, 0x41,
+       0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut
+       0x21, 0x55, 0x54, 0x78, 0x40,
+       0x20, 0x54, 0x55, 0x79, 0x40,
+       0x0C, 0x1E, 0x52, 0x72, 0x12,
+       0x39, 0x55, 0x55, 0x55, 0x59,
+       0x39, 0x54, 0x54, 0x54, 0x59,
+       0x39, 0x55, 0x54, 0x54, 0x58,
+       0x00, 0x00, 0x45, 0x7C, 0x41,
+       0x00, 0x02, 0x45, 0x7D, 0x42,
+       0x00, 0x01, 0x45, 0x7C, 0x40,
+       0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut
+       0xF0, 0x28, 0x25, 0x28, 0xF0,
+       0x7C, 0x54, 0x55, 0x45, 0x00,
+       0x20, 0x54, 0x54, 0x7C, 0x54,
+       0x7C, 0x0A, 0x09, 0x7F, 0x49,
+       0x32, 0x49, 0x49, 0x49, 0x32,
+       0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut
+       0x32, 0x4A, 0x48, 0x48, 0x30,
+       0x3A, 0x41, 0x41, 0x21, 0x7A,
+       0x3A, 0x42, 0x40, 0x20, 0x78,
+       0x00, 0x9D, 0xA0, 0xA0, 0x7D,
+       0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut
+       0x3D, 0x40, 0x40, 0x40, 0x3D,
+       0x3C, 0x24, 0xFF, 0x24, 0x24,
+       0x48, 0x7E, 0x49, 0x43, 0x66,
+       0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
+       0xFF, 0x09, 0x29, 0xF6, 0x20,
+       0xC0, 0x88, 0x7E, 0x09, 0x03,
+       0x20, 0x54, 0x54, 0x79, 0x41,
+       0x00, 0x00, 0x44, 0x7D, 0x41,
+       0x30, 0x48, 0x48, 0x4A, 0x32,
+       0x38, 0x40, 0x40, 0x22, 0x7A,
+       0x00, 0x7A, 0x0A, 0x0A, 0x72,
+       0x7D, 0x0D, 0x19, 0x31, 0x7D,
+       0x26, 0x29, 0x29, 0x2F, 0x28,
+       0x26, 0x29, 0x29, 0x29, 0x26,
+       0x30, 0x48, 0x4D, 0x40, 0x20,
+       0x38, 0x08, 0x08, 0x08, 0x08,
+       0x08, 0x08, 0x08, 0x08, 0x38,
+       0x2F, 0x10, 0xC8, 0xAC, 0xBA,
+       0x2F, 0x10, 0x28, 0x34, 0xFA,
+       0x00, 0x00, 0x7B, 0x00, 0x00,
+       0x08, 0x14, 0x2A, 0x14, 0x22,
+       0x22, 0x14, 0x2A, 0x14, 0x08,
+       0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code
+       0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block
+       0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block
+       0x00, 0x00, 0x00, 0xFF, 0x00,
+       0x10, 0x10, 0x10, 0xFF, 0x00,
+       0x14, 0x14, 0x14, 0xFF, 0x00,
+       0x10, 0x10, 0xFF, 0x00, 0xFF,
+       0x10, 0x10, 0xF0, 0x10, 0xF0,
+       0x14, 0x14, 0x14, 0xFC, 0x00,
+       0x14, 0x14, 0xF7, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0xFF,
+       0x14, 0x14, 0xF4, 0x04, 0xFC,
+       0x14, 0x14, 0x17, 0x10, 0x1F,
+       0x10, 0x10, 0x1F, 0x10, 0x1F,
+       0x14, 0x14, 0x14, 0x1F, 0x00,
+       0x10, 0x10, 0x10, 0xF0, 0x00,
+       0x00, 0x00, 0x00, 0x1F, 0x10,
+       0x10, 0x10, 0x10, 0x1F, 0x10,
+       0x10, 0x10, 0x10, 0xF0, 0x10,
+       0x00, 0x00, 0x00, 0xFF, 0x10,
+       0x10, 0x10, 0x10, 0x10, 0x10,
+       0x10, 0x10, 0x10, 0xFF, 0x10,
+       0x00, 0x00, 0x00, 0xFF, 0x14,
+       0x00, 0x00, 0xFF, 0x00, 0xFF,
+       0x00, 0x00, 0x1F, 0x10, 0x17,
+       0x00, 0x00, 0xFC, 0x04, 0xF4,
+       0x14, 0x14, 0x17, 0x10, 0x17,
+       0x14, 0x14, 0xF4, 0x04, 0xF4,
+       0x00, 0x00, 0xFF, 0x00, 0xF7,
+       0x14, 0x14, 0x14, 0x14, 0x14,
+       0x14, 0x14, 0xF7, 0x00, 0xF7,
+       0x14, 0x14, 0x14, 0x17, 0x14,
+       0x10, 0x10, 0x1F, 0x10, 0x1F,
+       0x14, 0x14, 0x14, 0xF4, 0x14,
+       0x10, 0x10, 0xF0, 0x10, 0xF0,
+       0x00, 0x00, 0x1F, 0x10, 0x1F,
+       0x00, 0x00, 0x00, 0x1F, 0x14,
+       0x00, 0x00, 0x00, 0xFC, 0x14,
+       0x00, 0x00, 0xF0, 0x10, 0xF0,
+       0x10, 0x10, 0xFF, 0x10, 0xFF,
+       0x14, 0x14, 0x14, 0xFF, 0x14,
+       0x10, 0x10, 0x10, 0x1F, 0x00,
+       0x00, 0x00, 0x00, 0xF0, 0x10,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+       0xFF, 0xFF, 0xFF, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFF, 0xFF,
+       0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+       0x38, 0x44, 0x44, 0x38, 0x44,
+       0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta
+       0x7E, 0x02, 0x02, 0x06, 0x06,
+       0x02, 0x7E, 0x02, 0x7E, 0x02,
+       0x63, 0x55, 0x49, 0x41, 0x63,
+       0x38, 0x44, 0x44, 0x3C, 0x04,
+       0x40, 0x7E, 0x20, 0x1E, 0x20,
+       0x06, 0x02, 0x7E, 0x02, 0x02,
+       0x99, 0xA5, 0xE7, 0xA5, 0x99,
+       0x1C, 0x2A, 0x49, 0x2A, 0x1C,
+       0x4C, 0x72, 0x01, 0x72, 0x4C,
+       0x30, 0x4A, 0x4D, 0x4D, 0x30,
+       0x30, 0x48, 0x78, 0x48, 0x30,
+       0xBC, 0x62, 0x5A, 0x46, 0x3D,
+       0x3E, 0x49, 0x49, 0x49, 0x00,
+       0x7E, 0x01, 0x01, 0x01, 0x7E,
+       0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
+       0x44, 0x44, 0x5F, 0x44, 0x44,
+       0x40, 0x51, 0x4A, 0x44, 0x40,
+       0x40, 0x44, 0x4A, 0x51, 0x40,
+       0x00, 0x00, 0xFF, 0x01, 0x03,
+       0xE0, 0x80, 0xFF, 0x00, 0x00,
+       0x08, 0x08, 0x6B, 0x6B, 0x08,
+       0x36, 0x12, 0x36, 0x24, 0x36,
+       0x06, 0x0F, 0x09, 0x0F, 0x06,
+       0x00, 0x00, 0x18, 0x18, 0x00,
+       0x00, 0x00, 0x10, 0x10, 0x00,
+       0x30, 0x40, 0xFF, 0x01, 0x01,
+       0x00, 0x1F, 0x01, 0x01, 0x1E,
+       0x00, 0x19, 0x1D, 0x17, 0x12,
+       0x00, 0x3C, 0x3C, 0x3C, 0x3C,
+       0x00, 0x00, 0x00, 0x00, 0x00  // #255 NBSP
+};
+#endif // FONT5X7_H
index 08ce4b0093a0ec26e8d05f0cdd751d6b15be421c..c15b6bc5065eaf14c11c9d2667078c6f102c6227 100644 (file)
@@ -16,7 +16,7 @@
 #define SLAVE_BUFFER_SIZE 0x10
 
 // i2c SCL clock frequency
-#define SCL_CLOCK  100000L
+#define SCL_CLOCK  400000L
 
 extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
 
@@ -28,4 +28,22 @@ uint8_t i2c_master_read(int);
 void i2c_reset_state(void);
 void i2c_slave_init(uint8_t address);
 
+
+static inline unsigned char i2c_start_read(unsigned char addr) {
+  return i2c_master_start((addr << 1) | I2C_READ);
+}
+
+static inline unsigned char i2c_start_write(unsigned char addr) {
+  return i2c_master_start((addr << 1) | I2C_WRITE);
+}
+
+// from SSD1306 scrips
+extern unsigned char i2c_rep_start(unsigned char addr);
+extern void i2c_start_wait(unsigned char addr);
+extern unsigned char i2c_readAck(void);
+extern unsigned char i2c_readNak(void);
+extern unsigned char i2c_read(unsigned char ack);
+
+#define i2c_read(ack)  (ack) ? i2c_readAck() : i2c_readNak();
+
 #endif
diff --git a/keyboards/lets_split/keymaps/OLED_sample/Makefile b/keyboards/lets_split/keymaps/OLED_sample/Makefile
new file mode 100644 (file)
index 0000000..90616d1
--- /dev/null
@@ -0,0 +1,25 @@
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = no        # Commands for debug and configuration
+NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+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
+
+# 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
\ No newline at end of file
diff --git a/keyboards/lets_split/keymaps/OLED_sample/config.h b/keyboards/lets_split/keymaps/OLED_sample/config.h
new file mode 100644 (file)
index 0000000..353ea36
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+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/>.
+*/
+
+#define USE_I2C
+//#define USE_SERIAL
+//#define MASTER_RIGHT
+#define FLIP_HALF
+
+#define SSD1306OLED
+
+
+#define PREVENT_STUCK_MODIFIERS
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 100
+
+#undef RGBLED_NUM
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 6
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+
+
+
+#ifdef SUBPROJECT_rev1
+    #include "../../rev1/config.h"
+#endif
+#ifdef SUBPROJECT_rev2
+    #include "../../rev2/config.h"
+#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/keymaps/OLED_sample/keymap.c b/keyboards/lets_split/keymaps/OLED_sample/keymap.c
new file mode 100644 (file)
index 0000000..072b825
--- /dev/null
@@ -0,0 +1,356 @@
+#include "lets_split.h"
+#include "bootloader.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+#include "tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/Peripheral/TWI.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+
+extern keymap_config_t keymap_config;
+
+//Following line allows macro to read current RGB settings
+extern rgblight_config_t rgblight_config;
+
+
+// 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.
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 16
+
+enum custom_keycodes {
+  QWERTY = SAFE_RANGE,
+  COLEMAK,
+  DVORAK,
+  LOWER,
+  RAISE,
+  ADJUST,
+  BACKLIT,
+  RGBLED_TOGGLE,
+  RGBLED_STEP_MODE,
+  RGBLED_INCREASE_HUE,
+  RGBLED_DECREASE_HUE,
+  RGBLED_INCREASE_SAT,
+  RGBLED_DECREASE_SAT,
+  RGBLED_INCREASE_VAL,
+  RGBLED_DECREASE_VAL,
+};
+
+enum macro_keycodes {
+  KC_SAMPLEMACRO,
+};
+
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+//Macros
+#define M_SAMPLE M(KC_SAMPLEMACRO)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = KEYMAP( \
+  KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \
+  KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, \
+  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = KEYMAP( \
+  KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC, \
+  KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, \
+  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = KEYMAP( \
+  KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC, \
+  KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH, \
+  KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |     |    \  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = KEYMAP( \
+  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = KEYMAP( \
+  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS, \
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] =  KEYMAP( \
+  _______, RESET,   _______, M_SAMPLE, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
+  _______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+)
+
+
+};
+
+
+#ifdef AUDIO_ENABLE
+
+float tone_startup[][2]    = SONG(STARTUP_SOUND);
+float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
+float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
+float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
+float tone_plover[][2]     = SONG(PLOVER_SOUND);
+float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
+float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
+float tone_goodbye[][2]    = SONG(GOODBYE_SOUND);
+#endif
+
+// define variables for reactive RGB
+bool TOG_STATUS = false;
+int RGB_current_mode;
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+// Setting ADJUST layer RGB back to default
+void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+  if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
+    rgblight_mode(RGB_current_mode);
+    layer_on(layer3);
+  } else {
+    layer_off(layer3);
+  }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case COLEMAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_COLEMAK);
+      }
+      return false;
+      break;
+    case DVORAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_DVORAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+          //not sure how to have keyboard check mode and set it to a variable, so my work around
+          //uses another variable that would be set to true after the first time a reactive key is pressed.
+        if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
+        } else {
+          TOG_STATUS = !TOG_STATUS;
+          rgblight_mode(16);
+        }
+        layer_on(_LOWER);
+        update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
+      } else {
+        rgblight_mode(RGB_current_mode);   // revert RGB to initial mode prior to RGB mode change
+        TOG_STATUS = false;
+        layer_off(_LOWER);
+        update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        //not sure how to have keyboard check mode and set it to a variable, so my work around
+        //uses another variable that would be set to true after the first time a reactive key is pressed.
+        if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
+        } else {
+          TOG_STATUS = !TOG_STATUS;
+          rgblight_mode(15);
+        }
+        layer_on(_RAISE);
+        update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
+      } else {
+        rgblight_mode(RGB_current_mode);  // revert RGB to initial mode prior to RGB mode change
+        layer_off(_RAISE);
+        TOG_STATUS = false;
+        update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case BACKLIT:
+      if (record->event.pressed) {
+        register_code(KC_RSFT);
+        #ifdef BACKLIGHT_ENABLE
+          backlight_step();
+        #endif
+      } else {
+        unregister_code(KC_RSFT);
+      }
+      return false;
+      break;
+      //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
+    case RGB_MOD:
+      if (record->event.pressed) {
+        rgblight_mode(RGB_current_mode);
+        rgblight_step();
+        RGB_current_mode = rgblight_config.mode;
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
+void matrix_init_user(void) {
+    #ifdef AUDIO_ENABLE
+        startup_user();
+    #endif
+    RGB_current_mode = rgblight_config.mode; 
+}
+
+//SSD1306 OLED init and update loop, make sure to add #define SSD1306OLED in config.h
+#ifdef SSD1306OLED
+void matrix_master_OLED_init (void) {
+    TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
+    iota_gfx_init();   // turns on the display   
+}
+
+void matrix_scan_user(void) {
+     iota_gfx_task();  // this is what updates the display continuously
+}
+#endif
+
+#ifdef AUDIO_ENABLE
+
+void startup_user()
+{
+    _delay_ms(20); // gets rid of tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+}
+
+void shutdown_user()
+{
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
+
+void music_on_user(void)
+{
+    music_scale_user();
+}
+
+void music_scale_user(void)
+{
+    PLAY_NOTE_ARRAY(music_scale, false, 0);
+}
+
+#endif
+
+/*
+ * Macro definition
+ */
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    if (!eeconfig_is_enabled()) {
+      eeconfig_init();
+    }
+
+    switch (id) {
+      case KC_SAMPLEMACRO:
+        if (record->event.pressed){
+          return MACRO (I(10), T(H), T(E), T(L), T(L), T(O), T(SPACE), T(W), T(O), T(R), T(L), T(D), END);
+        }
+    }
+
+    return MACRO_NONE;
+}
diff --git a/keyboards/lets_split/keymaps/OLED_sample/readme.md b/keyboards/lets_split/keymaps/OLED_sample/readme.md
new file mode 100644 (file)
index 0000000..0288885
--- /dev/null
@@ -0,0 +1,25 @@
+SSD1306 OLED Display via I2C
+======
+
+Features
+--------
+
+Some features supported by the firmware:
+
+
+* I2C connection between the two halves is required as the OLED display will use this connection as well. Note this
+  requires pull-up resistors on the data and clock lines.
+* OLED display will connect from either side
+
+
+Wiring
+------
+
+
+Work in progress...
+
+
+OLED Configuration
+-------------------------------
+
+Work in progress...
index 13896900421f0654f29e75f46f9eeddc22ea1015..81dfb14455ae52742e08372de6901a79c49069b0 100644 (file)
@@ -226,9 +226,7 @@ uint8_t matrix_scan(void)
         TXLED0;
         error_count = 0;
     }
-
     matrix_scan_quantum();
-
     return ret;
 }
 
index c505d3a6e317630df35f0d166a77bf4de841f11e..8bfa171d01dd5f486193978824681d87b504dbc9 100644 (file)
@@ -5,6 +5,13 @@
     float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
 #endif
 
+#ifdef SSD1306OLED
+void led_set_kb(uint8_t usb_led) {
+    // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+    led_set_user(usb_led);
+}
+#endif
+
 void matrix_init_kb(void) {
 
     #ifdef AUDIO_ENABLE
@@ -30,3 +37,4 @@ void shutdown_user(void) {
        stop_all_notes();
     #endif
 }
+
index 990976de2bca3dad26196b93fdb7bb5513dd875d..054731366efbe273acb440596c9188cec0b302dc 100644 (file)
@@ -6,23 +6,66 @@
 //void promicro_bootloader_jmp(bool program);
 #include "quantum.h"
 
+
+#ifdef USE_I2C
+#include <stddef.h>
+#ifdef __AVR__
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#endif
+#ifdef SSD1306OLED
+extern bool iota_gfx_init(void);
+extern void iota_gfx_task(void);
+extern bool iota_gfx_off(void);
+extern bool iota_gfx_on(void);
+extern void iota_gfx_flush(void);
+extern void iota_gfx_write_char(uint8_t c);
+extern void iota_gfx_write(const char *data);
+extern void iota_gfx_write_P(const char *data);
+extern void iota_gfx_clear_screen(void);
+#endif
+#endif
+
 //void promicro_bootloader_jmp(bool program);
 
+#ifndef FLIP_HALF
+//Standard Keymap
 #define KEYMAP( \
-       k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \
-       k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \
-       k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \
-       k30, k31, k32, k33, k34, k35, k75, k74, k73, k72, k71, k70 \
+       k40, k41, k42, k43, k44, k45, k05, k04, k03, k02, k01, k00, \
+       k50, k51, k52, k53, k54, k55, k15, k14, k13, k12, k11, k10, \
+       k60, k61, k62, k63, k64, k65, k25, k24, k23, k22, k21, k20, \
+       k70, k71, k72, k73, k74, k75, k35, k34, k33, k32, k31, k30 \
+       ) \
+       { \
+               { k45, k44, k43, k42, k41, k40 }, \
+               { k55, k54, k53, k52, k51, k50 }, \
+               { k65, k64, k63, k62, k61, k60 }, \
+               { k75, k74, k73, k72, k71, k70 }, \
+               { k00, k01, k02, k03, k04, k05 }, \
+               { k10, k11, k12, k13, k14, k15 }, \
+               { k20, k21, k22, k23, k24, k25 }, \
+               { k30, k31, k32, k33, k34, k35 } \
+       }
+
+#else
+// Keymap with one side flipped
+#define KEYMAP( \
+       k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \
+       k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \
+       k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \
+       k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \
        ) \
        { \
                { k00, k01, k02, k03, k04, k05 }, \
                { k10, k11, k12, k13, k14, k15 }, \
                { k20, k21, k22, k23, k24, k25 }, \
                { k30, k31, k32, k33, k34, k35 }, \
-               { k40, k41, k42, k43, k44, k45 }, \
-               { k50, k51, k52, k53, k54, k55 }, \
-               { k60, k61, k62, k63, k64, k65 }, \
-               { k70, k71, k72, k73, k74, k75 } \
+               { k45, k44, k43, k42, k41, k40 }, \
+               { k55, k54, k53, k52, k51, k50 }, \
+               { k65, k64, k63, k62, k61, k60 }, \
+               { k75, k74, k73, k72, k71, k70 } \
        }
+#endif
+
 
 #endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2fliphalf/Makefile b/keyboards/lets_split/rev2fliphalf/Makefile
deleted file mode 100644 (file)
index 4e2a6f0..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-ifndef MAKEFILE_INCLUDED
-       include ../../Makefile
-endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2fliphalf/config.h b/keyboards/lets_split/rev2fliphalf/config.h
deleted file mode 100644 (file)
index 1c45cf1..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-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/>.
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#include "config_common.h"
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID       0xFEED
-#define PRODUCT_ID      0x3060
-#define DEVICE_VER      0x0001
-#define MANUFACTURER    Wootpatoot
-#define PRODUCT         Lets Split v2
-#define DESCRIPTION     A split keyboard for the cheap makers
-
-/* key matrix size */
-// Rows are doubled-up
-#define MATRIX_ROWS 8
-#define MATRIX_COLS 6
-
-// wiring of each half
-#define MATRIX_ROW_PINS { D7, E6, B4, B5 }
-//#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
-#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6 } //uncomment this line and comment line above if you need to reverse left-to-right key order
-
-//#define CATERINA_BOOTLOADER
-
-/* COL2ROW or ROW2COL */
-#define DIODE_DIRECTION COL2ROW
-
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-/* number of backlight levels */
-// #define BACKLIGHT_LEVELS 3
-
-/* Set 0 if debouncing isn't needed */
-#define DEBOUNCING_DELAY 5
-
-/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
-#define LOCKING_SUPPORT_ENABLE
-/* Locking resynchronize hack */
-#define LOCKING_RESYNC_ENABLE
-
-/* key combination for command */
-#define IS_COMMAND() ( \
-    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
-)
-
-/* ws2812 RGB LED */
-#define RGB_DI_PIN D3
-#define RGBLIGHT_TIMER
-#define RGBLED_NUM 12    // Number of LEDs
-#define ws2812_PORTREG  PORTD
-#define ws2812_DDRREG   DDRD
-
-/*
- * 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
-
-
-#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2fliphalf/rev2fliphalf.c b/keyboards/lets_split/rev2fliphalf/rev2fliphalf.c
deleted file mode 100644 (file)
index c505d3a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "lets_split.h"
-
-#ifdef AUDIO_ENABLE
-    float tone_startup[][2] = SONG(STARTUP_SOUND);
-    float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
-#endif
-
-void matrix_init_kb(void) {
-
-    #ifdef AUDIO_ENABLE
-        _delay_ms(20); // gets rid of tick
-        PLAY_NOTE_ARRAY(tone_startup, false, 0);
-    #endif
-
-    // // green led on
-    // DDRD |= (1<<5);
-    // PORTD &= ~(1<<5);
-
-    // // orange led on
-    // DDRB |= (1<<0);
-    // PORTB &= ~(1<<0);
-
-       matrix_init_user();
-};
-
-void shutdown_user(void) {
-    #ifdef AUDIO_ENABLE
-        PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
-       _delay_ms(150);
-       stop_all_notes();
-    #endif
-}
diff --git a/keyboards/lets_split/rev2fliphalf/rev2fliphalf.h b/keyboards/lets_split/rev2fliphalf/rev2fliphalf.h
deleted file mode 100644 (file)
index 7dc8e5b..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef REV2FLIPHALF_H
-#define REV2FLIPHALF_H
-
-#include "../lets_split.h"
-
-//void promicro_bootloader_jmp(bool program);
-#include "quantum.h"
-
-//void promicro_bootloader_jmp(bool program);
-
-#define KEYMAP( \
-       k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \
-       k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \
-       k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \
-       k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \
-       ) \
-       { \
-               { k00, k01, k02, k03, k04, k05 }, \
-               { k10, k11, k12, k13, k14, k15 }, \
-               { k20, k21, k22, k23, k24, k25 }, \
-               { k30, k31, k32, k33, k34, k35 }, \
-               { k40, k41, k42, k43, k44, k45 }, \
-               { k50, k51, k52, k53, k54, k55 }, \
-               { k60, k61, k62, k63, k64, k65 }, \
-               { k70, k71, k72, k73, k74, k75 } \
-       }
-
-#endif
\ No newline at end of file
diff --git a/keyboards/lets_split/rev2fliphalf/rules.mk b/keyboards/lets_split/rev2fliphalf/rules.mk
deleted file mode 100644 (file)
index 80a942d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-BACKLIGHT_ENABLE = no
-
-ifndef QUANTUM_DIR
-       include ../../../Makefile
-endif
index 0efa785505a707c0a5138b13e8ef653034ddf7b8..ff159e0f06253a80d61f451b0fc325c74eeb2d8c 100644 (file)
@@ -1,7 +1,8 @@
 SRC += matrix.c \
           i2c.c \
           split_util.c \
-          serial.c
+          serial.c\
+          ssd1306.c
 
 # MCU name
 #MCU = at90usb1287
@@ -73,15 +74,3 @@ USE_I2C ?= yes
 SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 
 CUSTOM_MATRIX = yes
-
-avrdude: build
-       ls /dev/tty* > /tmp/1; \
-       echo "Reset your Pro Micro now"; \
-       while [[ -z $$USB ]]; do \
-         sleep 1; \
-         ls /dev/tty* > /tmp/2; \
-         USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \
-       done; \
-       avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex
-
-.PHONY: avrdude
index 226dc1881631003342c2f0874d968ef352a62908..46586fbc00bb6e7b15ab35eef0440705e0909eb4 100644 (file)
@@ -21,7 +21,7 @@ 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
+    // I2c_MASTER_RIGHT ish deprecate use MASTER_RIGHT instead since this works for both serial and i2c:
     #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT)
       isLeftHand = !has_usb();
     #else
@@ -33,6 +33,9 @@ static void setup_handedness(void) {
 static void keyboard_master_setup(void) {
 #ifdef USE_I2C
     i2c_master_init();
+#ifdef SSD1306OLED
+    matrix_master_OLED_init ();
+#endif
 #else
     serial_master_init();
 #endif
index 6b896679cac466e9dd8957de6035b2828b97e42f..3ae76c209ad7324f3aea4b0d680ce0c417c4c3d8 100644 (file)
@@ -19,4 +19,6 @@ void split_keyboard_setup(void);
 bool has_usb(void);
 void keyboard_slave_loop(void);
 
+void matrix_master_OLED_init (void);
+
 #endif
diff --git a/keyboards/lets_split/ssd1306.c b/keyboards/lets_split/ssd1306.c
new file mode 100644 (file)
index 0000000..3c7816b
--- /dev/null
@@ -0,0 +1,468 @@
+#include "config.h"
+#include "i2c.h"
+#include <stdbool.h>
+#include <string.h>
+#include <stdio.h>
+#include "print.h"
+#include "lets_split.h"
+#include "common/glcdfont.c"
+#ifdef ADAFRUIT_BLE_ENABLE
+#include "adafruit_ble.h"
+#endif
+#ifdef PROTOCOL_LUFA
+#include "lufa.h"
+#endif
+#include "sendchar.h"
+#include "pincontrol.h"
+
+//assign the right code to your layers
+#define _BASE 0
+#define _LOWER 8
+#define _RAISE 16
+#define _FNLAYER 64
+#define _NUMLAY 128
+#define _NLOWER 136
+#define _NFNLAYER 192
+#define _MOUSECURSOR 256
+#define _ADJUST 65560
+
+// Set this to 1 to help diagnose early startup problems
+// when testing power-on with ble.  Turn it off otherwise,
+// as the latency of printing most of the debug info messes
+// with the matrix scan, causing keys to drop.
+#define DEBUG_TO_SCREEN 0
+
+// Controls the SSD1306 128x32 OLED display via i2c
+
+#define i2cAddress 0x3C
+
+#define DisplayHeight 32
+#define DisplayWidth 128
+
+#define FontHeight 8
+#define FontWidth 6
+
+#define MatrixRows (DisplayHeight / FontHeight)
+#define MatrixCols (DisplayWidth / FontWidth)
+
+struct CharacterMatrix {
+  uint8_t display[MatrixRows][MatrixCols];
+  uint8_t *cursor;
+  bool dirty;
+};
+
+static struct CharacterMatrix display;
+//static uint16_t last_battery_update;
+//static uint32_t vbat;
+//#define BatteryUpdateInterval 10000 /* milliseconds */
+#define ScreenOffInterval 300000 /* milliseconds */
+#if DEBUG_TO_SCREEN
+static uint8_t displaying;
+#endif
+static uint16_t last_flush;
+
+enum ssd1306_cmds {
+  DisplayOff = 0xAE,
+  DisplayOn = 0xAF,
+
+  SetContrast = 0x81,
+  DisplayAllOnResume = 0xA4,
+
+  DisplayAllOn = 0xA5,
+  NormalDisplay = 0xA6,
+  InvertDisplay = 0xA7,
+  SetDisplayOffset = 0xD3,
+  SetComPins = 0xda,
+  SetVComDetect = 0xdb,
+  SetDisplayClockDiv = 0xD5,
+  SetPreCharge = 0xd9,
+  SetMultiPlex = 0xa8,
+  SetLowColumn = 0x00,
+  SetHighColumn = 0x10,
+  SetStartLine = 0x40,
+
+  SetMemoryMode = 0x20,
+  ColumnAddr = 0x21,
+  PageAddr = 0x22,
+
+  ComScanInc = 0xc0,
+  ComScanDec = 0xc8,
+  SegRemap = 0xa0,
+  SetChargePump = 0x8d,
+  ExternalVcc = 0x01,
+  SwitchCapVcc = 0x02,
+
+  ActivateScroll = 0x2f,
+  DeActivateScroll = 0x2e,
+  SetVerticalScrollArea = 0xa3,
+  RightHorizontalScroll = 0x26,
+  LeftHorizontalScroll = 0x27,
+  VerticalAndRightHorizontalScroll = 0x29,
+  VerticalAndLeftHorizontalScroll = 0x2a,
+};
+
+
+// Write command sequence.
+// Returns true on success.
+static inline bool _send_cmd1(uint8_t cmd) {
+  bool res = false;
+
+  if (i2c_start_write(i2cAddress)) {
+    xprintf("failed to start write to %d\n", i2cAddress);
+    goto done;
+  }
+
+  if (i2c_master_write(0x0 /* command byte follows */)) {
+    print("failed to write control byte\n");
+
+    goto done;
+  }
+
+  if (i2c_master_write(cmd)) {
+    xprintf("failed to write command %d\n", cmd);
+    goto done;
+  }
+  res = true;
+done:
+  i2c_master_stop();
+  return res;
+}
+
+// Write 2-byte command sequence.
+// Returns true on success
+static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) {
+  if (!_send_cmd1(cmd)) {
+    return false;
+  }
+  return _send_cmd1(opr);
+}
+
+// Write 3-byte command sequence.
+// Returns true on success
+static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) {
+  if (!_send_cmd1(cmd)) {
+    return false;
+  }
+  if (!_send_cmd1(opr1)) {
+    return false;
+  }
+  return _send_cmd1(opr2);
+}
+
+#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;}
+#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;}
+#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;}
+
+static void matrix_clear(struct CharacterMatrix *matrix);
+
+static void clear_display(void) {
+  matrix_clear(&display);
+
+  // Clear all of the display bits (there can be random noise
+  // in the RAM on startup)
+  send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1);
+  send_cmd3(ColumnAddr, 0, DisplayWidth - 1);
+
+  if (i2c_start_write(i2cAddress)) {
+    goto done;
+  }
+  if (i2c_master_write(0x40)) {
+    // Data mode
+    goto done;
+  }
+  for (uint8_t row = 0; row < MatrixRows; ++row) {
+    for (uint8_t col = 0; col < DisplayWidth; ++col) {
+      i2c_master_write(0);
+    }
+  }
+
+  display.dirty = false;
+
+done:
+  i2c_master_stop();
+}
+
+#if DEBUG_TO_SCREEN
+#undef sendchar
+static int8_t capture_sendchar(uint8_t c) {
+  sendchar(c);
+  iota_gfx_write_char(c);
+
+  if (!displaying) {
+    iota_gfx_flush();
+  }
+  return 0;
+}
+#endif
+
+bool iota_gfx_init(void) {
+  bool success = false;
+
+  send_cmd1(DisplayOff);
+  send_cmd2(SetDisplayClockDiv, 0x80);
+  send_cmd2(SetMultiPlex, DisplayHeight - 1);
+
+  send_cmd2(SetDisplayOffset, 0);
+
+
+  send_cmd1(SetStartLine | 0x0);
+  send_cmd2(SetChargePump, 0x14 /* Enable */);
+  send_cmd2(SetMemoryMode, 0 /* horizontal addressing */);
+
+/// Flips the display orientation 0 degrees
+  send_cmd1(SegRemap | 0x1);
+  send_cmd1(ComScanDec);
+/*
+// the following Flip the display orientation 180 degrees
+  send_cmd1(SegRemap);
+  send_cmd1(ComScanInc);
+// end flip */
+  send_cmd2(SetComPins, 0x2);
+  send_cmd2(SetContrast, 0x8f);
+  send_cmd2(SetPreCharge, 0xf1);
+  send_cmd2(SetVComDetect, 0x40);
+  send_cmd1(DisplayAllOnResume);
+  send_cmd1(NormalDisplay);
+  send_cmd1(DeActivateScroll);
+  send_cmd1(DisplayOn);
+
+  send_cmd2(SetContrast, 0); // Dim
+
+  clear_display();
+
+  success = true;
+
+  iota_gfx_flush();
+
+#if DEBUG_TO_SCREEN
+  print_set_sendchar(capture_sendchar);
+#endif
+
+done:
+  return success;
+}
+
+bool iota_gfx_off(void) {
+  bool success = false;
+
+  send_cmd1(DisplayOff);
+  success = true;
+
+done:
+  return success;
+} 
+
+bool iota_gfx_on(void) {
+  bool success = false;
+
+  send_cmd1(DisplayOn);
+  success = true;
+
+done:
+  return success;
+}
+
+static void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
+  *matrix->cursor = c;
+  ++matrix->cursor;
+
+  if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
+    // We went off the end; scroll the display upwards by one line
+    memmove(&matrix->display[0], &matrix->display[1],
+            MatrixCols * (MatrixRows - 1));
+    matrix->cursor = &matrix->display[MatrixRows - 1][0];
+    memset(matrix->cursor, ' ', MatrixCols);
+  }
+}
+
+static void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
+  matrix->dirty = true;
+
+  if (c == '\n') {
+    // Clear to end of line from the cursor and then move to the
+    // start of the next line
+    uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols;
+
+    while (cursor_col++ < MatrixCols) {
+      matrix_write_char_inner(matrix, ' ');
+    }
+    return;
+  }
+
+  matrix_write_char_inner(matrix, c);
+}
+
+void iota_gfx_write_char(uint8_t c) {
+  matrix_write_char(&display, c);
+}
+
+static void matrix_write(struct CharacterMatrix *matrix, const char *data) {
+  const char *end = data + strlen(data);
+  while (data < end) {
+    matrix_write_char(matrix, *data);
+    ++data;
+  }
+}
+
+void iota_gfx_write(const char *data) {
+  matrix_write(&display, data);
+}
+
+static void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
+  while (true) {
+    uint8_t c = pgm_read_byte(data);
+    if (c == 0) {
+      return;
+    }
+    matrix_write_char(matrix, c);
+    ++data;
+  }
+}
+
+void iota_gfx_write_P(const char *data) {
+  matrix_write_P(&display, data);
+}
+
+static void matrix_clear(struct CharacterMatrix *matrix) {
+  memset(matrix->display, ' ', sizeof(matrix->display));
+  matrix->cursor = &matrix->display[0][0];
+  matrix->dirty = true;
+}
+
+void iota_gfx_clear_screen(void) {
+  matrix_clear(&display);
+}
+
+static void matrix_render(struct CharacterMatrix *matrix) {
+  last_flush = timer_read();
+  iota_gfx_on();
+#if DEBUG_TO_SCREEN
+  ++displaying;
+#endif
+
+  // Move to the home position
+  send_cmd3(PageAddr, 0, MatrixRows - 1);
+  send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1);
+
+  if (i2c_start_write(i2cAddress)) {
+    goto done;
+  }
+  if (i2c_master_write(0x40)) {
+    // Data mode
+    goto done;
+  }
+
+  for (uint8_t row = 0; row < MatrixRows; ++row) {
+    for (uint8_t col = 0; col < MatrixCols; ++col) {
+      const uint8_t *glyph = font + (matrix->display[row][col] * (FontWidth - 1));
+
+      for (uint8_t glyphCol = 0; glyphCol < FontWidth - 1; ++glyphCol) {
+        uint8_t colBits = pgm_read_byte(glyph + glyphCol);
+        i2c_master_write(colBits);
+      }
+
+      // 1 column of space between chars (it's not included in the glyph)
+      i2c_master_write(0);
+    }
+  }
+
+  matrix->dirty = false;
+
+done:
+  i2c_master_stop();
+#if DEBUG_TO_SCREEN
+  --displaying;
+#endif
+}
+
+void iota_gfx_flush(void) {
+  matrix_render(&display);
+}
+
+static void matrix_update(struct CharacterMatrix *dest,
+                          const struct CharacterMatrix *source) {
+  if (memcmp(dest->display, source->display, sizeof(dest->display))) {
+    memcpy(dest->display, source->display, sizeof(dest->display));
+    dest->dirty = true;
+  }
+}
+
+static void render_status_info(void) {
+#if DEBUG_TO_SCREEN
+  if (debug_enable) {
+    return;
+  }
+#endif
+
+  struct CharacterMatrix matrix;
+
+  matrix_clear(&matrix);
+  matrix_write_P(&matrix, PSTR("USB: "));
+#ifdef PROTOCOL_LUFA
+  switch (USB_DeviceState) {
+    case DEVICE_STATE_Unattached:
+      matrix_write_P(&matrix, PSTR("Unattached"));
+      break;
+    case DEVICE_STATE_Suspended:
+      matrix_write_P(&matrix, PSTR("Suspended"));
+      break;
+    case DEVICE_STATE_Configured:
+      matrix_write_P(&matrix, PSTR("Connected"));
+      break;
+    case DEVICE_STATE_Powered:
+      matrix_write_P(&matrix, PSTR("Powered"));
+      break;
+    case DEVICE_STATE_Default:
+      matrix_write_P(&matrix, PSTR("Default"));
+      break;
+    case DEVICE_STATE_Addressed:
+      matrix_write_P(&matrix, PSTR("Addressed"));
+      break;
+    default:
+      matrix_write_P(&matrix, PSTR("Invalid"));
+  }
+#endif
+
+// Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
+
+  char buf[40];
+  snprintf(buf,sizeof(buf), "Undef-%ld", layer_state);
+  matrix_write_P(&matrix, PSTR("\n\nLayer: "));
+    switch (layer_state) {
+        case _BASE:
+           matrix_write_P(&matrix, PSTR("Default"));
+           break;
+        case _RAISE:
+           matrix_write_P(&matrix, PSTR("Raise"));
+           break;
+        case _LOWER:
+           matrix_write_P(&matrix, PSTR("Lower"));
+           break;
+        case _ADJUST:
+           matrix_write_P(&matrix, PSTR("ADJUST"));
+           break;
+        default:
+           matrix_write(&matrix, buf);
+ }
+  
+  // Host Keyboard LED Status
+  char led[40];
+    snprintf(led, sizeof(led), "\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" : "    ");
+  matrix_write(&matrix, led);
+  matrix_update(&display, &matrix);
+}
+
+void iota_gfx_task(void) {
+  render_status_info();
+
+  if (display.dirty) {
+    iota_gfx_flush();
+  }
+
+  if (timer_elapsed(last_flush) > ScreenOffInterval) {
+    iota_gfx_off();
+  }
+}