2014-06-25 04:57:36 +00:00
# include <avr/io.h>
# include <avr/power.h>
# include <avr/wdt.h>
# include "lufa.h"
# include "print.h"
# include "sendchar.h"
2014-06-30 19:29:45 +00:00
# include "rn42.h"
2014-07-17 07:59:22 +00:00
# include "rn42_task.h"
2014-06-30 19:29:45 +00:00
# include "serial.h"
# include "keyboard.h"
# include "keycode.h"
# include "action.h"
# include "action_util.h"
# include "wait.h"
2014-07-14 06:20:10 +00:00
# include "suart.h"
2014-07-18 17:33:23 +00:00
# include "suspend.h"
2014-06-25 04:57:36 +00:00
2014-07-14 06:20:10 +00:00
static int8_t sendchar_func ( uint8_t c )
{
xmit ( c ) ; // SUART
2014-11-29 11:47:15 +00:00
sendchar ( c ) ; // LUFA
2014-07-17 07:59:22 +00:00
return 0 ;
2014-07-14 06:20:10 +00:00
}
2014-06-25 04:57:36 +00:00
static void SetupHardware ( void )
{
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR & = ~ ( 1 < < WDRF ) ;
wdt_disable ( ) ;
/* Disable clock division */
clock_prescale_set ( clock_div_1 ) ;
// Leonardo needs. Without this USB device is not recognized.
USB_Disable ( ) ;
USB_Init ( ) ;
// for Console_Task
USB_Device_EnableSOFEvents ( ) ;
2014-07-14 06:20:10 +00:00
print_set_sendchar ( sendchar_func ) ;
// SUART PD0:output, PD1:input
DDRD | = ( 1 < < 0 ) ;
PORTD | = ( 1 < < 0 ) ;
DDRD & = ~ ( 1 < < 1 ) ;
PORTD | = ( 1 < < 1 ) ;
2014-06-25 04:57:36 +00:00
}
int main ( void ) __attribute__ ( ( weak ) ) ;
int main ( void )
{
SetupHardware ( ) ;
sei ( ) ;
2014-06-30 19:29:45 +00:00
/* wait for USB startup to get ready for debug output */
uint8_t timeout = 255 ; // timeout when USB is not available(Bluetooth)
while ( timeout - - & & USB_DeviceState ! = DEVICE_STATE_Configured ) {
wait_ms ( 4 ) ;
2014-06-25 04:57:36 +00:00
# if defined(INTERRUPT_CONTROL_ENDPOINT)
;
# else
USB_USBTask ( ) ;
# endif
}
2014-12-03 06:50:02 +00:00
print ( " \n USB init \n " ) ;
2014-06-25 04:57:36 +00:00
2014-06-30 19:29:45 +00:00
rn42_init ( ) ;
2014-07-17 07:59:22 +00:00
rn42_task_init ( ) ;
2014-06-30 19:29:45 +00:00
print ( " RN-42 init \n " ) ;
2014-06-25 04:57:36 +00:00
/* init modules */
keyboard_init ( ) ;
2014-06-30 19:29:45 +00:00
2014-07-17 04:06:48 +00:00
if ( ! rn42_rts ( ) ) {
2014-06-30 19:29:45 +00:00
host_set_driver ( & rn42_driver ) ;
} else {
host_set_driver ( & lufa_driver ) ;
}
2014-06-25 04:57:36 +00:00
# ifdef SLEEP_LED_ENABLE
sleep_led_init ( ) ;
# endif
2014-12-03 06:50:02 +00:00
print ( " Keyboard start \n " ) ;
2014-06-25 04:57:36 +00:00
while ( 1 ) {
2014-12-03 06:50:02 +00:00
while ( rn42_rts ( ) & & // RN42 is off
USB_DeviceState = = DEVICE_STATE_Suspended ) {
2014-11-29 11:47:15 +00:00
print ( " [s] " ) ;
2014-12-03 06:50:02 +00:00
matrix_power_down ( ) ;
suspend_power_down ( ) ;
suspend_power_down ( ) ;
suspend_power_down ( ) ;
suspend_power_down ( ) ;
suspend_power_down ( ) ;
suspend_power_down ( ) ;
2014-11-26 02:25:45 +00:00
suspend_power_down ( ) ;
2014-06-25 04:57:36 +00:00
if ( USB_Device_RemoteWakeupEnabled & & suspend_wakeup_condition ( ) ) {
USB_Device_SendRemoteWakeup ( ) ;
}
}
keyboard_task ( ) ;
# if !defined(INTERRUPT_CONTROL_ENDPOINT)
USB_USBTask ( ) ;
# endif
2014-06-30 19:29:45 +00:00
2014-07-17 07:59:22 +00:00
rn42_task ( ) ;
2014-06-30 19:29:45 +00:00
}
}