qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

1upslider8.c (13497B)


      1 /* Copyright 2022 ziptyze
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 
     17 
     18 #include "analog.h"
     19 #include "qmk_midi.h"
     20 
     21 #include "quantum.h"
     22 #include "quantum/midi/midi.h"
     23 #include "quantum/midi/midi_device.h"
     24 
     25 uint8_t divisor = 0;
     26 void slider(void) {
     27   if (divisor++) { // only run the slider function 1/256 times it's called
     28     return;
     29   }
     30   midi_send_cc(&midi_device, 2, 0x3E, 0x7F - (analogReadPin(SLIDER_PIN) >> 3));
     31   uprintf("%d string", analogReadPin(SLIDER_PIN));
     32 }
     33 
     34 void housekeeping_task_kb(void) {
     35     slider();
     36 }
     37 
     38 static uint32_t oled_logo_timer = 0;
     39 static bool clear_logo = true;
     40 static const char PROGMEM my_logo[] = {
     41     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     42     0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
     43     0xE0, 0xF0, 0x70, 0x70, 0x70, 0x70,
     44     0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00,
     45     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     46     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     47     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     48     0x00, 0x63, 0xE7, 0xE7, 0xCE, 0xCE,
     49     0xCE, 0xCE, 0xFC, 0xFC, 0x78, 0x00,
     50     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     51     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     52     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     53     0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC1,
     54     0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
     55     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     56     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     57     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     58     0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
     59     0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
     60     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     61     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     62     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     63     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     64     0x00, 0x07, 0x07, 0x07, 0x07, 0x07,
     65     0x07, 0x07, 0x07, 0x07, 0x00, 0x00,
     66     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     67     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     68     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     69     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     70     0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
     71     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     72     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     73     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     74     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     75     0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00,
     76     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     77     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     78     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     79     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     80     0xFC, 0xFC, 0xFC, 0x1C, 0x1C, 0x1C,
     81     0x1C, 0x3C, 0xF8, 0xF8, 0xE0, 0x00,
     82     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     83     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     84     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     85     0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x70,
     86     0x70, 0x70, 0x70, 0x78, 0x3F, 0x3F,
     87     0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
     88     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     89     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     90     0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
     91     0xF0, 0xF0, 0x70, 0x70, 0x70, 0x70,
     92     0x70, 0x70, 0x70, 0x00, 0x00, 0x00,
     93     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     94     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     95     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     96     0x00, 0xFF, 0xFF, 0xFF, 0xCE, 0xCE,
     97     0xCE, 0xCE, 0xCE, 0xCE, 0xCE, 0x00,
     98     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     99     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    100     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    101     0x00, 0x00, 0xC0, 0xC1, 0xC1, 0xC1,
    102     0xC1, 0xC1, 0xC1, 0xC1, 0xC1, 0x81,
    103     0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
    104     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    105     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    106     0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
    107     0xFF, 0x39, 0x39, 0x79, 0xF9, 0xF9,
    108     0xDF, 0x9F, 0x0F, 0x00, 0x00, 0x00,
    109     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    110     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    111     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    112     0x07, 0x07, 0x07, 0x00, 0x00, 0x00,
    113     0x00, 0x03, 0x07, 0x07, 0x06, 0x04,
    114     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    115     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    116     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    117     0x00, 0x00, 0x00, 0x00, 0x1C, 0xBE,
    118     0xFF, 0x63, 0x63, 0xFF, 0xBE, 0x1C,
    119     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    120     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    121     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    122     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    123     0x07, 0x0F, 0x1F, 0x18, 0x18, 0x1F,
    124     0x0F, 0x07, 0x00, 0x00, 0x00, 0x00,
    125     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    126     0x00, 0x00
    127     };
    128 
    129 oled_rotation_t oled_init_user(oled_rotation_t rotation) {
    130 	return OLED_ROTATION_270;
    131 }
    132 
    133 
    134 static const char PROGMEM ou_logo[] = {
    135     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    136     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    137     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    138     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    139     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    140     0x00, 0x00, 0xFC, 0xFC, 0xCF, 0xCF,
    141     0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF,
    142     0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03,
    143     0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03,
    144     0x03, 0x03, 0xF3, 0xF3, 0x03, 0x03,
    145     0x0C, 0x0C, 0xFC, 0xFC, 0x00, 0x00,
    146     0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0,
    147     0xFF, 0xFF, 0xF0, 0xF0, 0xC3, 0xC3,
    148     0xC0, 0xC0, 0xF0, 0xF0, 0xFF, 0xFF,
    149     0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0xFC,
    150     0x0C, 0x0C, 0x0F, 0x0F, 0x03, 0x03,
    151     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    152     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    153     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    154     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    155     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    156     0x00, 0x00
    157     };
    158 
    159 
    160 static char PROGMEM caps_on[] = {
    161     0x00, 0x00, 0x00, 0xF8, 0x04, 0x04,
    162     0x04, 0x88, 0x00, 0x00, 0xE0, 0x58,
    163     0x44, 0x58, 0xE0, 0x00, 0x00, 0xFC,
    164     0x24, 0x24, 0x24, 0x18, 0x00, 0x00,
    165     0x98, 0x24, 0x24, 0x24, 0xC8, 0x00,
    166     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    167     0x01, 0x01, 0x01, 0x00, 0x00, 0x81,
    168     0xC0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF1,
    169     0xF0, 0xF1, 0xF0, 0xF0, 0xE0, 0xC0,
    170     0x80, 0x00, 0x00, 0x01, 0x01, 0x01,
    171     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    172     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    173     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    174     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    175     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
    176     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    177     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    178     0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F,
    179     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    180     0x3F, 0x3F, 0x1F, 0x0F, 0x07, 0x03,
    181     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    182     0x00, 0x00
    183     };
    184 
    185 static char PROGMEM caps_off[] = {
    186     0x00, 0x00, 0x00, 0xF8, 0x04, 0x04,
    187     0x04, 0x88, 0x00, 0x00, 0xE0, 0x58,
    188     0x44, 0x58, 0xE0, 0x00, 0x00, 0xFC,
    189     0x24, 0x24, 0x24, 0x18, 0x00, 0x00,
    190     0x98, 0x24, 0x24, 0x24, 0xC8, 0x00,
    191     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    192     0x01, 0x01, 0x01, 0x00, 0x00, 0x81,
    193     0xC0, 0xE0, 0xF0, 0x70, 0x30, 0x31,
    194     0x30, 0x31, 0x70, 0xF0, 0xE0, 0xC0,
    195     0x80, 0x00, 0x00, 0x01, 0x01, 0x01,
    196     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    197     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    198     0xFF, 0xFF, 0x03, 0x01, 0x00, 0x00,
    199     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    200     0x01, 0x03, 0xFF, 0xFF, 0x00, 0x00,
    201     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    202     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    203     0x00, 0x00, 0x03, 0x07, 0x0F, 0x1E,
    204     0x3C, 0x38, 0x30, 0x30, 0x30, 0x30,
    205     0x38, 0x3C, 0x1E, 0x0F, 0x07, 0x03,
    206     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    207     0x00, 0x00
    208     };
    209 
    210 static const char PROGMEM num_on[] = {
    211     0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
    212     0x18, 0x20, 0xC0, 0xFC, 0x00, 0x00,
    213     0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC,
    214     0x00, 0x00, 0xFC, 0x18, 0x60, 0x80,
    215     0x60, 0x18, 0xFC, 0x00, 0x00, 0x00,
    216     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    217     0x00, 0x01, 0x00, 0x00, 0x00, 0x81,
    218     0xC0, 0xE0, 0xF0, 0xF0, 0xF1, 0xF1,
    219     0xF1, 0xF0, 0xF0, 0xF0, 0xE1, 0xC0,
    220     0x80, 0x01, 0x00, 0x00, 0x01, 0x00,
    221     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    222     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    223     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    224     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    225     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
    226     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    227     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    228     0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F,
    229     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    230     0x3F, 0x3F, 0x1F, 0x0F, 0x07, 0x03,
    231     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    232     0x00, 0x00
    233     };
    234 
    235 static const char PROGMEM num_off[] = {
    236     0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
    237     0x18, 0x20, 0xC0, 0xFC, 0x00, 0x00,
    238     0x00, 0xFC, 0x00, 0x00, 0x00, 0xFC,
    239     0x00, 0x00, 0xFC, 0x18, 0x60, 0x80,
    240     0x60, 0x18, 0xFC, 0x00, 0x00, 0x00,
    241     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    242     0x00, 0x01, 0x00, 0x00, 0x00, 0x81,
    243     0xC0, 0xE0, 0xF0, 0x70, 0x31, 0x31,
    244     0x31, 0x30, 0x70, 0xF0, 0xE1, 0xC0,
    245     0x80, 0x01, 0x00, 0x00, 0x01, 0x00,
    246     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    247     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    248     0xFF, 0xFF, 0x03, 0x01, 0x00, 0x00,
    249     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    250     0x01, 0x03, 0xFF, 0xFF, 0x00, 0x00,
    251     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    252     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    253     0x00, 0x00, 0x03, 0x07, 0x0F, 0x1E,
    254     0x3C, 0x38, 0x30, 0x30, 0x30, 0x30,
    255     0x38, 0x3C, 0x1E, 0x0F, 0x07, 0x03,
    256     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    257     0x00, 0x00
    258     };
    259 
    260 static const char PROGMEM scrl_on[] = {
    261     0x00, 0x00, 0x00, 0x98, 0x24, 0x24,
    262     0x24, 0xC8, 0x00, 0x00, 0xF8, 0x04,
    263     0x04, 0x04, 0x88, 0x00, 0x00, 0xFC,
    264     0x24, 0x24, 0xE4, 0x18, 0x00, 0x00,
    265     0x00, 0xFC, 0x00, 0x00, 0x00, 0x00,
    266     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    267     0x01, 0x01, 0x01, 0x00, 0x00, 0x80,
    268     0xC0, 0xE1, 0xF1, 0xF1, 0xF0, 0xF0,
    269     0xF0, 0xF1, 0xF0, 0xF0, 0xE0, 0xC1,
    270     0x80, 0x00, 0x00, 0x01, 0x01, 0x01,
    271     0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
    272     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    273     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    274     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    275     0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
    276     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    277     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    278     0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F,
    279     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
    280     0x3F, 0x3F, 0x1F, 0x0F, 0x07, 0x03,
    281     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    282     0x00, 0x00
    283     };
    284 
    285 static const char PROGMEM scrl_off[] = {
    286     0x00, 0x00, 0x00, 0x98, 0x24, 0x24,
    287     0x24, 0xC8, 0x00, 0x00, 0xF8, 0x04,
    288     0x04, 0x04, 0x88, 0x00, 0x00, 0xFC,
    289     0x24, 0x24, 0xE4, 0x18, 0x00, 0x00,
    290     0x00, 0xFC, 0x00, 0x00, 0x00, 0x00,
    291     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    292     0x01, 0x01, 0x01, 0x00, 0x00, 0x80,
    293     0xC0, 0xE1, 0xF1, 0x71, 0x30, 0x30,
    294     0x30, 0x31, 0x70, 0xF0, 0xE0, 0xC1,
    295     0x80, 0x00, 0x00, 0x01, 0x01, 0x01,
    296     0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
    297     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    298     0xFF, 0xFF, 0x03, 0x01, 0x00, 0x00,
    299     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    300     0x01, 0x03, 0xFF, 0xFF, 0x00, 0x00,
    301     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    302     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    303     0x00, 0x00, 0x03, 0x07, 0x0F, 0x1E,
    304     0x3C, 0x38, 0x30, 0x30, 0x30, 0x30,
    305     0x38, 0x3C, 0x1E, 0x0F, 0x07, 0x03,
    306     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    307     0x00, 0x00
    308     };
    309 
    310 static void render_oled(void) {
    311     const int combined_size = sizeof(ou_logo) + sizeof(caps_off) + sizeof(num_off) + sizeof(scrl_off);
    312     char combined[combined_size];
    313     led_t led_state = host_keyboard_led_state();
    314 
    315     memcpy_P(combined, ou_logo, sizeof(ou_logo));
    316 
    317     if (led_state.caps_lock) {
    318         memcpy_P(combined + sizeof(ou_logo), caps_on, sizeof(caps_off));
    319     }
    320     else {
    321         memcpy_P(combined + sizeof(ou_logo), caps_off, sizeof(caps_off));
    322     }
    323 
    324     if (led_state.num_lock) {
    325         memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off), num_on, sizeof(num_off));
    326     }
    327     else {
    328         memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off), num_off, sizeof(num_off));
    329     }
    330 
    331     if (led_state.scroll_lock) {
    332         memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off) + sizeof(num_off), scrl_on, sizeof(scrl_off));
    333     }
    334     else {
    335         memcpy_P(combined + sizeof(ou_logo) + sizeof(caps_off) + sizeof(num_off), scrl_off, sizeof(scrl_off));
    336     }
    337 
    338     oled_write_raw_P(combined, sizeof(combined));
    339 }
    340 
    341 void render_logo(void) {
    342     oled_write_raw_P(my_logo, sizeof(my_logo));
    343 }
    344 
    345 void clear_screen(void) {
    346     if (clear_logo){
    347       for (uint8_t i = 0; i < OLED_DISPLAY_HEIGHT; ++i) {
    348         for (uint8_t j = 0; j < OLED_DISPLAY_WIDTH; ++j) {
    349           oled_write_raw_byte(0x0, i*OLED_DISPLAY_WIDTH + j);
    350         }
    351       }
    352       clear_logo = false;
    353     }
    354 }
    355 
    356 #define MIDI_CONTROL_CHANGE 0xB0
    357 
    358 MidiDevice _midi_device;
    359 
    360 void midi_callback(uint8_t cable, uint8_t *midi_data, uint16_t length) {
    361   // Check if this is a MIDI CC message on channel 2
    362   if ((midi_data[0] & 0xF0) == MIDI_CONTROL_CHANGE && midi_data[0] & (0x0F == 1)) {
    363     uprintf("%s string", midi_data );
    364     // ...
    365   }
    366 }
    367 
    368 void slider8_cc_callback(struct _midi_device *dev, uint8_t cable, uint8_t code_index, uint8_t value) {
    369     midi_callback(MIDI_CONTROL_CHANGE, &value, 1);
    370 }
    371 
    372 void init_timer(void){
    373    oled_logo_timer = timer_read32();
    374 };
    375 
    376 void keyboard_post_init_kb(void) {
    377     init_timer();
    378 
    379     keyboard_post_init_user();
    380 }
    381 
    382 void matrix_init_kb(void) {
    383     midi_register_cc_callback(&_midi_device, slider8_cc_callback);
    384     matrix_init_user();
    385 }
    386 
    387 #ifndef SHOW_LOGO
    388 #    define SHOW_LOGO 5000
    389 #endif
    390 bool oled_task_kb(void) {
    391     if (!oled_task_user()) { return false; }
    392     if ((timer_elapsed32(oled_logo_timer) < SHOW_LOGO)){
    393         render_logo();
    394     }else{
    395       clear_screen();
    396       render_oled();
    397     }
    398     return false;
    399 }