CleanUpGuys

Keyboard code with accurate capslock

Oct 2nd, 2020 (edited)
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.29 KB | None | 0 0
  1. #define USB_LED_NUM_LOCK 0
  2. #define USB_LED_CAPS_LOCK 1
  3. #define USB_LED_SCROLL_LOCK 2
  4. #define USB_LED_COMPOSE 3
  5. #define USB_LED_KANA 4
  6.  
  7. unsigned int KEY_LEFTCURLYBRACE = (unsigned int)('{');
  8. unsigned int KEY_RIGHTCURLYBRACE = (unsigned int)('}');
  9. unsigned int KEY_SMALLERTHAN = (unsigned int)('<');
  10. unsigned int KEY_BIGGERTHAN = (unsigned int)('>');
  11. unsigned int KEY_WQUOTE = (unsigned int)('`');
  12. unsigned int KEY_COLON = (unsigned int)(':');
  13. unsigned int KEY_QUESTIONMAKR = (unsigned int)('?');
  14. unsigned int KEY_TILDE_M = (unsigned int)('~');
  15. unsigned int KEY_DOUBLEQUOTE = (unsigned int)('"');
  16. unsigned int KEY_BAR = (unsigned int)('|');
  17. unsigned int KEY_PASS = (unsigned int)('H');
  18. int passIndex = 0;
  19.  
  20. int Pressed[] = {false,false,false,false,false,false,false,false,false,false,false,false,false,
  21.                  false,false,false,false,false,false,false,false,false,false,false,false,false,
  22.                  false,false,false,false,false,false,false,false,false,false,false,false,false,
  23.                  false,false,false,false,false,false,false,false,false,false,false,false,false,
  24.                  false,false,false,false,false,false,false,false,false,false,false,false,false};
  25.                  
  26. unsigned int Keys[] = {0, MODIFIERKEY_GUI,MODIFIERKEY_CTRL ,MODIFIERKEY_ALT ,0,0,0,KEY_SPACE,MODIFIERKEY_RIGHT_ALT,MODIFIERKEY_RIGHT_CTRL,KEY_LEFT,KEY_DOWN,KEY_RIGHT,
  27.               0,MODIFIERKEY_RIGHT_SHIFT,0,KEY_Z,KEY_X,KEY_C,KEY_V,KEY_B,KEY_N,KEY_M,MODIFIERKEY_RIGHT_SHIFT,KEY_UP,0,
  28.               0,KEY_A,KEY_CAPS_LOCK,KEY_S,KEY_D,KEY_F,KEY_G,KEY_H,KEY_J,KEY_K,KEY_L,KEY_ENTER,0,
  29.               0,KEY_Q,KEY_TAB,KEY_W,KEY_E,KEY_R,KEY_T,KEY_Y,KEY_U,KEY_I,KEY_O,KEY_P,KEY_BACKSPACE,
  30.               KEY_ESC,KEY_2,KEY_1,KEY_3,KEY_4,KEY_5,KEY_6,KEY_7,KEY_8,KEY_9,KEY_0,KEY_MINUS,KEY_EQUAL};
  31.  
  32. unsigned int KeysFn[] = {0, MODIFIERKEY_GUI,MODIFIERKEY_CTRL ,MODIFIERKEY_ALT ,0,0,0,KEY_SPACE,MODIFIERKEY_RIGHT_ALT,MODIFIERKEY_RIGHT_CTRL,KEY_LEFT,KEY_DOWN,KEY_RIGHT,
  33.               0,MODIFIERKEY_RIGHT_SHIFT,0,KEY_F9,KEY_F10,KEY_F11,KEY_F12,KEY_END,KEY_PAGE_DOWN,KEY_BAR,MODIFIERKEY_RIGHT_SHIFT,KEY_UP,0,
  34.               0,KEY_F5,KEY_CAPS_LOCK,KEY_F6,KEY_F7,KEY_F8,KEY_INSERT,KEY_HOME,KEY_PAGE_UP,KEY_SLASH,KEY_BACKSLASH,KEY_ENTER,0,
  35.               0,KEY_F1,KEY_TAB,KEY_F2,KEY_F3,KEY_F4,KEY_MENU,KEY_PRINTSCREEN,KEY_PAUSE,KEY_TILDE_M,KEY_DOUBLEQUOTE,KEY_QUOTE,KEY_DELETE,
  36.               KEY_SEMICOLON,KEY_LEFT_BRACE,KEY_WQUOTE,KEY_RIGHT_BRACE,KEY_LEFTCURLYBRACE,KEY_RIGHTCURLYBRACE,KEY_SMALLERTHAN,KEY_BIGGERTHAN,KEY_SEMICOLON,KEY_COLON,KEY_QUESTIONMAKR,KEY_COMMA,KEY_PERIOD};
  37.  
  38. unsigned int KeysPr[] = {0, KEY_MINUS,MODIFIERKEY_CTRL ,MODIFIERKEY_ALT ,0,0,0,KEY_SPACE,KEY_HOME,KEY_END,KEY_LEFT,KEY_DOWN,KEY_RIGHT,
  39.               0,MODIFIERKEY_RIGHT_SHIFT,0,KEY_Z,KEY_X,KEY_C,KEY_V,KEY_B,KEY_N,KEY_M,KEY_EQUAL,KEY_UP,0,
  40.               0,KEY_A,KEY_CAPS_LOCK,KEY_S,KEY_D,KEY_F,KEY_G,KEY_H,KEY_J,KEY_K,KEY_L,KEY_ENTER,0,
  41.               0,KEY_Q,KEY_TAB,KEY_W,KEY_E,KEY_R,KEY_T,KEY_Y,KEY_U,KEY_I,KEY_O,KEY_P,KEY_BACKSPACE,
  42.               KEY_SEMICOLON,KEY_2,KEY_1,KEY_3,KEY_QUOTE,KEY_DOUBLEQUOTE,KEY_SMALLERTHAN,KEY_BIGGERTHAN,KEY_8,KEY_9,KEY_0,KEY_COMMA,KEY_PERIOD};
  43.  
  44. bool isRowInput = false;
  45.  
  46. const int RowCount = 5;
  47. const int ColCount = 13;
  48. const bool useBounce = true;
  49. const int debounce = 100;
  50. int PRi = 2;
  51. int PRj = 12;
  52. int FNi = 1;
  53. int FNj = 12;
  54. unsigned long LastHit[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,
  55.                            0,0,0,0,0,0,0,0,0,0,0,0,0,
  56.                            0,0,0,0,0,0,0,0,0,0,0,0,0,
  57.                            0,0,0,0,0,0,0,0,0,0,0,0,0,
  58.                            0,0,0,0,0,0,0,0,0,0,0,0,0};
  59. bool isPressedDownOld[] = {false,false,false,false,false,false,false,false,false,false,false,false,false,
  60.                       false,false,false,false,false,false,false,false,false,false,false,false,false,
  61.                       false,false,false,false,false,false,false,false,false,false,false,false,false,
  62.                       false,false,false,false,false,false,false,false,false,false,false,false,false,
  63.                       false,false,false,false,false,false,false,false,false,false,false,false,false};
  64. bool isPressedDown[] = {false,false,false,false,false,false,false,false,false,false,false,false,false,
  65.                       false,false,false,false,false,false,false,false,false,false,false,false,false,
  66.                       false,false,false,false,false,false,false,false,false,false,false,false,false,
  67.                       false,false,false,false,false,false,false,false,false,false,false,false,false,
  68.                       false,false,false,false,false,false,false,false,false,false,false,false,false};
  69.  
  70. const short Rows[] = {0, 1, 2, 3, 4};
  71. const short Cols[] = {5,6,7,8,9,10,12 ,13 ,14 ,15 ,16 ,17, 18};
  72.  
  73. bool CapsLockOn = false;
  74. const int CapsLED = 11;
  75. bool FnOn = false;
  76. const int FnLED = 19;
  77. bool PrOn = false;
  78. const int PrLED = 20;
  79.  
  80. void setup()
  81. {
  82.   Serial.begin(115200);
  83.   Serial.println("Startin up...");
  84.   pinMode(CapsLED, OUTPUT);
  85.   pinMode(FnLED, OUTPUT);
  86.   pinMode(PrLED, OUTPUT);
  87.   digitalWrite(CapsLED, LOW);
  88.   digitalWrite(FnLED, LOW);
  89.   digitalWrite(PrLED, LOW);
  90.  
  91.   for (int i = 0; i < RowCount; i++)
  92.   {
  93.     if(isRowInput)
  94.     {
  95.       pinMode(Rows[i], INPUT);
  96.       digitalWrite(Rows[i], HIGH);
  97.     }
  98.     else
  99.     {
  100.       pinMode(Rows[i], OUTPUT);
  101.       digitalWrite(Rows[i], LOW);
  102.     }
  103.    
  104.   }
  105.   for (int i = 0; i < ColCount; i++)
  106.   {
  107.     if(isRowInput)
  108.     {
  109.       pinMode(Cols[i], OUTPUT);
  110.       digitalWrite(Cols[i], LOW);
  111.     }
  112.     else
  113.     {
  114.       pinMode(Cols[i], INPUT);
  115.       digitalWrite(Cols[i], HIGH);
  116.     }
  117.   }
  118.   Keyboard.begin();
  119. }
  120.  
  121. int Map(int row, int col)
  122. {
  123.   int index = ((13 * row) + col);
  124.   return index;
  125. }
  126.  
  127. bool CheckButton(int Row, int Col, bool bounce = false)
  128. {
  129.   if(bounce)
  130.   {
  131.     if(isRowInput)
  132.     {
  133.       for(int i = 0; i < ColCount; i++)
  134.       {
  135.         digitalWrite(Cols[i], HIGH);
  136.       }
  137.       digitalWrite(Cols[Col], LOW);
  138.       isPressedDown[Map(Row,Col)] = digitalRead(Rows[Row]) == LOW;
  139.       if(!isPressedDown[Map(Row,Col)])
  140.       {
  141.         if(isPressedDownOld[Map(Row,Col)])
  142.         {
  143.           LastHit[Map(Row,Col)] = millis();
  144.         }
  145.       }
  146.       isPressedDownOld[Map(Row,Col)] = isPressedDown[Map(Row,Col)];
  147.       return isPressedDown[Map(Row,Col)] && millis() - LastHit[Map(Row,Col)] >= debounce;
  148.     }
  149.     else
  150.     {
  151.       for(int i = 0; i < RowCount; i++)
  152.       {
  153.         digitalWrite(Rows[i], HIGH);
  154.       }
  155.       digitalWrite(Rows[Row], LOW);
  156.       isPressedDown[Map(Row,Col)] = digitalRead(Cols[Col]) == LOW;
  157.       if(!isPressedDown[Map(Row,Col)])
  158.       {
  159.         if(isPressedDownOld[Map(Row,Col)])
  160.         {
  161.           LastHit[Map(Row,Col)] = millis();
  162.         }
  163.       }
  164.       isPressedDownOld[Map(Row,Col)] = isPressedDown[Map(Row,Col)];
  165.       return isPressedDown[Map(Row,Col)] && millis() - LastHit[Map(Row,Col)] >= debounce;
  166.     }
  167.   }
  168.   else
  169.   {
  170.     if(isRowInput)
  171.     {
  172.       for(int i = 0; i < ColCount; i++)
  173.       {
  174.         digitalWrite(Cols[i], HIGH);
  175.       }
  176.       digitalWrite(Cols[Col], LOW);
  177.       return digitalRead(Rows[Row]) == LOW;
  178.     }
  179.     else
  180.     {
  181.       for(int i = 0; i < RowCount; i++)
  182.       {
  183.         digitalWrite(Rows[i], HIGH);
  184.       }
  185.       digitalWrite(Rows[Row], LOW);
  186.       return digitalRead(Cols[Col]) == LOW;
  187.     }
  188.   }
  189. }
  190.  
  191. #include <usb_private.h>
  192. // This will cause some issues with traditional teensy code
  193. // go to hardware/teensy/avr/cores/usb_serial_hid/
  194. // look at usb_api.h and usb_private.h
  195. // before extern uint8_t joystick_report_data[12];
  196. // add
  197. // #ifndef JOYSTICK_LINKAGE
  198. // #define JOYSTICK_LINKAGE
  199. // after extern uint8_t joystick_report_data[12];
  200. // add
  201. // #endif
  202.  
  203. void Run()
  204. {
  205.   CapsLockOn = keyboard_leds & (1<<USB_LED_CAPS_LOCK);
  206.   for(int i = 0; i < RowCount; i++)
  207.   {
  208.     for(int j = 0; j < ColCount; j++)
  209.     {
  210.       if(CheckButton(i,j,useBounce) && !Pressed[Map(i,j)])
  211.       {
  212.         Serial.print("[");
  213.         Serial.print(i);
  214.         Serial.print(",");
  215.         Serial.print(j);
  216.         Serial.print("] - \"");
  217.         Serial.print(Keys[Map(i,j)]);
  218.         Serial.print("\"");
  219.         Serial.println(" is Pressed!");
  220.         if(FnOn)
  221.         {
  222.           Keyboard.press(KeysFn[Map(i,j)]);
  223.         }
  224.         else
  225.         {
  226.           if(PrOn)
  227.           {
  228.             Keyboard.press(KeysPr[Map(i,j)]);
  229.           }
  230.           else
  231.           {
  232.             Keyboard.press(Keys[Map(i,j)]);
  233.           }
  234.         }
  235.         Pressed[Map(i,j)] = true;
  236.         if(i == FNi && j == FNj)
  237.           FnOn = !FnOn;
  238.         if(i == PRi && j == PRj)
  239.           PrOn = !PrOn;
  240.       }
  241.       if(!CheckButton(FNi,FNj,useBounce) && Pressed[Map(FNi,FNj)])
  242.       {
  243.         FnOn = false;
  244.       }
  245.       if(!CheckButton(i,j,useBounce) && Pressed[Map(i,j)])
  246.       {
  247.         Keyboard.release(KeysPr[Map(i,j)]);
  248.         Keyboard.release(KeysFn[Map(i,j)]);
  249.         Keyboard.release(  Keys[Map(i,j)]);
  250.         Pressed[Map(i,j)] = false;
  251.       }
  252.     }
  253.   }
  254. }
  255.  
  256. void SetLED()
  257. {
  258.   if(CapsLockOn)
  259.   {
  260.     digitalWrite(CapsLED, HIGH);
  261.   }
  262.   else
  263.   {
  264.     digitalWrite(CapsLED, LOW);
  265.   }
  266.   if(FnOn)
  267.   {
  268.     digitalWrite(FnLED, HIGH);
  269.   }
  270.   else
  271.   {
  272.     digitalWrite(FnLED, LOW);
  273.   }
  274.   if(PrOn)
  275.   {
  276.     digitalWrite(PrLED, HIGH);
  277.   }
  278.   else
  279.   {
  280.     digitalWrite(PrLED, LOW);
  281.   }
  282. }
  283. //
  284. void loop()
  285. {
  286.   Run();
  287.   SetLED();
  288.   delay(20);
  289. }
Add Comment
Please, Sign In to add comment