Compare commits

..
17 Commits
Author SHA1 Message Date
Jack Humbert 6ed8ce4f59 Merge pull request #1491 from fredizzimo/msys2
Add support for msys2 build environment
2017-07-13 14:24:26 -04:00
ishtob 087af43dee fix implementation issues from SSD1306 clean up, added rotation (#1494)
* moved OLED update task to keymap

* fix splitting render display to keymap

* Added rotation option for OLED, fixed splitting display render update to keymap

* issues with attribute
2017-07-12 12:10:28 -04:00
Fred Sundvik b7d8dec7dc Fix printf error in make output on msys2 2017-07-12 13:04:50 +03:00
Fred Sundvik 7f67abd7d7 Fix bitfield problem when compiling in native mingw 2017-07-11 22:05:01 +03:00
Jack Humbert cc468523df clean up ssd1306 implementation 2017-07-11 14:23:26 -04:00
Fred Sundvik 78545b9509 Fix unreferenced errors with mingw compiler and unit tests 2017-07-11 19:41:04 +03:00
Fred Sundvik 5a25d50168 Add more dependencies, everything can be compiled now 2017-07-11 18:51:52 +03:00
Fred Sundvik 5c3fd67198 Add tools to the path 2017-07-11 17:55:03 +03:00
Fred Sundvik 0d9e7f635e Extract flip 2017-07-11 17:32:58 +03:00
Fred Sundvik 76bd0d3e18 Install arm toolchain 2017-07-11 17:18:24 +03:00
Fred Sundvik b8c363099b Download and extract avr tools 2017-07-11 16:44:46 +03:00
Fred Sundvik b85ce4ce22 Fix overlong lines, and a few spelling errors 2017-07-11 16:26:29 +03:00
Fred Sundvik d47db637ed Use home directory for download on msys2 2017-07-11 16:11:37 +03:00
Fred Sundvik 32fc4da4a7 Install unzip 2017-07-10 18:16:35 +03:00
Fred Sundvik 861087096b Add symlinks only on WSL 2017-07-10 18:05:32 +03:00
Fred Sundvik 7bedf8f4f2 Fix launch of qmk_driver_installer on msys2 2017-07-10 17:51:59 +03:00
Fred Sundvik a2d3fc98b8 Initial structure for shared msys2 and wsl installation 2017-07-10 17:31:58 +03:00
20 changed files with 611 additions and 251 deletions

No files matched your search

+1
View File
@@ -23,6 +23,7 @@ quantum/version.h
CMakeLists.txt CMakeLists.txt
.DS_STORE .DS_STORE
/util/wsl_downloaded /util/wsl_downloaded
/util/win_downloaded
# Eclipse/PyCharm/Other IDE Settings # Eclipse/PyCharm/Other IDE Settings
.cproject .cproject
+22 -166
View File
@@ -1,7 +1,6 @@
#ifdef SSD1306OLED #ifdef SSD1306OLED
#include "ssd1306.h" #include "ssd1306.h"
#include "config.h"
#include "i2c.h" #include "i2c.h"
#include <string.h> #include <string.h>
#include "print.h" #include "print.h"
@@ -13,18 +12,7 @@
#include "lufa.h" #include "lufa.h"
#endif #endif
#include "sendchar.h" #include "sendchar.h"
#include "pincontrol.h" #include "timer.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 // Set this to 1 to help diagnose early startup problems
// when testing power-on with ble. Turn it off otherwise, // when testing power-on with ble. Turn it off otherwise,
@@ -32,26 +20,6 @@
// with the matrix scan, causing keys to drop. // with the matrix scan, causing keys to drop.
#define DEBUG_TO_SCREEN 0 #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 uint16_t last_battery_update;
//static uint32_t vbat; //static uint32_t vbat;
//#define BatteryUpdateInterval 10000 /* milliseconds */ //#define BatteryUpdateInterval 10000 /* milliseconds */
@@ -61,54 +29,13 @@ static uint8_t displaying;
#endif #endif
static uint16_t last_flush; 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. // Write command sequence.
// Returns true on success. // Returns true on success.
static inline bool _send_cmd1(uint8_t cmd) { static inline bool _send_cmd1(uint8_t cmd) {
bool res = false; bool res = false;
if (i2c_start_write(i2cAddress)) { if (i2c_start_write(SSD1306_ADDRESS)) {
xprintf("failed to start write to %d\n", i2cAddress); xprintf("failed to start write to %d\n", SSD1306_ADDRESS);
goto done; goto done;
} }
@@ -153,8 +80,6 @@ static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) {
#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {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;} #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) { static void clear_display(void) {
matrix_clear(&display); matrix_clear(&display);
@@ -163,7 +88,7 @@ static void clear_display(void) {
send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1); send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1);
send_cmd3(ColumnAddr, 0, DisplayWidth - 1); send_cmd3(ColumnAddr, 0, DisplayWidth - 1);
if (i2c_start_write(i2cAddress)) { if (i2c_start_write(SSD1306_ADDRESS)) {
goto done; goto done;
} }
if (i2c_master_write(0x40)) { if (i2c_master_write(0x40)) {
@@ -209,14 +134,17 @@ bool iota_gfx_init(void) {
send_cmd2(SetChargePump, 0x14 /* Enable */); send_cmd2(SetChargePump, 0x14 /* Enable */);
send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); send_cmd2(SetMemoryMode, 0 /* horizontal addressing */);
/// Flips the display orientation 0 degrees #ifdef OLED_ROTATE180
send_cmd1(SegRemap | 0x1);
send_cmd1(ComScanDec);
/*
// the following Flip the display orientation 180 degrees // the following Flip the display orientation 180 degrees
send_cmd1(SegRemap); send_cmd1(SegRemap);
send_cmd1(ComScanInc); send_cmd1(ComScanInc);
// end flip */ #endif
#ifndef OLED_ROTATE180
// Flips the display orientation 0 degrees
send_cmd1(SegRemap | 0x1);
send_cmd1(ComScanDec);
#endif
send_cmd2(SetComPins, 0x2); send_cmd2(SetComPins, 0x2);
send_cmd2(SetContrast, 0x8f); send_cmd2(SetContrast, 0x8f);
send_cmd2(SetPreCharge, 0xf1); send_cmd2(SetPreCharge, 0xf1);
@@ -262,7 +190,7 @@ done:
return success; return success;
} }
static void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) { void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
*matrix->cursor = c; *matrix->cursor = c;
++matrix->cursor; ++matrix->cursor;
@@ -275,7 +203,7 @@ static void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
} }
} }
static void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) { void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
matrix->dirty = true; matrix->dirty = true;
if (c == '\n') { if (c == '\n') {
@@ -296,7 +224,7 @@ void iota_gfx_write_char(uint8_t c) {
matrix_write_char(&display, c); matrix_write_char(&display, c);
} }
static void matrix_write(struct CharacterMatrix *matrix, const char *data) { void matrix_write(struct CharacterMatrix *matrix, const char *data) {
const char *end = data + strlen(data); const char *end = data + strlen(data);
while (data < end) { while (data < end) {
matrix_write_char(matrix, *data); matrix_write_char(matrix, *data);
@@ -308,7 +236,7 @@ void iota_gfx_write(const char *data) {
matrix_write(&display, data); matrix_write(&display, data);
} }
static void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
while (true) { while (true) {
uint8_t c = pgm_read_byte(data); uint8_t c = pgm_read_byte(data);
if (c == 0) { if (c == 0) {
@@ -323,7 +251,7 @@ void iota_gfx_write_P(const char *data) {
matrix_write_P(&display, data); matrix_write_P(&display, data);
} }
static void matrix_clear(struct CharacterMatrix *matrix) { void matrix_clear(struct CharacterMatrix *matrix) {
memset(matrix->display, ' ', sizeof(matrix->display)); memset(matrix->display, ' ', sizeof(matrix->display));
matrix->cursor = &matrix->display[0][0]; matrix->cursor = &matrix->display[0][0];
matrix->dirty = true; matrix->dirty = true;
@@ -333,7 +261,7 @@ void iota_gfx_clear_screen(void) {
matrix_clear(&display); matrix_clear(&display);
} }
static void matrix_render(struct CharacterMatrix *matrix) { void matrix_render(struct CharacterMatrix *matrix) {
last_flush = timer_read(); last_flush = timer_read();
iota_gfx_on(); iota_gfx_on();
#if DEBUG_TO_SCREEN #if DEBUG_TO_SCREEN
@@ -344,7 +272,7 @@ static void matrix_render(struct CharacterMatrix *matrix) {
send_cmd3(PageAddr, 0, MatrixRows - 1); send_cmd3(PageAddr, 0, MatrixRows - 1);
send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1); send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1);
if (i2c_start_write(i2cAddress)) { if (i2c_start_write(SSD1306_ADDRESS)) {
goto done; goto done;
} }
if (i2c_master_write(0x40)) { if (i2c_master_write(0x40)) {
@@ -379,84 +307,12 @@ void iota_gfx_flush(void) {
matrix_render(&display); matrix_render(&display);
} }
static void matrix_update(struct CharacterMatrix *dest, __attribute__ ((weak))
const struct CharacterMatrix *source) { void iota_gfx_task_user(void) {
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) { void iota_gfx_task(void) {
render_status_info(); iota_gfx_task_user();
if (display.dirty) { if (display.dirty) {
iota_gfx_flush(); iota_gfx_flush();
+76
View File
@@ -3,6 +3,71 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include "pincontrol.h"
#include "config.h"
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,
};
// Controls the SSD1306 128x32 OLED display via i2c
#ifndef SSD1306_ADDRESS
#define SSD1306_ADDRESS 0x3C
#endif
#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;
};
struct CharacterMatrix display;
bool iota_gfx_init(void); bool iota_gfx_init(void);
void iota_gfx_task(void); void iota_gfx_task(void);
@@ -14,4 +79,15 @@ void iota_gfx_write(const char *data);
void iota_gfx_write_P(const char *data); void iota_gfx_write_P(const char *data);
void iota_gfx_clear_screen(void); void iota_gfx_clear_screen(void);
void iota_gfx_task_user(void);
void matrix_clear(struct CharacterMatrix *matrix);
void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c);
void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c);
void matrix_write(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix);
#endif #endif
@@ -9,6 +9,7 @@
#define USE_I2C #define USE_I2C
#define SSD1306OLED #define SSD1306OLED
#define OLED_ROTATE180
/* ws2812 RGB LED*/ /* ws2812 RGB LED*/
#define RGB_DI_PIN D4 #define RGB_DI_PIN D4
+88
View File
@@ -406,3 +406,91 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE; return MACRO_NONE;
} }
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;
}
}
//assign the right code to your layers for OLED display
#define L_BASE 0
#define L_LOWER 8
#define L_RAISE 16
#define L_FNLAYER 64
#define L_NUMLAY 128
#define L_NLOWER 136
#define L_NFNLAYER 192
#define L_MOUSECURSOR 256
#define L_ADJUST 65560
void iota_gfx_task_user(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 L_BASE:
matrix_write_P(&matrix, PSTR("Default"));
break;
case L_RAISE:
matrix_write_P(&matrix, PSTR("Raise"));
break;
case L_LOWER:
matrix_write_P(&matrix, PSTR("Lower"));
break;
case L_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);
}
@@ -9,6 +9,7 @@
#define USE_I2C #define USE_I2C
#define SSD1306OLED #define SSD1306OLED
#define OLED_ROTATE180
/* ws2812 RGB LED*/ /* ws2812 RGB LED*/
#define RGB_DI_PIN D4 #define RGB_DI_PIN D4
@@ -416,3 +416,90 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE; return MACRO_NONE;
} }
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;
}
}
//assign the right code to your layers for OLED display
#define L_BASE 0
#define L_LOWER 8
#define L_RAISE 16
#define L_FNLAYER 64
#define L_NUMLAY 128
#define L_NLOWER 136
#define L_NFNLAYER 192
#define L_MOUSECURSOR 256
#define L_ADJUST 65560
void iota_gfx_task_user(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 L_BASE:
matrix_write_P(&matrix, PSTR("Default"));
break;
case L_RAISE:
matrix_write_P(&matrix, PSTR("Raise"));
break;
case L_LOWER:
matrix_write_P(&matrix, PSTR("Lower"));
break;
case L_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);
}
@@ -36,6 +36,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define FLIP_HALF #define FLIP_HALF
#define SSD1306OLED #define SSD1306OLED
//#define OLED_ROTATE180
#define PREVENT_STUCK_MODIFIERS #define PREVENT_STUCK_MODIFIERS
@@ -357,3 +357,91 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE; return MACRO_NONE;
} }
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;
}
}
//assign the right code to your layers for OLED display
#define L_BASE 0
#define L_LOWER 8
#define L_RAISE 16
#define L_FNLAYER 64
#define L_NUMLAY 128
#define L_NLOWER 136
#define L_NFNLAYER 192
#define L_MOUSECURSOR 256
#define L_ADJUST 65560
void iota_gfx_task_user(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 L_BASE:
matrix_write_P(&matrix, PSTR("Default"));
break;
case L_RAISE:
matrix_write_P(&matrix, PSTR("Raise"));
break;
case L_LOWER:
matrix_write_P(&matrix, PSTR("Lower"));
break;
case L_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);
}
+2 -2
View File
@@ -21,8 +21,8 @@ OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n
ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n
WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n
TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' TAB_LOG = printf "\n%s\n\n" "$$LOG" | $(AWK) '{ sub(/^/," | "); print }'
TAB_LOG_PLAIN = printf "$$LOG\n" TAB_LOG_PLAIN = printf "%s\n" "$$LOG"
AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }'
AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }'
PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && $(ON_ERROR) PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && $(ON_ERROR)
-1
View File
@@ -169,7 +169,6 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
} }
// translates key to keycode // translates key to keycode
__attribute__ ((weak))
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{ {
// Read entire word (16bits) // Read entire word (16bits)
+4 -1
View File
@@ -40,4 +40,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
} }
} }
return MACRO_NONE; return MACRO_NONE;
}; };
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
}
+3
View File
@@ -58,3 +58,6 @@ void release_key(uint8_t col, uint8_t row) {
void clear_all_keys(void) { void clear_all_keys(void) {
memset(matrix, 0, sizeof(matrix)); memset(matrix, 0, sizeof(matrix));
} }
void led_set(uint8_t usb_led) {
}
+2 -2
View File
@@ -44,8 +44,8 @@ void TestFixture::run_one_scan_loop() {
advance_time(1); advance_time(1);
} }
void TestFixture::idle_for(uint time) { void TestFixture::idle_for(unsigned time) {
for (uint i=0; i<time; i++) { for (unsigned i=0; i<time; i++) {
run_one_scan_loop(); run_one_scan_loop();
} }
} }
+1 -1
View File
@@ -26,5 +26,5 @@ public:
static void TearDownTestCase(); static void TearDownTestCase();
void run_one_scan_loop(); void run_one_scan_loop();
void idle_for(uint ms); void idle_for(unsigned ms);
}; };
+5
View File
@@ -1,3 +1,5 @@
SYSTEM_TYPE := $(shell gcc -dumpmachine)
CC = gcc CC = gcc
OBJCOPY = OBJCOPY =
OBJDUMP = OBJDUMP =
@@ -14,6 +16,9 @@ COMPILEFLAGS += -funsigned-bitfields
COMPILEFLAGS += -ffunction-sections COMPILEFLAGS += -ffunction-sections
COMPILEFLAGS += -fdata-sections COMPILEFLAGS += -fdata-sections
COMPILEFLAGS += -fshort-enums COMPILEFLAGS += -fshort-enums
ifneq ($(findstring mingw, ${SYSTEM_TYPE}),)
COMPILEFLAGS += -mno-ms-bitfields
endif
CFLAGS += $(COMPILEFLAGS) CFLAGS += $(COMPILEFLAGS)
CFLAGS += -fno-inline-small-functions CFLAGS += -fno-inline-small-functions
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
function export_variables {
local util_dir=~/qmk_utils
export PATH=$PATH:$util_dir/dfu-programmer
export PATH=$PATH:$util_dir/dfu-util-0.9-win64
export PATH=$PATH:$util_dir/flip/bin
export PATH=$PATH:$util_dir/avr8-gnu-toolchain/bin
export PATH=$PATH:$util_dir/gcc-arm-none-eabi/bin
}
export_variables
+117
View File
@@ -0,0 +1,117 @@
#!/bin/bash
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
download_dir=~/qmk_utils
avrtools=avr8-gnu-toolchain
armtools=gcc-arm-none-eabi
installflip=false
echo "Installing dependencies needed for the installation (quazip)"
pacman --needed -S msys/unzip msys/p7zip base-devel msys/git mingw-w64-x86_64-toolchain
source "$dir/win_shared_install.sh"
function install_avr {
rm -f -r "$avrtools"
wget "http://www.atmel.com/images/avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe"
7z x avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe
rm avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe
}
function install_arm {
wget -O gcc-arm-none-eabi.zip "https://developer.arm.com/-/media/Files/downloads/gnu-rm/6-2017q2/gcc-arm-none-eabi-6-2017-q2-update-win32.zip?product=GNU%20ARM%20Embedded%20Toolchain,ZIP,,Windows,6-2017-q2-update"
unzip -d gcc-arm-none-eabi gcc-arm-none-eabi.zip
rm gcc-arm-none-eabi.zip
}
function extract_flip {
rm -f -r flip
7z -oflip x FlipInstaller.exe
}
pushd "$download_dir"
if [ -f "FlipInstaller.exe" ]; then
echo
echo "Extracting flip"
extract_flip
fi
if [ ! -d "$avrtools" ]; then
while true; do
echo
echo "The AVR toolchain is not installed."
echo "This is needed for building AVR based keboards."
read -p "Do you want to install it? (Y/N) " res
case $res in
[Yy]* ) install_avr; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
else
while true; do
echo
echo "The AVR toolchain is already installed"
read -p "Do you want to reinstall? (Y/N) " res
case $res in
[Yy]* ) install_avr; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
fi
if [ ! -d "$armtools" ]; then
while true; do
echo
echo "The ARM toolchain is not installed."
echo "This is needed for building ARM based keboards."
read -p "Do you want to install it? (Y/N) " res
case $res in
[Yy]* ) install_arm; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
else
while true; do
echo
echo "The ARM toolchain is already installed"
read -p "Do you want to reinstall? (Y/N) " res
case $res in
[Yy]* ) install_arm; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
fi
popd
cp -f "$dir/activate_msys2.sh" "$download_dir/"
if grep "^source ~/qmk_utils/activate_msys2.sh$" ~/.bashrc
then
echo
echo "The line source ~/qmk_utils/activate_msys2.sh is already added to your /.bashrc"
echo "Not adding it twice!"
else
while true; do
echo
echo "Do you want to add 'source ~/qmk_utils/activate_msys2.sh' to the end of your"
echo ".bashrc file? Without this make won't find the needed utils, so if you don't"
echo "want to do it automatically, then you have to do it manually later."
read -p "(Y/N)? " res
case $res in
[Yy]* ) echo "source ~/qmk_utils/activate_msys2.sh" >> ~/.bashrc; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
fi
echo
echo "******************************************************************************"
echo "Installation completed!"
echo "Please close this Window and restart MSYS2 MinGW"
echo "******************************************************************************"
+80
View File
@@ -0,0 +1,80 @@
#!/bin/bash
function install_utils {
rm -f -r "$download_dir"
mkdir "$download_dir"
pushd "$download_dir"
echo "Installing dfu-programmer"
wget 'http://downloads.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip'
unzip -d dfu-programmer dfu-programmer-win-0.7.2.zip
echo "Installing dfu-util"
wget 'http://dfu-util.sourceforge.net/releases/dfu-util-0.9-win64.zip'
unzip dfu-util-0.9-win64.zip
echo "Installing teensy_loader_cli"
wget 'https://www.pjrc.com/teensy/teensy_loader_cli_windows.zip'
unzip teensy_loader_cli_windows.zip
echo "Installing Atmel Flip"
wget 'http://www.atmel.com/images/Flip%20Installer%20-%203.4.7.112.exe'
mv Flip\ Installer\ \-\ 3.4.7.112.exe FlipInstaller.exe
echo "Downloading the QMK driver installer"
wget -qO- https://api.github.com/repos/qmk/qmk_driver_installer/releases | grep browser_download_url | head -n 1 | cut -d '"' -f 4 | wget -i -
rm -f *.zip
popd > /dev/null
}
function install_drivers {
pushd "$download_dir"
cp -f "$dir/drivers.txt" .
echo
cmd.exe /c "qmk_driver_installer.exe $1 $2 drivers.txt"
popd > /dev/null
}
pushd "$dir"
if [ ! -d "$download_dir" ]; then
install_utils
else
while true; do
echo
echo "The utils seem to already be downloaded."
read -p "Do you want to re-download them and update to the newest version (Y/N) " res
case $res in
[Yy]* ) install_utils; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
fi
while true; do
echo
echo "Which USB drivers do you want to install?"
echo "(A)all - All supported drivers will be installed"
echo "(C)onnected - Only drivers for connected keyboards (in bootloader/flashing mode)"
echo " will be installed"
echo "(F)force - Like all, but will also override existing drivers for connected"
echo " keyboards"
echo "(N)one - No drivers will be installed,"
echo " flashing your keyboard will most likely not work"
read -p "(A/C/F/N)? " res
case $res in
[Aa]* ) install_drivers --all; break;;
[Cc]* ) install_drivers; break;;
[Ff]* ) install_drivers --all --force; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
popd > /dev/null
+16 -78
View File
@@ -1,44 +1,7 @@
#!/bin/bash #!/bin/bash
download_dir=wsl_downloaded
function install_utils {
rm -f -r $download_dir
mkdir $download_dir
pushd $download_dir
echo "Installing dfu-programmer"
wget 'http://downloads.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip'
unzip -d dfu-programmer dfu-programmer-win-0.7.2.zip
echo "Installing dfu-util"
wget 'http://dfu-util.sourceforge.net/releases/dfu-util-0.9-win64.zip'
unzip dfu-util-0.9-win64.zip
echo "Installing teensy_loader_cli"
wget 'https://www.pjrc.com/teensy/teensy_loader_cli_windows.zip'
unzip teensy_loader_cli_windows.zip
echo "Installing Atmel Flip"
wget 'http://www.atmel.com/images/Flip%20Installer%20-%203.4.7.112.exe'
mv Flip\ Installer\ \-\ 3.4.7.112.exe FlipInstaller.exe
echo "Downloading the QMK driver installer"
wget -qO- https://api.github.com/repos/qmk/qmk_driver_installer/releases | grep browser_download_url | head -n 1 | cut -d '"' -f 4 | wget -i -
rm -f *.zip
popd > /dev/null
}
function install_drivers {
pushd $download_dir
cmd.exe /C qmk_driver_installer.exe $1 $2 ../drivers.txt
popd > /dev/null
}
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
pushd "$dir";
if [[ $dir != /mnt/* ]]; if [[ $dir != /mnt/* ]];
then then
@@ -48,7 +11,6 @@ then
exit 1 exit 1
fi fi
pushd "$dir"
while true; do while true; do
echo echo
@@ -67,49 +29,25 @@ echo "Installing dependencies needed for the installation (unzip, wget)"
echo "This will ask for the sudo password" echo "This will ask for the sudo password"
sudo apt-get install unzip wget sudo apt-get install unzip wget
download_dir=wsl_downloaded
if [ ! -d "$download_dir" ]; then source "$dir/win_shared_install.sh"
install_utils
else
while true; do
echo
read -p "The utils seem to already be downloaded, do you want to re-download them and update to the newest version (Y/N) " res
case $res in
[Yy]* ) install_utils; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
fi
pushd "$download_dir"
while true; do while true; do
echo echo
read -p "Flip need to be installed if you want to use that for programming, do you want to install it now? (Y/N) " res echo "Flip need to be installed if you want to use that for programming."
echo "Please install it to the default location!"
read -p "Do you want to install it now? (Y/N) " res
case $res in case $res in
[Yy]* ) cmd.exe /c $download_dir\\FlipInstaller.exe; break;; [Yy]* ) cmd.exe /c FlipInstaller.exe; break;;
[Nn]* ) break;; [Nn]* ) break;;
* ) echo "Invalid answer";; * ) echo "Invalid answer";;
esac esac
done done
popd
while true; do
echo
echo "Which USB drivers do you want to install?"
echo "(A)all - All supported drivers will be installed"
echo "(C)onnected - Only drivers for connected keyboards (in bootloader/flashing mode) will be installed"
echo "(F)force - Like all, but will also override existing drivers for connected keyboards"
echo "(N)one - No drivers will be installed, flashing your keyboard will most likely not work"
read -p "(A/C/F/N)? " res
case $res in
[Aa]* ) install_drivers --all; break;;
[Cc]* ) install_drivers; break;;
[Ff]* ) install_drivers --all --force; break;;
[Nn]* ) break;;
* ) echo "Invalid answer";;
esac
done
echo echo
echo "Creating a softlink to the utils directory as ~/qmk_utils." echo "Creating a softlink to the utils directory as ~/qmk_utils."
echo "This is needed so that the the make system can find all utils it need." echo "This is needed so that the the make system can find all utils it need."
@@ -124,9 +62,9 @@ then
else else
while true; do while true; do
echo echo
echo "Do you want to add 'source ~/qmk_utils/activate_wsl.sh' to the end of you .bashrc file?" echo "Do you want to add 'source ~/qmk_utils/activate_wsl.sh' to the end of your"
echo "Without this make won't find the needed utils, so if you don't want to do it automatically," echo ".bashrc file? Without this make won't find the needed utils, so if you don't"
echo "then you have to do it manually." echo "want to do it automatically, then you have to do it manually later."
read -p "(Y/N)? " res read -p "(Y/N)? " res
case $res in case $res in
[Yy]* ) echo "source ~/qmk_utils/activate_wsl.sh" >> ~/.bashrc; break;; [Yy]* ) echo "source ~/qmk_utils/activate_wsl.sh" >> ~/.bashrc; break;;
@@ -138,9 +76,10 @@ fi
while true; do while true; do
echo echo
echo "Do you want to add a symlink to the QMK repository in your home directory for convenience?" echo "Do you want to add a symlink to the QMK repository in your home directory for"
echo "This will create a folder 'qmk_firmware' in your home directory." echo "convenience? This will create a folder 'qmk_firmware' in your home directory."
echo "In the future you can use this folder instead of the full path on your windows file system" echo "In the future you can use this folder instead of the full path on your Windows"
echo "file system."
read -p "(Y/N)? " res read -p "(Y/N)? " res
case $res in case $res in
[Yy]* ) ln -sfn "$dir/.." ~/qmk_firmware; break;; [Yy]* ) ln -sfn "$dir/.." ~/qmk_firmware; break;;
@@ -156,4 +95,3 @@ echo "You need to open a new batch command prompt for all the utils to work prop
echo "******************************************************************************" echo "******************************************************************************"
popd > /dev/null popd > /dev/null