2011-07-20 15:32:52 +00:00
/*
Copyright 2011 Jun Wako < wakojun @ gmail . com >
This program 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 2 of the License , or
( at your option ) any later version .
This program 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/>.
*/
2011-02-12 15:15:51 +00:00
# include <stdint.h>
# include <stdbool.h>
# include <util/delay.h>
# include "usb_keycodes.h"
# include "host.h"
# include "print.h"
# include "debug.h"
# include "util.h"
# include "timer.h"
# include "layer.h"
2011-02-21 06:43:17 +00:00
# include "matrix.h"
2011-09-22 07:56:36 +00:00
# include "bootloader.h"
2011-02-12 15:15:51 +00:00
# include "command.h"
# ifdef HOST_PJRC
# include "usb_keyboard.h"
2011-09-17 13:39:50 +00:00
# ifdef EXTRAKEY_ENABLE
2011-02-12 15:15:51 +00:00
# include "usb_extra.h"
# endif
# endif
2011-09-17 13:39:50 +00:00
# ifdef HOST_VUSB
# include "usbdrv.h"
# endif
2011-02-12 15:15:51 +00:00
2011-09-17 13:39:50 +00:00
static uint8_t command_common ( void ) ;
2011-02-12 15:15:51 +00:00
static void help ( void ) ;
static void switch_layer ( uint8_t layer ) ;
2011-09-17 13:39:50 +00:00
static bool last_print_enable ;
2011-02-12 15:15:51 +00:00
uint8_t command_proc ( void )
{
2011-09-17 13:39:50 +00:00
uint8_t processed = 0 ;
last_print_enable = print_enable ;
2011-02-12 15:15:51 +00:00
if ( ! IS_COMMAND ( ) )
return 0 ;
print_enable = true ;
2011-09-17 13:39:50 +00:00
if ( command_extra ( ) | | command_common ( ) ) {
processed = 1 ;
_delay_ms ( 500 ) ;
}
print_enable = last_print_enable ;
return processed ;
}
/* This allows to define extra commands. return 0 when not processed. */
uint8_t command_extra ( void ) __attribute__ ( ( weak ) ) ;
uint8_t command_extra ( void )
{
return 0 ;
}
static uint8_t command_common ( void )
{
2011-02-21 16:21:53 +00:00
switch ( host_get_first_key ( ) ) {
2011-02-12 15:15:51 +00:00
case KB_H :
help ( ) ;
break ;
case KB_B :
host_clear_keyboard_report ( ) ;
host_send_keyboard_report ( ) ;
2011-09-22 07:56:36 +00:00
print ( " jump to bootloader... " ) ;
2011-02-12 15:15:51 +00:00
_delay_ms ( 1000 ) ;
2011-09-22 07:56:36 +00:00
bootloader_jump ( ) ; // not return
print ( " not supported. \n " ) ;
2011-02-12 15:15:51 +00:00
break ;
case KB_D :
debug_enable = ! debug_enable ;
if ( debug_enable ) {
last_print_enable = true ;
print ( " debug enabled. \n " ) ;
debug_matrix = true ;
debug_keyboard = true ;
debug_mouse = true ;
} else {
print ( " debug disabled. \n " ) ;
last_print_enable = false ;
debug_matrix = false ;
debug_keyboard = false ;
debug_mouse = false ;
}
break ;
case KB_X : // debug matrix toggle
debug_matrix = ! debug_matrix ;
if ( debug_matrix )
print ( " debug matrix enabled. \n " ) ;
else
print ( " debug matrix disabled. \n " ) ;
break ;
case KB_K : // debug keyboard toggle
debug_keyboard = ! debug_keyboard ;
if ( debug_keyboard )
print ( " debug keyboard enabled. \n " ) ;
else
print ( " debug keyboard disabled. \n " ) ;
break ;
case KB_M : // debug mouse toggle
debug_mouse = ! debug_mouse ;
if ( debug_mouse )
print ( " debug mouse enabled. \n " ) ;
else
print ( " debug mouse disabled. \n " ) ;
break ;
case KB_V : // print version & information
print ( STR ( DESCRIPTION ) " \n " ) ;
break ;
case KB_T : // print timer
print ( " timer: " ) ; phex16 ( timer_count ) ; print ( " \n " ) ;
break ;
case KB_P : // print toggle
2011-02-21 16:21:53 +00:00
if ( last_print_enable ) {
2011-02-12 15:15:51 +00:00
print ( " print disabled. \n " ) ;
last_print_enable = false ;
} else {
last_print_enable = true ;
print ( " print enabled. \n " ) ;
}
break ;
case KB_S :
# ifdef HOST_PJRC
print ( " UDCON: " ) ; phex ( UDCON ) ; print ( " \n " ) ;
print ( " UDIEN: " ) ; phex ( UDIEN ) ; print ( " \n " ) ;
print ( " UDINT: " ) ; phex ( UDINT ) ; print ( " \n " ) ;
2011-03-09 15:50:27 +00:00
print ( " usb_keyboard_leds: " ) ; phex ( usb_keyboard_leds ) ; print ( " \n " ) ;
print ( " usb_keyboard_protocol: " ) ; phex ( usb_keyboard_protocol ) ; print ( " \n " ) ;
print ( " usb_keyboard_idle_config: " ) ; phex ( usb_keyboard_idle_config ) ; print ( " \n " ) ;
print ( " usb_keyboard_idle_count: " ) ; phex ( usb_keyboard_idle_count ) ; print ( " \n " ) ;
2011-09-17 13:39:50 +00:00
# endif
# ifdef HOST_VUSB
# if USB_COUNT_SOF
print ( " usbSofCount: " ) ; phex ( usbSofCount ) ; print ( " \n " ) ;
# endif
2011-02-12 15:15:51 +00:00
# endif
break ;
2011-09-17 13:39:50 +00:00
# ifdef NKRO_ENABLE
2011-02-12 15:15:51 +00:00
case KB_N :
2011-02-21 16:21:53 +00:00
// send empty report before change
2011-02-21 06:43:17 +00:00
host_clear_keyboard_report ( ) ;
host_send_keyboard_report ( ) ;
2011-02-12 15:15:51 +00:00
keyboard_nkro = ! keyboard_nkro ;
if ( keyboard_nkro )
2011-09-17 13:39:50 +00:00
print ( " NKRO: enabled \n " ) ;
2011-02-12 15:15:51 +00:00
else
2011-09-17 13:39:50 +00:00
print ( " NKRO: disabled \n " ) ;
2011-02-12 15:15:51 +00:00
break ;
# endif
2011-09-17 13:39:50 +00:00
# ifdef EXTRAKEY_ENABLE
2011-02-12 15:15:51 +00:00
case KB_ESC :
2011-06-30 16:10:55 +00:00
host_clear_keyboard_report ( ) ;
host_send_keyboard_report ( ) ;
2011-05-21 01:28:57 +00:00
# ifdef HOST_PJRC
2011-02-12 15:15:51 +00:00
if ( suspend & & remote_wakeup ) {
usb_remote_wakeup ( ) ;
} else {
2011-05-21 01:28:57 +00:00
host_system_send ( SYSTEM_POWER_DOWN ) ;
2011-06-30 16:10:55 +00:00
host_system_send ( 0 ) ;
_delay_ms ( 500 ) ;
2011-02-12 15:15:51 +00:00
}
2011-05-21 01:28:57 +00:00
# else
host_system_send ( SYSTEM_POWER_DOWN ) ;
2011-06-30 16:10:55 +00:00
host_system_send ( 0 ) ;
_delay_ms ( 500 ) ;
2011-05-21 01:28:57 +00:00
# endif
2011-02-12 15:15:51 +00:00
break ;
# endif
case KB_BSPC :
matrix_init ( ) ;
print ( " clear matrix \n " ) ;
break ;
case KB_0 :
switch_layer ( 0 ) ;
break ;
case KB_1 :
switch_layer ( 1 ) ;
break ;
case KB_2 :
switch_layer ( 2 ) ;
break ;
case KB_3 :
switch_layer ( 3 ) ;
break ;
case KB_4 :
switch_layer ( 4 ) ;
break ;
default :
2011-09-17 13:39:50 +00:00
return 0 ;
2011-02-12 15:15:51 +00:00
}
2011-09-17 13:39:50 +00:00
return 1 ;
2011-02-12 15:15:51 +00:00
}
static void help ( void )
{
print ( " b: jump to bootloader \n " ) ;
print ( " d: toggle debug enable \n " ) ;
print ( " x: toggle matrix debug \n " ) ;
print ( " k: toggle keyboard debug \n " ) ;
print ( " m: toggle mouse debug \n " ) ;
print ( " p: toggle print enable \n " ) ;
print ( " v: print version \n " ) ;
print ( " t: print timer count \n " ) ;
print ( " s: print status \n " ) ;
2011-09-17 13:39:50 +00:00
# ifdef NKRO_ENABLE
print ( " n: toggle NKRO \n " ) ;
2011-02-12 15:15:51 +00:00
# endif
print ( " Backspace: clear matrix \n " ) ;
print ( " ESC: power down/wake up \n " ) ;
print ( " 0: switch to Layer0 \n " ) ;
print ( " 1: switch to Layer1 \n " ) ;
print ( " 2: switch to Layer2 \n " ) ;
print ( " 3: switch to Layer3 \n " ) ;
print ( " 4: switch to Layer4 \n " ) ;
}
static void switch_layer ( uint8_t layer )
{
print ( " current_layer: " ) ; phex ( current_layer ) ; print ( " \n " ) ;
print ( " default_layer: " ) ; phex ( default_layer ) ; print ( " \n " ) ;
current_layer = layer ;
default_layer = layer ;
print ( " switch to Layer: " ) ; phex ( layer ) ; print ( " \n " ) ;
}