qmk_firmware

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

muse.c (2314B)


      1 #include "muse.h"
      2 
      3 #include <stdbool.h>
      4 
      5 enum { MUSE_OFF, MUSE_ON, MUSE_C_1_2, MUSE_C1, MUSE_C2, MUSE_C4, MUSE_C8, MUSE_C3, MUSE_C6, MUSE_B1, MUSE_B2, MUSE_B3, MUSE_B4, MUSE_B5, MUSE_B6, MUSE_B7, MUSE_B8, MUSE_B9, MUSE_B10, MUSE_B11, MUSE_B12, MUSE_B13, MUSE_B14, MUSE_B15, MUSE_B16, MUSE_B17, MUSE_B18, MUSE_B19, MUSE_B20, MUSE_B21, MUSE_B22, MUSE_B23, MUSE_B24, MUSE_B25, MUSE_B26, MUSE_B27, MUSE_B28, MUSE_B29, MUSE_B30, MUSE_B31 };
      6 
      7 bool number_of_ones_to_bool[16] = {1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1};
      8 
      9 uint8_t muse_interval[4] = {MUSE_B7, MUSE_B19, MUSE_B3, MUSE_B28};
     10 uint8_t muse_theme[4]    = {MUSE_B8, MUSE_B23, MUSE_B18, MUSE_B17};
     11 
     12 bool     muse_timer_1bit         = 0;
     13 uint8_t  muse_timer_2bit         = 0;
     14 uint8_t  muse_timer_2bit_counter = 0;
     15 uint8_t  muse_timer_4bit         = 0;
     16 uint32_t muse_timer_31bit        = 0;
     17 
     18 bool bit_for_value(uint8_t value) {
     19     switch (value) {
     20         case MUSE_OFF:
     21             return 0;
     22         case MUSE_ON:
     23             return 1;
     24         case MUSE_C_1_2:
     25             return muse_timer_1bit;
     26         case MUSE_C1:
     27             return (muse_timer_4bit & 1);
     28         case MUSE_C2:
     29             return (muse_timer_4bit & 2);
     30         case MUSE_C4:
     31             return (muse_timer_4bit & 4);
     32         case MUSE_C8:
     33             return (muse_timer_4bit & 8);
     34         case MUSE_C3:
     35             return (muse_timer_2bit & 1);
     36         case MUSE_C6:
     37             return (muse_timer_2bit & 2);
     38         default:
     39             return muse_timer_31bit & (1UL << (value - MUSE_B1));
     40     }
     41 }
     42 
     43 uint8_t muse_clock_pulse(void) {
     44     bool top = number_of_ones_to_bool[bit_for_value(muse_theme[0]) + (bit_for_value(muse_theme[1]) << 1) + (bit_for_value(muse_theme[2]) << 2) + (bit_for_value(muse_theme[3]) << 3)];
     45 
     46     if (muse_timer_1bit == 0) {
     47         if (muse_timer_2bit_counter == 0) {
     48             muse_timer_2bit = (muse_timer_2bit + 1) % 4;
     49         }
     50         muse_timer_2bit_counter = (muse_timer_2bit_counter + 1) % 3;
     51         muse_timer_4bit         = (muse_timer_4bit + 1) % 16;
     52         muse_timer_31bit        = (muse_timer_31bit << 1) + top;
     53     }
     54 
     55     muse_timer_1bit = (muse_timer_1bit + 1) % 2;
     56 
     57     return bit_for_value(muse_interval[0]) + (bit_for_value(muse_interval[1]) << 1) + (bit_for_value(muse_interval[2]) << 2) + (bit_for_value(muse_interval[3]) << 3);
     58 }