keyboard_task.c

Go to the documentation of this file.
00001 /*This file has been prepared for Doxygen automatic documentation generation.*/
00013 
00014 /* Copyright (c) 2007, Atmel Corporation All rights reserved.
00015  *
00016  * Redistribution and use in source and binary forms, with or without
00017  * modification, are permitted provided that the following conditions are met:
00018  *
00019  * 1. Redistributions of source code must retain the above copyright notice,
00020  * this list of conditions and the following disclaimer.
00021  *
00022  * 2. Redistributions in binary form must reproduce the above copyright notice,
00023  * this list of conditions and the following disclaimer in the documentation
00024  * and/or other materials provided with the distribution.
00025  *
00026  * 3. The name of ATMEL may not be used to endorse or promote products derived
00027  * from this software without specific prior written permission.
00028  *
00029  * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
00030  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00031  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
00032  * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
00033  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00034  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00035  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00036  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00037  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00038  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00039  */
00040 
00041 //_____  I N C L U D E S ___________________________________________________
00042 
00043 #include "config.h"
00044 #include "conf_usb.h"
00045 #include "keyboard_task.h"
00046 #include "lib_board/stk_525/stk_525.h"
00047 #include "lib_mcu/usb/usb_drv.h"
00048 #include "usb_descriptors.h"
00049 #include "modules/usb/device_chap9/usb_standard_request.h"
00050 #include "lib_mcu/power/power_drv.h"
00051 
00052 
00053 //_____ D E F I N I T I O N S ______________________________________________
00054 
00055 U8  code    usb_keys[]= {HID_ENTER, \
00056 HID_W, HID_E, HID_L, HID_C, HID_O, HID_M, HID_E, HID_SPACEBAR, HID_T, HID_O, HID_SPACEBAR, HID_H, HID_I, HID_D, HID_SPACEBAR, HID_K, HID_E, HID_Y, HID_B, HID_O, HID_A, HID_R, HID_D, HID_SPACEBAR, HID_D, HID_E, HID_M, HID_O, HID_SPACEBAR, HID_A, HID_N, HID_D, HID_SPACEBAR, HID_C, HID_O, HID_N, HID_G, HID_R, HID_A, HID_T, HID_U, HID_L, HID_A, HID_T, HID_I, HID_O, HID_N, HID_S, HID_SPACEBAR, HID_F, HID_O, HID_R, HID_SPACEBAR, HID_S, HID_E, HID_L, HID_E, HID_C, HID_T, HID_I, HID_N, HID_G, HID_SPACEBAR, HID_T, HID_H, HID_E, HID_SPACEBAR, HID_A, HID_T, HID_9, HID_0, HID_U, HID_S, HID_B, HID_X, HID_X, HID_X, HID_SPACEBAR, HID_M, HID_I, HID_C, HID_R, HID_O, HID_C, HID_O, HID_N, HID_T, HID_R, HID_O, HID_L, HID_L, HID_E, HID_R, HID_SPACEBAR, HID_F, HID_A, HID_M, HID_I, HID_L, HID_Y, HID_DOT,HID_ENTER,HID_ENTER\
00057 ,HID_T, HID_H, HID_E, HID_SPACEBAR, HID_A, HID_T, HID_9, HID_0, HID_U, HID_S, HID_B, HID_X, HID_X, HID_X, HID_SPACEBAR,HID_I, HID_S, HID_SPACEBAR, HID_B, HID_A, HID_S, HID_E, HID_D, HID_SPACEBAR,HID_O, HID_N, HID_SPACEBAR, HID_T, HID_H, HID_E, HID_SPACEBAR, HID_A, HID_V, HID_R, HID_SPACEBAR, HID_C, HID_O, HID_R, HID_E, HID_SPACEBAR, HID_W, HID_I, HID_T, HID_H, HID_SPACEBAR, HID_T, HID_H, HID_E, HID_SPACEBAR, HID_F, HID_O, HID_L, HID_L, HID_O, HID_W, HID_I, HID_N, HID_G, HID_SPACEBAR, HID_F, HID_E, HID_A, HID_T, HID_U, HID_R, HID_E, HID_S, HID_ENTER\
00058 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_S,HID_B,HID_SPACEBAR,HID_O,HID_T,HID_G,HID_SPACEBAR,HID_ENTER\
00059 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_L,HID_O,HID_W,HID_SLASH,HID_F,HID_U,HID_L,HID_L,HID_SPACEBAR,HID_S,HID_P,HID_E,HID_E,HID_D,HID_SPACEBAR,HID_C,HID_O,HID_N,HID_T,HID_R,HID_O,HID_L,HID_L,HID_E,HID_R,HID_SPACEBAR,HID_W,HID_I,HID_T,HID_H,HID_SPACEBAR,HID_7,HID_SPACEBAR,HID_E,HID_N,HID_D,HID_P,HID_O,HID_I,HID_N,HID_T,HID_S,HID_ENTER\
00060 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_P,HID_SPACEBAR,HID_T,HID_O,HID_SPACEBAR,HID_1,HID_2,HID_8,HID_SPACEBAR,HID_K,HID_B,HID_Y,HID_T,HID_E,HID_S,HID_SPACEBAR,HID_O,HID_N,HID_KEYPAD_MINUS,HID_C,HID_H,HID_I,HID_P,HID_SPACEBAR,HID_F,HID_L,HID_A,HID_S,HID_H,HID_SPACEBAR,HID_M,HID_E,HID_M,HID_O,HID_R,HID_Y,HID_ENTER\
00061 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_S,HID_B,HID_SPACEBAR,HID_B,HID_O,HID_O,HID_T,HID_L,HID_O,HID_A,HID_D,HID_E,HID_R,HID_ENTER\
00062 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_A,HID_R,HID_T,HID_SLASH,HID_S,HID_P,HID_I,HID_SLASH,HID_SPACEBAR,HID_T,HID_W,HID_I,HID_ENTER\
00063 ,HID_SPACEBAR,HID_SPACEBAR,HID_A,HID_N,HID_D,HID_SPACEBAR,HID_M,HID_O,HID_R,HID_E,HID_DOT,HID_DOT,HID_DOT,HID_ENTER\
00064 ,HID_E,HID_N,HID_J,HID_O,HID_Y,HID_SPACEBAR,HID_Y,HID_O,HID_U,HID_R,HID_SPACEBAR,HID_T,HID_I,HID_M,HID_E,HID_SPACEBAR,HID_W,HID_I,HID_T,HID_H,HID_SPACEBAR,HID_A,HID_T,HID_M,HID_E,HID_L,HID_SPACEBAR,HID_P,HID_R,HID_O,HID_D,HID_U,HID_C,HID_T,HID_S,HID_DOT,HID_DOT,HID_DOT\
00065                            };
00066 
00067 #define SIZEOF_USB_KEYS     (Uint16)sizeof(usb_keys)
00068 
00069 
00070 //_____ D E C L A R A T I O N S ____________________________________________
00071 
00072 volatile U8    cpt_sof;
00073          U8    transmit_no_key;
00074 volatile bit   key_hit;
00075          U8    usb_key;
00076          U8    usb_kbd_state;
00077          U16   usb_data_to_send;
00078 #ifdef __GNUC__
00079 PGM_VOID_P     usb_key_pointer;
00080 #else
00081 U8   code *    usb_key_pointer;
00082 #endif
00083 
00084 
00087 void keyboard_task_init(void)
00088 {
00089    transmit_no_key   = FALSE;
00090    key_hit           = FALSE;
00091    usb_kbd_state     = 0;
00092    Joy_init();
00093    cpt_sof           = 0;
00094 }
00095 
00096 
00100 void keyboard_task(void)
00101 {
00102    if(Is_device_enumerated())
00103    {
00104       // if USB ready to transmit new data :
00105       //        - if last time = 0, nothing
00106       //        - if key pressed -> transmit key
00107       //        - if !key pressed -> transmit 0
00108       if (key_hit==FALSE)
00109       {
00110          kbd_test_hit();
00111       }
00112       
00113       else
00114       {
00115          Usb_select_endpoint(EP_KBD_IN);   
00116          if(Is_usb_write_enabled())
00117          {
00118             if ( transmit_no_key==FALSE)
00119             {
00120                transmit_no_key = TRUE;
00121                Usb_write_byte(HID_MODIFIER_NONE);  // Byte0: Modifier
00122                Usb_write_byte(0);                  // Byte1: Reserved
00123                Usb_write_byte(usb_key);            // Byte2: Keycode 0
00124                Usb_write_byte(0);                  // Byte2: Keycode 1
00125                Usb_write_byte(0);                  // Byte2: Keycode 2
00126                Usb_write_byte(0);                  // Byte2: Keycode 3
00127                Usb_write_byte(0);                  // Byte2: Keycode 4
00128                Usb_write_byte(0);                  // Byte2: Keycode 5
00129                Usb_send_in();
00130                return;
00131             }
00132             else
00133             {
00134                key_hit = FALSE;
00135                transmit_no_key = FALSE;
00136                Usb_write_byte(0);
00137                Usb_write_byte(0);
00138                Usb_write_byte(0);
00139                Usb_write_byte(0);
00140                Usb_write_byte(0);
00141                Usb_write_byte(0);
00142                Usb_write_byte(0);
00143                Usb_write_byte(0);
00144                Usb_send_in();
00145             }
00146          }
00147       }
00148    }
00149 }
00150 
00151 
00156 void kbd_test_hit(void)
00157 {
00158    switch (usb_kbd_state)
00159    {
00160       case 0:
00161       if (Is_btn_middle())
00162       {
00163          usb_kbd_state = 1;
00164          usb_key_pointer = usb_keys;
00165          usb_data_to_send = SIZEOF_USB_KEYS;
00166       }
00167       break;
00168 
00169       case 1:
00170       if (usb_data_to_send != 0)
00171       {
00172          if ((key_hit == FALSE) && (transmit_no_key == FALSE))
00173          {
00174 #ifndef __GNUC__
00175             usb_key = *usb_key_pointer++;
00176 #else
00177             usb_key = pgm_read_byte_near(usb_key_pointer++);
00178 #endif
00179             usb_data_to_send --;
00180             key_hit = TRUE;
00181          }
00182       }
00183       else
00184       {
00185          usb_kbd_state = 0;
00186       }
00187       break;
00188    }
00189 }
00190 
00191 
00197 void vbus_off_action(void)
00198 {
00199    Usb_detach();
00200 }
00201 
00202 
00203 void suspend_action(void)
00204 {
00205 #if (USB_REMOTE_WAKEUP_FEATURE == ENABLED)
00206    if (remote_wakeup_feature == ENABLED)
00207    {
00208       Switches_enable_it()
00209    }
00210 #endif 
00211    Enable_interrupt();  
00212    Enter_power_down_mode();
00213 }
00214 
00215 
00216 #ifdef __GNUC__
00217  ISR(PCINT0_vect)
00218 #else
00219 #pragma vector = PCINT0_vect
00220 __interrupt void mouse_disco_int()
00221 #endif
00222 {
00223    Switches_disable_it();
00224    usb_generate_remote_wakeup();
00225 }
00226 

Generated on Fri Oct 31 15:59:42 2008 for ATMEL by  doxygen 1.5.3