/******************************************************************//**
 * Zerocat PS/2 Keyboard --- Get rid of keyloggers,
 *                           avoid USB firmware attacks!
 *
 * Copyright (C) 2017, 2018 Kai Mertens <kmx@posteo.net>
 *
 * The Zerocat PS/2 Keyboard 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.
 *
 * The Zerocat PS/2 Keyboard is distributed in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * This file is part of the Zerocat PS/2 Keyboard.
 *
 *
 * @file
 *
 * @brief
 * This file is the main file of firmware.
 *
 */

//parallax propside workspace: 'Simple Libraries'
#include "simpletext.h"
#include "simpletools.h"

//project headers
#include "main.h"


//Keyboard Scan Codes Set 1
//101-, 102-, 104-key US QWERTY Keyboard
//compare to: http://www.computer-engineering.org/ps2keyboard/scancodes1.html
struct scancode_set1_t scancode_set1[] = {
  { "A", 0x1e, 0x9e },
  { "B", 0x30, 0xb0 },
  { "C", 0x2e, 0xae },
  { "D", 0x20, 0xa0 },
  { "E", 0x12, 0x92 },
  { "F", 0x21, 0xa1 },
  { "G", 0x22, 0xa2 },
  { "H", 0x23, 0xa3 },
  { "I", 0x17, 0x97 },
  { "J", 0x24, 0xa4 },
  { "K", 0x25, 0xa5 },
  { "L", 0x26, 0xa6 },
  { "M", 0x32, 0xb2 },
  { "N", 0x31, 0xb1 },
  { "O", 0x18, 0x98 },
  { "P", 0x19, 0x99 },
  { "Q", 0x10, 0x90 },
  { "R", 0x13, 0x93 },
  { "S", 0x1f, 0x9f },
  { "T", 0x14, 0x94 },
  { "U", 0x16, 0x96 },
  { "V", 0x2f, 0xaf },
  { "W", 0x11, 0x91 },
  { "X", 0x2d, 0xad },
  { "Y", 0x15, 0x95 },
  { "Z", 0x2c, 0xac },
  { "0", 0x0b, 0x8b },
  { "1", 0x02, 0x82 },
  { "2", 0x03, 0x83 },
  { "3", 0x04, 0x84 },
  { "4", 0x05, 0x85 },
  { "5", 0x06, 0x86 },
  { "6", 0x07, 0x87 },
  { "7", 0x08, 0x88 },
  { "8", 0x09, 0x89 },
  { "9", 0x0a, 0x8a },
  { "`", 0x29, 0x89 },
  { "-", 0x0c, 0x8c },
  { "=", 0x0d, 0x8d },
  { "\\", 0x2b, 0xab },
  { "BKSP", 0x0e, 0x8e },
  { "SPACE", 0x39, 0xb9 },
  { "TAB", 0x0f, 0x8f },
  { "CAPS", 0x3a, 0xba },
  { "L SHFT", 0x2a, 0xaa },
  { "L CTRL", 0x1d, 0x9d },
  { "L GUI", 0xe05b, 0xe0db },
  { "L ALT", 0x38, 0xb8 },
  { "R SHFT", 0x36, 0xb6 },
  { "R CTRL", 0xe01d, 0xe09d },
  { "R GUI", 0xe05c, 0xe0dc },
  { "R ALT", 0xe038, 0xe0b8 },
  { "APPS", 0xe05d, 0xe0dd },
  { "ENTER", 0x1c, 0x9c },
  { "ESC", 0x01, 0x81 },
  { "F1", 0x3b, 0xbb },
  { "F2", 0x3c, 0xbc },
  { "F3", 0x3d, 0xbd },
  { "F4", 0x3e, 0xbe },
  { "F5", 0x3f, 0xbf },
  { "F6", 0x40, 0xc0 },
  { "F7", 0x41, 0xc1 },
  { "F8", 0x42, 0xc2 },
  { "F9", 0x43, 0xc3 },
  { "F10", 0x44, 0xc4 },
  { "F11", 0x57, 0xd7 },
  { "F12", 0x58, 0xd8 },
  { "PRNT SCRN", 0xe02ae037, 0xe0b7e0aa },
  { "SCROLL", 0x46, 0xc6 },
  { "PAUSE", 0xe11d45e19dc5, NULL },
  { "[", 0x1a, 0x9a },
  { "INSERT", 0xe052, 0xe0d2 },
  { "HOME", 0xe047, 0xe097 },
  { "PG UP", 0xe049, 0xe0c9 },
  { "DELETE", 0xe053, 0xe0d3 },
  { "END", 0xe04f, 0xe0cf },
  { "PG DN", 0xe051, 0xe0d1 },
  { "U ARROW", 0xe048, 0xe0c8 },
  { "L ARROW", 0xe04b, 0xe0cb },
  { "D ARROW", 0xe050, 0xe0d0 },
  { "R ARROW", 0xe04d, 0xe0cd },
  { "NUM", 0x45, 0xc5 },
  { "KP /", 0xe035, 0xe0b5 },
  { "KP *", 0x37, 0xb7 },
  { "KP -", 0x4a, 0xca },
  { "KP +", 0x4e, 0xce },
  { "KP ENTER", 0xe01c, 0xe09c },
  { "KP .", 0x53, 0xd3 },
  { "KP 0", 0x52, 0xd2 },
  { "KP 1", 0x4f, 0xcf },
  { "KP 2", 0x50, 0xd0 },
  { "KP 3", 0x51, 0xd1 },
  { "KP 4", 0x4b, 0xcb },
  { "KP 5", 0x4c, 0xcc },
  { "KP 6", 0x4d, 0xcd },
  { "KP 7", 0x47, 0xc7 },
  { "KP 8", 0x48, 0xc8 },
  { "KP 9", 0x49, 0xc9 },
  { "]", 0x1b, 0x9b },
  { ";", 0x27, 0xa7 },
  { "'", 0x28, 0xa8 },
  { ",", 0x33, 0xb3 },
  { ".", 0x34, 0xb4 },
  { "/", 0x35, 0xb5 }
};

//Keyboard Scan Codes Set 2
//101-, 102-, 104-key US QWERTY Keyboard
//compare to: http://www.computer-engineering.org/ps2keyboard/scancodes2.html
struct scancode_set2_t scancode_set2[] = {
  { "A", 0x1c, 0xf01c },
  { "B", 0x32, 0xf032 },
  { "C", 0x21, 0xf021 },
  { "D", 0x23, 0xf023 },
  { "E", 0x24, 0xf024 },
  { "F", 0x2b, 0xf02b },
  { "G", 0x34, 0xf034 },
  { "H", 0x33, 0xf033 },
  { "I", 0x43, 0xf043 },
  { "J", 0x3b, 0xf03b },
  { "K", 0x42, 0xf042 },
  { "L", 0x4b, 0xf04b },
  { "M", 0x3a, 0xf03a },
  { "N", 0x31, 0xf031 },
  { "O", 0x44, 0xf044 },
  { "P", 0x4d, 0xf04d },
  { "Q", 0x15, 0xf015 },
  { "R", 0x2d, 0xf02d },
  { "S", 0x1b, 0xf01b },
  { "T", 0x2c, 0xf02c },
  { "U", 0x3c, 0xf03c },
  { "V", 0x2a, 0xf02a },
  { "W", 0x1d, 0xf01d },
  { "X", 0x22, 0xf022 },
  { "Y", 0x35, 0xf035 },
  { "Z", 0x1a, 0xf01a },
  { "0", 0x45, 0xf045 },
  { "1", 0x16, 0xf016 },
  { "2", 0x1e, 0xf01e },
  { "3", 0x26, 0xf026 },
  { "4", 0x25, 0xf025 },
  { "5", 0x2e, 0xf02e },
  { "6", 0x36, 0xf036 },
  { "7", 0x3d, 0xf03d },
  { "8", 0x3e, 0xf03e },
  { "9", 0x46, 0xf046 },
  { "`", 0x0e, 0xf00e },
  { "-", 0x4e, 0xf04e },
  { "=", 0x55, 0xf055 },
  { "\\", 0x5d, 0xf05d },
  { "BKSP", 0x66, 0xf066 },
  { "SPACE", 0x29, 0xf029 },
  { "TAB", 0x0d, 0xf00d },
  { "CAPS", 0x58, 0xf058 },
  { "L SHFT", 0x12, 0xf012 },
  { "L CTRL", 0x14, 0xf014 },
  { "L GUI", 0xe01f, 0xe0f01f },
  { "L ALT", 0x11, 0xf011 },
  { "R SHFT", 0x59, 0xf059 },
  { "R CTRL", 0xe014, 0xe0f014 },
  { "R GUI", 0xe027, 0xe0f027 },
  { "R ALT", 0xe011, 0xe0f011 },
  { "APPS", 0xe02f, 0xe0f02f },
  { "ENTER", 0x5a, 0xf05a },
  { "ESC", 0x76, 0xf076 },
  { "F1", 0x05, 0xf005 },
  { "F2", 0x06, 0xf006 },
  { "F3", 0x04, 0xf004 },
  { "F4", 0x0c, 0xf00c },
  { "F5", 0x03, 0xf003 },
  { "F6", 0x0b, 0xf00b },
  { "F7", 0x83, 0xf083 },
  { "F8", 0x0a, 0xf00a },
  { "F9", 0x01, 0xf001 },
  { "F10", 0x09, 0xf009 },
  { "F11", 0x78, 0xf078 },
  { "F12", 0x07, 0xf007 },
  { "PRNT SCRN", 0xe012e07c, 0xe0f07ce0f012 },
  { "SCROLL", 0x7e, 0xf07e },
  { "PAUSE", 0xe11477e1f014f077, NULL },
  { "[", 0x54, 0xf054 },
  { "INSERT", 0xe070, 0xe0f070 },
  { "HOME", 0xe06c, 0xe0f06c },
  { "PGUP", 0xe07d, 0xe0f07d },
  { "DELETE", 0xe071, 0xe0f071 },
  { "END", 0xe069, 0xe0f069 },
  { "PGDWN", 0xe07a, 0xe0f07a },
  { "ARROW UP", 0xe075, 0xe0f075 },
  { "ARROW LEFT", 0xe06b, 0xe0f06b },
  { "ARROW DOWN", 0xe072, 0xe0f072 },
  { "ARROW RIGHT", 0xe074, 0xe0f074 },
  { "NUM", 0x77, 0xf077 },
  { "KP //", 0xe04a, 0xe0f04a },
  { "KP *", 0x7c, 0xf07c },
  { "KP -", 0x7b, 0xf07b },
  { "KP +", 0x79, 0xf079 },
  { "KP ENTER", 0xe05a, 0x0ef05a },
  { "KP .", 0x71, 0xf071 },
  { "KP 0", 0x70, 0xf070 },
  { "KP 1", 0x69, 0xf069 },
  { "KP 2", 0x72, 0xf072 },
  { "KP 3", 0x7a, 0xf07a },
  { "KP 4", 0x6b, 0xf06b },
  { "KP 5", 0x73, 0xf073 },
  { "KP 6", 0x74, 0xf074 },
  { "KP 7", 0x6c, 0xf06c },
  { "KP 8", 0x75, 0xf075 },
  { "KP 9", 0x7d, 0xf07d },
  { "]", 0x5b, 0xf05b },
  { ";", 0x4c, 0xf04c },
  { "'", 0x52, 0xf052 },
  { ",", 0x41, 0xf041 },
  { ".", 0x49, 0xf049 },
  { "//", 0x4a, 0xf04a }
};

//Keyboard Scan Codes Set 3
//101-, 102-, 104-key US QWERTY Keyboard
//compare to: http://www.computer-engineering.org/ps2keyboard/scancodes3.html
struct scancode_set3_t scancode_set3[] = {
  { "A", 0x1c, 0xf01c },
  { "B", 0x32, 0xf032 },
  { "C", 0x21, 0xf021 },
  { "D", 0x23, 0xf023 },
  { "E", 0x24, 0xf024 },
  { "F", 0x2b, 0xf02b },
  { "G", 0x34, 0xf034 },
  { "H", 0x33, 0xf033 },
  { "I", 0x43, 0xf043 }, //0xf048?
  { "J", 0x3b, 0xf03b },
  { "K", 0x42, 0xf042 },
  { "L", 0x4b, 0xf04b },
  { "M", 0x3a, 0xf03a },
  { "N", 0x31, 0xf031 },
  { "O", 0x44, 0xf044 },
  { "P", 0x4d, 0xf04d },
  { "Q", 0x15, 0xf015 },
  { "R", 0x2d, 0xf02d },
  { "S", 0x1b, 0xf01b },
  { "T", 0x2c, 0xf02c },
  { "U", 0x3c, 0xf03c },
  { "V", 0x2a, 0xf02a },
  { "W", 0x1d, 0xf01d },
  { "X", 0x22, 0xf022 },
  { "Y", 0x35, 0xf035 },
  { "Z", 0x1a, 0xf01a },
  { "0", 0x45, 0xf045 },
  { "1", 0x16, 0xf016 },
  { "2", 0x1e, 0xf01e },
  { "3", 0x26, 0xf026 },
  { "4", 0x25, 0xf025 },
  { "5", 0x2e, 0xf02e },
  { "6", 0x36, 0xf036 },
  { "7", 0x3d, 0xf03d },
  { "8", 0x3e, 0xf03e },
  { "9", 0x46, 0xf046 },
  { "`", 0x0e, 0xf00e },
  { "-", 0x4e, 0xf04e },
  { "=", 0x55, 0xf055 },
  { "\\", 0x5c, 0xf05c },
  { "BKSP", 0x66, 0xf066 },
  { "SPACE", 0x29, 0xf029 },
  { "TAB", 0x0d, 0xf02d },
  { "CAPS", 0x14, 0xf014 },
  { "L SHFT", 0x12, 0xf012 },
  { "L CTRL", 0x11, 0xf011 },
  { "L WIN", 0x8b, 0xf08b },
  { "L ALT", 0x19, 0xf019 },
  { "R SHFT", 0x59, 0xf059 },
  { "R CTRL", 0x58, 0xf058 },
  { "R WIN", 0x8c, 0xf08c },
  { "R ALT", 0x39, 0xf039 },
  { "APPS", 0x8d, 0xf08d },
  { "ENTER", 0x5a, 0xf05a },
  { "ESC", 0x08, 0xf008 },
  { "F1", 0x07, 0xf007 },
  { "F2", 0x0f, 0xf00f },
  { "F3", 0x17, 0xf017 },
  { "F4", 0x1f, 0xf01f },
  { "F5", 0x27, 0xf027 },
  { "F6", 0x2f, 0xf02f },
  { "F7", 0x37, 0xf037 },
  { "F8", 0x3f, 0xf03f },
  { "F9", 0x47, 0xf047 },
  { "F10", 0x4f, 0xf04f },
  { "F11", 0x56, 0xf056 },
  { "F12", 0x5e, 0xf05e },
  { "PRNT SCRN", 0x57, 0xf057 },
  { "SCROLL", 0x5f, 0xf05f },
  { "PAUSE", 0x62, 0xf062 },
  { "[", 0x54, 0xf054 },
  { "INSERT", 0x67, 0xf067 },
  { "HOME", 0x6e, 0xf06e },
  { "PG UP", 0x6f, 0xf06f },
  { "DELETE", 0x64, 0xf064 },
  { "END", 0x65, 0xf065 },
  { "PG DN", 0x6d, 0xf06d },
  { "U ARROW", 0x63, 0xf063 },
  { "L ARROW", 0x61, 0xf061 },
  { "D ARROW", 0x60, 0xf060 },
  { "R ARROW", 0x6a, 0xf06a },
  { "NUM", 0x76, 0xf076 },
  { "KP /", 0x4a, 0xf04a },
  { "KP *", 0x7e, 0xf07e },
  { "KP -", 0x4e, 0xf04e },
  { "KP +", 0x7c, 0xf07c },
  { "KP ENTER", 0x79, 0xf079 },
  { "KP .", 0x71, 0xf071 },
  { "KP 0", 0x70, 0xf070 },
  { "KP 1", 0x69, 0xf069 },
  { "KP 2", 0x72, 0xf072 },
  { "KP 3", 0x7a, 0xf07a },
  { "KP 4", 0x6b, 0xf06b },
  { "KP 5", 0x73, 0xf073 },
  { "KP 6", 0x74, 0xf074 },
  { "KP 7", 0x6c, 0xf06c },
  { "KP 8", 0x75, 0xf075 },
  { "KP 9", 0x7d, 0xf07d },
  { "]", 0x5b, 0xf05b },
  { ";", 0x4c, 0xf04c },
  { "'", 0x52, 0xf052 },
  { ",", 0x41, 0xf041 },
  { ".", 0x49, 0xf049 },
  { "/", 0x4a, 0xf04a }
};

//Keyboard ACPI Scan Codes
struct scancode_set1_t scancode_ACPI[] = {
  { "POWER", 0xe037, 0xe0f037 },
  { "SLEEP", 0xe03f, 0xe0f03f },
  { "WAKE", 0xe05e, 0xe0f05e }
};

//Keyboard Windows Multimedia Scan Codes
struct scancode_set1_t scancode_WINDOWS_MULITMEDIA[] = {
  { "Next Track", 0xe04d, 0xe0f04d },
  { "Previous Track", 0xe015, 0xe0f015 },
  { "Stop", 0xe03b, 0xe0f03b },
  { "Play_Pause", 0xe034, 0xe0f034 },
  { "Mute", 0xe023, 0xe0f023 },
  { "Volume Up", 0xe032, 0xe0f032 },
  { "Volume Down", 0xe021, 0xe0f021 },
  { "Media Select", 0xe050, 0xe0f050 },
  { "E-Mail", 0xe048, 0xe0f048 },
  { "Calculator", 0xe02b, 0xe0f02b },
  { "My Computer", 0xe040, 0xe0f040 },
  { "WWW Search", 0xe010, 0xe0f010 },
  { "WWW Home", 0xe03a, 0xe0f03a },
  { "WWW Back", 0xe038, 0xe0f038 },
  { "WWW Forward", 0xe030, 0xe0f030 },
  { "WWW Stop", 0xe028, 0xe0f028 },
  { "WWW Refresh", 0xe020, 0xe0f020 },
  { "WWW Favorites", 0xe018, 0xe0f018 }
};


/**
 * @brief This is firmware’s main().
 *
 */
int main (void) {

  //hang up
  while(1);

  return 0;   //success
}



