qmk

QMK Firmware
git clone git://git.z3bra.org/qmk.git
Log | Files | Refs | Submodules | LICENSE

quantum.h (7791B)


      1 /* Copyright 2016-2018 Erez Zukerman, Jack Humbert, Yiancar
      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 #pragma once
     17 
     18 #if defined(__AVR__)
     19 #    include <avr/pgmspace.h>
     20 #    include <avr/io.h>
     21 #    include <avr/interrupt.h>
     22 #endif
     23 #if defined(PROTOCOL_CHIBIOS)
     24 #    include "hal.h"
     25 #endif
     26 
     27 #include "wait.h"
     28 #include "matrix.h"
     29 #include "keymap.h"
     30 
     31 #ifdef BACKLIGHT_ENABLE
     32 #    ifdef LED_MATRIX_ENABLE
     33 #        include "ledmatrix.h"
     34 #    else
     35 #        include "backlight.h"
     36 #    endif
     37 #endif
     38 
     39 #if defined(RGBLIGHT_ENABLE)
     40 #    include "rgblight.h"
     41 #elif defined(RGB_MATRIX_ENABLE)
     42 // Dummy define RGBLIGHT_MODE_xxxx
     43 #    define RGBLIGHT_H_DUMMY_DEFINE
     44 #    include "rgblight.h"
     45 #endif
     46 
     47 #ifdef RGB_MATRIX_ENABLE
     48 #    include "rgb_matrix.h"
     49 #endif
     50 
     51 #include "action_layer.h"
     52 #include "eeconfig.h"
     53 #include "bootloader.h"
     54 #include "timer.h"
     55 #include "config_common.h"
     56 #include "led.h"
     57 #include "action_util.h"
     58 #include "print.h"
     59 #include "send_string_keycodes.h"
     60 #include "suspend.h"
     61 #include <stddef.h>
     62 #include <stdlib.h>
     63 
     64 extern layer_state_t default_layer_state;
     65 
     66 #ifndef NO_ACTION_LAYER
     67 extern layer_state_t layer_state;
     68 #endif
     69 
     70 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
     71 #    include "process_midi.h"
     72 #endif
     73 
     74 #ifdef AUDIO_ENABLE
     75 #    include "audio.h"
     76 #    include "process_audio.h"
     77 #    ifdef AUDIO_CLICKY
     78 #        include "process_clicky.h"
     79 #    endif
     80 #endif
     81 
     82 #ifdef STENO_ENABLE
     83 #    include "process_steno.h"
     84 #endif
     85 
     86 #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
     87 #    include "process_music.h"
     88 #endif
     89 
     90 #ifdef LEADER_ENABLE
     91 #    include "process_leader.h"
     92 #endif
     93 
     94 #ifdef UNICODE_ENABLE
     95 #    include "process_unicode.h"
     96 #endif
     97 
     98 #ifdef UCIS_ENABLE
     99 #    include "process_ucis.h"
    100 #endif
    101 
    102 #ifdef UNICODEMAP_ENABLE
    103 #    include "process_unicodemap.h"
    104 #endif
    105 
    106 #ifdef TAP_DANCE_ENABLE
    107 #    include "process_tap_dance.h"
    108 #endif
    109 
    110 #ifdef PRINTING_ENABLE
    111 #    include "process_printer.h"
    112 #endif
    113 
    114 #ifdef AUTO_SHIFT_ENABLE
    115 #    include "process_auto_shift.h"
    116 #endif
    117 
    118 #ifdef COMBO_ENABLE
    119 #    include "process_combo.h"
    120 #endif
    121 
    122 #ifdef KEY_LOCK_ENABLE
    123 #    include "process_key_lock.h"
    124 #endif
    125 
    126 #ifdef TERMINAL_ENABLE
    127 #    include "process_terminal.h"
    128 #else
    129 #    include "process_terminal_nop.h"
    130 #endif
    131 
    132 #ifdef SPACE_CADET_ENABLE
    133 #    include "process_space_cadet.h"
    134 #endif
    135 
    136 #ifdef HD44780_ENABLE
    137 #    include "hd44780.h"
    138 #endif
    139 
    140 #ifdef HAPTIC_ENABLE
    141 #    include "haptic.h"
    142 #endif
    143 
    144 #ifdef OLED_DRIVER_ENABLE
    145 #    include "oled_driver.h"
    146 #endif
    147 
    148 // Function substitutions to ease GPIO manipulation
    149 #if defined(__AVR__)
    150 typedef uint8_t pin_t;
    151 
    152 #    define setPinInput(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF))
    153 #    define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF))
    154 #    define setPinInputLow(pin) _Static_assert(0, "AVR processors cannot implement an input as pull low")
    155 #    define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF))
    156 
    157 #    define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF))
    158 #    define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF))
    159 #    define writePin(pin, level) ((level) ? writePinHigh(pin) : writePinLow(pin))
    160 
    161 #    define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF)))
    162 #elif defined(PROTOCOL_CHIBIOS)
    163 typedef ioline_t pin_t;
    164 
    165 #    define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT)
    166 #    define setPinInputHigh(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)
    167 #    define setPinInputLow(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)
    168 #    define setPinOutput(pin) palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)
    169 
    170 #    define writePinHigh(pin) palSetLine(pin)
    171 #    define writePinLow(pin) palClearLine(pin)
    172 #    define writePin(pin, level) ((level) ? writePinHigh(pin) : writePinLow(pin))
    173 
    174 #    define readPin(pin) palReadLine(pin)
    175 #endif
    176 
    177 // Send string macros
    178 #define STRINGIZE(z) #z
    179 #define ADD_SLASH_X(y) STRINGIZE(\x##y)
    180 #define SYMBOL_STR(x) ADD_SLASH_X(x)
    181 
    182 #define SS_TAP_CODE 1
    183 #define SS_DOWN_CODE 2
    184 #define SS_UP_CODE 3
    185 
    186 #define SS_TAP(keycode) "\1" SYMBOL_STR(keycode)
    187 #define SS_DOWN(keycode) "\2" SYMBOL_STR(keycode)
    188 #define SS_UP(keycode) "\3" SYMBOL_STR(keycode)
    189 
    190 // `string` arguments must not be parenthesized
    191 #define SS_LCTRL(string) SS_DOWN(X_LCTRL) string SS_UP(X_LCTRL)
    192 #define SS_LGUI(string) SS_DOWN(X_LGUI) string SS_UP(X_LGUI)
    193 #define SS_LCMD(string) SS_LGUI(string)
    194 #define SS_LWIN(string) SS_LGUI(string)
    195 #define SS_LALT(string) SS_DOWN(X_LALT) string SS_UP(X_LALT)
    196 #define SS_LSFT(string) SS_DOWN(X_LSHIFT) string SS_UP(X_LSHIFT)
    197 #define SS_RALT(string) SS_DOWN(X_RALT) string SS_UP(X_RALT)
    198 #define SS_ALGR(string) SS_RALT(string)
    199 
    200 #define SEND_STRING(string) send_string_P(PSTR(string))
    201 
    202 extern const bool    ascii_to_shift_lut[128];
    203 extern const bool    ascii_to_altgr_lut[128];
    204 extern const uint8_t ascii_to_keycode_lut[128];
    205 
    206 void send_string(const char *str);
    207 void send_string_with_delay(const char *str, uint8_t interval);
    208 void send_string_P(const char *str);
    209 void send_string_with_delay_P(const char *str, uint8_t interval);
    210 void send_char(char ascii_code);
    211 
    212 // For tri-layer
    213 void          update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
    214 layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3);
    215 
    216 void set_single_persistent_default_layer(uint8_t default_layer);
    217 
    218 void tap_random_base64(void);
    219 
    220 #define IS_LAYER_ON(layer) (layer_state & (1UL << (layer)))
    221 #define IS_LAYER_OFF(layer) (~layer_state & (1UL << (layer)))
    222 
    223 void     matrix_init_kb(void);
    224 void     matrix_scan_kb(void);
    225 void     matrix_init_user(void);
    226 void     matrix_scan_user(void);
    227 uint16_t get_record_keycode(keyrecord_t *record);
    228 uint16_t get_event_keycode(keyevent_t event);
    229 bool     process_action_kb(keyrecord_t *record);
    230 bool     process_record_kb(uint16_t keycode, keyrecord_t *record);
    231 bool     process_record_user(uint16_t keycode, keyrecord_t *record);
    232 
    233 #ifndef BOOTMAGIC_LITE_COLUMN
    234 #    define BOOTMAGIC_LITE_COLUMN 0
    235 #endif
    236 #ifndef BOOTMAGIC_LITE_ROW
    237 #    define BOOTMAGIC_LITE_ROW 0
    238 #endif
    239 
    240 void bootmagic_lite(void);
    241 
    242 void reset_keyboard(void);
    243 
    244 void startup_user(void);
    245 void shutdown_user(void);
    246 
    247 void register_code16(uint16_t code);
    248 void unregister_code16(uint16_t code);
    249 void tap_code16(uint16_t code);
    250 
    251 #ifdef BACKLIGHT_ENABLE
    252 void backlight_init_ports(void);
    253 void backlight_task(void);
    254 void backlight_task_internal(void);
    255 void backlight_on(uint8_t backlight_pin);
    256 void backlight_off(uint8_t backlight_pin);
    257 
    258 #    ifdef BACKLIGHT_BREATHING
    259 void breathing_task(void);
    260 void breathing_enable(void);
    261 void breathing_pulse(void);
    262 void breathing_disable(void);
    263 void breathing_self_disable(void);
    264 void breathing_toggle(void);
    265 bool is_breathing(void);
    266 
    267 void breathing_intensity_default(void);
    268 void breathing_period_default(void);
    269 void breathing_period_set(uint8_t value);
    270 void breathing_period_inc(void);
    271 void breathing_period_dec(void);
    272 #    endif
    273 #endif
    274 
    275 void     send_dword(uint32_t number);
    276 void     send_word(uint16_t number);
    277 void     send_byte(uint8_t number);
    278 void     send_nibble(uint8_t number);
    279 uint16_t hex_to_keycode(uint8_t hex);
    280 
    281 void led_set_user(uint8_t usb_led);
    282 void led_set_kb(uint8_t usb_led);
    283 
    284 void api_send_unicode(uint32_t unicode);