2013-03-14 16:12:24 +00:00
/* mbed USBHost Library
* Copyright ( c ) 2006 - 2013 ARM Limited
*
* Licensed under the Apache License , Version 2.0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
# include "USBHostMouse.h"
# if USBHOST_MOUSE
2017-05-04 09:40:59 +00:00
USBHostMouse : : USBHostMouse ( )
{
2013-03-14 16:12:24 +00:00
host = USBHost : : getHostInst ( ) ;
init ( ) ;
}
2017-05-04 09:40:59 +00:00
void USBHostMouse : : init ( )
{
2013-03-14 16:12:24 +00:00
dev = NULL ;
int_in = NULL ;
onUpdate = NULL ;
onButtonUpdate = NULL ;
onXUpdate = NULL ;
onYUpdate = NULL ;
onZUpdate = NULL ;
report_id = 0 ;
dev_connected = false ;
mouse_device_found = false ;
mouse_intf = - 1 ;
2014-05-29 13:16:53 +00:00
2013-03-14 16:12:24 +00:00
buttons = 0 ;
x = 0 ;
y = 0 ;
z = 0 ;
}
2017-05-04 09:40:59 +00:00
bool USBHostMouse : : connected ( )
{
2013-03-14 16:12:24 +00:00
return dev_connected ;
}
2017-04-20 15:54:26 +00:00
bool USBHostMouse : : connect ( )
{
2015-01-15 05:01:48 +00:00
int len_listen ;
2013-03-14 16:12:24 +00:00
if ( dev_connected ) {
return true ;
}
2014-05-29 13:16:53 +00:00
2013-03-14 16:12:24 +00:00
for ( uint8_t i = 0 ; i < MAX_DEVICE_CONNECTED ; i + + ) {
if ( ( dev = host - > getDevice ( i ) ) ! = NULL ) {
2017-05-04 09:40:59 +00:00
if ( host - > enumerate ( dev , this ) ) {
2013-03-14 16:12:24 +00:00
break ;
2017-05-04 09:40:59 +00:00
}
2013-03-14 16:12:24 +00:00
if ( mouse_device_found ) {
2017-04-20 15:54:26 +00:00
{
/* As this is done in a specific thread
* this lock is taken to avoid to process the device
* disconnect in usb process during the device registering */
USBHost : : Lock Lock ( host ) ;
int_in = dev - > getEndpoint ( mouse_intf , INTERRUPT_ENDPOINT , IN ) ;
2017-05-04 09:40:59 +00:00
if ( ! int_in ) {
2017-04-20 15:54:26 +00:00
break ;
2017-05-04 09:40:59 +00:00
}
2017-04-20 15:54:26 +00:00
USB_INFO ( " New Mouse device: VID:%04x PID:%04x [dev: %p - intf: %d] " , dev - > getVid ( ) , dev - > getPid ( ) , dev , mouse_intf ) ;
dev - > setName ( " Mouse " , mouse_intf ) ;
host - > registerDriver ( dev , mouse_intf , this , & USBHostMouse : : init ) ;
int_in - > attach ( this , & USBHostMouse : : rxHandler ) ;
len_listen = int_in - > getSize ( ) ;
if ( len_listen > sizeof ( report ) ) {
len_listen = sizeof ( report ) ;
}
2015-01-15 05:01:48 +00:00
}
2017-04-20 15:54:26 +00:00
int ret = host - > interruptRead ( dev , int_in , report , len_listen , false ) ;
MBED_ASSERT ( ( ret = = USB_TYPE_OK ) | | ( ret = = USB_TYPE_PROCESSING ) | | ( ret = = USB_TYPE_FREE ) ) ;
2017-05-04 09:40:59 +00:00
if ( ( ret = = USB_TYPE_OK ) | | ( ret = = USB_TYPE_PROCESSING ) ) {
2017-04-20 15:54:26 +00:00
dev_connected = true ;
2017-05-04 09:40:59 +00:00
}
if ( ret = = USB_TYPE_FREE ) {
2017-04-20 15:54:26 +00:00
dev_connected = false ;
2017-05-04 09:40:59 +00:00
}
2013-03-14 16:12:24 +00:00
return true ;
}
}
}
init ( ) ;
return false ;
}
2017-05-04 09:40:59 +00:00
void USBHostMouse : : rxHandler ( )
{
2017-04-21 06:47:57 +00:00
int len_listen = int_in - > getLengthTransferred ( ) ;
if ( len_listen ! = 0 ) {
2014-05-29 13:16:53 +00:00
2017-04-21 06:47:57 +00:00
if ( onUpdate ) {
( * onUpdate ) ( report [ 0 ] & 0x07 , report [ 1 ] , report [ 2 ] , report [ 3 ] ) ;
}
2014-05-29 13:16:53 +00:00
2017-04-21 06:47:57 +00:00
if ( onButtonUpdate & & ( buttons ! = ( report [ 0 ] & 0x07 ) ) ) {
( * onButtonUpdate ) ( report [ 0 ] & 0x07 ) ;
}
2014-05-29 13:16:53 +00:00
2017-04-21 06:47:57 +00:00
if ( onXUpdate & & ( x ! = report [ 1 ] ) ) {
( * onXUpdate ) ( report [ 1 ] ) ;
}
2014-05-29 13:16:53 +00:00
2017-04-21 06:47:57 +00:00
if ( onYUpdate & & ( y ! = report [ 2 ] ) ) {
( * onYUpdate ) ( report [ 2 ] ) ;
}
2014-05-29 13:16:53 +00:00
2017-04-21 06:47:57 +00:00
if ( onZUpdate & & ( z ! = report [ 3 ] ) ) {
( * onZUpdate ) ( report [ 3 ] ) ;
}
2014-05-29 13:16:53 +00:00
2017-04-21 06:47:57 +00:00
// update mouse state
buttons = report [ 0 ] & 0x07 ;
x = report [ 1 ] ;
y = report [ 2 ] ;
z = report [ 3 ] ;
}
/* set again the maximum value */
len_listen = int_in - > getSize ( ) ;
2014-05-29 13:16:53 +00:00
2015-01-15 05:01:48 +00:00
if ( len_listen > sizeof ( report ) ) {
len_listen = sizeof ( report ) ;
}
2017-05-04 09:40:59 +00:00
if ( dev ) {
2013-03-14 16:12:24 +00:00
host - > interruptRead ( dev , int_in , report , len_listen , false ) ;
2017-05-04 09:40:59 +00:00
}
2013-03-14 16:12:24 +00:00
}
/*virtual*/ void USBHostMouse : : setVidPid ( uint16_t vid , uint16_t pid )
{
// we don't check VID/PID for mouse driver
}
/*virtual*/ bool USBHostMouse : : parseInterface ( uint8_t intf_nb , uint8_t intf_class , uint8_t intf_subclass , uint8_t intf_protocol ) //Must return true if the interface should be parsed
{
if ( ( mouse_intf = = - 1 ) & &
2017-05-04 09:40:59 +00:00
( intf_class = = HID_CLASS ) & &
( intf_subclass = = 0x01 ) & &
( intf_protocol = = 0x02 ) ) {
2013-03-14 16:12:24 +00:00
mouse_intf = intf_nb ;
return true ;
}
return false ;
}
/*virtual*/ bool USBHostMouse : : useEndpoint ( uint8_t intf_nb , ENDPOINT_TYPE type , ENDPOINT_DIRECTION dir ) //Must return true if the endpoint will be used
{
if ( intf_nb = = mouse_intf ) {
if ( type = = INTERRUPT_ENDPOINT & & dir = = IN ) {
mouse_device_found = true ;
return true ;
}
}
return false ;
}
# endif