.idea/
CMakeLists.txt
cmake-build-debug
+doxygen/
.DS_STORE
/util/wsl_downloaded
/util/win_downloaded
# things travis sees
secrets.tar
id_rsa_*
-/.vs
\ No newline at end of file
+/.vs
install:
- tar -zxf avr8-gnu-toolchain-3.5.4.1709-linux.any.x86_64.tar.gz
- export PATH="$PATH:$TRAVIS_BUILD_DIR/avr8-gnu-toolchain-linux_x86_64/bin"
+ - npm install -g moxygen
before_script:
- avr-gcc --version
script:
- make test:all AUTOGEN=false
- bash util/travis_build.sh
+- bash util/travis_docs.sh
addons:
apt:
packages:
- libnewlib-arm-none-eabi
- diffutils
- dos2unix
+ - doxygen
after_success:
bash util/travis_compiled_push.sh
notifications:
--- /dev/null
+# Doxyfile 1.8.14
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for qmk_firmware (github.com/qmk/qmk_firmware)
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = "QMK Firmware"
+PROJECT_NUMBER = https://github.com/qmk/qmk_firmware
+PROJECT_BRIEF = "Keyboard controller firmware for Atmel AVR and ARM USB families"
+OUTPUT_DIRECTORY = doxygen
+ALLOW_UNICODE_NAMES = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 4
+ALIASES =
+TCL_SUBST =
+OPTIMIZE_OUTPUT_FOR_C = YES
+OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = YES
+TOC_INCLUDE_HEADINGS = 2
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+GROUP_NESTED_COMPOUNDS = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = NO
+HIDE_SCOPE_NAMES = YES
+HIDE_COMPOUND_REFERENCE= NO
+SHOW_INCLUDE_FILES = YES
+SHOW_GROUPED_MEMB_INC = NO
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_AS_ERROR = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+INPUT = tmk_core quantum drivers
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to disabled outputs
+#---------------------------------------------------------------------------
+
+GENERATE_HTML = NO
+GENERATE_LATEX = NO
+GENERATE_RTF = NO
+GENERATE_MAN = NO
+GENERATE_DOCBOOK = NO
+GENERATE_AUTOGEN_DEF = NO
+GENERATE_PERLMOD = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+GENERATE_XML = YES
+XML_OUTPUT = xml
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+CLASS_DIAGRAMS = YES
+MSCGEN_PATH =
+DIA_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = Helvetica
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DIAFILE_DIRS =
+PLANTUML_JAR_PATH =
+PLANTUML_CFG_FILE =
+PLANTUML_INCLUDE_PATH =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
* Other Topics
* [Using Eclipse with QMK](eclipse.md)
+
+* QMK API (In Progress)
+ * [Defines](api_defines.md)
+ * [Input Callback Reg](api_input_callback_reg.md)
+ * [Midi Device](api_midi_device.md)
+ * [Midi Device Setup Process](api_midi_device_setup_process.md)
+ * [Midi Util](api_midi_util.md)
+ * [Send Functions](api_send_functions.md)
+ * [Sysex Tools](api_sysex_tools.md)
--- /dev/null
+# group `defines` {#group__defines}
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) |
+`define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) |
+`define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) |
+`define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) |
+`define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) |
+`define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) |
+`define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) |
+`define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) |
+`define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) |
+`define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) |
+`define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) |
+`define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) |
+`define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) |
+`define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) |
+`define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) |
+`define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) |
+`define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) |
+`define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) |
+`define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) |
+`define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) |
+`define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) |
+`define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) |
+`define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) |
+
+## Members
+
+#### `define `[`SYSEX_BEGIN`](#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79) {#group__defines_1ga1a3c39bb790dda8a368c4247caabcf79}
+
+#### `define `[`SYSEX_END`](#group__defines_1ga753706d1d28e6f96d7caf1973e80feed) {#group__defines_1ga753706d1d28e6f96d7caf1973e80feed}
+
+#### `define `[`MIDI_STATUSMASK`](#group__defines_1gab78a1c818a5f5dab7a8946543f126c69) {#group__defines_1gab78a1c818a5f5dab7a8946543f126c69}
+
+#### `define `[`MIDI_CHANMASK`](#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909) {#group__defines_1ga239edc0a6f8405d3a8f2804f1590b909}
+
+#### `define `[`MIDI_CC`](#group__defines_1ga45f116a1daab76b3c930c2cecfaef215) {#group__defines_1ga45f116a1daab76b3c930c2cecfaef215}
+
+#### `define `[`MIDI_NOTEON`](#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7) {#group__defines_1gafd416f27bf3590868c0c1f55c30be4c7}
+
+#### `define `[`MIDI_NOTEOFF`](#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc) {#group__defines_1gabed24bea2d989fd655e2ef2ad0765adc}
+
+#### `define `[`MIDI_AFTERTOUCH`](#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f) {#group__defines_1ga3a322d8cfd53576a2e167c1840551b0f}
+
+#### `define `[`MIDI_PITCHBEND`](#group__defines_1gabcc799504e8064679bca03f232223af4) {#group__defines_1gabcc799504e8064679bca03f232223af4}
+
+#### `define `[`MIDI_PROGCHANGE`](#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42) {#group__defines_1gaefb3f1595ffbb9db66b46c2c919a3d42}
+
+#### `define `[`MIDI_CHANPRESSURE`](#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe) {#group__defines_1gaeb3281cc7fcd0daade8ed3d2dfc33dbe}
+
+#### `define `[`MIDI_CLOCK`](#group__defines_1gafa5e4e295aafd15ab7893344599b3b89) {#group__defines_1gafa5e4e295aafd15ab7893344599b3b89}
+
+#### `define `[`MIDI_TICK`](#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7) {#group__defines_1ga3b99408ff864613765d4c3c2ceb52aa7}
+
+#### `define `[`MIDI_START`](#group__defines_1ga8233631c85823aa546f932ad8975caa4) {#group__defines_1ga8233631c85823aa546f932ad8975caa4}
+
+#### `define `[`MIDI_CONTINUE`](#group__defines_1gab24430f0081e27215b0da84dd0ee745c) {#group__defines_1gab24430f0081e27215b0da84dd0ee745c}
+
+#### `define `[`MIDI_STOP`](#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62) {#group__defines_1ga3af9271d4b1f0d22904a0b055f48cf62}
+
+#### `define `[`MIDI_ACTIVESENSE`](#group__defines_1gacd88ed42dba52bb4b2052c5656362677) {#group__defines_1gacd88ed42dba52bb4b2052c5656362677}
+
+#### `define `[`MIDI_RESET`](#group__defines_1ga02947f30ca62dc332fdeb10c5868323b) {#group__defines_1ga02947f30ca62dc332fdeb10c5868323b}
+
+#### `define `[`MIDI_TC_QUARTERFRAME`](#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31) {#group__defines_1gaaa072f33590e236d1bfd8f28e833ae31}
+
+#### `define `[`MIDI_SONGPOSITION`](#group__defines_1ga412f6ed33a2150051374bee334ee1705) {#group__defines_1ga412f6ed33a2150051374bee334ee1705}
+
+#### `define `[`MIDI_SONGSELECT`](#group__defines_1gafcab254838b028365ae0259729e72c4e) {#group__defines_1gafcab254838b028365ae0259729e72c4e}
+
+#### `define `[`MIDI_TUNEREQUEST`](#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795) {#group__defines_1ga8100b907b8c0a84e58b1c53dcd9bd795}
+
+#### `define `[`SYSEX_EDUMANUFID`](#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f) {#group__defines_1ga5ef855ed955b00a2239ca16afbeb164f}
+
--- /dev/null
+# group `input_callback_reg` {#group__input__callback__reg}
+
+These are the functions you use to register your input callbacks.
+
+The functions are called when the appropriate midi message is matched on the associated device's input.
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a control change message (cc) callback.
+`public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a note on callback.
+`public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a note off callback.
+`public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register an after touch callback.
+`public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a pitch bend callback.
+`public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` | Register a song position callback.
+`public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | Register a program change callback.
+`public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | Register a channel pressure callback.
+`public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | Register a song select callback.
+`public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` | Register a tc quarter frame callback.
+`public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | Register a realtime callback.
+`public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` | Register a tune request callback.
+`public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` | Register a sysex callback.
+`public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | Register fall through callback.
+`public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` | Register a catch all callback.
+
+## Members
+
+#### `public void `[`midi_register_cc_callback`](#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga64ab672abbbe393c9c4a83110c8df718}
+
+Register a control change message (cc) callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_noteon_callback`](#group__input__callback__reg_1ga3962f276c17618923f1152779552103e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga3962f276c17618923f1152779552103e}
+
+Register a note on callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_noteoff_callback`](#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gac847b66051bd6d53b762958be0ec4c6d}
+
+Register a note off callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_aftertouch_callback`](#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaa95bc901bd9edff956a667c9a69dd01f}
+
+Register an after touch callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_pitchbend_callback`](#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1ga071a28f02ba14f53de219be70ebd9a48}
+
+Register a pitch bend callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_songposition_callback`](#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_three_byte_func_t func)` {#group__input__callback__reg_1gaf2adfd79637f3553d8f26deb1ca22ed6}
+
+Register a song position callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_progchange_callback`](#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gae6ba1a35a4cde9bd15dd42f87401d127}
+
+Register a program change callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_chanpressure_callback`](#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga39b31f1f4fb93917ce039b958f21b4f5}
+
+Register a channel pressure callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_songselect_callback`](#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1gaf9aafc76a2dc4b9fdbb4106cbda6ce72}
+
+Register a song select callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_tc_quarterframe_callback`](#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_two_byte_func_t func)` {#group__input__callback__reg_1ga0a119fada2becc628cb15d753b257e6e}
+
+Register a tc quarter frame callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_realtime_callback`](#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1ga764f440e857b89084b1a07f9da2ff93a}
+
+Register a realtime callback.
+
+The callback will be called for all of the real time message types.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_tunerequest_callback`](#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_one_byte_func_t func)` {#group__input__callback__reg_1gae40ff3ce20bda79fef87da24b8321cb1}
+
+Register a tune request callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_sysex_callback`](#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_sysex_func_t func)` {#group__input__callback__reg_1ga63ce9631b025785c1848d0122d4c4c48}
+
+Register a sysex callback.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_fallthrough_callback`](#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga7ed189164aa9682862b3181153afbd94}
+
+Register fall through callback.
+
+This is only called if a more specific callback is not matched and called. For instance, if you don't register a note on callback but you get a note on message the fall through callback will be called, if it is registered.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
+#### `public void `[`midi_register_catchall_callback`](#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t func)` {#group__input__callback__reg_1ga9dbfed568d047a6cd05708f11fe39e99}
+
+Register a catch all callback.
+
+If registered, the catch all callback is called for every message that is matched, even if a more specific or the fallthrough callback is registered.
+
+#### Parameters
+* `device` the device associate with
+
+* `func` the callback function to register
+
--- /dev/null
+# group `midi_device` {#group__midi__device}
+
+You use the functions when you are implementing your own midi device.
+
+You set a send function to actually send bytes via your device, this method is called when you call a send function with this device, for instance midi_send_cc
+
+You use the midi_device_input to process input data from the device and pass it through the device's associated callbacks.
+
+You use the midi_device_set_pre_input_process_func if you want to have a function called at the beginning of the device's process function, generally to poll for input and pass that into midi_device_input
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) |
+`enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) |
+`public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` | Process input bytes. This function parses bytes and calls the appropriate callbacks associated with the given device. You use this function if you are creating a custom device and you want to have midi input.
+`public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` | Set the callback function that will be used for sending output data bytes. This is only used if you're creating a custom device. You'll most likely want the callback function to disable interrupts so that you can call the various midi send functions without worrying about locking.
+`public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` | Set a callback which is called at the beginning of the midi_device_process call. This can be used to poll for input data and send the data through the midi_device_input function. You'll probably only use this if you're creating a custom device.
+`struct `[`_midi_device`](docs/api_midi_device.md#struct__midi__device) | This structure represents the input and output functions and processing data for a midi device.
+
+## Members
+
+#### `define `[`MIDI_INPUT_QUEUE_LENGTH`](#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8) {#group__midi__device_1ga4aaa419caebdca2bbdfc1331e79781a8}
+
+#### `enum `[`input_state_t`](#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621) {#group__midi__device_1gac203e877d3df4275ceb8e7180a61f621}
+
+ Values | Descriptions
+--------------------------------|---------------------------------------------
+IDLE |
+ONE_BYTE_MESSAGE |
+TWO_BYTE_MESSAGE |
+THREE_BYTE_MESSAGE |
+SYSEX_MESSAGE |
+
+#### `public void `[`midi_device_input`](#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t cnt,uint8_t * input)` {#group__midi__device_1gad8d3db8eb35d9cfa51ef036a0a9d70db}
+
+Process input bytes. This function parses bytes and calls the appropriate callbacks associated with the given device. You use this function if you are creating a custom device and you want to have midi input.
+
+#### Parameters
+* `device` the midi device to associate the input with
+
+* `cnt` the number of bytes you are processing
+
+* `input` the bytes to process
+
+#### `public void `[`midi_device_set_send_func`](#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_var_byte_func_t send_func)` {#group__midi__device_1ga59f5a46bdd4452f186cc73d9e96d4673}
+
+Set the callback function that will be used for sending output data bytes. This is only used if you're creating a custom device. You'll most likely want the callback function to disable interrupts so that you can call the various midi send functions without worrying about locking.
+
+#### Parameters
+* `device` the midi device to associate this callback with
+
+* `send_func` the callback function that will do the sending
+
+#### `public void `[`midi_device_set_pre_input_process_func`](#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69)`(`[`MidiDevice`](#struct__midi__device)` * device,midi_no_byte_func_t pre_process_func)` {#group__midi__device_1ga4de0841b87c04fc23cb56b6451f33b69}
+
+Set a callback which is called at the beginning of the midi_device_process call. This can be used to poll for input data and send the data through the midi_device_input function. You'll probably only use this if you're creating a custom device.
+
+#### Parameters
+* `device` the midi device to associate this callback with
+
+* `midi_no_byte_func_t` the actual callback function
+
+# struct `_midi_device` {#struct__midi__device}
+
+This structure represents the input and output functions and processing data for a midi device.
+
+A device can represent an actual physical device [serial port, usb port] or something virtual. You should not need to modify this structure directly.
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) |
+`public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) |
+`public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) |
+`public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) |
+`public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) |
+`public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) |
+`public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) |
+`public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) |
+`public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) |
+`public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) |
+`public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) |
+`public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) |
+`public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) |
+`public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) |
+`public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) |
+`public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) |
+`public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) |
+`public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) |
+`public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) |
+`public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) |
+`public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) |
+`public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) |
+
+## Members
+
+#### `public midi_var_byte_func_t `[`send_func`](docs/api_midi_device.md#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9) {#struct__midi__device_1a25d4c94b4bbccd5b98f1032b469f3ff9}
+
+#### `public midi_three_byte_func_t `[`input_cc_callback`](docs/api_midi_device.md#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1) {#struct__midi__device_1a6da5236c1bc73877728df92d213a78d1}
+
+#### `public midi_three_byte_func_t `[`input_noteon_callback`](docs/api_midi_device.md#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c) {#struct__midi__device_1aa10b15cf1a7fb825a5df0d2abbe34a1c}
+
+#### `public midi_three_byte_func_t `[`input_noteoff_callback`](docs/api_midi_device.md#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84) {#struct__midi__device_1aaf290043078534d3a5a0ea4c840eba84}
+
+#### `public midi_three_byte_func_t `[`input_aftertouch_callback`](docs/api_midi_device.md#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f) {#struct__midi__device_1acb0b4901c545cec4b28b126f2d8c315f}
+
+#### `public midi_three_byte_func_t `[`input_pitchbend_callback`](docs/api_midi_device.md#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18) {#struct__midi__device_1a305fea672caeb996f2233bf8cd2bef18}
+
+#### `public midi_three_byte_func_t `[`input_songposition_callback`](docs/api_midi_device.md#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586) {#struct__midi__device_1a5f3f13638b3fef3fc561ed1bf301d586}
+
+#### `public midi_two_byte_func_t `[`input_progchange_callback`](docs/api_midi_device.md#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da) {#struct__midi__device_1adaf1da617c9a10a9dcad00ab1959d3da}
+
+#### `public midi_two_byte_func_t `[`input_chanpressure_callback`](docs/api_midi_device.md#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7) {#struct__midi__device_1ab7ca2925c539915d43974eff604d85f7}
+
+#### `public midi_two_byte_func_t `[`input_songselect_callback`](docs/api_midi_device.md#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f) {#struct__midi__device_1a89bed8a5a55376120cfc0a62b42f057f}
+
+#### `public midi_two_byte_func_t `[`input_tc_quarterframe_callback`](docs/api_midi_device.md#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0) {#struct__midi__device_1ad9813e75d22e284f9f65a907d20600f0}
+
+#### `public midi_one_byte_func_t `[`input_realtime_callback`](docs/api_midi_device.md#struct__midi__device_1a9448eba4afb7e43650434748db3777be) {#struct__midi__device_1a9448eba4afb7e43650434748db3777be}
+
+#### `public midi_one_byte_func_t `[`input_tunerequest_callback`](docs/api_midi_device.md#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d) {#struct__midi__device_1a0cb8fd53e00cf1d4202d4fa04d038e8d}
+
+#### `public midi_sysex_func_t `[`input_sysex_callback`](docs/api_midi_device.md#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2) {#struct__midi__device_1afff9a0ce641762aaef24c1e6953ec9a2}
+
+#### `public midi_var_byte_func_t `[`input_fallthrough_callback`](docs/api_midi_device.md#struct__midi__device_1abb974ec6d734001b4a0e370f292be503) {#struct__midi__device_1abb974ec6d734001b4a0e370f292be503}
+
+#### `public midi_var_byte_func_t `[`input_catchall_callback`](docs/api_midi_device.md#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8) {#struct__midi__device_1aae0d535129d4fd650edc98eb3f7584f8}
+
+#### `public midi_no_byte_func_t `[`pre_input_process_callback`](docs/api_midi_device.md#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754) {#struct__midi__device_1aeb0bb8923d66c23d874e177dc4265754}
+
+#### `public uint8_t `[`input_buffer`](docs/api_midi_device.md#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a) {#struct__midi__device_1a7c5684857d6af4ebc4dc12da27bd6b2a}
+
+#### `public input_state_t `[`input_state`](docs/api_midi_device.md#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39) {#struct__midi__device_1a69a687d2d1c449ec15a11c07a5722e39}
+
+#### `public uint16_t `[`input_count`](docs/api_midi_device.md#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d) {#struct__midi__device_1a68dea8e7b6151e89c85c95caa612ee5d}
+
+#### `public uint8_t `[`input_queue_data`](docs/api_midi_device.md#struct__midi__device_1ada41de021135dc423abedcbb30f366ff) {#struct__midi__device_1ada41de021135dc423abedcbb30f366ff}
+
+#### `public `[`byteQueue_t`](#structbyte_queue__t)` `[`input_queue`](#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f) {#struct__midi__device_1a49c8538a8a02193c58e28a56eb695d8f}
+
--- /dev/null
+# group `midi_device_setup_process` {#group__midi__device__setup__process}
+
+These are method that you must use to initialize and run a device.
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Initialize a device.
+`public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Process input data.
+
+## Members
+
+#### `public void `[`midi_device_init`](#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaf29deddc94ea98a59daa0bde1aefd9d9}
+
+Initialize a device.
+
+You must call this before using the device in question.
+
+#### Parameters
+* `device` the device to initialize
+
+#### `public void `[`midi_device_process`](#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__midi__device__setup__process_1gaa3d5993d0e998a1b59bbf5ab9c7b492b}
+
+Process input data.
+
+This method drives the input processing, you must call this method frequently if you expect to have your input callbacks called.
+
+#### Parameters
+* `device` the device to process
+
--- /dev/null
+# group `midi_util` {#group__midi__util}
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) | An enumeration of the possible packet length values.
+`public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` | Test to see if the byte given is a status byte.
+`public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` | Test to see if the byte given is a realtime message.
+`public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` | Find the length of the packet associated with the status byte given.
+
+## Members
+
+#### `enum `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e) {#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e}
+
+ Values | Descriptions
+--------------------------------|---------------------------------------------
+UNDEFINED |
+ONE |
+TWO |
+THREE |
+
+An enumeration of the possible packet length values.
+
+#### `public bool `[`midi_is_statusbyte`](#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5)`(uint8_t theByte)` {#group__midi__util_1ga12e3b42ff9cbb4b4f2bc455fc8743ee5}
+
+Test to see if the byte given is a status byte.
+
+#### Parameters
+* `theByte` the byte to test
+
+#### Returns
+true if the byte given is a midi status byte
+
+#### `public bool `[`midi_is_realtime`](#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7)`(uint8_t theByte)` {#group__midi__util_1gad2f52c363e34a8000d80c983c324e2d7}
+
+Test to see if the byte given is a realtime message.
+
+#### Parameters
+* `theByte` the byte to test
+
+#### Returns
+true if it is a realtime message, false otherwise
+
+#### `public `[`midi_packet_length_t`](#group__midi__util_1gae29ff56aee2b430ffe53933b97e5e79e)` `[`midi_packet_length`](#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175)`(uint8_t status)` {#group__midi__util_1gaa168b43af6ae9de0debce1625e4b8175}
+
+Find the length of the packet associated with the status byte given.
+
+#### Parameters
+* `status` the status byte
+
+#### Returns
+the length of the packet, will return UNDEFINED if the byte is not a status byte or if it is a sysex status byte
+
--- /dev/null
+# group `send_functions` {#group__send__functions}
+
+These are the functions you use to send midi data through a device.
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` | Send a control change message (cc) via the given device.
+`public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | Send a note on message via the given device.
+`public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` | Send a note off message via the given device.
+`public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` | Send an after touch message via the given device.
+`public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` | Send a pitch bend message via the given device.
+`public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` | Send a program change message via the given device.
+`public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` | Send a channel pressure message via the given device.
+`public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a clock message via the given device.
+`public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a tick message via the given device.
+`public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a start message via the given device.
+`public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a continue message via the given device.
+`public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a stop message via the given device.
+`public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send an active sense message via the given device.
+`public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a reset message via the given device.
+`public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` | Send a tc quarter frame message via the given device.
+`public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` | Send a song position message via the given device.
+`public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` | Send a song select message via the given device.
+`public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` | Send a tune request message via the given device.
+`public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` | Send a byte via the given device.
+`public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` | Send up to 3 bytes of data.
+`public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` | Send an array of formatted midi data.
+
+## Members
+
+#### `public void `[`midi_send_cc`](#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t val)` {#group__send__functions_1gaaf884811c92df405ca8fe1a00082f960}
+
+Send a control change message (cc) via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `chan` the channel to send on, 0-15
+
+* `num` the cc num
+
+* `val` the value of that cc num
+
+#### `public void `[`midi_send_noteon`](#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1ga467bcf46dbf03ec269ce565b46bc2775}
+
+Send a note on message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `chan` the channel to send on, 0-15
+
+* `num` the note number
+
+* `vel` the note velocity
+
+#### `public void `[`midi_send_noteoff`](#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num,uint8_t vel)` {#group__send__functions_1gaedb7d8805425eef5d47d57ddcb4c7a49}
+
+Send a note off message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `chan` the channel to send on, 0-15
+
+* `num` the note number
+
+* `vel` the note velocity
+
+#### `public void `[`midi_send_aftertouch`](#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t note_num,uint8_t amt)` {#group__send__functions_1ga0014847571317a0e34b2ef46a6bc584f}
+
+Send an after touch message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `chan` the channel to send on, 0-15
+
+* `note_num` the note number
+
+* `amt` the after touch amount
+
+#### `public void `[`midi_send_pitchbend`](#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,int16_t amt)` {#group__send__functions_1gae5a4a1e71611e7534be80af9ce3d3491}
+
+Send a pitch bend message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `chan` the channel to send on, 0-15
+
+* `amt` the bend amount range: -8192..8191, 0 means no bend
+
+#### `public void `[`midi_send_programchange`](#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t num)` {#group__send__functions_1ga7b15588ef25e5e1ff09c2afc3151ce86}
+
+Send a program change message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `chan` the channel to send on, 0-15
+
+* `num` the program to change to
+
+#### `public void `[`midi_send_channelpressure`](#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t chan,uint8_t amt)` {#group__send__functions_1gaf23e69fdf812e89c0036f51f88ab2e1b}
+
+Send a channel pressure message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `chan` the channel to send on, 0-15
+
+* `amt` the amount of channel pressure
+
+#### `public void `[`midi_send_clock`](#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga4e1b11a7cdb0875f6e03ce7c79c581aa}
+
+Send a clock message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_tick`](#group__send__functions_1ga2b43c7d433d940c5b907595aac947972)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga2b43c7d433d940c5b907595aac947972}
+
+Send a tick message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_start`](#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga1569749a8d58ccc56789289d7c7245cc}
+
+Send a start message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_continue`](#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1gaed5dc29d754a27372e89ab8bc20ee120}
+
+Send a continue message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_stop`](#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga026e1a620276cb653ac501aa0d12a988}
+
+Send a stop message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_activesense`](#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga9b6e4c6ce4719d2604187b325620db37}
+
+Send an active sense message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_reset`](#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga3671e39a6d93ca9568fc493001af1b1b}
+
+Send a reset message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_tcquarterframe`](#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t time)` {#group__send__functions_1ga5b85639910eec280bb744c934d0fd45a}
+
+Send a tc quarter frame message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `time` the time of this quarter frame, range 0..16383
+
+#### `public void `[`midi_send_songposition`](#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t pos)` {#group__send__functions_1gab1c9eeef3b57a8cd2e6128d18e85eb7f}
+
+Send a song position message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `pos` the song position
+
+#### `public void `[`midi_send_songselect`](#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t song)` {#group__send__functions_1ga42de7838ba70d949af9a50f9facc3c50}
+
+Send a song select message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `song` the song to select
+
+#### `public void `[`midi_send_tunerequest`](#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656)`(`[`MidiDevice`](#struct__midi__device)` * device)` {#group__send__functions_1ga8db6c7e04d48e4d2266dd59118ca0656}
+
+Send a tune request message via the given device.
+
+#### Parameters
+* `device` the device to use for sending
+
+#### `public void `[`midi_send_byte`](#group__send__functions_1ga857e85eb90b288385642d4d991e09881)`(`[`MidiDevice`](#struct__midi__device)` * device,uint8_t b)` {#group__send__functions_1ga857e85eb90b288385642d4d991e09881}
+
+Send a byte via the given device.
+
+This is a generic method for sending data via the given midi device. This would be useful for sending sysex data or messages that are not implemented in this API, if there are any. Please contact the author if you find some so we can add them.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `b` the byte to send
+
+#### `public void `[`midi_send_data`](#group__send__functions_1ga36e2f2e45369d911b76969361679054b)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t byte0,uint8_t byte1,uint8_t byte2)` {#group__send__functions_1ga36e2f2e45369d911b76969361679054b}
+
+Send up to 3 bytes of data.
+
+% 4 is applied to count so that you can use this to pass sysex through
+
+#### Parameters
+* `device` the device to use for sending
+
+* `count` the count of bytes to send, %4 is applied
+
+* `byte0` the first byte
+
+* `byte1` the second byte, ignored if cnt % 4 != 2
+
+* `byte2` the third byte, ignored if cnt % 4 != 3
+
+#### `public void `[`midi_send_array`](#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead)`(`[`MidiDevice`](#struct__midi__device)` * device,uint16_t count,uint8_t * array)` {#group__send__functions_1ga245243cb1da18d2cea18d4b18d846ead}
+
+Send an array of formatted midi data.
+
+Can be used for sysex.
+
+#### Parameters
+* `device` the device to use for sending
+
+* `count` the count of bytes to send
+
+* `array` the array of bytes
+
--- /dev/null
+# group `sysex_tools` {#group__sysex__tools}
+
+## Summary
+
+ Members | Descriptions
+--------------------------------|---------------------------------------------
+`public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` | Compute the length of a message after it is encoded.
+`public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` | Compute the length of a message after it is decoded.
+`public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` | Encode data so that it can be transmitted safely in a sysex message.
+`public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` | Decode encoded data.
+
+## Members
+
+#### `public uint16_t `[`sysex_encoded_length`](#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a)`(uint16_t decoded_length)` {#group__sysex__tools_1ga061e5607030412d6e62e2390d8013f0a}
+
+Compute the length of a message after it is encoded.
+
+#### Parameters
+* `decoded_length` The length, in bytes, of the message to encode.
+
+#### Returns
+The length, in bytes, of the message after encodeing.
+
+#### `public uint16_t `[`sysex_decoded_length`](#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0)`(uint16_t encoded_length)` {#group__sysex__tools_1ga121fc227d3acc1c0ea08c9a5c26fa3b0}
+
+Compute the length of a message after it is decoded.
+
+#### Parameters
+* `encoded_length` The length, in bytes, of the encoded message.
+
+#### Returns
+The length, in bytes, of the message after it is decoded.
+
+#### `public uint16_t `[`sysex_encode`](#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742)`(uint8_t * encoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1ga54d77f8d32f92a6f329daefa2b314742}
+
+Encode data so that it can be transmitted safely in a sysex message.
+
+#### Parameters
+* `encoded` The output data buffer, must be at least sysex_encoded_length(length) bytes long.
+
+* `source` The input buffer of data to be encoded.
+
+* `length` The number of bytes from the input buffer to encode.
+
+#### Returns
+number of bytes encoded.
+
+#### `public uint16_t `[`sysex_decode`](#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229)`(uint8_t * decoded,const uint8_t * source,uint16_t length)` {#group__sysex__tools_1gaaad1d9ba2d5eca709a0ab4ba40662229}
+
+Decode encoded data.
+
+#### Parameters
+* `decoded` The output data buffer, must be at least sysex_decoded_length(length) bytes long.
+
+* `source` The input buffer of data to be decoded.
+
+* `length` The number of bytes from the input buffer to decode.
+
+#### Returns
+number of bytes decoded.
+
--- /dev/null
+tmk_core/protocol
+tmk_core/protocol/bluefruit
+tmk_core/protocol/chibios
+tmk_core/protocol/iwrap
+tmk_core/protocol/lufa
+tmk_core/protocol/mbed
+tmk_core/protocol/midi
+tmk_core/protocol/midi/bytequeue
+tmk_core/protocol/midi/Config
+tmk_core/protocol/pjrc
+tmk_core/protocol/usb_hid
+tmk_core/protocol/vusb
+tmk_core/tool
+tmk_core/tool/chibios
+quantum
+quantum/api
+quantum/audio
+quantum/keymap_extras
+quantum/process_keycode
+quantum/serial_link
+quantum/serial_link/protocol
+quantum/serial_link/system
+quantum/serial_link/tests
+quantum/tools
+quantum/visualizer
+quantum/visualizer/resources
+drivers
+drivers/avr
+drivers/ugfx
+drivers/ugfx/gdisp
+drivers/ugfx/gdisp/is31fl3731c
+drivers/ugfx/gdisp/st7565
#include <fauxclicky.h>
#endif
+/** \brief Called to execute an action.
+ *
+ * FIXME: Needs documentation.
+ */
void action_exec(keyevent_t event)
{
if (!IS_NOEVENT(event)) {
bool swap_hands = false;
bool swap_held = false;
+/** \brief Process Hand Swap
+ *
+ * FIXME: Needs documentation.
+ */
void process_hand_swap(keyevent_t *event) {
static swap_state_row_t swap_state[MATRIX_ROWS];
}
#ifndef NO_ACTION_TAPPING
-// Allows for handling tap-hold actions immediately instead of waiting for TAPPING_TERM or another keypress.
+/** \brief Allows for handling tap-hold actions immediately instead of waiting for TAPPING_TERM or another keypress.
+ *
+ * FIXME: Needs documentation.
+ */
void process_record_tap_hint(keyrecord_t *record)
{
action_t action = layer_switch_get_action(record->event.key);
}
#endif
+/** \brief Take a key event (key press or key release) and processes it.
+ *
+ * FIXME: Needs documentation.
+ */
void process_record(keyrecord_t *record)
{
if (IS_NOEVENT(record->event)) { return; }
process_action(record, action);
}
+/** \brief Take an action and processes it.
+ *
+ * FIXME: Needs documentation.
+ */
void process_action(keyrecord_t *record, action_t action)
{
keyevent_t event = record->event;
-/*
- * Utilities for actions.
+/** \brief Utilities for actions. (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
*/
void register_code(uint8_t code)
{
}
}
+/** \brief Utilities for actions. (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
void unregister_code(uint8_t code)
{
if (code == KC_NO) {
}
}
+/** \brief Utilities for actions. (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
void register_mods(uint8_t mods)
{
if (mods) {
}
}
+/** \brief Utilities for actions. (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
void unregister_mods(uint8_t mods)
{
if (mods) {
}
}
+/** \brief Utilities for actions. (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
void clear_keyboard(void)
{
clear_mods();
clear_keyboard_but_mods();
}
+/** \brief Utilities for actions. (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
void clear_keyboard_but_mods(void)
{
clear_weak_mods();
#endif
}
+/** \brief Utilities for actions. (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
bool is_tap_key(keypos_t key)
{
action_t action = layer_switch_get_action(key);
}
-/*
- * debug print
+/** \brief Debug print (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
*/
void debug_event(keyevent_t event)
{
dprintf("%04X%c(%u)", (event.key.row<<8 | event.key.col), (event.pressed ? 'd' : 'u'), event.time);
}
+/** \brief Debug print (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
void debug_record(keyrecord_t record)
{
debug_event(record.event);
#endif
}
+/** \brief Debug print (FIXME: Needs better description)
+ *
+ * FIXME: Needs documentation.
+ */
void debug_action(action_t action)
{
switch (action.kind.id) {
#ifndef ACTION_CODE_H
#define ACTION_CODE_H
-/* Action codes
- * ============
- * 16bit code: action_kind(4bit) + action_parameter(12bit)
+/** \brief Action codes
*
+ * 16bit code: action_kind(4bit) + action_parameter(12bit)
*
* Key Actions(00xx)
* -----------------
* 001r|mods|0000 00xx (reserved)
* 001r|mods| keycode Modifiers with Tap Key(Dual role)
*
- *
* Other Keys(01xx)
* ----------------
* ACT_USAGE(0100): TODO: Not needed?
* 0100|10| usage(10) (reserved)
* 0100|11| usage(10) (reserved)
*
- *
* ACT_MOUSEKEY(0101): TODO: Merge these two actions to conserve space?
* 0101|xxxx| keycode Mouse key
*
* ACT_SWAP_HANDS(0110):
* 0110|xxxx| keycode Swap hands (keycode on tap, or options)
*
- *
* 0111|xxxx xxxx xxxx (reserved)
*
- *
* Layer Actions(10xx)
* -------------------
* ACT_LAYER(1000):
* 101E|LLLL|1111 xxxx Reserved (0xF5-FF)
* ELLLL: layer 0-31(E: extra bit for layer 16-31)
*
- *
* Extensions(11xx)
* ----------------
* ACT_MACRO(1100):
};
-/* Action Code Struct
+/** \brief Action Code Struct
*
* NOTE:
* In avr-gcc bit field seems to be assigned from LSB(bit0) to MSB(bit15).
#define ACTION(kind, param) ((kind)<<12 | (param))
-/*
- * Key Actions
- */
-/* Mod bits: 43210
+/** \brief Key Actions
+ *
+ * Mod bits: 43210
* bit 0 ||||+- Control
* bit 1 |||+-- Shift
* bit 2 ||+--- Alt
#define ACTION_MODS_TAP_TOGGLE(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | MODS_TAP_TOGGLE)
-/*
- * Other Keys
+/** \brief Other Keys
*/
enum usage_pages {
PAGE_SYSTEM,
-/*
- * Layer Actions
+/** \brief Layer Actions
*/
enum layer_param_on {
ON_PRESS = 1,
ON_RELEASE = 2,
ON_BOTH = 3,
};
+
+/** \brief Layer Actions
+ */
enum layer_param_bit_op {
OP_BIT_AND = 0,
OP_BIT_OR = 1,
OP_BIT_XOR = 2,
OP_BIT_SET = 3,
};
+
+/** \brief Layer Actions
+ */
enum layer_param_tap_op {
OP_TAP_TOGGLE = 0xF0,
OP_ON_OFF,
#define ACTION_DEFAULT_LAYER_BIT_SET(part, bits) ACTION_LAYER_BITOP(OP_BIT_SET, (part), (bits), 0)
-/*
- * Extensions
+/** \brief Extensions
*/
enum backlight_opt {
BACKLIGHT_INCREASE = 0,
#endif
-/*
- * Default Layer State
+/** \brief Default Layer State
*/
uint32_t default_layer_state = 0;
+/** \brief Default Layer State Set At Keyboard Level
+ *
+ * FIXME: Needs docs
+ */
__attribute__((weak))
uint32_t default_layer_state_set_kb(uint32_t state) {
return state;
}
+/** \brief Default Layer State Set
+ *
+ * FIXME: Needs docs
+ */
static void default_layer_state_set(uint32_t state)
{
state = default_layer_state_set_kb(state);
clear_keyboard_but_mods(); // To avoid stuck keys
}
+/** \brief Default Layer Print
+ *
+ * FIXME: Needs docs
+ */
void default_layer_debug(void)
{
dprintf("%08lX(%u)", default_layer_state, biton32(default_layer_state));
}
+/** \brief Default Layer Set
+ *
+ * FIXME: Needs docs
+ */
void default_layer_set(uint32_t state)
{
default_layer_state_set(state);
}
#ifndef NO_ACTION_LAYER
+/** \brief Default Layer Or
+ *
+ * FIXME: Needs docs
+ */
void default_layer_or(uint32_t state)
{
default_layer_state_set(default_layer_state | state);
}
+/** \brief Default Layer And
+ *
+ * FIXME: Needs docs
+ */
void default_layer_and(uint32_t state)
{
default_layer_state_set(default_layer_state & state);
}
+/** \brief Default Layer Xor
+ *
+ * FIXME: Needs docs
+ */
void default_layer_xor(uint32_t state)
{
default_layer_state_set(default_layer_state ^ state);
#ifndef NO_ACTION_LAYER
-/*
- * Keymap Layer State
+/** \brief Keymap Layer State
*/
uint32_t layer_state = 0;
+/** \brief Layer state set user
+ *
+ * FIXME: Needs docs
+ */
__attribute__((weak))
uint32_t layer_state_set_user(uint32_t state) {
return state;
}
+/** \brief Layer state set keyboard
+ *
+ * FIXME: Needs docs
+ */
__attribute__((weak))
uint32_t layer_state_set_kb(uint32_t state) {
return layer_state_set_user(state);
}
+/** \brief Layer state set
+ *
+ * FIXME: Needs docs
+ */
void layer_state_set(uint32_t state)
{
state = layer_state_set_kb(state);
clear_keyboard_but_mods(); // To avoid stuck keys
}
+/** \brief Layer clear
+ *
+ * FIXME: Needs docs
+ */
void layer_clear(void)
{
layer_state_set(0);
}
+/** \brief Layer state is
+ *
+ * FIXME: Needs docs
+ */
bool layer_state_is(uint8_t layer)
{
return layer_state_cmp(layer_state, layer);
}
+/** \brief Layer state compare
+ *
+ * FIXME: Needs docs
+ */
bool layer_state_cmp(uint32_t cmp_layer_state, uint8_t layer) {
if (!cmp_layer_state) { return layer == 0; }
return (cmp_layer_state & (1UL<<layer)) != 0;
}
+/** \brief Layer move
+ *
+ * FIXME: Needs docs
+ */
void layer_move(uint8_t layer)
{
layer_state_set(1UL<<layer);
}
+/** \brief Layer on
+ *
+ * FIXME: Needs docs
+ */
void layer_on(uint8_t layer)
{
layer_state_set(layer_state | (1UL<<layer));
}
+/** \brief Layer off
+ *
+ * FIXME: Needs docs
+ */
void layer_off(uint8_t layer)
{
layer_state_set(layer_state & ~(1UL<<layer));
}
+/** \brief Layer invert
+ *
+ * FIXME: Needs docs
+ */
void layer_invert(uint8_t layer)
{
layer_state_set(layer_state ^ (1UL<<layer));
}
+/** \brief Layer or
+ *
+ * FIXME: Needs docs
+ */
void layer_or(uint32_t state)
{
layer_state_set(layer_state | state);
}
+/** \brief Layer and
+ *
+ * FIXME: Needs docs
+ */
void layer_and(uint32_t state)
{
layer_state_set(layer_state & state);
}
+/** \brief Layer xor
+ *
+ * FIXME: Needs docs
+ */
void layer_xor(uint32_t state)
{
layer_state_set(layer_state ^ state);
}
+/** \brief Layer debug printing
+ *
+ * FIXME: Needs docs
+ */
void layer_debug(void)
{
dprintf("%08lX(%u)", layer_state, biton32(layer_state));
}
#endif
-/*
+/** \brief Store or get action (FIXME: Needs better summary)
+ *
* Make sure the action triggered when the key is released is the same
* one as the one triggered on press. It's important for the mod keys
* when the layer is switched after the down event but before the up
}
+/** \brief Layer switch get layer
+ *
+ * FIXME: Needs docs
+ */
int8_t layer_switch_get_layer(keypos_t key)
{
#ifndef NO_ACTION_LAYER
#endif
}
+/** \brief Layer switch get layer
+ *
+ * FIXME: Needs docs
+ */
action_t layer_switch_get_action(keypos_t key)
{
return action_for_key(layer_switch_get_layer(key), key);
#ifndef NO_ACTION_MACRO
#define MACRO_READ() (macro = MACRO_GET(macro_p++))
+/** \brief Action Macro Play
+ *
+ * FIXME: Needs doc
+ */
void action_macro_play(const macro_t *macro_p)
{
macro_t macro = END;
static void debug_waiting_buffer(void);
+/** \brief Action Tapping Process
+ *
+ * FIXME: Needs doc
+ */
void action_tapping_process(keyrecord_t record)
{
if (process_tapping(&record)) {
}
-/* Tapping
+/** \brief Tapping
*
* Rule: Tap key is typed(pressed and released) within TAPPING_TERM.
* (without interfering by typing other key)
}
-/*
- * Waiting buffer
+/** \brief Waiting buffer enq
+ *
+ * FIXME: Needs docs
*/
bool waiting_buffer_enq(keyrecord_t record)
{
return true;
}
+/** \brief Waiting buffer clear
+ *
+ * FIXME: Needs docs
+ */
void waiting_buffer_clear(void)
{
waiting_buffer_head = 0;
waiting_buffer_tail = 0;
}
+/** \brief Waiting buffer typed
+ *
+ * FIXME: Needs docs
+ */
bool waiting_buffer_typed(keyevent_t event)
{
for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) {
return false;
}
+/** \brief Waiting buffer has anykey pressed
+ *
+ * FIXME: Needs docs
+ */
__attribute__((unused))
bool waiting_buffer_has_anykey_pressed(void)
{
return false;
}
-/* scan buffer for tapping */
+/** \brief Scan buffer for tapping
+ *
+ * FIXME: Needs docs
+ */
void waiting_buffer_scan_tap(void)
{
// tapping already is settled
}
-/*
- * debug print
+/** \brief Tapping key debug print
+ *
+ * FIXME: Needs docs
*/
static void debug_tapping_key(void)
{
debug("TAPPING_KEY="); debug_record(tapping_key); debug("\n");
}
+/** \brief Waiting buffer debug print
+ *
+ * FIXME: Needs docs
+ */
static void debug_waiting_buffer(void)
{
debug("{ ");
/* oneshot layer */
#ifndef NO_ACTION_ONESHOT
-/* oneshot_layer_data bits
-* LLLL LSSS
-* where:
-* L => are layer bits
-* S => oneshot state bits
-*/
+/** \brief oneshot_layer_data bits
+ * LLLL LSSS
+ * where:
+ * L => are layer bits
+ * S => oneshot state bits
+ */
static int8_t oneshot_layer_data = 0;
inline uint8_t get_oneshot_layer(void) { return oneshot_layer_data >> 3; }
}
#endif
-/* Oneshot layer */
+/** \brief Set oneshot layer
+ *
+ * FIXME: needs doc
+ */
void set_oneshot_layer(uint8_t layer, uint8_t state)
{
oneshot_layer_data = layer << 3 | state;
oneshot_layer_time = timer_read();
#endif
}
+/** \brief Reset oneshot layer
+ *
+ * FIXME: needs doc
+ */
void reset_oneshot_layer(void) {
oneshot_layer_data = 0;
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
oneshot_layer_time = 0;
#endif
}
+/** \brief Clear oneshot layer
+ *
+ * FIXME: needs doc
+ */
void clear_oneshot_layer_state(oneshot_fullfillment_t state)
{
uint8_t start_state = oneshot_layer_data;
#endif
}
}
+/** \brief Is oneshot layer active
+ *
+ * FIXME: needs doc
+ */
bool is_oneshot_layer_active(void)
{
return get_oneshot_layer_state();
}
#endif
+/** \brief Send keyboard report
+ *
+ * FIXME: needs doc
+ */
void send_keyboard_report(void) {
keyboard_report->mods = real_mods;
keyboard_report->mods |= weak_mods;
host_keyboard_send(keyboard_report);
}
-/* modifier */
+/** \brief Get mods
+ *
+ * FIXME: needs doc
+ */
uint8_t get_mods(void) { return real_mods; }
+/** \brief add mods
+ *
+ * FIXME: needs doc
+ */
void add_mods(uint8_t mods) { real_mods |= mods; }
+/** \brief del mods
+ *
+ * FIXME: needs doc
+ */
void del_mods(uint8_t mods) { real_mods &= ~mods; }
+/** \brief set mods
+ *
+ * FIXME: needs doc
+ */
void set_mods(uint8_t mods) { real_mods = mods; }
+/** \brief clear mods
+ *
+ * FIXME: needs doc
+ */
void clear_mods(void) { real_mods = 0; }
-/* weak modifier */
+/** \brief get weak mods
+ *
+ * FIXME: needs doc
+ */
uint8_t get_weak_mods(void) { return weak_mods; }
+/** \brief add weak mods
+ *
+ * FIXME: needs doc
+ */
void add_weak_mods(uint8_t mods) { weak_mods |= mods; }
+/** \brief del weak mods
+ *
+ * FIXME: needs doc
+ */
void del_weak_mods(uint8_t mods) { weak_mods &= ~mods; }
+/** \brief set weak mods
+ *
+ * FIXME: needs doc
+ */
void set_weak_mods(uint8_t mods) { weak_mods = mods; }
+/** \brief clear weak mods
+ *
+ * FIXME: needs doc
+ */
void clear_weak_mods(void) { weak_mods = 0; }
/* macro modifier */
+/** \brief get macro mods
+ *
+ * FIXME: needs doc
+ */
uint8_t get_macro_mods(void) { return macro_mods; }
+/** \brief add macro mods
+ *
+ * FIXME: needs doc
+ */
void add_macro_mods(uint8_t mods) { macro_mods |= mods; }
+/** \brief del macro mods
+ *
+ * FIXME: needs doc
+ */
void del_macro_mods(uint8_t mods) { macro_mods &= ~mods; }
+/** \brief set macro mods
+ *
+ * FIXME: needs doc
+ */
void set_macro_mods(uint8_t mods) { macro_mods = mods; }
+/** \brief clear macro mods
+ *
+ * FIXME: needs doc
+ */
void clear_macro_mods(void) { macro_mods = 0; }
-/* Oneshot modifier */
#ifndef NO_ACTION_ONESHOT
+/** \brief set oneshot mods
+ *
+ * FIXME: needs doc
+ */
void set_oneshot_mods(uint8_t mods)
{
oneshot_mods = mods;
oneshot_time = timer_read();
#endif
}
+/** \brief clear oneshot mods
+ *
+ * FIXME: needs doc
+ */
void clear_oneshot_mods(void)
{
oneshot_mods = 0;
oneshot_time = 0;
#endif
}
+/** \brief get oneshot mods
+ *
+ * FIXME: needs doc
+ */
uint8_t get_oneshot_mods(void)
{
return oneshot_mods;
}
#endif
-/*
- * inspect keyboard state
+/** \brief inspect keyboard state
+ *
+ * FIXME: needs doc
*/
uint8_t has_anymod(void)
{
#endif
-/* Bootloader Size in *bytes*
+/** \brief Bootloader Size in *bytes*
*
* AVR Boot section size are defined by setting BOOTSZ fuse in fact. Consult with your MCU datasheet.
* Note that 'Word'(2 bytes) size and address are used in datasheet while TMK uses 'Byte'.
*
- *
* Size of Bootloaders in bytes:
* Atmel DFU loader(ATmega32U4) 4096
* Atmel DFU loader(AT90USB128) 8192
* Teensy halfKay(ATmega32U4) 512
* Teensy++ halfKay(AT90USB128) 1024
*
- *
* AVR Boot section is located at the end of Flash memory like the followings.
*
- *
* byte Atmel/LUFA(ATMega32u4) byte Atmel(AT90SUB128)
* 0x0000 +---------------+ 0x00000 +---------------+
* | | | |
* | Bootloader | 512B | Bootloader | 1KB
* 0x7FFF +---------------+ 0x1FFFF +---------------+
*/
-
#define FLASH_SIZE (FLASHEND + 1L)
#if !defined(BOOTLOADER_SIZE)
#define BOOT_SIZE_1024 0b010
#define BOOT_SIZE_2048 0b000
-/*
- * Entering the Bootloader via Software
+/** \brief Entering the Bootloader via Software
+ *
* http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
*/
#define BOOTLOADER_RESET_KEY 0xB007B007
uint32_t reset_key __attribute__ ((section (".noinit")));
-/* initialize MCU status by watchdog reset */
+/** \brief initialize MCU status by watchdog reset
+ *
+ * FIXME: needs doc
+ */
void bootloader_jump(void) {
#if !defined(BOOTLOADER_SIZE)
*/
#define SLEEP_LED_TIMER_TOP F_CPU/(256*64)
+/** \brief Sleep LED initialization
+ *
+ * FIXME: needs doc
+ */
void sleep_led_init(void)
{
/* Timer1 setup */
SREG = sreg;
}
+/** \brief Sleep LED enable
+ *
+ * FIXME: needs doc
+ */
void sleep_led_enable(void)
{
/* Enable Compare Match Interrupt */
TIMSK1 |= _BV(OCIE1A);
}
+/** \brief Sleep LED disable
+ *
+ * FIXME: needs doc
+ */
void sleep_led_disable(void)
{
/* Disable Compare Match Interrupt */
TIMSK1 &= ~_BV(OCIE1A);
}
+/** \brief Sleep LED toggle
+ *
+ * FIXME: needs doc
+ */
void sleep_led_toggle(void)
{
/* Disable Compare Match Interrupt */
}
-/* Breathing Sleep LED brighness(PWM On period) table
+/** \brief Breathing Sleep LED brighness(PWM On period) table
+ *
* (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
*
* http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
)
+/** \brief Suspend idle
+ *
+ * FIXME: needs doc
+ */
void suspend_idle(uint8_t time)
{
cli();
}
#ifndef NO_SUSPEND_POWER_DOWN
-/* Power down MCU with watchdog timer
+/** \brief Power down MCU with watchdog timer
+ *
* wdto: watchdog timer timeout defined in <avr/wdt.h>
* WDTO_15MS
* WDTO_30MS
*/
static uint8_t wdt_timeout = 0;
+/** \brief Power down
+ *
+ * FIXME: needs doc
+ */
static void power_down(uint8_t wdto)
{
#ifdef PROTOCOL_LUFA
}
#endif
+/** \brief Suspend power down
+ *
+ * FIXME: needs doc
+ */
void suspend_power_down(void)
{
#ifndef NO_SUSPEND_POWER_DOWN
return false;
}
-// run immediately after wakeup
+/** \brief run immediately after wakeup
+ *
+ * FIXME: needs doc
+ */
void suspend_wakeup_init(void)
{
// clear keyboard state
// NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
volatile uint32_t timer_count;
+/** \brief timer initialization
+ *
+ * FIXME: needs doc
+ */
void timer_init(void)
{
#if TIMER_PRESCALER == 1
#endif
}
+/** \brief timer clear
+ *
+ * FIXME: needs doc
+ */
inline
void timer_clear(void)
{
}
}
+/** \brief timer read
+ *
+ * FIXME: needs doc
+ */
inline
uint16_t timer_read(void)
{
return (t & 0xFFFF);
}
+/** \brief timer read32
+ *
+ * FIXME: needs doc
+ */
inline
uint32_t timer_read32(void)
{
return t;
}
+/** \brief timer elapsed
+ *
+ * FIXME: needs doc
+ */
inline
uint16_t timer_elapsed(uint16_t last)
{
return TIMER_DIFF_16((t & 0xFFFF), last);
}
+/** \brief timer elapsed32
+ *
+ * FIXME: needs doc
+ */
inline
uint32_t timer_elapsed32(uint32_t last)
{
backlight_config_t backlight_config;
+/** \brief Backlight initialization
+ *
+ * FIXME: needs doc
+ */
void backlight_init(void)
{
/* check signature */
backlight_set(backlight_config.enable ? backlight_config.level : 0);
}
+/** \brief Backlight increase
+ *
+ * FIXME: needs doc
+ */
void backlight_increase(void)
{
if(backlight_config.level < BACKLIGHT_LEVELS)
backlight_set(backlight_config.level);
}
+/** \brief Backlight decrease
+ *
+ * FIXME: needs doc
+ */
void backlight_decrease(void)
{
if(backlight_config.level > 0)
backlight_set(backlight_config.level);
}
+/** \brief Backlight toggle
+ *
+ * FIXME: needs doc
+ */
void backlight_toggle(void)
{
backlight_config.enable ^= 1;
backlight_set(backlight_config.enable ? backlight_config.level : 0);
}
+/** \brief Backlight step through levels
+ *
+ * FIXME: needs doc
+ */
void backlight_step(void)
{
backlight_config.level++;
backlight_set(backlight_config.level);
}
+/** \brief Backlight set level
+ *
+ * FIXME: needs doc
+ */
void backlight_level(uint8_t level)
{
if (level > BACKLIGHT_LEVELS)
backlight_set(backlight_config.level);
}
+/** \brief Get backlight level
+ *
+ * FIXME: needs doc
+ */
uint8_t get_backlight_level(void)
{
return backlight_config.level;
keymap_config_t keymap_config;
+/** \brief Bootmagic
+ *
+ * FIXME: needs doc
+ */
void bootmagic(void)
{
/* check signature */
}
}
+/** \brief Scan Keycode
+ *
+ * FIXME: needs doc
+ */
static bool scan_keycode(uint8_t keycode)
{
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
return false;
}
+/** \brief Bootmagic Scan Keycode
+ *
+ * FIXME: needs doc
+ */
bool bootmagic_scan_keycode(uint8_t keycode)
{
if (!scan_keycode(BOOTMAGIC_KEY_SALT)) return false;
return scan_keycode(keycode);
-}
\ No newline at end of file
+}
#define BOOTMAGIC_H
+/* FIXME: Add special doxygen comments for defines here. */
+
/* bootmagic salt key */
#ifndef BOOTMAGIC_KEY_SALT
#define BOOTMAGIC_KEY_SALT KC_SPACE
#define MAGIC_ADDR (unsigned long*)(SYMVAL(__ram0_end__) - 4)
+/** \brief Jump to the bootloader
+ *
+ * FIXME: needs doc
+ */
void bootloader_jump(void) {
*MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader
NVIC_SystemReset();
}
+/** \brief Enter bootloader mode if requested
+ *
+ * FIXME: needs doc
+ */
void enter_bootloader_mode_if_requested(void) {
unsigned long* check = MAGIC_ADDR;
if(*check == BOOTLOADER_MAGIC) {
#define EEESIZE 0x39
#endif
+/** \brief eeprom initialization
+ *
+ * FIXME: needs doc
+ */
void eeprom_initialize(void)
{
uint32_t count=0;
#define FlexRAM ((uint8_t *)0x14000000)
+/** \brief eeprom read byte
+ *
+ * FIXME: needs doc
+ */
uint8_t eeprom_read_byte(const uint8_t *addr)
{
uint32_t offset = (uint32_t)addr;
return FlexRAM[offset];
}
+/** \brief eeprom read word
+ *
+ * FIXME: needs doc
+ */
uint16_t eeprom_read_word(const uint16_t *addr)
{
uint32_t offset = (uint32_t)addr;
return *(uint16_t *)(&FlexRAM[offset]);
}
+/** \brief eeprom read dword
+ *
+ * FIXME: needs doc
+ */
uint32_t eeprom_read_dword(const uint32_t *addr)
{
uint32_t offset = (uint32_t)addr;
return *(uint32_t *)(&FlexRAM[offset]);
}
+/** \brief eeprom read block
+ *
+ * FIXME: needs doc
+ */
void eeprom_read_block(void *buf, const void *addr, uint32_t len)
{
uint32_t offset = (uint32_t)addr;
}
}
+/** \brief eeprom is ready
+ *
+ * FIXME: needs doc
+ */
int eeprom_is_ready(void)
{
return (FTFL->FCNFG & FTFL_FCNFG_EEERDY) ? 1 : 0;
}
+/** \brief flexram wait
+ *
+ * FIXME: needs doc
+ */
static void flexram_wait(void)
{
while (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) {
}
}
+/** \brief eeprom_write_byte
+ *
+ * FIXME: needs doc
+ */
void eeprom_write_byte(uint8_t *addr, uint8_t value)
{
uint32_t offset = (uint32_t)addr;
}
}
+/** \brief eeprom write word
+ *
+ * FIXME: needs doc
+ */
void eeprom_write_word(uint16_t *addr, uint16_t value)
{
uint32_t offset = (uint32_t)addr;
#endif
}
+/** \brief eeprom write dword
+ *
+ * FIXME: needs doc
+ */
void eeprom_write_dword(uint32_t *addr, uint32_t value)
{
uint32_t offset = (uint32_t)addr;
#endif
}
+/** \brief eeprom write block
+ *
+ * FIXME: needs doc
+ */
void eeprom_write_block(const void *buf, void *addr, uint32_t len)
{
uint32_t offset = (uint32_t)addr;
#include "suspend.h"
#include "wait.h"
+/** \brief suspend idle
+ *
+ * FIXME: needs doc
+ */
void suspend_idle(uint8_t time) {
// TODO: this is not used anywhere - what units is 'time' in?
wait_ms(time);
}
+/** \brief suspend power down
+ *
+ * FIXME: needs doc
+ */
void suspend_power_down(void) {
// TODO: figure out what to power down and how
// shouldn't power down TPM/FTM if we want a breathing LED
wait_ms(17);
}
+/** \brief suspend wakeup condition
+ *
+ * FIXME: needs doc
+ */
__attribute__ ((weak)) void matrix_power_up(void) {}
__attribute__ ((weak)) void matrix_power_down(void) {}
bool suspend_wakeup_condition(void)
return false;
}
-// run immediately after wakeup
+/** \brief suspend wakeup condition
+ *
+ * run immediately after wakeup
+ * FIXME: needs doc
+ */
void suspend_wakeup_init(void)
{
// clear keyboard state
#ifndef COMMAND_H
#define COMMAND
+/* FIXME: Add doxygen comments for the behavioral defines in here. */
+
/* TODO: Refactoring */
typedef enum { ONESHOT, CONSOLE, MOUSEKEY } command_state_t;
extern command_state_t command_state;
#define XMAGIC_KC(key) KC_##key
#define MAGIC_KC(key) XMAGIC_KC(key)
-#endif
\ No newline at end of file
+#endif
#include "eeprom.h"
#include "eeconfig.h"
+/** \brief eeconfig initialization
+ *
+ * FIXME: needs doc
+ */
void eeconfig_init(void)
{
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
#endif
}
+/** \brief eeconfig enable
+ *
+ * FIXME: needs doc
+ */
void eeconfig_enable(void)
{
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
}
+/** \brief eeconfig disable
+ *
+ * FIXME: needs doc
+ */
void eeconfig_disable(void)
{
eeprom_update_word(EECONFIG_MAGIC, 0xFFFF);
}
+/** \brief eeconfig is enabled
+ *
+ * FIXME: needs doc
+ */
bool eeconfig_is_enabled(void)
{
return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER);
}
+/** \brief eeconfig read debug
+ *
+ * FIXME: needs doc
+ */
uint8_t eeconfig_read_debug(void) { return eeprom_read_byte(EECONFIG_DEBUG); }
+/** \brief eeconfig update debug
+ *
+ * FIXME: needs doc
+ */
void eeconfig_update_debug(uint8_t val) { eeprom_update_byte(EECONFIG_DEBUG, val); }
+/** \brief eeconfig read default layer
+ *
+ * FIXME: needs doc
+ */
uint8_t eeconfig_read_default_layer(void) { return eeprom_read_byte(EECONFIG_DEFAULT_LAYER); }
+/** \brief eeconfig update default layer
+ *
+ * FIXME: needs doc
+ */
void eeconfig_update_default_layer(uint8_t val) { eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val); }
+/** \brief eeconfig read keymap
+ *
+ * FIXME: needs doc
+ */
uint8_t eeconfig_read_keymap(void) { return eeprom_read_byte(EECONFIG_KEYMAP); }
+/** \brief eeconfig update keymap
+ *
+ * FIXME: needs doc
+ */
void eeconfig_update_keymap(uint8_t val) { eeprom_update_byte(EECONFIG_KEYMAP, val); }
#ifdef BACKLIGHT_ENABLE
+/** \brief eeconfig read backlight
+ *
+ * FIXME: needs doc
+ */
uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
+/** \brief eeconfig update backlight
+ *
+ * FIXME: needs doc
+ */
void eeconfig_update_backlight(uint8_t val) { eeprom_update_byte(EECONFIG_BACKLIGHT, val); }
#endif
#ifdef AUDIO_ENABLE
+/** \brief eeconfig read audio
+ *
+ * FIXME: needs doc
+ */
uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO); }
+/** \brief eeconfig update audio
+ *
+ * FIXME: needs doc
+ */
void eeconfig_update_audio(uint8_t val) { eeprom_update_byte(EECONFIG_AUDIO, val); }
#endif
#endif
+/** \brief matrix_setup
+ *
+ * FIXME: needs doc
+ */
__attribute__ ((weak))
void matrix_setup(void) {
}
+/** \brief keyboard_setup
+ *
+ * FIXME: needs doc
+ */
void keyboard_setup(void) {
matrix_setup();
}
+/** \brief is_keyboard_master
+ *
+ * FIXME: needs doc
+ */
__attribute__((weak))
bool is_keyboard_master(void) {
return true;
}
+/** \brief keyboard_init
+ *
+ * FIXME: needs doc
+ */
void keyboard_init(void) {
timer_init();
matrix_init();
#endif
}
-/*
- * Do keyboard routine jobs: scan matrix, light LEDs, ...
+/** \brief Keyboard task: Do keyboard routine jobs
+ *
+ * Do routine keyboard jobs:
+ *
+ * * scan matrix
+ * * handle mouse movements
+ * * run visualizer code
+ * * handle midi commands
+ * * light LEDs
+ *
* This is repeatedly called as fast as possible.
*/
void keyboard_task(void)
}
}
+/** \brief keyboard set leds
+ *
+ * FIXME: needs doc
+ */
void keyboard_set_leds(uint8_t leds)
{
if (debug_keyboard) { debug("keyboard_set_led: "); debug_hex8(leds); debug("\n"); }
#ifndef KEYCODE_H
#define KEYCODE_H
+/* FIXME: Add doxygen comments here */
#define IS_ERROR(code) (KC_ROLL_OVER <= (code) && (code) <= KC_UNDEFINED)
#define IS_ANY(code) (KC_A <= (code) && (code) <= 0xFF)
#define LED_H
#include "stdint.h"
+/* FIXME: Add doxygen comments here. */
/* keyboard LEDs */
#define USB_LED_NUM_LOCK 0
}
#endif
-#endif
\ No newline at end of file
+#endif
keymap_config_t keymap_config;
+/** \brief Magic
+ *
+ * FIXME: Needs doc
+ */
void magic(void)
{
/* check signature */
#include "debug.h"
#include "util.h"
+/** \brief has_anykey
+ *
+ * FIXME: Needs doc
+ */
uint8_t has_anykey(report_keyboard_t* keyboard_report)
{
uint8_t cnt = 0;
return cnt;
}
+/** \brief get_first_key
+ *
+ * FIXME: Needs doc
+ */
uint8_t get_first_key(report_keyboard_t* keyboard_report)
{
#ifdef NKRO_ENABLE
#endif
}
+/** \brief add key byte
+ *
+ * FIXME: Needs doc
+ */
void add_key_byte(report_keyboard_t* keyboard_report, uint8_t code)
{
#ifdef USB_6KRO_ENABLE
#endif
}
+/** \brief del key byte
+ *
+ * FIXME: Needs doc
+ */
void del_key_byte(report_keyboard_t* keyboard_report, uint8_t code)
{
#ifdef USB_6KRO_ENABLE
}
#ifdef NKRO_ENABLE
+/** \brief add key bit
+ *
+ * FIXME: Needs doc
+ */
void add_key_bit(report_keyboard_t* keyboard_report, uint8_t code)
{
if ((code>>3) < KEYBOARD_REPORT_BITS) {
}
}
+/** \brief del key bit
+ *
+ * FIXME: Needs doc
+ */
void del_key_bit(report_keyboard_t* keyboard_report, uint8_t code)
{
if ((code>>3) < KEYBOARD_REPORT_BITS) {
}
#endif
+/** \brief add key to report
+ *
+ * FIXME: Needs doc
+ */
void add_key_to_report(report_keyboard_t* keyboard_report, uint8_t key)
{
#ifdef NKRO_ENABLE
add_key_byte(keyboard_report, key);
}
+/** \brief del key from report
+ *
+ * FIXME: Needs doc
+ */
void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key)
{
#ifdef NKRO_ENABLE
del_key_byte(keyboard_report, key);
}
+/** \brief clear key from report
+ *
+ * FIXME: Needs doc
+ */
void clear_keys_from_report(report_keyboard_t* keyboard_report)
{
// not clear mods
#ifdef RAW_ENABLE
+/** \brief Raw HID Send
+ *
+ * FIXME: Needs doc
+ */
void raw_hid_send( uint8_t *data, uint8_t length )
{
// TODO: implement variable size packet
Endpoint_SelectEndpoint(ep);
}
+/** \brief Raw HID Receive
+ *
+ * FIXME: Needs doc
+ */
__attribute__ ((weak))
void raw_hid_receive( uint8_t *data, uint8_t length )
{
// so users can opt to not handle data coming in.
}
+/** \brief Raw HID Task
+ *
+ * FIXME: Needs doc
+ */
static void raw_hid_task(void)
{
// Create a temporary buffer to hold the read in data from the host
* Console
******************************************************************************/
#ifdef CONSOLE_ENABLE
+/** \brief Console Task
+ *
+ * FIXME: Needs doc
+ */
static void Console_Task(void)
{
/* Device must be connected and configured for the task to run */
* 2) EVENT_USB_Device_Reset
* 3) EVENT_USB_Device_Wake
*/
+/** \brief Event USB Device Connect
+ *
+ * FIXME: Needs doc
+ */
void EVENT_USB_Device_Connect(void)
{
print("[C]");
}
}
+/** \brief Event USB Device Connect
+ *
+ * FIXME: Needs doc
+ */
void EVENT_USB_Device_Disconnect(void)
{
print("[D]");
*/
}
+/** \brief Event USB Device Connect
+ *
+ * FIXME: Needs doc
+ */
void EVENT_USB_Device_Reset(void)
{
print("[R]");
}
+/** \brief Event USB Device Connect
+ *
+ * FIXME: Needs doc
+ */
void EVENT_USB_Device_Suspend()
{
print("[S]");
#endif
}
+/** \brief Event USB Device Connect
+ *
+ * FIXME: Needs doc
+ */
void EVENT_USB_Device_WakeUp()
{
print("[W]");
} \
} while (0)
-// called every 1ms
+/** \brief Event USB Device Start Of Frame
+ *
+ * FIXME: Needs doc
+ * called every 1ms
+ */
void EVENT_USB_Device_StartOfFrame(void)
{
static uint8_t count;
#endif
-/** Event handler for the USB_ConfigurationChanged event.
+/** \brief Event handler for the USB_ConfigurationChanged event.
+ *
* This is fired when the host sets the current configuration of the USB device after enumeration.
*
* ATMega32u2 supports dual bank(ping-pong mode) only on endpoint 3 and 4,
- * it is safe to use singl bank for all endpoints.
+ * it is safe to use single bank for all endpoints.
*/
void EVENT_USB_Device_ConfigurationChanged(void)
{
#endif
}
-/*
+/* FIXME: Expose this table in the docs somehow
Appendix G: HID Request Support Requirements
The following table enumerates the requests that need to be supported by various types of HID class devices.
Non-Boot Keybrd Required Optional Required Required Optional Optional
Other Device Required Optional Optional Optional Optional Optional
*/
-/** Event handler for the USB_ControlRequest event.
+/** \brief Event handler for the USB_ControlRequest event.
+ *
* This is fired before passing along unhandled control requests to the library for processing internally.
*/
void EVENT_USB_Device_ControlRequest(void)
/*******************************************************************************
* Host driver
******************************************************************************/
+/** \brief Keyboard LEDs
+ *
+ * FIXME: Needs doc
+ */
static uint8_t keyboard_leds(void)
{
return keyboard_led_stats;
}
+/** \brief Send Keyboard
+ *
+ * FIXME: Needs doc
+ */
static void send_keyboard(report_keyboard_t *report)
{
uint8_t timeout = 255;
keyboard_report_sent = *report;
}
-
+
+/** \brief Send Mouse
+ *
+ * FIXME: Needs doc
+ */
static void send_mouse(report_mouse_t *report)
{
#ifdef MOUSE_ENABLE
#endif
}
+/** \brief Send System
+ *
+ * FIXME: Needs doc
+ */
static void send_system(uint16_t data)
{
uint8_t timeout = 255;
Endpoint_ClearIN();
}
+/** \brief Send Consumer
+ *
+ * FIXME: Needs doc
+ */
static void send_consumer(uint16_t data)
{
uint8_t timeout = 255;
******************************************************************************/
#ifdef CONSOLE_ENABLE
#define SEND_TIMEOUT 5
+/** \brief Send Char
+ *
+ * FIXME: Needs doc
+ */
int8_t sendchar(uint8_t c)
{
// Not wait once timeouted.
******************************************************************************/
#ifdef VIRTSER_ENABLE
+/** \brief Virtual Serial Init
+ *
+ * FIXME: Needs doc
+ */
void virtser_init(void)
{
cdc_device.State.ControlLineStates.DeviceToHost = CDC_CONTROL_LINE_IN_DSR ;
CDC_Device_SendControlLineStateChange(&cdc_device);
}
+/** \brief Virtual Serial Receive
+ *
+ * FIXME: Needs doc
+ */
void virtser_recv(uint8_t c) __attribute__ ((weak));
void virtser_recv(uint8_t c)
{
// Ignore by default
}
+/** \brief Virtual Serial Task
+ *
+ * FIXME: Needs doc
+ */
void virtser_task(void)
{
uint16_t count = CDC_Device_BytesReceived(&cdc_device);
virtser_recv(ch);
}
}
+/** \brief Virtual Serial Send
+ *
+ * FIXME: Needs doc
+ */
void virtser_send(const uint8_t byte)
{
uint8_t timeout = 255;
/*******************************************************************************
* main
******************************************************************************/
+/** \brief Setup MCU
+ *
+ * FIXME: Needs doc
+ */
static void setup_mcu(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
}
+/** \brief Setup USB
+ *
+ * FIXME: Needs doc
+ */
static void setup_usb(void)
{
// Leonardo needs. Without this USB device is not recognized.
print_set_sendchar(sendchar);
}
+/** \brief Main
+ *
+ * FIXME: Needs doc
+ */
int main(void) __attribute__ ((weak));
int main(void)
{
uint8_t desired_output = OUTPUT_DEFAULT;
+/** \brief Set Output
+ *
+ * FIXME: Needs doc
+ */
void set_output(uint8_t output) {
set_output_user(output);
desired_output = output;
}
+/** \brief Set Output User
+ *
+ * FIXME: Needs doc
+ */
__attribute__((weak))
void set_output_user(uint8_t output) {
}
+/** \brief Auto Detect Output
+ *
+ * FIXME: Needs doc
+ */
uint8_t auto_detect_output(void) {
if (USB_DeviceState == DEVICE_STATE_Configured) {
return OUTPUT_USB;
return OUTPUT_NONE;
}
+/** \brief Where To Send
+ *
+ * FIXME: Needs doc
+ */
uint8_t where_to_send(void) {
if (desired_output == OUTPUT_AUTO) {
return auto_detect_output();
--- /dev/null
+#!/bin/bash
+
+set -x
+
+if ! doxygen -v 2>&1 > /dev/null; then
+ echo "doxygen not found! Please install it!"
+ exit 1
+elif ! moxygen -V 2>&1 > /dev/null; then
+ echo -n "moxygen not found! Would you like to install it? [y/n] "
+ read ANSWER
+ case $ANSWER in
+ y|Y|yes|YES|Yes)
+ npm install -g moxygen
+ ;;
+ *)
+ exit 1
+ ;;
+ esac
+fi
+
+if [ ! -e Doxyfile ]; then
+ echo "Error: You must run this from the top-level qmk_firmware directory!"
+ exit 1
+fi
+
+# Generate the doxygen XML files
+rm -rf doxygen
+doxygen Doxyfile
+
+# Generate the moxygen Markdown files
+moxygen -a -g -o docs/api_%s.md doxygen/xml
#!/bin/bash
-TRAVIS_BRANCH="${TRAVIS_BRANCH:master}"
-TRAVIS_PULL_REQUEST="${TRAVIS_PULL_REQUEST:false}"
-TRAVIS_COMMIT_MESSAGE="${TRAVIS_COMMIT_MESSAGE:-none}"
-TRAVIS_COMMIT_RANGE="${TRAVIS_COMMIT_RANGE:-HEAD~1..HEAD}"
-
set -o errexit -o nounset
+source util/travis_push.sh
rev=$(git rev-parse --short HEAD)
-if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" ]] ; then
-
-git config --global user.name "QMK Bot"
-git config --global user.email "hello@qmk.fm"
-
-openssl aes-256-cbc -K $encrypted_b0ee987fd0fc_key -iv $encrypted_b0ee987fd0fc_iv -in secrets.tar.enc -out secrets.tar -d
-tar xvf secrets.tar
-
-chmod 600 id_rsa_qmk_firmware
-chmod 600 id_rsa_qmk.fm
-eval `ssh-agent -s`
-ssh-add id_rsa_qmk_firmware
+if ! [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" ]] ; then
+ exit 0
+fi
# convert to unix line-endings
git checkout master
git diff --diff-filter=M --name-only -n 1 -z ${TRAVIS_COMMIT_RANGE} | xargs -0 git add
git commit -m "convert to unix line-endings [skip ci]" && git push git@github.com:qmk/qmk_firmware.git master
-increment_version ()
-{
- declare -a part=( ${1//\./ } )
- part[2]=$((part[2] + 1))
- new="${part[*]}"
- echo -e "${new// /.}"
+increment_version () {
+ declare -a part=( ${1//\./ } )
+ part[2]=$((part[2] + 1))
+ new="${part[*]}"
+ echo -e "${new// /.}"
}
git diff --name-only -n 1 ${TRAVIS_COMMIT_RANGE}
git add -A
git commit -m "generated from qmk/qmk_firmware@${rev}"
git push git@github.com:qmk/qmk.fm.git
-
fi
-
-fi
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+source util/travis_push.sh
+
+if [[ "$TRAVIS_COMMIT_MESSAGE" != *"[skip docs]"* ]] ; then
+ if git diff --name-only ${TRAVIS_COMMIT_RANGE} | grep -e '^quantum/' -e '^tmk_core/' -e '^docs/api_.*'; then
+ echo "Generating API docs..."
+ rm -rf doxygen
+ doxygen Doxyfile
+ moxygen -a -g -o -q docs/api_%s.md doxygen/xml
+ git add docs/api_*
+ git commit -m'autogenerated api docs for ${TRAVIS_COMMIT_RANGE}' || true
+ fi
+fi
--- /dev/null
+# Use this by sourcing it in your script.
+
+TRAVIS_BRANCH="${TRAVIS_BRANCH:master}"
+TRAVIS_PULL_REQUEST="${TRAVIS_PULL_REQUEST:false}"
+TRAVIS_COMMIT_MESSAGE="${TRAVIS_COMMIT_MESSAGE:-none}"
+TRAVIS_COMMIT_RANGE="${TRAVIS_COMMIT_RANGE:-HEAD~1..HEAD}"
+
+git config --global user.name "QMK Bot"
+git config --global user.email "hello@qmk.fm"
+
+openssl aes-256-cbc -K $encrypted_b0ee987fd0fc_key -iv $encrypted_b0ee987fd0fc_iv -in secrets.tar.enc -out secrets.tar -d
+tar xvf secrets.tar
+
+chmod 600 id_rsa_qmk_firmware
+chmod 600 id_rsa_qmk.fm
+eval `ssh-agent -s`
+ssh-add id_rsa_qmk_firmware