shortlinkconn_plat/generic_hid_api/inc/hidgeneric.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:40 +0100
branchRCL_3
changeset 40 52a167391590
parent 0 c3e98f10fcf4
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004-2007 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  Declares main application class.
*
*/


#ifndef C_GENERICHID_H
#define C_GENERICHID_H

#include <hidinterfaces.h>

class CDriverListItem;
class TElement;
class CParser;
class CReportRoot;
class CConnectionInfo;

/**
 *
 *  Generic HID main class
 *  Generic HID layer, allowing the HID Transport layers and device drivers to
 *  pass data to the Generic HID
 *
 *  @lib generichid.lib
 *  @since S60 v5.0
 */
class CGenericHid : public CHidTransport, public MDriverAccess
    {
public:
    virtual ~CGenericHid();

    /**
     * Constructs a generic HID layer with a reference to the owner so commands can
     * be sent to connected devices
     *
     * @since S60 v5.0
     * @param aTransportLayer The owning transport layer
     * @return a Pointer to an instantiated Generic HID layer
     */
    IMPORT_C static CGenericHid* NewL(MTransportLayer* aTransportLayer);

    /**
     * Constructs a generic HID layer with a reference to the owner so commands can
     * be sent to connected devices
     *
     * @since S60 v5.0
     * @param aTransportLayer The owning transport layer
     * @return a Pointer to an instantiated Generic HID layer
     */
    IMPORT_C static CGenericHid* NewLC(MTransportLayer* aTransportLayer);

    /**
     * Fromm class MDriverAccess
     * Retrieves the country code for the HID device
     *
     * @since S60 v5.0
     * @param aConnectionID The device identifier
     * @return  a country code
     */
    TUint CountryCodeL(TInt aConnectionID);

    /**
     * Fromm class MDriverAccess
     * Retrieves the country code for the HID device
     *
     * @since S60 v5.0
     * @param aConnectionId The device identifier
     * @return a vendor ir
     */
    TUint VendorIdL(TInt aConnectionId);

    /**
     * Fromm class MDriverAccess
     * Retrieves the product identifier for the HID device
     *
     * @since S60 v5.0
     * @param aConnectionId The device identifier
     * @return  a prodcut id
     */
    TUint ProductIdL(TInt aConnectionId);


    /**
     * Fromm class MDriverAccess
     * Sets the protocol to be used for reports. 
     * Leaves KErrInUse The request was not successful because the
     * transport layer is busy with a previous request,
     * KErrNotReady The request failed because the device
     * is currently unavailable and KErrNotFound The request
     * was unsuccessful
     *
     * @since S60 v5.0
     * @param aConnectionId The device identifier
     * @param aInterface The device interface being used by the driver
     * @param aProtocol The requested report protocol (boot or report)
     * @parem aDriver Calling driver
     * @return  None.
     */
    void SetProtocolL(TInt aConnectionId, TUint16 aInterface,
        MDriverAccess::TProtocols aProtocol, CHidDriver* aDriver);


    /**
     * Fromm class MDriverAccess
     * Requests the current protocol from the HID device.  This is an asynchronous
     * request. The protocol value will come through at a later time
     *
     * @since S60 v5.0
     * @param aConnectionId The device identifier
     * @param aInterface The hid interface
     * @return None. 
     */
    void GetProtocolL(TInt aConnectionId,  TUint16 aInterface);

    /**
     * Fromm class MDriverAccess
     * A request for a report from the device.  This is an asynchronous request.
     * The report will come through at a later time
     *
     * @since S60 v5.0
     * @param aConnectionId The device identifier
     * @param aReportId report id to be get
     * @param aInterface The device interface being used by the driver
     * @param aLength report lenght
     * @return  None.
     */
    void GetReportL(TInt aConnectionId, TUint8 aReportId,
        TUint16 aInterface, TUint16 aLength);

    /**
     * Fromm class MDriverAccess
     * A request to send a report payload to the HID device
     * Leaves whit KErrInUse The request was not successful because the transport 
     * layer is busy with previous request and KErrNotReady The request failed 
     * because the device is currently unavailable
     *
     * @since S60 v5.0
     * @param aConnectionId The device ID
     * @param aReportId The report id
     * @param aReportType Type of report (input/output/feature)
     * @param aPayload The report containing the device setup packet
     * @param aInterface The device interface being used by the driver
     * @parem aDriver Calling driver
     * @return None.
     */
    void SetReportL(TInt aConnectionId,
        TUint8 aReportId, MDriverAccess::TReportType aReportType,
        const TDesC8& aPayload, TUint16 aInterface, CHidDriver* aDriver);

    /**
     * Fromm class MDriverAccess
     * A request to send a report payload to the HID device in Interrupt Channel
     * Leaves whit KErrInUse The request was not successful because the transport 
     * layer is busy with previous request and KErrNotReady The request failed 
     * because the device is currently unavailable
     *
     * @since S60 v5.0
     * @param aConnectionId The device ID
     * @param aReportId report id which payload to be send
     * @param aPayload The report containing the device setup packet
     * @param aInterface The device interface being used by the driver
     * @return  None.
     */
    void DataOutL(TInt aConnectionId,  TUint8 aReportId,
                              const TDesC8& aPayload, TUint16 aInterface);

    /**
     * Fromm class MDriverAccess
     * Request for the current idle setting for the device
     * This is an asynchronous request.  The idle value will come through at a
     * later time. Leaves whit KErrInUse The request was not successful because the transport 
     * layer is busy with previous request and KErrNotReady The request failed 
     * because the device is currently unavailable
     *
     * @since S60 v5.0
     * @param aConnectionId The device identifier
     * @param aReportId The report ID for which we want the idle rate
     * @param aInterface The device interface being used by the driver
     * @return None.
     */
    void GetIdleL(TInt aConnectionId, TUint8 aReportId, TUint16 aInterface);

    /**
     * Fromm class MDriverAccess
     * Request to the HID device to set the specified idle rate
     * A request to send a report payload to the HID device
     * Leaves whit KErrInUse The request was not successful because the transport 
     * layer is busy with previous request and KErrNotReady The request failed 
     * because the device is currently unavailable
     *
     * @since S60 v5.0
     * @param aConnectionId The device ID
     * @param aDuration The number of 0.04ms intervals to wait between reports
     * @param aReportId The report for which the idle rate is being set
     * @param aInterface The device interface being used by the driver
     * @parem aDriver Calling driver
     * @return None.
     */
    void SetIdleL(TInt aConnectionId, TUint8 aDuration,
        TUint8 aReportId, TUint16 aInterface, CHidDriver* aDriver);

    /**
     * From class CHidTransport
     * Called by the transport layers to inform the generic HID of the success of
     * the last Set... command.
     *
     * @since S60 v5.0
     * @param aConnectionId The device ID
     * @param aCmdAck Status of the last Set... command
     * @return None.
     */
    void CommandResult(TInt aConnectionId, TInt aCmdAck);

    /**
     * From class MDriverAccess
     * Gives the device driver access to the results of the report
     * descriptor parsing
     *
     * @since S60 v5.0
     * @param aConnectionId The device ID
     * @return A pointer to the parsed descriptor object.
     */
    CReportRoot* ReportDescriptor(TInt aConnectionId);

    /**
     * From class CHidTransport
     * Called by a transport layer when a device has connected and the report
     * descriptors have been obtained
     *
     * @since S60 v5.0
     * @param aConnectionId The tansport-layer enumeration for the connection
     * @param aDescriptor The report descriptor for the connected HID device
     * @return KErrNone if a driver was found, otherwise an error code
     */
    TInt ConnectedL(TInt aConnectionId, const TDesC8& aDescriptor);

    /**
     * From class CHidTransport
     * Called by a transport layer when a device has been disconnected
     *
     * @since S60 v5.0
     * @param aConnectionId The tansport-layer enumeration for the connection
     * @return KErrNone if a driver was found, otherwise an error code
     */
    TInt Disconnected(TInt aConnectionId);

    /**
     * From class CHidTransport
     * Called by the transport layer when a device has sent a report on the
     * interrupt or control channel
     *
     * @since S60 v5.0
     * @param aConnectionId The tansport-layer enumeration for the connection
     * @param aChannel Channel ID (Interrupt or Control)
     * @param aPayload The complete report payload
     * @return KErrNone if the data was handled by the driver, otherwise an error code
     */
    virtual TInt DataIn(TInt aConnectionId,
        CHidTransport::THidChannelType aChannel, const TDesC8& aPayload);

    /**
     * From class CHidTransport
     * Called by the transport layer to suspend or resume a driver
     *
     * @since S60 v5.0
     * @param aConnectionId The tansport-layer enumeration for the connection
     * @param aActive EActive to start the driver(s), ESuspend to suspend
     * @return KErrNone if the driver was successfully activated, otherwise an error code
     */
    TInt DriverActive(TInt aConnectionId,
        CHidTransport::TDriverState aActive);

protected:
    CGenericHid(MTransportLayer* aTransportLayer);
    void ConstructL();

private:

    /**
     * Remove drivers
     *
     * @since S60 v5.0
     * @return None
     */
    void RemoveDrivers();
              
    /**
     * Attempts to find a driver that is handling reports from the HID device
     *
     * @since S60 v5.0
     * @return Connection information
     */
    CConnectionInfo* SeekConnectionInfo(TInt aConnectionId);

private:

    /**
     * Instantiated driver list
     */
    TSglQue<CDriverListItem> iDriverList;

    /**
     * Parser
     * Own.
     */
    CParser* iParser;

    /**
     * Parser
     * Not own.
     */
    MTransportLayer* iTransportLayer;
    
    /**
     * Connection information
     */
    RPointerArray<CConnectionInfo> iConnectionInfo;
    
    /**
     * Input data handling registry 
     * Own.
     */
    CHidInputDataHandlingReg* iInputHandlingReg;
    
    };

#endif