⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 device_mouse_task.c

📁 ATMEL 90usb128 USB source,include USB protocol stack.
💻 C
字号:
//!
//! @file device_mouse_task.c,v
//!
//! Copyright (c) 2004 Atmel.
//!
//! Please read file license.txt for copyright notice.
//!
//! @brief This file manages the Mouse task.
//!
//!
//! @version 1.6 at90usb128-usbkey-demo-3enum-host-mouse-1_0_4 $Id: device_mouse_task.c,v 1.6 2006/08/02 15:16:25 rletendu Exp $
//!
//! @todo
//! @bug
//!/

//_____  I N C L U D E S ___________________________________________________

#include "config.h"
#include "conf_usb.h"
#include "device_mouse_task.h"
#include "lib_mcu/usb/usb_drv.h"
#include "usb_descriptors.h"
#include "modules/usb/device_chap9/usb_standard_request.h"
#include "lib_mcu/wdt/wdt_drv.h"






//_____ M A C R O S ________________________________________________________

#define Usb_mouse_up()                  (usb_mouse_report[2]-=MOUSE_SPEED)
#define Usb_mouse_down()                (usb_mouse_report[2]+=MOUSE_SPEED)
#define Usb_mouse_left()                (usb_mouse_report[1]-=MOUSE_SPEED)
#define Usb_mouse_right()               (usb_mouse_report[1]+=MOUSE_SPEED)
#define Usb_mouse_click_left()          (usb_mouse_report[0] |= 0x01)
#define Usb_mouse_click_right()         (usb_mouse_report[0] |= 0x02)
#define Usb_mouse_click_middle()        (usb_mouse_report[0] |= 0x04)
#define Usb_mouse_release_left()        (usb_mouse_report[0] &= ~0x01)
#define Usb_mouse_release_right()       (usb_mouse_report[0] &= ~0x02)
#define Usb_mouse_release_middle()      (usb_mouse_report[0] &= ~0x04)
#define Usb_mouse_scroll_up()           (usb_mouse_report[3]++)
#define Usb_mouse_scroll_down()         (usb_mouse_report[3]--)
#define Usb_mouse_report_reset()        (usb_mouse_report[0]=0,usb_mouse_report[1]=0,usb_mouse_report[2]=0,usb_mouse_report[3]=0)

#define Is_mouse_left_event()         Is_joy_left()
#define Is_mouse_right_event()        Is_joy_right()
#define Is_mouse_up_event()           Is_joy_up()
#define Is_mouse_down_event()         Is_joy_down()
#define Is_mouse_click_left_event()   Is_hwb()
#define Is_mouse_release_left_event() !Is_hwb()




//_____ D E F I N I T I O N S ______________________________________________



//_____ D E C L A R A T I O N S ____________________________________________

U8 report_ready;
U8 usb_mouse_report[4];
U16 wheel;
volatile U8 cpt_sof;
volatile U16 cpt_sof_debounce=0;
volatile U16 cpt_sof_tempe=0;

volatile U8 joy_for_mouse;


//!
//! @brief This function initializes the hardware/software resources required for mouse task.
//!
//!
//! @param none
//!
//! @return none
//!
//!/
void device_mouse_task_init(void)
{
   Joy_init();
   Hwb_button_init();
   Leds_init();
   Usb_mouse_report_reset();
   report_ready=TRUE;

   cpt_sof=0;
   Usb_enable_sof_interrupt();
   joy_for_mouse=TRUE;

}





//! @brief Entry point of the mouse management
//!
//! This function links the mouse and the USB bus.
//!
//!
//! @param none
//!
//! @return none
void device_mouse_task(void)
{
   if(cpt_sof_debounce>=500)
   {
      cpt_sof_debounce=0;
      if (joy_for_mouse==TRUE) joy_for_mouse=FALSE;
      else joy_for_mouse=TRUE;
   }

   if(Is_device_enumerated())
   {
      if(is_usb_mouse_event() && !Is_usb_report_ready())
      {
         report_ready=TRUE;
      }

      if ( Is_usb_report_ready())
      {
         Usb_select_endpoint(EP_MOUSE_IN);
         if (Is_usb_write_enabled())
         {
            Usb_set_report_not_ready();
            Usb_write_byte(usb_mouse_report[0]);
            Usb_write_byte(usb_mouse_report[1]);
            Usb_write_byte(usb_mouse_report[2]);
            Usb_write_byte(usb_mouse_report[3]);
            Usb_ack_in_ready();
         }
      }
   }
}

//! @brief Is_usb_mouse_event
//!
//! This function returns TRUE if a event occurs on the mouse
//! (FALSE if not). The mouse report is updated by this function
//!
//!
//! @param none
//!
//! @return none
bit is_usb_mouse_event(void)
{
   static U8 i;
   static bit usb_mouse_event_stored;

   if(cpt_sof<NB_IDLE_POLLING_SOF || joy_for_mouse==FALSE) return FALSE;
   cpt_sof=0;
   if(i++>100)
   {
      Led2_toggle();
      i=0;
   }


   Usb_mouse_report_reset();
   if(Is_mouse_click_left_event())
   {
      Usb_mouse_click_left();
      usb_mouse_event_stored = 1;
   }

   if(Is_mouse_release_left_event())
   {
      Usb_mouse_release_left();
      usb_mouse_event_stored = 1;
   }

   if (Is_mouse_left_event())
   {
      Usb_mouse_left();
      usb_mouse_event_stored = 1;
   }

   if (Is_mouse_right_event())
   {
      Usb_mouse_right();
      usb_mouse_event_stored = 1;
   }

   if (Is_mouse_down_event())
   {
      Usb_mouse_down();
      usb_mouse_event_stored = 1;
   }

   if (Is_mouse_up_event())
   {
      Usb_mouse_up();
      usb_mouse_event_stored = 1;
   }

   if (usb_mouse_event_stored == 1)
   {
      usb_mouse_event_stored = 0;
      return TRUE;
   }
   else {return FALSE;}

}


//! @brief sof_action
//!
//! This function increments the cpt_sof counter each times
//! the USB Start Of Frame interrupt subroutine is executed (1ms)
//! Usefull to manage time delays
//!
//! @warning Code:?? bytes (function code length)
//!
//! @param none
//!
//! @return none
void sof_action()
{
   if(cpt_sof<0xFF) cpt_sof++;
   if(Is_joy_select())
   {
      if (cpt_sof_debounce<2000)
      { cpt_sof_debounce++;}
   }
   else
   {
       cpt_sof_debounce=0;
   }
   cpt_sof_tempe++;

}




//! @brief vbus_off_action
//!
//! This function increments the action to be executed upon
//! the USB VBUS disconnection
//! Here a Vbus lost lead to detach
//!
//! @warning Code:?? bytes (function code length)
//!
//! @param none
//!
//! @return none
void vbus_off_action(void)
{
   Usb_detach();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -