feat: Implement OLED display support and custom icons for 128x32 displays
- Added OLED functionality in keymap.c with custom rendering for layers and modifiers. - Created a Python script to generate simple icons for OLED displays. - Introduced a new rules.mk file to enable OLED features for the keymap. - Developed an OLED font helper script for visualizing and designing custom graphics. - Redesigned OLED layout to fit 128x32 displays, optimizing space for logos and layer indicators. - Implemented flow tap functionality in flow_tap.c for enhanced key responsiveness.
This commit is contained in:
parent
f3afe70c10
commit
ac0b03a50c
15 changed files with 1300 additions and 17 deletions
139
OLED_FIX_README.md
Normal file
139
OLED_FIX_README.md
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
# OLED Display Fix for 128x32 Screens
|
||||
|
||||
## Problem
|
||||
Your OLED code was designed for larger displays (128x64) with 8 rows. Your 128x32 display only has **4 rows × 21 characters**, so the 3-row tall graphics take up most of the screen, leaving no room for useful information.
|
||||
|
||||
## Solution Overview
|
||||
1. **Simplify graphics**: Use 1-row tall icons (single character height) instead of 3-row tall graphics
|
||||
2. **Optimize layout**: Better use of the 4 available rows
|
||||
3. **Update font file**: Replace oversized graphics with compact, readable icons
|
||||
|
||||
## New Layout for 128x32 (4 rows)
|
||||
```
|
||||
Row 1: [Logo] LAYER NAME
|
||||
Row 2: [Icon] W-C-S (modifiers)
|
||||
Row 3: WPM:045
|
||||
Row 4: CAPS SCRL
|
||||
```
|
||||
|
||||
## Files Modified
|
||||
|
||||
### 1. OLED Code (keymap.c)
|
||||
Replace your current OLED functions with the compact version in:
|
||||
- `oled_redesign_128x32.c` (reference implementation)
|
||||
|
||||
Key changes:
|
||||
- **Logo**: 2 characters instead of 15 (3×5 grid)
|
||||
- **Layer indicators**: 2 characters instead of 15 (3×5 grid)
|
||||
- **Modifiers**: 4 single characters (W-A-C-S) instead of multi-char graphics
|
||||
- **Text-based layer names**: More readable than icons
|
||||
- **Efficient spacing**: Uses all 4 rows effectively
|
||||
|
||||
### 2. Font File (glcdfont.c)
|
||||
Update these character positions with simple icons:
|
||||
|
||||
```c
|
||||
// 0x80-0x81: Logo (2 chars)
|
||||
0x3E, 0x41, 0x55, 0x55, 0x41, 0x3E, // 0x80: Keyboard icon
|
||||
0x3E, 0x41, 0x55, 0x55, 0x41, 0x3E, // 0x81: Keyboard icon
|
||||
|
||||
// 0x92-0x93: Default layer (2 chars)
|
||||
0x08, 0x1C, 0x3E, 0x7F, 0x2A, 0x2A, // 0x92: Home icon
|
||||
0x10, 0x38, 0x7C, 0xFE, 0x54, 0x54, // 0x93: Home icon
|
||||
|
||||
// 0x94-0x95: Symbol layer (2 chars)
|
||||
0x24, 0x7F, 0x24, 0x7F, 0x24, 0x00, // 0x94: # symbol
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, // 0x95: $ symbol
|
||||
|
||||
// 0x96-0x97: Navigation layer (2 chars)
|
||||
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x08, // 0x96: Up arrow
|
||||
0x08, 0x08, 0x08, 0x2A, 0x1C, 0x08, // 0x97: Down arrow
|
||||
|
||||
// 0x98-0x9B: Modifier keys (1 char each)
|
||||
0x66, 0x66, 0x00, 0x7E, 0x66, 0x66, // 0x98: GUI/Windows
|
||||
0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, // 0x99: ALT
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, // 0x9A: CTRL
|
||||
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x08, // 0x9B: SHIFT (arrow)
|
||||
```
|
||||
|
||||
## Implementation Steps
|
||||
|
||||
### Step 1: Update keymap.c OLED functions
|
||||
Copy the redesigned functions from `oled_redesign_128x32.c` to your `keymap.c`, replacing these functions:
|
||||
- `render_logo()` → `render_logo_compact()`
|
||||
- `render_logo2()` → (merged into main function)
|
||||
- `render_layer_state()` → `render_layer_name()` + `render_layer_icon()`
|
||||
- `render_mod_status_gui_alt()` → `render_modifiers_compact()`
|
||||
- `render_mod_status_ctrl_shift()` → (merged into modifiers_compact)
|
||||
- `render_status_main()` → `render_status_compact()`
|
||||
- `render_status_secondary()` → (use same compact function)
|
||||
- `oled_task_user()` → Updated version
|
||||
|
||||
### Step 2: Update glcdfont.c
|
||||
1. Find line ~136 where character 0x80 starts
|
||||
2. Replace the hex values for characters 0x80, 0x81, 0x92-0x9B
|
||||
3. Keep all other characters (0x00-0x7F for ASCII text)
|
||||
|
||||
### Step 3: Compile and Test
|
||||
```bash
|
||||
cd qmk_userspace
|
||||
bash build_all.sh
|
||||
```
|
||||
|
||||
### Step 4: Flash to Keyboard
|
||||
Flash the `.uf2` files to both halves of your split keyboard.
|
||||
|
||||
## Customization
|
||||
|
||||
### Design Your Own Icons
|
||||
1. Visit: https://helixfonteditor.netlify.com/
|
||||
2. Each character is **6 pixels wide × 8 pixels tall**
|
||||
3. Export as hex array (6 bytes per character)
|
||||
4. Copy hex values to glcdfont.c
|
||||
|
||||
### Character Format
|
||||
Each character = 6 bytes (one per column):
|
||||
```
|
||||
Byte format (binary): 0bDCBA9876
|
||||
where 0 = top pixel, 7 = bottom pixel
|
||||
|
||||
Example (arrow up):
|
||||
▄ ▄▄▄ ▄ █ ▄ ▄ ▄ ▄
|
||||
█ ███ █ █ █ █ █ █
|
||||
= [0x08, 0x1C, 0x2A, 0x08, 0x08, 0x08]
|
||||
```
|
||||
|
||||
### Alternative: Use Text Instead of Icons
|
||||
If you prefer text-only (no custom graphics):
|
||||
```c
|
||||
// In render_modifiers_compact():
|
||||
if(modifiers & MOD_MASK_GUI) oled_write_P(PSTR("W"), false);
|
||||
if(modifiers & MOD_MASK_ALT) oled_write_P(PSTR("A"), false);
|
||||
if(modifiers & MOD_MASK_CTRL) oled_write_P(PSTR("C"), false);
|
||||
if(modifiers & MOD_MASK_SHIFT) oled_write_P(PSTR("S"), false);
|
||||
```
|
||||
|
||||
## Benefits of This Design
|
||||
|
||||
✅ **Readable**: Text layer names are clearer than multi-row icons
|
||||
✅ **Efficient**: Uses all 4 rows with no wasted space
|
||||
✅ **Informative**: Shows layer, modifiers, WPM, and caps/scroll lock
|
||||
✅ **Compact**: Small icons fit in single row (1 char tall)
|
||||
✅ **Consistent**: Same layout on both keyboard halves
|
||||
✅ **Maintainable**: Simpler code, easier to modify
|
||||
|
||||
## Tools Provided
|
||||
|
||||
1. **oled_font_helper.py**: Visualize current font graphics
|
||||
2. **generate_simple_icons.py**: Generate simple icon hex values
|
||||
3. **oled_redesign_128x32.c**: Complete redesigned OLED code
|
||||
|
||||
## Next Steps
|
||||
|
||||
Would you like me to:
|
||||
1. Apply these changes directly to your keymap.c and glcdfont.c?
|
||||
2. Create a different layout design?
|
||||
3. Design custom icons for specific purposes?
|
||||
4. Keep some of your original graphics but optimize them?
|
||||
|
||||
Let me know how you'd like to proceed!
|
||||
Loading…
Add table
Add a link
Reference in a new issue