keyboard_task.c

Go to the documentation of this file.
00001 /*This file is prepared for Doxygen automatic documentation generation.*/
00013 
00014 /* Copyright (c) 2009 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  * 4. This software may only be redistributed and used in connection with an Atmel
00030  * AVR product.
00031  *
00032  * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
00033  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00034  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
00035  * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
00036  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00037  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00038  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00039  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00040  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00041  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00042  */
00043 
00044 //_____  I N C L U D E S ___________________________________________________
00045 
00046 #include "config.h"
00047 #include "conf_usb.h"
00048 #include "keyboard_task.h"
00049 #include "lib_mcu/usb/usb_drv.h"
00050 #include "usb_descriptors.h"
00051 #include "modules/usb/device_chap9/usb_standard_request.h"
00052 #include "lib_mcu/power/power_drv.h"
00053 
00054 
00055 //_____ D E F I N I T I O N S ______________________________________________
00056 
00057 
00058 U8  code    usb_keys[]= {HID_ENTER, \
00059 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\
00060 ,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\
00061 ,HID_KEYPAD_MINUS,HID_SPACEBAR,HID_U,HID_S,HID_B,HID_SPACEBAR,HID_O,HID_T,HID_G,HID_SPACEBAR,HID_ENTER\
00062 ,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\
00063 ,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\
00064 ,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\
00065 ,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\
00066 ,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\
00067 ,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\
00068                            };
00069 
00070 
00071 
00072 U8  code    usb_keyup[]= {\
00073                         HID_UP, \
00074                         };
00075 U8  code    usb_keydown[]= {\
00076                         HID_DOWN, \
00077                         };
00078 U8  code    usb_keyright[]= {\
00079                         HID_RIGHT, \
00080                         };
00081 U8  code    usb_keyleft[]= {\
00082                         HID_LEFT, \
00083                         };
00084 
00085 
00086 
00087 #define SIZEOF_USB_KEYS     (Uint16)sizeof(usb_keys)
00088 
00089 
00090 //_____ D E C L A R A T I O N S ____________________________________________
00091 
00092 volatile U8    cpt_sof;
00093          U8    transmit_no_key;
00094 volatile bit   key_hit;
00095          U8    usb_key;
00096          U8    usb_kbd_state;
00097          U16   usb_data_to_send;
00098 #ifdef __GNUC__
00099 PGM_VOID_P     usb_key_pointer;
00100 #else
00101 U8   code *    usb_key_pointer;
00102 #endif
00103 
00104 
00107 void keyboard_task_init(void)
00108 {
00109    transmit_no_key   = FALSE;
00110    key_hit           = FALSE;
00111    usb_kbd_state     = 0;
00112    Joy_init();
00113    cpt_sof           = 0;
00114    Usb_enable_sof_interrupt();
00115 }
00116 
00117 
00121 void keyboard_task(void)
00122 {
00123    if(Is_device_enumerated())
00124    {
00125       // if USB ready to transmit new data :
00126       //        - if last time = 0, nothing
00127       //        - if key pressed -> transmit key
00128       //        - if !key pressed -> transmit 0
00129       if (key_hit==FALSE )
00130       {
00131 
00132          if (cpt_sof>= NB_IDLE_POLLING_SOF) 
00133          {
00134             kbd_test_hit();
00135             cpt_sof = 0;
00136          }
00137       }
00138       
00139       else
00140       {
00141          Usb_select_endpoint(EP_KBD_IN);   
00142          if(Is_usb_write_enabled())
00143          {
00144             if ( transmit_no_key==FALSE)
00145             {
00146                transmit_no_key = TRUE;
00147                Usb_write_byte(HID_MODIFIER_NONE);  // Byte0: Modifier
00148                Usb_write_byte(0);                  // Byte1: Reserved
00149                Usb_write_byte(usb_key);            // Byte2: Keycode 0
00150                Usb_write_byte(0);                  // Byte2: Keycode 1
00151                Usb_write_byte(0);                  // Byte2: Keycode 2
00152                Usb_write_byte(0);                  // Byte2: Keycode 3
00153                Usb_write_byte(0);                  // Byte2: Keycode 4
00154                Usb_write_byte(0);                  // Byte2: Keycode 5
00155                Usb_send_in();
00156                return;
00157             }
00158             else
00159             {
00160                key_hit = FALSE;
00161                transmit_no_key = FALSE;
00162                Usb_write_byte(0);
00163                Usb_write_byte(0);
00164                Usb_write_byte(0);
00165                Usb_write_byte(0);
00166                Usb_write_byte(0);
00167                Usb_write_byte(0);
00168                Usb_write_byte(0);
00169                Usb_write_byte(0);
00170                Usb_send_in();
00171             }
00172          }
00173       }
00174    }
00175 }
00176 
00177 
00182 void kbd_test_hit(void)
00183 {
00184    switch (usb_kbd_state)
00185    {
00186       case 0:
00187       if (Is_btn_middle())
00188       {
00189          usb_kbd_state = 1;
00190          usb_key_pointer = usb_keys;
00191          usb_data_to_send = SIZEOF_USB_KEYS;
00192       }
00193       else if (Is_joy_up())
00194       {
00195          usb_kbd_state = 1;
00196          usb_key_pointer = usb_keyup;
00197          usb_data_to_send = (Uint16)sizeof(usb_keyup);
00198       }    
00199       else if (Is_joy_down())
00200       {
00201          usb_kbd_state = 1;
00202          usb_key_pointer = usb_keydown;
00203         usb_data_to_send = (Uint16)sizeof(usb_keydown);
00204       }   
00205       else if (Is_joy_right())
00206       {
00207          usb_kbd_state = 1;
00208          usb_key_pointer = usb_keyright;
00209         usb_data_to_send = (Uint16)sizeof(usb_keyright);
00210       } 
00211       else if (Is_joy_left())
00212       {
00213          usb_kbd_state = 1;
00214          usb_key_pointer = usb_keyleft;
00215         usb_data_to_send = (Uint16)sizeof(usb_keyleft);
00216       }       
00217       
00218       break;
00219 
00220       case 1:
00221       if (usb_data_to_send != 0)
00222       {
00223          if ((key_hit == FALSE) && (transmit_no_key == FALSE))
00224          {
00225 #ifndef __GNUC__
00226             usb_key = *usb_key_pointer++;
00227 #else
00228             usb_key = pgm_read_byte_near(usb_key_pointer++);
00229 #endif
00230             usb_data_to_send --;
00231             key_hit = TRUE;
00232          }
00233       }
00234       else
00235       {
00236          usb_kbd_state = 0;
00237       }
00238       break;
00239    }
00240 }
00241 
00242 
00248 void vbus_off_action(void)
00249 {
00250    Usb_detach();
00251 }
00252 
00253 
00254 void suspend_action(void)
00255 {
00256 #if (USB_REMOTE_WAKEUP_FEATURE == ENABLED)
00257    if (remote_wakeup_feature == ENABLED)
00258    {
00259       Switches_enable_it()
00260    }
00261 #endif 
00262    Enable_interrupt();  
00263    Enter_power_down_mode();
00264 }
00265 
00266 
00267 #ifdef __GNUC__
00268  ISR(PCINT0_vect)
00269 #else
00270 #pragma vector = PCINT0_vect
00271 __interrupt void mouse_disco_int()
00272 #endif
00273 {
00274    Switches_disable_it();
00275    usb_generate_remote_wakeup();
00276 }
00277 
00278 
00279 void sof_action(void)
00280 {
00281    cpt_sof++;
00282 }

Generated on Fri Sep 11 14:37:15 2009 for ATMEL by  doxygen 1.5.3