123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- /*
- Toby's Low Cost Macro Keyboard
- */
- #ifndef USER_USB_RAM
- #error "Require USB RAM. Go Tools > USB Setting and pick the 2nd option in the dropdown list"
- #endif
- #include "src/userUsbHidMediaKeyboard/USBHIDMediaKeyboard.h"
- #include "win-zh_util.h"
- ////////////// HARDWARE CONFIG //////////
- //Mode LED
- #define LED_A 34
- #define LED_B 33
- //RGB LED
- #define LED_Red 32
- #define LED_Green 31
- #define LED_Blue 30
- //Mode switch
- #define SWITCH 14
- //Button (Mechnical, left to right)
- #define BTN_1 15
- #define BTN_2 16
- #define BTN_3 17
- #define BTN_4 11
- ///////////////// RUNTIME ///////////////
- //Current Mode
- bool modeA = true;
- //Previous button states
- bool bt1ActiveState = false;
- bool bt2ActiveState = false;
- bool bt3ActiveState = false;
- bool bt4ActiveState = false;
- //Current button states
- bool bt1Active = false;
- bool bt2Active = false;
- bool bt3Active = false;
- bool bt4Active = false;
- ////////////// Special Hotkeys //////////////////
- //When Button 2 is hold in mode A, activate volume Mode to
- //allow button 3 and 4 to change volume instead of prev / next song
- bool volMode = false;
- void setup() {
- USBInit();
- pinMode(SWITCH, INPUT);
-
- //Modes LED
- pinMode(LED_A, OUTPUT);
- pinMode(LED_B, OUTPUT);
- //Bottom RGB LEDs
- //by defaults it follows the LED A or B
- pinMode(LED_Red, OUTPUT);
- pinMode(LED_Green, OUTPUT);
- pinMode(LED_Blue, OUTPUT);
-
- if (!digitalRead(SWITCH)){
- digitalWrite(LED_A, HIGH);
- digitalWrite(LED_B, LOW);
- digitalWrite(LED_Blue, HIGH);
- digitalWrite(LED_Red, LOW);
- }else{
- digitalWrite(LED_A, LOW);
- digitalWrite(LED_B, HIGH);
- digitalWrite(LED_Blue, LOW);
- digitalWrite(LED_Red, HIGH);
- }
-
- //LED G reserve for media controller Button 2 long press
- digitalWrite(LED_Green, LOW);
- }
- void loop() {
- //Read the mode of the keyboard
- modeA = !digitalRead(SWITCH);
- //Read the button states, default PULL HIGH (aka LOW Activate)
- bt1Active = !digitalRead(BTN_1);
- bt2Active = !digitalRead(BTN_2);
- bt3Active = !digitalRead(BTN_3);
- bt4Active = !digitalRead(BTN_4);
- if (modeA == HIGH){
- //Mode A
- //Media Controller
- //Button 1: Play / Pause
- if (bt1ActiveState != bt1Active){
- bt1ActiveState = bt1Active;
- if (bt1Active){
- Consumer_press(MEDIA_PLAY_PAUSE);
- }else{
- Consumer_release(MEDIA_PLAY_PAUSE);
- }
- }
- //Button 2: Toggle Playlist / Volumn Control Mode
- if (bt2ActiveState != bt2Active){
- bt2ActiveState = bt2Active;
- if (bt2Active){
- volMode = true;
- digitalWrite(LED_Green, HIGH);
- }else{
- volMode = false;
- digitalWrite(LED_Green, LOW);
- }
- }
- //Previous Song / Vol Down
- if (bt3ActiveState != bt3Active){
- bt3ActiveState = bt3Active;
- if (volMode){
- //Button 2 is held
- if (bt3Active){
- Consumer_press(MEDIA_VOLUME_DOWN);
- }else{
- Consumer_release(MEDIA_VOLUME_DOWN);
- }
- }else{
- //Default mode
- if (bt3Active){
- Consumer_press(MEDIA_PREV);
- }else{
- Consumer_release(MEDIA_PREV);
- }
- }
-
- }
- //Button 4: Next Song / Vol Up
- if (bt4ActiveState != bt4Active){
- bt4ActiveState = bt4Active;
- if (volMode){
- //Button 2 is held
- if (bt4Active){
- Consumer_press(MEDIA_VOLUME_UP);
- }else{
- Consumer_release(MEDIA_VOLUME_UP);
- }
- }else{
- //Default mode
- if (bt4Active){
- Consumer_press(MEDIA_NEXT);
- }else{
- Consumer_release(MEDIA_NEXT);
- }
- }
- }
- //Set the status LED
- digitalWrite(LED_A, HIGH);
- digitalWrite(LED_B, LOW);
- digitalWrite(LED_Blue, HIGH);
- digitalWrite(LED_Red, LOW);
- }else{
- //Mode B
- //For printing out information
-
- //Button 1
- if (bt1ActiveState != bt1Active){
- bt1ActiveState = bt1Active;
- if (bt1Active){
- //Open browser
- Consumer_press(CONSUMER_BROWSER_HOME);
- delay(100);
- Consumer_release(CONSUMER_BROWSER_HOME);
- delay(1500);
- //Type website
- Keyboard_write('h');
- delay(30);
- Keyboard_write('t');
- delay(30);
- Keyboard_write('t');
- delay(30);
- Keyboard_write('p');
- delay(30);
- Keyboard_write('s');
- delay(30);
- Keyboard_write(':');
- delay(30);
- Keyboard_write('/');
- delay(30);
- Keyboard_write('/');
- delay(30);
- Keyboard_write('i');
- delay(30);
- Keyboard_write('m');
- delay(30);
- Keyboard_write('u');
- delay(30);
- Keyboard_write('s');
- delay(30);
- Keyboard_write('l');
- delay(30);
- Keyboard_write('a');
- delay(30);
- Keyboard_write('b');
- delay(30);
- Keyboard_write('.');
- delay(30);
- Keyboard_write('c');
- delay(30);
- Keyboard_write('o');
- delay(30);
- Keyboard_write('m');
- delay(30);
- Keyboard_write(KEY_RETURN);
- delay(30);
- }
- }
-
- //Button 2
- if (bt2ActiveState != bt2Active){
- bt2ActiveState = bt2Active;
- if (bt2Active){
- typeChinese("45935"); //這
- typeChinese("44111"); //是
- Keyboard_write(' ');
- Keyboard_write('U');
- Keyboard_write('T');
- Keyboard_write('F');
- Keyboard_write('-');
- Keyboard_write('8');
- Keyboard_write(' ');
- typeChinese("43706"); //的
- typeChinese("42148"); //中
- typeChinese("42213"); //文
- typeChinese("49129"); //輸
- typeChinese("42328"); //出
- }
- }
- //Button 3
- if (bt3ActiveState != bt3Active){
- bt3ActiveState = bt3Active;
- if (bt3Active){
- typeChinese("36889"); //這
- typeChinese("26159"); //是
- Keyboard_write(' ');
- Keyboard_write('b');
- Keyboard_write('i');
- Keyboard_write('g');
- Keyboard_write('5');
- Keyboard_write(' ');
- typeChinese("30340"); //的
- typeChinese("20013"); //中
- typeChinese("25991"); //文
- typeChinese("36664"); //輸
- typeChinese("20986"); //出
- }
- }
- //Button 4
- if (bt4ActiveState != bt4Active){
- bt4ActiveState = bt4Active;
- if (bt4Active){
- Keyboard_write('S');
- Keyboard_write('e');
- Keyboard_write('e');
- Keyboard_write(' ');
- Keyboard_write('m');
- Keyboard_write('o');
- Keyboard_write('r');
- Keyboard_write('e');
- Keyboard_write(' ');
- Keyboard_write('o');
- Keyboard_write('n');
- Keyboard_write(' ');
- Keyboard_write('h');
- Keyboard_write('t');
- Keyboard_write('t');
- Keyboard_write('p');
- Keyboard_write('s');
- Keyboard_write(':');
- Keyboard_write('/');
- Keyboard_write('/');
- Keyboard_write('g');
- Keyboard_write('i');
- Keyboard_write('t');
- Keyboard_write('h');
- Keyboard_write('u');
- Keyboard_write('b');
- Keyboard_write('.');
- Keyboard_write('c');
- Keyboard_write('o');
- Keyboard_write('m');
- Keyboard_write('/');
- Keyboard_write('t');
- Keyboard_write('o');
- Keyboard_write('b');
- Keyboard_write('y');
- Keyboard_write('c');
- Keyboard_write('h');
- Keyboard_write('u');
- Keyboard_write('i');
- Keyboard_write('/');
- Keyboard_write('4');
- Keyboard_write('x');
- Keyboard_write('M');
- Keyboard_write('a');
- Keyboard_write('c');
- Keyboard_write('r');
- Keyboard_write('o');
- Keyboard_write('p');
- Keyboard_write('a');
- Keyboard_write('d');
- }
-
- }
-
- //Set the status LED
- digitalWrite(LED_A, LOW);
- digitalWrite(LED_B, HIGH);
- digitalWrite(LED_Blue, LOW);
- digitalWrite(LED_Red, HIGH);
- }
-
- delay(50); //naive debouncing
- }
|