mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Add Model-B keyboard (#24681)
* Add Model-B keyboard * PR changes for Model-B * Update to OLED on Model-B * added license to pass lint check * update virtual eeprom for Model-B * eeconfig_read_kb() update on Model-B * cleanup changes for Model B * implementing Model B suggestions
This commit is contained in:
		
							parent
							
								
									163b894b97
								
							
						
					
					
						commit
						5650894c20
					
				
							
								
								
									
										32
									
								
								keyboards/trojan_pinata/model_b/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								keyboards/trojan_pinata/model_b/readme.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| # Model-B | ||||
| 
 | ||||
| A 75% keyboard based on the RP2040. | ||||
| 
 | ||||
| * Keyboard Maintainer: [Brian Hill](https://github.com/TrojanPinata) | ||||
| * Hardware Supported: [GitHub](https://github.com/TrojanPinata/Model-B) | ||||
| 
 | ||||
| ## Revisions | ||||
| 
 | ||||
| At the current moment there is only one variant of the Model-B, the rev-0 (aka the prototype board). Any others are clones and may not have the exact firmware requirements. | ||||
| 
 | ||||
| ## Building and Flashing | ||||
| 
 | ||||
| Make example for this keyboard (after setting up your build environment): | ||||
| 
 | ||||
|     make trojan_pinata/model-b/rev0:default | ||||
|      | ||||
| Flashing example for this keyboard: | ||||
| 
 | ||||
|     make trojan_pinata/model-b/rev0:default:flash | ||||
| 
 | ||||
| See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). | ||||
| 
 | ||||
| ## Bootloader | ||||
| 
 | ||||
| Enter the bootloader in 3 ways: | ||||
| 
 | ||||
| * **Bootmagic reset**: Hold down the top left key and plug in the keyboard. This will also clear the emulated EEPROM, so it is a good first step if the keyboard is misbehaving. | ||||
| * **Physical reset button**: Hold down the `BOOTSEL` button on the Pi Pico, then either plug the board in or press the `RESET` button. | ||||
| * **Keycode in layout**: Press the key mapped to `QK_BOOT`. In the pre-supplied keymaps it is on the second layer, replacing the Esc key. | ||||
| 
 | ||||
| After entering the bootloader through one of the three methods above, the keyboard will appear as a USB mass storage device named `RPI-RP2`. If the CLI is unable to find this device, the compiled `.uf2` file can be manually copied to it. The keyboard will reboot on completion with the new firmware loaded. | ||||
							
								
								
									
										14
									
								
								keyboards/trojan_pinata/model_b/rev0/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								keyboards/trojan_pinata/model_b/rev0/config.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| // Copyright 2022 Stefan Kerkmann
 | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET | ||||
| #define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U | ||||
| 
 | ||||
| // settings for the oled keyboard demo with Adafruit 0.91" OLED display on the Stemma QT port
 | ||||
| #define I2C_DRIVER I2CD0 | ||||
| #define I2C1_SDA_PIN GP0 | ||||
| #define I2C1_SCL_PIN GP1 | ||||
| 
 | ||||
| #define OLED_TIMEOUT 3000000 // 5 minutes before oled turns off
 | ||||
							
								
								
									
										122
									
								
								keyboards/trojan_pinata/model_b/rev0/keyboard.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								keyboards/trojan_pinata/model_b/rev0/keyboard.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| { | ||||
|     "manufacturer": "Trojan_Pinata", | ||||
|     "keyboard_name": "Model-B", | ||||
|     "maintainer": "Trojan_Pinata", | ||||
|     "bootloader": "rp2040", | ||||
|     "diode_direction": "COL2ROW", | ||||
|     "encoder": { | ||||
|         "rotary": [ | ||||
|             {"pin_a": "GP27", "pin_b": "GP26"} | ||||
|         ] | ||||
|     }, | ||||
|     "features": { | ||||
|         "bootmagic": true, | ||||
|         "command": false, | ||||
|         "console": false, | ||||
|         "extrakey": true, | ||||
|         "mousekey": true, | ||||
|         "nkro": true, | ||||
|         "oled": true, | ||||
|         "encoder": true | ||||
|     }, | ||||
|     "matrix_pins": { | ||||
|         "cols": ["GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP14", "GP15", "GP16", "GP17", "GP18", "GP19", "GP20", "GP21", "GP22"], | ||||
|         "rows": ["GP2", "GP3", "GP4", "GP5", "GP6", "GP7"] | ||||
|     }, | ||||
|     "processor": "RP2040", | ||||
|     "url": "https://github.com/TrojanPinata/Model-B", | ||||
|     "usb": { | ||||
|         "device_version": "1.0.0", | ||||
|         "pid": "0xA500", | ||||
|         "vid": "0xE739" | ||||
|     }, | ||||
|     "layouts": { | ||||
|         "LAYOUT": { | ||||
|             "layout": [ | ||||
|                 {"matrix": [0, 0], "x": 0, "y": 0}, | ||||
|                 {"matrix": [0, 2], "x": 1.25, "y": 0}, | ||||
|                 {"matrix": [0, 3], "x": 2.25, "y": 0}, | ||||
|                 {"matrix": [0, 4], "x": 3.25, "y": 0}, | ||||
|                 {"matrix": [0, 5], "x": 4.25, "y": 0}, | ||||
|                 {"matrix": [0, 6], "x": 5.5, "y": 0}, | ||||
|                 {"matrix": [0, 7], "x": 6.5, "y": 0}, | ||||
|                 {"matrix": [0, 8], "x": 7.5, "y": 0}, | ||||
|                 {"matrix": [0, 9], "x": 8.5, "y": 0}, | ||||
|                 {"matrix": [0, 10], "x": 9.75, "y": 0}, | ||||
|                 {"matrix": [0, 11], "x": 10.75, "y": 0}, | ||||
|                 {"matrix": [0, 12], "x": 11.75, "y": 0}, | ||||
|                 {"matrix": [0, 13], "x": 12.75, "y": 0}, | ||||
|                 {"matrix": [0, 14], "x": 15.75, "y": 0}, | ||||
|                 {"matrix": [1, 0], "x": 0, "y": 1.5}, | ||||
|                 {"matrix": [1, 1], "x": 1, "y": 1.5}, | ||||
|                 {"matrix": [1, 2], "x": 2, "y": 1.5}, | ||||
|                 {"matrix": [1, 3], "x": 3, "y": 1.5}, | ||||
|                 {"matrix": [1, 4], "x": 4, "y": 1.5}, | ||||
|                 {"matrix": [1, 5], "x": 5, "y": 1.5}, | ||||
|                 {"matrix": [1, 6], "x": 6, "y": 1.5}, | ||||
|                 {"matrix": [1, 7], "x": 7, "y": 1.5}, | ||||
|                 {"matrix": [1, 8], "x": 8, "y": 1.5}, | ||||
|                 {"matrix": [1, 9], "x": 9, "y": 1.5}, | ||||
|                 {"matrix": [1, 10], "x": 10, "y": 1.5}, | ||||
|                 {"matrix": [1, 11], "x": 11, "y": 1.5}, | ||||
|                 {"matrix": [1, 12], "x": 12, "y": 1.5}, | ||||
|                 {"matrix": [1, 13], "x": 13, "y": 1.5, "w": 2}, | ||||
|                 {"matrix": [1, 14], "x": 15.25, "y": 1.5}, | ||||
|                 {"matrix": [2, 0], "x": 0, "y": 2.5, "w": 1.5}, | ||||
|                 {"matrix": [2, 1], "x": 1.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 2], "x": 2.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 3], "x": 3.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 4], "x": 4.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 5], "x": 5.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 6], "x": 6.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 7], "x": 7.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 8], "x": 8.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 9], "x": 9.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 10], "x": 10.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 11], "x": 11.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 12], "x": 12.5, "y": 2.5}, | ||||
|                 {"matrix": [2, 13], "x": 13.5, "y": 2.5, "w": 1.5}, | ||||
|                 {"matrix": [2, 14], "x": 15.25, "y": 2.5}, | ||||
|                 {"matrix": [3, 0], "x": 0, "y": 3.5, "w": 1.75}, | ||||
|                 {"matrix": [3, 1], "x": 1.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 2], "x": 2.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 3], "x": 3.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 4], "x": 4.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 5], "x": 5.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 6], "x": 6.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 7], "x": 7.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 8], "x": 8.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 9], "x": 9.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 10], "x": 10.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 11], "x": 11.75, "y": 3.5}, | ||||
|                 {"matrix": [3, 12], "x": 14, "y": 0}, | ||||
|                 {"matrix": [3, 13], "x": 12.75, "y": 3.5, "w": 2.25}, | ||||
|                 {"matrix": [3, 14], "x": 16.25, "y": 1.5}, | ||||
|                 {"matrix": [4, 0], "x": 0, "y": 4.5, "w": 2.25}, | ||||
|                 {"matrix": [4, 1], "x": 2.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 2], "x": 3.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 3], "x": 4.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 4], "x": 5.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 5], "x": 6.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 6], "x": 7.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 7], "x": 8.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 8], "x": 9.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 9], "x": 10.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 10], "x": 11.25, "y": 4.5}, | ||||
|                 {"matrix": [4, 12], "x": 12.25, "y": 4.5, "w": 1.75}, | ||||
|                 {"matrix": [4, 13], "x": 14.3, "y": 4.6}, | ||||
|                 {"matrix": [4, 14], "x": 16.25, "y": 2.5}, | ||||
|                 {"matrix": [5, 0], "x": 0, "y": 5.5, "w": 1.25}, | ||||
|                 {"matrix": [5, 1], "x": 1.25, "y": 5.5, "w": 1.25}, | ||||
|                 {"matrix": [5, 2], "x": 2.5, "y": 5.5, "w": 1.25}, | ||||
|                 {"matrix": [5, 6], "x": 3.75, "y": 5.5, "w": 6.25}, | ||||
|                 {"matrix": [5, 9], "x": 10, "y": 5.5}, | ||||
|                 {"matrix": [5, 10], "x": 11, "y": 5.5}, | ||||
|                 {"matrix": [5, 11], "x": 12, "y": 5.5}, | ||||
|                 {"matrix": [5, 12], "x": 13.3, "y": 5.6}, | ||||
|                 {"matrix": [5, 13], "x": 14.3, "y": 5.6}, | ||||
|                 {"matrix": [5, 14], "x": 15.3, "y": 5.6} | ||||
|             ] | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,47 @@ | ||||
| /* Copyright 2024 Brian H (@Trojan_Pinata)
 | ||||
|  * | ||||
|  * 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/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #include QMK_KEYBOARD_H | ||||
| 
 | ||||
| // keymaps
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
|     [0] = LAYOUT( | ||||
|         KC_ESC,           KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_MUTE, | ||||
| 
 | ||||
|         KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_DEL, | ||||
|         KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_INS, | ||||
|         KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, QK_KB,   KC_ENT,  KC_HOME, | ||||
|         KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END, | ||||
|         KC_LCTL, KC_LWIN, KC_LALT,                            KC_SPC,                    KC_RALT, MO(1),   KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT | ||||
|     ), | ||||
|     [1] = LAYOUT( | ||||
|         QK_BOOT,          KC_F13,   KC_F14, KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20,  KC_F21,  KC_F22,  KC_F23,  KC_F24,  KC_MUTE, | ||||
| 
 | ||||
|         EE_CLR,  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, | ||||
|         DB_TOGG, _______, _______, KC_MYCM, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, | ||||
|         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, | ||||
|         _______, _______, _______, _______, KC_CALC, _______, _______, _______, _______, _______, _______,          _______, _______, KC_MNXT, | ||||
|         _______, _______, _______,                            _______,                   _______, _______, _______, KC_EXEC, _______, _______ | ||||
|     ) | ||||
| }; | ||||
| 
 | ||||
| // encoder handling
 | ||||
| #if defined(ENCODER_MAP_ENABLE) | ||||
| const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { | ||||
|     [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, | ||||
|     [1] = { ENCODER_CCW_CW(_______, _______) }, | ||||
| }; | ||||
| #endif | ||||
							
								
								
									
										24
									
								
								keyboards/trojan_pinata/model_b/rev0/mcuconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								keyboards/trojan_pinata/model_b/rev0/mcuconf.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| /* Copyright 2020 QMK
 | ||||
|  * | ||||
|  * 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/>.
 | ||||
|  */ | ||||
| #pragma once | ||||
| 
 | ||||
| #include_next <mcuconf.h> | ||||
| 
 | ||||
| #undef RP_I2C_USE_I2C0 | ||||
| #define RP_I2C_USE_I2C0 TRUE | ||||
| 
 | ||||
| #undef RP_I2C_USE_I2C1 | ||||
| #define RP_I2C_USE_I2C1 TRUE | ||||
							
								
								
									
										397
									
								
								keyboards/trojan_pinata/model_b/rev0/rev0.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								keyboards/trojan_pinata/model_b/rev0/rev0.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,397 @@ | ||||
| /* Copyright 2024 Brian H (@Trojan_Pinata)
 | ||||
|  * | ||||
|  * 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/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #include "rev0.h" | ||||
| 
 | ||||
| // NUM_MODES stays last to indicate the number of different screens possible
 | ||||
| enum oled_modes { | ||||
|     MTNS, INFO, LOGO, MEW, CEL, RAY, NUM_MODES | ||||
| }; | ||||
| 
 | ||||
| // define the key that switches the display
 | ||||
| enum keeb_codes { | ||||
|     OLED_MOD = QK_KB, | ||||
| }; | ||||
| 
 | ||||
| // virtual eeprom for storing last layer
 | ||||
| typedef union { | ||||
|     uint32_t raw; | ||||
|     struct { | ||||
|         uint8_t display_mode_saved : 3; | ||||
|     }; | ||||
| } keyboard_config_t; | ||||
| keyboard_config_t keyboard_config; | ||||
| 
 | ||||
| void keyboard_pre_init_kb(void) { | ||||
|     keyboard_config.raw = eeconfig_read_kb(); | ||||
|     keyboard_pre_init_user(); | ||||
| } | ||||
| 
 | ||||
| void eeconfig_init_kb(void) { | ||||
|     keyboard_config.raw = 0; | ||||
|     keyboard_config.display_mode_saved = INFO; | ||||
|     eeconfig_update_kb(keyboard_config.raw); | ||||
|     eeconfig_init_user(); | ||||
| } | ||||
| 
 | ||||
| // oled stuff below
 | ||||
| #ifdef OLED_ENABLE | ||||
| 
 | ||||
| // hold only let me just drop all of my embedded images rq
 | ||||
| static const char PROGMEM bootscreen[] = { | ||||
|     // 'modelb-oled', 128x32px
 | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, | ||||
|     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, | ||||
|     0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, | ||||
|     0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x7f, 0xfe, | ||||
|     0xf0, 0x80, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xfe, 0x3f, 0x07, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, | ||||
|     0xf0, 0xfc, 0xfe, 0x3f, 0x0f, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, 0x1f, | ||||
|     0x3f, 0xfe, 0xfc, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, | ||||
|     0x0f, 0x1f, 0xfe, 0xfc, 0xf8, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, | ||||
|     0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe1, | ||||
|     0xe1, 0xe1, 0xe3, 0xff, 0xff, 0xbf, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x03, | ||||
|     0x1f, 0x7f, 0xfc, 0xf0, 0xfe, 0x7f, 0x0f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, | ||||
|     0x07, 0x1f, 0x3f, 0x7e, 0xf8, 0xf0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0x7c, | ||||
|     0x7f, 0x3f, 0x1f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, | ||||
|     0xf8, 0x7c, 0x3f, 0x1f, 0x07, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, | ||||
|     0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, | ||||
|     0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, | ||||
|     0xc1, 0xc1, 0xc1, 0xe1, 0xff, 0xff, 0x7f, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, | ||||
|     0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, | ||||
|     0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||
| }; | ||||
| 
 | ||||
| static const char PROGMEM mnts_l0[] = { | ||||
|     // 'base', 128x32px
 | ||||
|     0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0xa0, 0xb0, 0xf0, 0xd0, 0xd0, 0xf8, 0xfc, 0xdc, 0xfe, | ||||
|     0xff, 0xff, 0xff, 0xdf, 0xde, 0xde, 0x9c, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0x90, 0xa0, 0x40, | ||||
|     0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, | ||||
|     0x40, 0x40, 0x20, 0x20, 0x20, 0x90, 0xd0, 0xd0, 0xc8, 0xe8, 0xec, 0xe4, 0xfc, 0xfa, 0xfa, 0xfa, | ||||
|     0xf4, 0xe4, 0xe4, 0xc8, 0xc8, 0xd8, 0x90, 0x90, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x80, 0x80, 0xc0, 0x60, 0x30, 0x10, 0x00, 0x40, 0x60, | ||||
|     0x30, 0x10, 0xf8, 0x0c, 0x06, 0x02, 0x00, 0x10, 0x08, 0x18, 0x3f, 0xe8, 0x08, 0x24, 0x3c, 0x0c, | ||||
|     0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x04, 0xfe, 0x00, 0x00, | ||||
|     0xb9, 0x3d, 0x3d, 0x7c, 0x3e, 0x3f, 0x3f, 0x1d, 0x0d, 0x0f, 0x0b, 0x1f, 0x1f, 0x1f, 0x1f, 0x0b, | ||||
|     0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x05, 0x07, 0x0f, 0x0b, 0x0b, 0x13, 0x13, 0x37, 0x7f, 0xf7, | ||||
|     0xf7, 0xf8, 0xf0, 0xf8, 0xf8, 0xf1, 0xe1, 0xf3, 0x12, 0xd2, 0xd1, 0xd1, 0x11, 0x00, 0xc0, 0xc0, | ||||
|     0xe0, 0xf0, 0x78, 0x78, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0x1f, | ||||
|     0x0f, 0x0f, 0x0f, 0x1f, 0x1f, 0x1f, 0x0f, 0x1f, 0x1e, 0x1e, 0x1f, 0x1c, 0x39, 0x39, 0x3a, 0x3c, | ||||
|     0x79, 0x79, 0xf2, 0xe2, 0xe4, 0xe5, 0x85, 0x49, 0x48, 0x08, 0xd0, 0xd0, 0x90, 0x20, 0x20, 0x40, | ||||
|     0x40, 0x40, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, | ||||
|     0x0b, 0x0f, 0x0f, 0x1f, 0x2f, 0x7c, 0x7c, 0xf8, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x0f, 0x0f, 0x0f, | ||||
|     0x07, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7e, 0x7f, 0xff, 0x78, 0xf8, 0xe0, | ||||
|     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x07, 0x07, 0x07, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x06, | ||||
|     0x0e, 0x0e, 0x0c, 0x0c, 0x00, 0x03, 0x47, 0x46, 0xc6, 0x8c, 0x8c, 0x0c, 0x18, 0x30, 0x63, 0x4c, | ||||
|     0x50, 0xcc, 0x83, 0x00, 0x00, 0x12, 0x1f, 0x10, 0x00, 0x10, 0x00, 0x0e, 0x15, 0x13, 0x0e, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x60, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, | ||||
|     0x70, 0x70, 0x30, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1c, 0x1c, 0x07, 0x0f, 0x1f, | ||||
|     0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x18, 0x10, 0x30, 0x30, | ||||
|     0x30, 0x30, 0x38, 0x38, 0x7c, 0x3c, 0x3c, 0x3c, 0x7c, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, | ||||
|     0x60, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x80, 0x40, 0x60, | ||||
|     0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x60, 0x20, 0x60, 0x60, 0x60, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x01, 0x01, 0x03, 0x02, 0x06, 0x06, 0x0c, 0x08, 0x08, 0x10, 0x30, 0x20, 0x20, 0x60 | ||||
| }; | ||||
| 
 | ||||
| static const char PROGMEM mnts_l1[] = { | ||||
|     // 'alt', 128x32px
 | ||||
|     0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0xa0, 0xb0, 0xf0, 0xd0, 0xd0, 0xf8, 0xfc, 0xdc, 0xfe, | ||||
|     0xff, 0xff, 0xff, 0xdf, 0xde, 0xde, 0x9c, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0x90, 0xa0, 0x40, | ||||
|     0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, | ||||
|     0x40, 0x40, 0x20, 0x20, 0x20, 0x90, 0xd0, 0xd0, 0xc8, 0xe8, 0xec, 0xe4, 0xfc, 0xfa, 0xfa, 0xfa, | ||||
|     0xf4, 0xe4, 0xe4, 0xc8, 0xc8, 0xd8, 0x90, 0x90, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x80, 0x80, 0xc0, 0x60, 0x30, 0x10, 0x00, 0x40, 0x60, | ||||
|     0x30, 0x10, 0xf8, 0x0c, 0x06, 0x02, 0x00, 0x10, 0x08, 0x18, 0x3f, 0xe8, 0x08, 0x24, 0x3c, 0x0c, | ||||
|     0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x04, 0x82, 0x42, 0x22, 0x1c, 0x00, | ||||
|     0xb9, 0x3d, 0x3d, 0x7c, 0x3e, 0x3f, 0x3f, 0x1d, 0x0d, 0x0f, 0x0b, 0x1f, 0x1f, 0x1f, 0x1f, 0x0b, | ||||
|     0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x05, 0x07, 0x0f, 0x0b, 0x0b, 0x13, 0x13, 0x37, 0x7f, 0xf7, | ||||
|     0xf7, 0xf8, 0xf0, 0xf8, 0xf8, 0xf1, 0xe1, 0xf3, 0x12, 0xd2, 0xd1, 0xd1, 0x11, 0x00, 0xc0, 0xc0, | ||||
|     0xe0, 0xf0, 0x78, 0x78, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0x1f, | ||||
|     0x0f, 0x0f, 0x0f, 0x1f, 0x1f, 0x1f, 0x0f, 0x1f, 0x1e, 0x1e, 0x1f, 0x1c, 0x39, 0x39, 0x3a, 0x3c, | ||||
|     0x79, 0x79, 0xf2, 0xe2, 0xe4, 0xe5, 0x85, 0x49, 0x48, 0x08, 0xd0, 0xd0, 0x90, 0x20, 0x20, 0x40, | ||||
|     0x40, 0x40, 0xc1, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x02, 0x02, 0x02, 0x00, | ||||
|     0x0b, 0x0f, 0x0f, 0x1f, 0x2f, 0x7c, 0x7c, 0xf8, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x0f, 0x0f, 0x0f, | ||||
|     0x07, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x7e, 0x7f, 0xff, 0x78, 0xf8, 0xe0, | ||||
|     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x0f, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x07, 0x07, 0x07, 0x03, 0x00, 0x03, 0x03, 0x03, 0x03, 0x06, | ||||
|     0x0e, 0x0e, 0x0c, 0x0c, 0x00, 0x03, 0x47, 0x46, 0xc6, 0x8c, 0x8c, 0x0c, 0x18, 0x30, 0x63, 0x4c, | ||||
|     0x50, 0xcc, 0x83, 0x00, 0x00, 0x12, 0x1f, 0x10, 0x00, 0x10, 0x00, 0x0e, 0x15, 0x13, 0x0e, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x60, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, | ||||
|     0x70, 0x70, 0x30, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1c, 0x1c, 0x07, 0x0f, 0x1f, | ||||
|     0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x18, 0x10, 0x30, 0x30, | ||||
|     0x30, 0x30, 0x38, 0x38, 0x7c, 0x3c, 0x3c, 0x3c, 0x7c, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0x60, | ||||
|     0x60, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf0, 0xe0, 0x80, 0x80, 0x40, 0x60, | ||||
|     0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x60, 0x20, 0x60, 0x60, 0x60, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x01, 0x01, 0x03, 0x02, 0x06, 0x06, 0x0c, 0x08, 0x08, 0x10, 0x30, 0x20, 0x20, 0x60 | ||||
| }; | ||||
| 
 | ||||
| static const char PROGMEM mew_disp[] = { | ||||
|     // 'mewl2', 128x32px
 | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, | ||||
|     0x60, 0x50, 0x10, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x08, | ||||
|     0x04, 0xc4, 0xf2, 0xfa, 0x7e, 0x3e, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0xa0, 0x20, 0x00, 0x10, | ||||
|     0x10, 0x10, 0x10, 0x0c, 0x02, 0x22, 0x42, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x34, 0xf2, 0xf2, 0xc2, 0x01, 0x00, 0xc0, 0xa0, 0xe0, 0x28, | ||||
|     0x50, 0x00, 0x00, 0x00, 0x01, 0x1a, 0xf8, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x70, 0xe0, | ||||
|     0xff, 0xff, 0xc7, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0x78, 0x78, 0x3c, 0x3c, 0x1c, 0x1c, 0x3c, 0x38, | ||||
|     0x78, 0xf0, 0xe0, 0xc0, 0x00, 0x01, 0x06, 0x08, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x41, 0xc0, 0x80, | ||||
|     0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x61, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0c, 0x8c, 0xd9, 0x7b, 0x53, 0x10, | ||||
|     0x08, 0x18, 0x38, 0x3c, 0x36, 0x2f, 0x6b, 0x75, 0x92, 0xee, 0x18, 0xe4, 0xfc, 0x78, 0x00, 0xc1, | ||||
|     0xb7, 0xcf, 0xf3, 0xfc, 0xfd, 0xef, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfe, 0xf9, | ||||
|     0xf0, 0xf9, 0xff, 0x7f, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x90, | ||||
|     0x08, 0x09, 0x9f, 0xff, 0xff, 0xf8, 0x00, 0x38, 0xc6, 0x81, 0x8e, 0x70, 0x50, 0x50, 0x53, 0xe2, | ||||
|     0x83, 0x01, 0x62, 0xab, 0xa8, 0xa8, 0x50, 0x54, 0x50, 0x89, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0e, 0x0d, 0x0c, 0x04, 0x06, 0x1e, 0x6e, | ||||
|     0x80, 0x00, 0x00, 0x38, 0x08, 0x84, 0xc4, 0xfe, 0x07, 0xf8, 0xff, 0xff, 0xff, 0x7f, 0x3e, 0x7f, | ||||
|     0x7f, 0x3f, 0x0f, 0x01, 0x83, 0x7c, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | ||||
|     0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xc8, 0x84, 0x86, 0xcf, | ||||
|     0xb7, 0x81, 0x80, 0x41, 0x43, 0x8c, 0x92, 0xe1, 0x61, 0x53, 0x2e, 0x11, 0x11, 0x19, 0x2c, 0xd0, | ||||
|     0x20, 0x41, 0x40, 0x40, 0x24, 0x30, 0x20, 0x20, 0xf0, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||
| }; | ||||
| 
 | ||||
| static const char PROGMEM cel_disp[] = { | ||||
|     // 'celebi1', 128x32px
 | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, | ||||
|     0x20, 0xc0, 0xe0, 0xe0, 0xf0, 0xdc, 0xee, 0xf0, 0xbe, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x60, 0xc0, 0x81, 0x80, 0x80, 0xc0, | ||||
|     0xc0, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x80, 0xc0, 0xc0, 0xc0, | ||||
|     0x60, 0xb0, 0xcc, 0xf0, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xc0, 0xf8, 0xfc, 0xfc, 0xfb, | ||||
|     0xf4, 0xff, 0xff, 0x7f, 0x1f, 0xcf, 0x67, 0xe3, 0xc7, 0x0f, 0x9f, 0xff, 0x3e, 0xc0, 0xf0, 0x78, | ||||
|     0x90, 0xe0, 0xf2, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x3f, | ||||
|     0x3f, 0x3b, 0x3e, 0x79, 0xfe, 0xfe, 0xff, 0xfe, 0x7c, 0xfc, 0xf8, 0xd8, 0xf0, 0xf0, 0xb0, 0xa0, | ||||
|     0xa0, 0xa0, 0xe0, 0xe0, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x0e, 0x31, 0x40, 0xf0, 0xf8, 0xfc, 0xfe, 0xf0, 0xff, 0xf0, 0xff, 0x7f, 0x3f, 0xbf, 0x9f, | ||||
|     0x9f, 0x1f, 0x3f, 0xfe, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0x87, 0x8f, 0x9f, | ||||
|     0x9f, 0x9f, 0xc7, 0xcc, 0xd8, 0xd8, 0x98, 0x3c, 0xfc, 0xf7, 0xfb, 0x1c, 0x1d, 0x1e, 0x1e, 0x1f, | ||||
|     0x0f, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x87, 0xcf, 0x6d, 0xf8, 0x72, 0xf4, | ||||
|     0xf4, 0x90, 0x20, 0x20, 0xa7, 0x6f, 0x6f, 0x6b, 0x0b, 0x06, 0x06, 0x05, 0x05, 0x01, 0x01, 0x01, | ||||
|     0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, | ||||
|     0xc0, 0xc0, 0xc0, 0xc0, 0x83, 0x8f, 0x9f, 0x3f, 0x7f, 0x5f, 0xff, 0x71, 0xe0, 0xe1, 0x60, 0x62, | ||||
|     0x27, 0x30, 0x18, 0x9f, 0xcf, 0xc3, 0xc0, 0xc0, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, | ||||
|     0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x40, 0xe0, 0xe0, 0xc8, 0x9c, 0xf8, 0x60, 0x28, 0x3c, 0x7e, 0x7e, 0xfe, 0xff, 0xfc, 0xe1, | ||||
|     0x07, 0x1f, 0x3f, 0x3e, 0x7d, 0x7b, 0x73, 0x72, 0xe2, 0xe0, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, | ||||
|     0x01, 0x01, 0xc1, 0xc1, 0x03, 0x03, 0x03, 0x23, 0x01, 0x0d, 0x06, 0x07, 0x37, 0x33, 0x01, 0x01, | ||||
|     0x07, 0x0e, 0x3c, 0x39, 0x79, 0x71, 0x71, 0x60, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||
| }; | ||||
| 
 | ||||
| static const char PROGMEM rayq_disp[] = { | ||||
|     // 'rayquaza1', 128x32px
 | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, | ||||
|     0x10, 0x20, 0x20, 0x40, 0x40, 0x40, 0x70, 0x70, 0x71, 0x50, 0x60, 0x60, 0x60, 0x40, 0x80, 0x80, | ||||
|     0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc0, 0x80, 0x00, 0xc0, 0x60, 0x00, 0x00, 0x80, | ||||
|     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xc0, 0xc0, | ||||
|     0xe0, 0x60, 0x70, 0x70, 0x7b, 0x7b, 0xfb, 0xfb, 0xf8, 0xb0, 0xb0, 0xd0, 0x60, 0x30, 0x10, 0x08, | ||||
|     0x0c, 0x84, 0x86, 0x83, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x30, 0x1c, 0x02, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x11, 0x12, 0x10, 0x10, 0x0e, 0x0e, 0x0c, 0x0c, 0x07, | ||||
|     0x07, 0x0f, 0x0f, 0x03, 0x06, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9f, 0xf3, 0x3e, 0xe7, 0xfc, 0x7f, 0x3f, 0x0f, | ||||
|     0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3c, 0x2e, 0x57, 0x17, 0x1b, 0x1d, 0x36, | ||||
|     0x36, 0x3d, 0x31, 0x31, 0x39, 0x3d, 0x3d, 0x1d, 0x1f, 0x1f, 0xcf, 0x3f, 0x07, 0x00, 0x00, 0x81, | ||||
|     0x83, 0x83, 0x83, 0x03, 0x07, 0x07, 0x07, 0x0f, 0x0e, 0x1e, 0x1c, 0x3c, 0x78, 0xf8, 0xf0, 0xe0, | ||||
|     0x00, 0x40, 0xc0, 0x00, 0x60, 0x38, 0x38, 0x20, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfe, 0xff, 0x7f, 0xfe, 0xec, 0xf8, 0x7c, 0x3c, | ||||
|     0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xcf, 0x80, 0x07, 0x01, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x08, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xc1, | ||||
|     0x07, 0x0f, 0x9f, 0xbe, 0x78, 0xf0, 0xc0, 0x00, 0x80, 0x00, 0x80, 0x30, 0x30, 0x30, 0x11, 0x19, | ||||
|     0x18, 0x02, 0x07, 0x1f, 0x1f, 0x3c, 0x73, 0xcf, 0x0f, 0x0f, 0x0f, 0x17, 0x2f, 0x56, 0x20, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x1d, 0x3b, 0xff, 0xff, 0xfc, 0xf8, 0xf0, | ||||
|     0x60, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x68, 0x78, 0x10, 0x00, 0x18, 0x90, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x7f, 0xff, 0xfc, 0xf8, 0xe0, 0x80, | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, | ||||
|     0xf0, 0xf0, 0xf0, 0xf1, 0xe1, 0x41, 0x04, 0x1e, 0xcf, 0xc7, 0x44, 0x63, 0x59, 0x6d, 0x0a, 0x03, | ||||
|     0x03, 0x0c, 0x0e, 0x05, 0x03, 0x02, 0x02, 0x1b, 0xec, 0x67, 0x5b, 0x1c, 0x8c, 0xcc, 0xdc, 0x30, | ||||
|     0x00, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0xc0, 0x3f, 0xfc, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||
| }; | ||||
| 
 | ||||
| // invert display based on layer
 | ||||
| static void inv_display(void) { | ||||
|     switch (get_highest_layer(layer_state)) { | ||||
|         case 1: | ||||
|             oled_invert(true); | ||||
|             break; | ||||
|         default: | ||||
|             oled_invert(false); | ||||
|             break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // MTNS
 | ||||
| static void mountains(void) { | ||||
|     switch (get_highest_layer(layer_state)) { | ||||
|         case 0: | ||||
|             oled_write_raw_P(mnts_l0, sizeof(mnts_l0)); | ||||
|             break; | ||||
|         case 1: | ||||
|             oled_write_raw_P(mnts_l1, sizeof(mnts_l1)); | ||||
|             break; | ||||
|         default: | ||||
|             oled_write_raw_P(mnts_l0, sizeof(mnts_l0)); | ||||
|             break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // INFO
 | ||||
| static void info(void) { | ||||
|     // get layer the board is on
 | ||||
|     oled_write_P(PSTR("LAYER "), false); | ||||
|     oled_write_P(PSTR(" "), true); | ||||
|     oled_write_char(get_highest_layer(layer_state) + 0x30, true); | ||||
|     oled_write_P(PSTR(" "), true); | ||||
| 
 | ||||
|     // here we do a bit of trickery
 | ||||
|     oled_write_P(PSTR(" ENC "), false); | ||||
|     oled_write_P(PSTR(" VOL "), true); | ||||
| 
 | ||||
|     // lock key statuses
 | ||||
|     led_t led_state = host_keyboard_led_state(); | ||||
|     oled_set_cursor(9, 1); | ||||
|     oled_write_P(PSTR(" CAP "), led_state.caps_lock); | ||||
|     oled_set_cursor(14, 1); | ||||
|     oled_write_P(PSTR(" SCR "), led_state.scroll_lock); | ||||
| 
 | ||||
|     // write model B here in invert text
 | ||||
|     oled_set_cursor(0, 3); | ||||
|     oled_write_P(PSTR(" MODEL-B "), true); | ||||
| 
 | ||||
|     // mod masks - if you don't know what these do, don't worry about them
 | ||||
|     uint8_t mod_state = get_mods(); | ||||
|     oled_advance_char(); | ||||
|     oled_advance_char(); | ||||
|     oled_write_P(PSTR("S"), mod_state & MOD_MASK_SHIFT); | ||||
|     oled_advance_char(); | ||||
|     oled_write_P(PSTR("C"), mod_state & MOD_MASK_CTRL); | ||||
|     oled_advance_char(); | ||||
|     oled_write_P(PSTR("A"), mod_state & MOD_MASK_ALT); | ||||
|     oled_advance_char(); | ||||
|     oled_write_P(PSTR("G"), mod_state & MOD_MASK_GUI); | ||||
|     oled_advance_char(); | ||||
| } | ||||
| 
 | ||||
| // display logo - used on boot and exception state
 | ||||
| static void logo(void) { | ||||
|     oled_write_raw_P(bootscreen, sizeof(bootscreen)); | ||||
| } | ||||
| 
 | ||||
| // run this whenever the oled needs to update
 | ||||
| bool oled_task_kb(void) { | ||||
|     if (!oled_task_user()) { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     switch (keyboard_config.display_mode_saved) { | ||||
|         case MTNS: | ||||
|             mountains(); | ||||
|             break; | ||||
|         case INFO: | ||||
|             info(); | ||||
|             break; | ||||
|         case LOGO: | ||||
|             oled_write_raw_P(bootscreen, sizeof(bootscreen));   // write image to screen
 | ||||
|             inv_display();                                      // invert image if necessary - remove if layer differs
 | ||||
|             break; | ||||
|         case MEW: | ||||
|             oled_write_raw_P(mew_disp, sizeof(mew_disp)); | ||||
|             inv_display(); | ||||
|             break; | ||||
|         case CEL: | ||||
|             oled_write_raw_P(cel_disp, sizeof(cel_disp)); | ||||
|             inv_display(); | ||||
|             break; | ||||
|         case RAY: | ||||
|             oled_write_raw_P(rayq_disp, sizeof(rayq_disp)); | ||||
|             inv_display(); | ||||
|             break; | ||||
|         default: | ||||
|             logo(); | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| // render this on boot/reset
 | ||||
| void oled_render_boot(bool bootloader) { | ||||
|     oled_clear(); | ||||
|     logo(); | ||||
|     oled_render_dirty(true); | ||||
| } | ||||
| 
 | ||||
| // change depending on if OLED_MOD is pressed
 | ||||
| bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | ||||
|     if (!process_record_user(keycode, record)) { | ||||
|         return false; | ||||
|     } | ||||
|     if (keycode == OLED_MOD && record->event.pressed) { | ||||
|         oled_clear(); | ||||
|         keyboard_config.display_mode_saved++; | ||||
|         if (keyboard_config.display_mode_saved == NUM_MODES) { | ||||
|             keyboard_config.display_mode_saved = 0; | ||||
|         } | ||||
|         eeconfig_update_kb(keyboard_config.raw); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										21
									
								
								keyboards/trojan_pinata/model_b/rev0/rev0.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								keyboards/trojan_pinata/model_b/rev0/rev0.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| /* Copyright 2024 Brian H (@Trojan_Pinata)
 | ||||
|  * | ||||
|  * 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/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "quantum.h" | ||||
| 
 | ||||
| void oled_render_boot(bool bootloader); | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Brian Hill
						Brian Hill