diff --git a/Scan/CapSense/capabilities.kll b/Scan/CapSense/capabilities.kll
new file mode 100644
index 0000000..0de41cf
--- /dev/null
+++ b/Scan/CapSense/capabilities.kll
@@ -0,0 +1,11 @@
+Name = CapSenseCapabilities;
+Version = 0.1;
+Author = "HaaTa (Jacob Alexander) 2016";
+KLL = 0.3d;
+
+# Modified Date
+Date = 2016-04-11;
+
+# Defines available to the CapSense sub-module
+# TODO Add cap sense configuration here
+
diff --git a/Scan/CapSense/matrix_scan.c b/Scan/CapSense/matrix_scan.c
new file mode 100644
index 0000000..0bbcac6
--- /dev/null
+++ b/Scan/CapSense/matrix_scan.c
@@ -0,0 +1,241 @@
+/* Copyright (C) 2016 by Jacob Alexander
+ *
+ * This file is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file. If not, see .
+ */
+
+// ----- Includes -----
+
+// Compiler Includes
+#include
+
+// Project Includes
+#include
+#include
+#include
+#include
+#include
+#include
+
+// Local Includes
+#include "matrix_scan.h"
+
+// Matrix Configuration
+//#include
+
+
+
+// ----- Defines -----
+
+// ----- Function Declarations -----
+
+// CLI Functions
+void cliFunc_matrixDebug( char* args );
+void cliFunc_matrixInfo( char* args );
+void cliFunc_matrixState( char* args );
+
+
+
+// ----- Variables -----
+
+// Scan Module command dictionary
+CLIDict_Entry( matrixDebug, "Enables matrix debug mode, prints out each scan code." NL "\t\tIf argument \033[35mT\033[0m is given, prints out each scan code state transition." );
+CLIDict_Entry( matrixInfo, "Print info about the configured matrix." );
+CLIDict_Entry( matrixState, "Prints out the current scan table N times." NL "\t\t \033[1mO\033[0m - Off, \033[1;33mP\033[0m - Press, \033[1;32mH\033[0m - Hold, \033[1;35mR\033[0m - Release, \033[1;31mI\033[0m - Invalid" );
+
+CLIDict_Def( matrixCLIDict, "Matrix Module Commands" ) = {
+ CLIDict_Item( matrixDebug ),
+ CLIDict_Item( matrixInfo ),
+ CLIDict_Item( matrixState ),
+ { 0, 0, 0 } // Null entry for dictionary end
+};
+
+
+
+// ----- Functions -----
+
+// TODO
+// - Support multiple ADCs
+// - Channel/Mux setup
+void ADC_setup( ADC adc )
+{
+
+ // Enable ADC clock
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_)
+ SIM_SCGC6 |= SIM_SCGC6_ADC0;
+#elif defined(_mk20dx256_) || defined(_mk20dx256vlh7_)
+ SIM_SCGC6 |= SIM_SCGC6_ADC0;
+ SIM_SCGC3 |= SIM_SCGC3_ADC1;
+#endif
+
+ // Lookup base ADC register
+ volatile unsigned int *ADC_SC1A = (unsigned int*)(&ADC_reg_offset_map[adc]);
+
+ // Calculate Register offsets
+ volatile unsigned int *ADC_CFG1 = (unsigned int*)(&ADC_SC1A) + 0x08;
+ volatile unsigned int *ADC_CFG2 = (unsigned int*)(&ADC_SC1A) + 0x0C;
+ volatile unsigned int *ADC_SC2 = (unsigned int*)(&ADC_SC1A) + 0x20;
+ volatile unsigned int *ADC_SC3 = (unsigned int*)(&ADC_SC1A) + 0x24;
+ volatile unsigned int *ADC_PG = (unsigned int*)(&ADC_SC1A) + 0x2C;
+ volatile unsigned int *ADC_CLPS = (unsigned int*)(&ADC_SC1A) + 0x38;
+ volatile unsigned int *ADC_CLP4 = (unsigned int*)(&ADC_SC1A) + 0x3C;
+ volatile unsigned int *ADC_CLP3 = (unsigned int*)(&ADC_SC1A) + 0x40;
+ volatile unsigned int *ADC_CLP2 = (unsigned int*)(&ADC_SC1A) + 0x44;
+ volatile unsigned int *ADC_CLP1 = (unsigned int*)(&ADC_SC1A) + 0x48;
+ volatile unsigned int *ADC_CLP0 = (unsigned int*)(&ADC_SC1A) + 0x4C;
+
+ // Make sure calibration has stopped
+ *ADC_SC3 = 0;
+
+ // - CFG1 -
+ // ADIV: (input)/2 divider
+ // ADICLK: (bus)/2 divider
+ // MODE: 16-bit
+ // ADLSMP: Long sample
+ //ADC_CFG1 = ADC_CFG1_ADIV(1) | ADC_CFG1_ADICLK(1) | ADC_CFG1_MODE(3) | ADC_CFG1_ADLSMP;
+ // ADIV: (input)/8 divider
+ *ADC_CFG1 = ADC_CFG1_ADIV(3) | ADC_CFG1_ADICLK(1) | ADC_CFG1_MODE(3) | ADC_CFG1_ADLSMP;
+
+ // - CFG2 -
+ // ADLSTS: 6 extra ADCK cycles; 10 ADCK cycles total sample time
+ //ADC_CFG2 = ADC_CFG2_ADLSTS(2);
+ // ADLSTS: 20 extra ADCK cycles; 24 ADCK cycles total sample time
+ *ADC_CFG2 = ADC_CFG2_ADLSTS(0);
+
+ // - SC2 -
+ // REFSEL: Use default 3.3V reference
+ *ADC_SC2 = ADC_SC2_REFSEL(0);
+ /*
+ // Setup VREF to 1.2 V
+ VREF_TRM = 0x60;
+ VREF_SC = 0xE1; // Enable 1.2 volt ref
+ // REFSEL: Use 1.2V reference VREF
+ *ADC_SC2 = ADC_SC2_REFSEL(1);
+ */
+
+ // - SC3 -
+ // CAL: Start calibration
+ // AVGE: Enable hardware averaging
+ // AVGS: 32 samples averaged
+ // 32 sample averaging
+ *ADC_SC3 = ADC_SC3_CAL | ADC_SC3_AVGE | ADC_SC3_AVGS(3);
+
+ // Wait for calibration
+ while ( *ADC_SC3 & ADC_SC3_CAL );
+
+ // Apply computed calibration offset
+ // XXX Note, for single-ended, only the plus side offsets have to be applied
+ // For differential the minus side also has to be set as well
+
+ __disable_irq(); // Disable interrupts while reading/setting offsets
+
+ // Set calibration
+ // ADC Plus-Side Gain Register
+ // See Section 31.4.7 in the datasheet (mk20dx256vlh7) for details
+ uint16_t sum = *ADC_CLPS + *ADC_CLP4 + *ADC_CLP3 + *ADC_CLP2 + *ADC_CLP1 + *ADC_CLP0;
+ sum = (sum / 2) | 0x8000;
+ *ADC_PG = sum;
+
+ __enable_irq(); // Re-enable interrupts
+
+ // Start ADC reading loop
+ // - SC1A -
+ // ADCH: Channel DAD0 (A10)
+ // AIEN: Enable interrupt
+ //*ADC_SC1A = ADC_SC1_AIEN | ADC_SC1_ADCH(0);
+
+ // Enable ADC0 IRQ Vector
+ //NVIC_ENABLE_IRQ( IRQ_ADC0 );
+}
+
+// TODO
+// - Enable/Disable strobe detection (IBM)
+// - Setup strobe matrix
+void Strobe_setup()
+{
+}
+
+// TODO
+// - Setup ADCs
+// - Setup ADC muxes
+// - Setup voltage stab
+void Sense_setup()
+{
+}
+
+void Matrix_setup()
+{
+ // Register Matrix CLI dictionary
+ CLI_registerDictionary( matrixCLIDict, matrixCLIDictName );
+
+ // Setup sense
+ Sense_setup();
+
+ // Setup strobes
+ Strobe_setup();
+}
+
+// Scan the matrix for keypresses
+// NOTE: scanNum should be reset to 0 after a USB send (to reset all the counters)
+void Matrix_scan( uint16_t scanNum )
+{
+}
+
+
+// Called by parent scan module whenever the available current changes
+// current - mA
+void Matrix_currentChange( unsigned int current )
+{
+ // TODO - Any potential power savings?
+}
+
+
+
+// ----- CLI Command Functions -----
+
+void cliFunc_matrixInfo( char* args )
+{
+}
+
+void cliFunc_matrixDebug( char* args )
+{
+ // Parse number from argument
+ // NOTE: Only first argument is used
+ char* arg1Ptr;
+ char* arg2Ptr;
+ CLI_argumentIsolation( args, &arg1Ptr, &arg2Ptr );
+
+ // Set the matrix debug flag depending on the argument
+ // If no argument, set to scan code only
+ // If set to T, set to state transition
+ switch ( arg1Ptr[0] )
+ {
+ // T as argument
+ case 'T':
+ case 't':
+ break;
+
+ // No argument
+ case '\0':
+ break;
+
+ // Invalid argument
+ default:
+ return;
+ }
+}
+
+void cliFunc_matrixState( char* args )
+{
+}
+
diff --git a/Scan/CapSense/matrix_scan.h b/Scan/CapSense/matrix_scan.h
new file mode 100644
index 0000000..a0b9bb5
--- /dev/null
+++ b/Scan/CapSense/matrix_scan.h
@@ -0,0 +1,175 @@
+/* Copyright (C) 2016 by Jacob Alexander
+ *
+ * This file is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file. If not, see .
+ */
+
+#pragma once
+
+// ----- Includes -----
+
+// KLL Generated Defines
+#include
+
+
+
+// ----- Defines -----
+
+// ----- Enums -----
+
+// Freescale MK20s have GPIO ports A...E
+typedef enum Port {
+ Port_A = 0,
+ Port_B = 1,
+ Port_C = 2,
+ Port_D = 3,
+ Port_E = 4,
+} Port;
+
+// Each port has a possible 32 pins
+typedef enum Pin {
+ Pin_0 = 0,
+ Pin_1 = 1,
+ Pin_2 = 2,
+ Pin_3 = 3,
+ Pin_4 = 4,
+ Pin_5 = 5,
+ Pin_6 = 6,
+ Pin_7 = 7,
+ Pin_8 = 8,
+ Pin_9 = 9,
+ Pin_10 = 10,
+ Pin_11 = 11,
+ Pin_12 = 12,
+ Pin_13 = 13,
+ Pin_14 = 14,
+ Pin_15 = 15,
+ Pin_16 = 16,
+ Pin_17 = 17,
+ Pin_18 = 18,
+ Pin_19 = 19,
+ Pin_20 = 20,
+ Pin_21 = 21,
+ Pin_22 = 22,
+ Pin_23 = 23,
+ Pin_24 = 24,
+ Pin_25 = 25,
+ Pin_26 = 26,
+ Pin_27 = 27,
+ Pin_28 = 28,
+ Pin_29 = 29,
+ Pin_30 = 30,
+ Pin_31 = 31,
+} Pin;
+
+// Depending on the microcontroller, it can have 1 or more ADCs
+typedef enum ADC {
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_)
+ ADC_0 = 0,
+#elif defined(_mk20dx256_) || defined(_mk20dx256vlh7_)
+ ADC_0 = 0,
+ ADC_1 = 1,
+#endif
+} ADC;
+
+// ADC Register offset map
+unsigned int *ADC_reg_offset_map[] = {
+#if defined(_mk20dx128_) || defined(_mk20dx128vlf5_)
+ (unsigned int*)(&ADC0_SC1A),
+#elif defined(_mk20dx256_) || defined(_mk20dx256vlh7_)
+ (unsigned int*)(&ADC0_SC1A),
+ (unsigned int*)(&ADC1_SC1A),
+#endif
+};
+
+// Each ADC has a possible 32 channels
+typedef enum Channel {
+ Channel_0 = 0,
+ Channel_1 = 1,
+ Channel_2 = 2,
+ Channel_3 = 3,
+ Channel_4 = 4,
+ Channel_5 = 5,
+ Channel_6 = 6,
+ Channel_7 = 7,
+ Channel_8 = 8,
+ Channel_9 = 9,
+ Channel_10 = 10,
+ Channel_11 = 11,
+ Channel_12 = 12,
+ Channel_13 = 13,
+ Channel_14 = 14,
+ Channel_15 = 15,
+ Channel_16 = 16,
+ Channel_17 = 17,
+ Channel_18 = 18,
+ Channel_19 = 19,
+ Channel_20 = 20,
+ Channel_21 = 21,
+ Channel_22 = 22,
+ Channel_23 = 23,
+ Channel_24 = 24,
+ Channel_25 = 25,
+ Channel_26 = 26,
+ Channel_27 = 27,
+ Channel_28 = 28,
+ Channel_29 = 29,
+ Channel_30 = 30,
+ Channel_31 = 31,
+} Channel;
+
+// Type of pin
+typedef enum Type {
+ Type_StrobeOn,
+ Type_StrobeOff,
+ Type_StrobeSetup,
+ Type_Sense,
+ Type_SenseSetup,
+} Type;
+
+// Keypress States
+typedef enum KeyPosition {
+ KeyState_Off = 0,
+ KeyState_Press = 1,
+ KeyState_Hold = 2,
+ KeyState_Release = 3,
+ KeyState_Invalid,
+} KeyPosition;
+
+
+
+// ----- Structs -----
+
+// Struct container for defining Strobe pins
+typedef struct GPIO_Pin {
+ Port port;
+ Pin pin;
+} GPIO_Pin;
+
+// Struct container for defining Sense pins
+typedef struct ADC_Pin {
+ Port port;
+ Pin pin;
+ ADC adc;
+ Channel ch;
+} ADC_Pin;
+
+
+
+// ----- Functions -----
+
+void Matrix_setup();
+void Matrix_scan( uint16_t scanNum );
+
+void Matrix_currentChange( unsigned int current );
+
diff --git a/Scan/CapSense/matrix_setup.h b/Scan/CapSense/matrix_setup.h
new file mode 100644
index 0000000..c52e712
--- /dev/null
+++ b/Scan/CapSense/matrix_setup.h
@@ -0,0 +1,27 @@
+/* Copyright (C) 2016 by Jacob Alexander
+ *
+ * This file is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file. If not, see .
+ */
+
+#pragma once
+
+// ----- Macros -----
+
+// Convenience Macros
+#define gpio( port, pin ) { Port_##port, Pin_##pin }
+#define sense( port, pin, adc, ch ) { Port_##port, Pin_##pin, ADC_##adc, Channel_##ch }
+#define Matrix_colsNum sizeof( Matrix_cols ) / sizeof( GPIO_Pin )
+#define Matrix_rowsNum sizeof( Matrix_rows ) / sizeof( GPIO_Pin )
+#define Matrix_maxKeys sizeof( Matrix_scanArray ) / sizeof( KeyState )
+
diff --git a/Scan/CapSense/setup.cmake b/Scan/CapSense/setup.cmake
new file mode 100644
index 0000000..f56516a
--- /dev/null
+++ b/Scan/CapSense/setup.cmake
@@ -0,0 +1,30 @@
+###| CMake Kiibohd Controller Scan Module |###
+#
+# Written by Jacob Alexander in 2016 for the Kiibohd Controller
+#
+# Released into the Public Domain
+#
+###
+
+
+###
+# Sub-module flag, cannot be included stand-alone
+#
+set ( SubModule 1 )
+
+
+###
+# Module C files
+#
+set ( Module_SRCS
+ matrix_scan.c
+)
+
+
+###
+# Compiler Family Compatibility
+#
+set ( ModuleCompatibility
+ arm
+)
+
diff --git a/Scan/CapTest1/defaultMap.kll b/Scan/CapTest1/defaultMap.kll
new file mode 100644
index 0000000..5fa6ce6
--- /dev/null
+++ b/Scan/CapTest1/defaultMap.kll
@@ -0,0 +1,73 @@
+Name = CapTest1;
+Version = 0.3d;
+Author = "HaaTa (Jacob Alexander) 2016";
+KLL = 0.3c;
+
+# Modified Date
+Date = 2016-04-11;
+
+# TODO
+S0x00 : U"Esc";
+S0x01 : U"1";
+S0x02 : U"2";
+S0x03 : U"3";
+S0x04 : U"4";
+S0x05 : U"5";
+S0x06 : U"6";
+S0x07 : U"7";
+S0x08 : U"8";
+S0x09 : U"9";
+S0x0A : U"0";
+S0x0B : U"Minus";
+S0x0C : U"Equal";
+S0x0D : U"Backslash";
+S0x0E : U"Backtick";
+S0x0F : U"Tab";
+S0x10 : U"Q";
+S0x11 : U"W";
+S0x12 : U"E";
+S0x13 : U"R";
+S0x14 : U"T";
+S0x15 : U"Y";
+S0x16 : U"U";
+S0x17 : U"I";
+S0x18 : U"O";
+S0x19 : U"P";
+S0x1A : U"LBrace";
+S0x1B : U"RBrace";
+S0x1C : U"Backspace";
+S0x1D : U"Ctrl";
+S0x1E : U"A";
+S0x1F : U"S";
+S0x20 : U"D";
+S0x21 : U"F";
+S0x22 : U"G";
+S0x23 : U"H";
+S0x24 : U"J";
+S0x25 : U"K";
+S0x26 : U"L";
+S0x27 : U"Semicolon";
+S0x28 : U"Quote";
+S0x29 : U"Enter";
+S0x2A : U"LShift";
+S0x2B : U"Z";
+S0x2C : U"X";
+S0x2D : U"C";
+S0x2E : U"V";
+S0x2F : U"B";
+S0x30 : U"N";
+S0x31 : U"M";
+S0x32 : U"Comma";
+S0x33 : U"Period";
+S0x34 : U"Slash";
+S0x35 : U"RShift";
+S0x36 : U"Function1"; # Fun key
+S0x37 : U"Function2"; # Left Blank Key
+S0x38 : U"LAlt";
+S0x39 : U"LGui";
+S0x3A : U"Space";
+S0x3B : U"RGui";
+S0x3C : U"RAlt";
+S0x3D : U"Function3"; # Right Blank Key 1
+S0x3E : U"Function4"; # Right Blank Key 2
+
diff --git a/Scan/CapTest1/matrix.h b/Scan/CapTest1/matrix.h
new file mode 100644
index 0000000..bb30999
--- /dev/null
+++ b/Scan/CapTest1/matrix.h
@@ -0,0 +1,63 @@
+/* Copyright (C) 2014-2016 by Jacob Alexander
+ *
+ * This file is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file. If not, see .
+ */
+
+#pragma once
+
+// ----- Includes -----
+
+// Project Includes
+#include
+
+
+
+// ----- Matrix Definition -----
+
+// CapTest
+// (TODO)
+//
+// Strobe
+// PTB0..3,16,17
+// PTC4,5
+// PTD0
+//
+// Sense
+// PTD1..7
+
+
+// -- Strobes --
+// Format
+// gpio( , )
+// Freescale ARM MK20's support GPIO PTA, PTB, PTC, PTD and PTE 0..31
+// Not all chips have access to all of these pins (most don't have 160 pins :P)
+//
+
+GPIO_Pin Matrix_strobe[] = { gpio(B,0), gpio(B,1), gpio(B,2), gpio(B,3), gpio(B,16), gpio(B,17), gpio(C,4), gpio(C,5), gpio(D,0) };
+
+
+// -- Sense --
+// Format
+// sense( , , , )
+// Freescale ARM MK20's support 32 ADC channels
+// However, not every channel is useful for reading from an input pin.
+//
+// NOTE: Be careful that you are not using a strobe and a sense at the same time!
+//
+
+ADC_Pin Matrix_sense[] = { sense(B,4,0,5) };
+
+// TODO
+// Misc pins required for control
+
diff --git a/Scan/CapTest1/scan_loop.c b/Scan/CapTest1/scan_loop.c
new file mode 100644
index 0000000..d045644
--- /dev/null
+++ b/Scan/CapTest1/scan_loop.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 2016 by Jacob Alexander
+ *
+ * This file is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file. If not, see .
+ */
+
+// ----- Includes -----
+
+// Compiler Includes
+#include
+
+// Project Includes
+#include
+#include
+#include
+#include
+#include
+#include
+
+// Local Includes
+#include "scan_loop.h"
+
+
+
+// ----- Function Declarations -----
+
+// ----- Variables -----
+
+// Number of scans since the last USB send
+uint16_t Scan_scanCount = 0;
+
+
+
+// ----- Functions -----
+
+// Setup
+inline void Scan_setup()
+{
+ // Setup cap sense matrix pins for scanning
+ Matrix_setup();
+
+ // Reset scan count
+ Scan_scanCount = 0;
+}
+
+
+// Main Detection Loop
+inline uint8_t Scan_loop()
+{
+ Matrix_scan( Scan_scanCount++ );
+
+ return 0;
+}
+
+
+// Signal from Macro Module that all keys have been processed (that it knows about)
+inline void Scan_finishedWithMacro( uint8_t sentKeys )
+{
+}
+
+
+// Signal from Output Module that all keys have been processed (that it knows about)
+inline void Scan_finishedWithOutput( uint8_t sentKeys )
+{
+ // Reset scan loop indicator (resets each key debounce state)
+ // TODO should this occur after USB send or Macro processing?
+ Scan_scanCount = 0;
+}
+
+
+// Signal from the Output Module that the available current has changed
+// current - mA
+void Scan_currentChange( unsigned int current )
+{
+ // Indicate to all submodules current change
+ Matrix_currentChange( current );
+}
+
+
+
+// ----- Capabilities -----
+
diff --git a/Scan/CapTest1/scan_loop.h b/Scan/CapTest1/scan_loop.h
new file mode 100644
index 0000000..1824849
--- /dev/null
+++ b/Scan/CapTest1/scan_loop.h
@@ -0,0 +1,40 @@
+/* Copyright (C) 2016 by Jacob Alexander
+ *
+ * This file is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this file. If not, see .
+ */
+
+#pragma once
+
+// ----- Includes -----
+
+// Compiler Includes
+#include
+
+
+
+// ----- Functions -----
+
+// Functions to be called by main.c
+void Scan_setup();
+uint8_t Scan_loop();
+
+// Call-backs
+void Scan_finishedWithMacro( uint8_t sentKeys ); // Called by Macro Module
+void Scan_finishedWithOutput( uint8_t sentKeys ); // Called by Output Module
+
+void Scan_currentChange( unsigned int current ); // Called by Output Module
+
+
+// ----- Capabilities -----
+
diff --git a/Scan/CapTest1/setup.cmake b/Scan/CapTest1/setup.cmake
new file mode 100644
index 0000000..49e0ea0
--- /dev/null
+++ b/Scan/CapTest1/setup.cmake
@@ -0,0 +1,32 @@
+###| CMake Kiibohd Controller Scan Module |###
+#
+# Written by Jacob Alexander in 2016 for the Kiibohd Controller
+#
+# Released into the Public Domain
+#
+###
+
+
+###
+# Required Submodules
+#
+
+AddModule ( Scan CapSense )
+
+
+###
+# Module C files
+#
+
+set ( Module_SRCS
+ scan_loop.c
+)
+
+
+###
+# Compiler Family Compatibility
+#
+set ( ModuleCompatibility
+ arm
+)
+