# Devices/Keyboardio/Imago/Imago.ino ``` c++ ,/* -*- mode: c++ -*- * Imago.ino -- Example sketch for the Keyboardio Imago * Copyright (C) 2018, 2019, 2020 Keyboard.io, Inc * * 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, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "Kaleidoscope.h" #include "Kaleidoscope-Macros.h" // Support for controlling the keyboard's LEDs #include "Kaleidoscope-LEDControl.h" // Support for the "Boot greeting" effect, which pulses the 'LED' button for 10s // when the keyboard is connected to a computer (or that computer is powered on) #include "Kaleidoscope-LEDEffect-BootGreeting.h" // Support for LED modes that set all LEDs to a single color #include "Kaleidoscope-LEDEffect-SolidColor.h" // Support for an LED mode that makes all the LEDs 'breathe' #include "Kaleidoscope-LEDEffect-Breathe.h" #include "Kaleidoscope-LEDEffect-Chase.h" // Support for LED modes that pulse the keyboard's LED in a rainbow pattern #include "Kaleidoscope-LEDEffect-Rainbow.h" // Support for host power management (suspend & wakeup) #include "Kaleidoscope-HostPowerManagement.h" // Support for magic combos (key chords that trigger an action) #include "Kaleidoscope-MagicCombo.h" // Support for USB quirks, like changing the key state report protocol #include "Kaleidoscope-USB-Quirks.h" enum { _QWERTY, }; // clang-format off KEYMAPS( [_QWERTY] = KEYMAP( Key_F1, Key_Escape, Key_Backtick, Key_1, Key_2, Key_3, Key_4, Key_5, Key_6, Key_7, Key_8, Key_9, Key_0, Key_Minus, Key_Equals, Key_Backspace, Key_F2, Key_Tab, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_LeftBracket, Key_RightBracket, Key_Backslash, Key_F3, Key_Escape, Key_A, Key_S, Key_D, Key_F, Key_G, Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, Key_Enter, Key_F4, Key_LeftShift, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_UpArrow, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_RightShift, Key_LEDEffectNext, Key_F5, Key_LeftControl,Key_LeftAlt, Key_LeftGui, Key_Backspace, Key_LeftArrow, Key_DownArrow, Key_RightArrow, Key_Space, Key_RightAlt, Key_Menu, Key_RightControl, Key_LEDEffectNext )); // clang-format on // These 'solid' color effect definitions define a rainbow of // LED color modes calibrated to draw 500mA or less on the // Keyboardio Model 01. static kaleidoscope::plugin::LEDSolidColor solidRed(160, 0, 0); static kaleidoscope::plugin::LEDSolidColor solidOrange(140, 70, 0); static kaleidoscope::plugin::LEDSolidColor solidYellow(130, 100, 0); static kaleidoscope::plugin::LEDSolidColor solidGreen(0, 160, 0); static kaleidoscope::plugin::LEDSolidColor solidBlue(0, 70, 130); static kaleidoscope::plugin::LEDSolidColor solidIndigo(0, 0, 170); static kaleidoscope::plugin::LEDSolidColor solidViolet(130, 0, 120); /** toggleLedsOnSuspendResume toggles the LEDs off when the host goes to sleep, * and turns them back on when it wakes up. */ void toggleLedsOnSuspendResume(kaleidoscope::plugin::HostPowerManagement::Event event) { switch (event) { case kaleidoscope::plugin::HostPowerManagement::Suspend: LEDControl.disable(); break; case kaleidoscope::plugin::HostPowerManagement::Resume: LEDControl.enable(); break; case kaleidoscope::plugin::HostPowerManagement::Sleep: break; } } /** hostPowerManagementEventHandler dispatches power management events (suspend, * resume, and sleep) to other functions that perform action based on these * events. */ void hostPowerManagementEventHandler(kaleidoscope::plugin::HostPowerManagement::Event event) { toggleLedsOnSuspendResume(event); } /** This 'enum' is a list of all the magic combos used by the Model 01's * firmware The names aren't particularly important. What is important is that * each is unique. * * These are the names of your magic combos. They will be used by the * `USE_MAGIC_COMBOS` call below. */ enum { // Toggle between Boot (6-key rollover; for BIOSes and early boot) and NKRO // mode. COMBO_TOGGLE_NKRO_MODE }; /** A tiny wrapper, to be used by MagicCombo. * This simply toggles the keyboard protocol via USBQuirks, and wraps it within * a function with an unused argument, to match what MagicCombo expects. */ static void toggleKeyboardProtocol(uint8_t combo_index) { USBQuirks.toggleKeyboardProtocol(); } /** Magic combo list, a list of key combo and action pairs the firmware should * recognise. */ USE_MAGIC_COMBOS( {.action = toggleKeyboardProtocol, // Left Fn + Esc + Shift .keys = {R3C6, R2C6, R3C7}}); KALEIDOSCOPE_INIT_PLUGINS( Macros, // LEDControl provides support for other LED modes LEDControl, // The rainbow effect changes the color of all of the keyboard's keys at the same time // running through all the colors of the rainbow. LEDRainbowEffect, // The rainbow wave effect lights up your keyboard with all the colors of a rainbow // and slowly moves the rainbow across your keyboard LEDRainbowWaveEffect, // The chase effect follows the adventure of a blue pixel which chases a red pixel across // your keyboard. Spoiler: the blue pixel never catches the red pixel LEDChaseEffect, // These static effects turn your keyboard's LEDs a variety of colors solidRed, solidOrange, solidYellow, solidGreen, solidBlue, solidIndigo, solidViolet, // The breathe effect slowly pulses all of the LEDs on your keyboard LEDBreatheEffect, // The HostPowerManagement plugin allows us to turn LEDs off when then host // goes to sleep, and resume them when it wakes up. HostPowerManagement, // The MagicCombo plugin lets you use key combinations to trigger custom // actions - a bit like Macros, but triggered by pressing multiple keys at the // same time. MagicCombo, // The USBQuirks plugin lets you do some things with USB that we aren't // comfortable - or able - to do automatically, but can be useful // nevertheless. Such as toggling the key report protocol between Boot (used // by BIOSes) and Report (NKRO). USBQuirks); void setup() { Kaleidoscope.setup(); Serial.begin(9600); } void loop() { Kaleidoscope.loop(); } ```