localconnectivityservice/headset/inc/headset.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:03:15 +0300
branchRCL_3
changeset 19 0aa8cc770c8a
permissions -rw-r--r--
Revision: 201032 Kit: 201035

/*
* Copyright (c) 2004-2010 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:  Hid headset driver 
 *
*/


#ifndef C_HIDHEADSETDRIVER_H
#define C_HIDHEADSETDRIVER_H

#include <e32std.h>
#include <asclisession.h>
#include <mpxplaybackutility.h>
#include <mpxplaybackobserver.h>
#include <mpxmessage.h>
#include <hidinterfaces.h>
#include <hidtranslate.h>
#include "keypresstimer.h"

class CField;
class CHidHeadsetDriver;
class CTelephony;

/**
 *  Scan status
 */
enum TScanStatus
    {
    EScanNotPressed, EScanPressed, EScanLongPress
    };

/**
 * HID headset driver class
 *
 * HidDriver interface for handlign headset related 
 * functionality.
 *
 */

class CHidHeadsetDriver : public CHidDriver,
        public MTimerNotifier,
        public MMPXPlaybackObserver
    {

private:
    /**
     *  Initialisation states 
     */
    enum THeadsetDriverState
        {
        EUninitialised, // Driver has not been initialised 
        EInitialised, // Driver is initialised 
        EDisabled
        // The driver will not respond to interrupt data 
        };

    /**
     * Hook handling
     */
    enum THookHandling
        {
        EOnHook, EOffHook, ENoHook
        };
public:

    /**
     * Two-phased constructor.
     * @param aHid The generic HID layer that requested the driver     
     */
    static CHidHeadsetDriver* NewL( MDriverAccess* aHid );

    /**
     * Two-phased constructor.
     * @param aHid The generic HID layer that requested the driver     
     */
    static CHidHeadsetDriver* NewLC( MDriverAccess* aHid );

    /**
     * Destructor
     */
    virtual ~CHidHeadsetDriver();

private:

    // from base class CHidDriver
    /**     
     * From class CHidDriver
     * Called by the Generic HID layer to see if the driver can is able to
     * use reports from a newly-connected device. Supported hid fields van 
     * be later request with SupportedFieldCount function
     *  
     * @param aReportRoot HID report descriptor
     * @return KErrNone The driver will handle reports from the report 
     *         descriptor and KErrHidUnrecognised The driver cannot 
     *         handle reports from the device
     */
    TInt CanHandleReportL( CReportRoot* aReportRoot );

    /**     
     * From class CHidDriver
     * Called by the Generic HID layer when a device has been removed, prior
     * to the driver being removed.  This allows the driver to notify any 
     * applications of disconnection, if required
     *     
     * @param aReason The reason for device disconnection     
     */
    void Disconnected( TInt aReason );

    /**     
     * From class CHidDriver
     * Called by the Generic HID layer when data has been received from the 
     * device handled by this driver. 
     *     
     * @param aChannel The channel on which the data was received 
     *                                   (as defined by the transport layer)
     * @param aPayload A pointer to the data buffer     
     */
    TInt DataIn( CHidTransport::THidChannelType aChannel,
            const TDesC8& aPayload );

    /**     
     * From class CHidDriver
     * Called by the transport layers to inform the generic HID of the 
     * success of the last Set... command. 
     *     
     * @param aCmdAck Status of the last Set... command     
     */
    void CommandResult( TInt aCmdAck );

    /**     
     * From class CHidDriver
     * Called after a driver is sucessfully created by the Generic HID, when 
     * a device is connected 
     *     
     * @param aConnectionId An number used to identify the device in
     *                      subsequent calls from the driver to the 
     *                      generic HI     
     */
    void InitialiseL( TInt aConnectionId );

    /**     
     * From class CHidDriver
     * Resets the internal state of the driver (any pressed keys are released) 
     * and enables the driver  
     *     
     * @param aConnectionId An number used to identify the device in
     *                      subsequent calls from the driver to the 
     *                      generic HI     
     */
    void StartL( TInt aConnectionId );

    /**     
     * From class CHidDriver
     * Cancels all pressed keys and disables the driver (so it will not
     * process interrupt data)  
     *
     */
    void Stop();

    /**
     * From class CHidDriver
     * Return count of supported fields
     *          
     * @return Number of supported fields
     */
    TInt SupportedFieldCount();

    /**
     * From class CHidDriver
     * Set input handling registy 
     *          
     * @param aHandlingReg  a Input handling registry     
     */
    void SetInputHandlingReg( CHidInputDataHandlingReg* aHandlingReg );

    // from base class MTimerNotifier    
    /**     
     * From class MTimerNotifier
     * The function to be called when a timeout occurs.
     *     
     * @param aTimerType a Type of timer
     */
    void TimerExpired( TTimerType aTimerType );

    /**
     *  From class MMPXPlaybackObserver
     *  Handle playback message.    
     *   
     *  @param aMsg playback message, ownership not transferred. 
     *         Please check aMsg is not NULL before using it. If aErr is not 
     *         KErrNone, plugin might still call back with more info in the 
     *         aMsg.
     *  @param aErr system error code.
     */
    void HandlePlaybackMessage( CMPXMessage* aMsg, TInt /*aErr*/);

private:
    /**
     * Constructor
     * @param aHid The generic HID layer that requested the driver 
     */
    CHidHeadsetDriver( MDriverAccess* aHid );
    /**
     * ConstructL
     */
    void ConstructL();

private:

    /**
     * Called from within DataIn to handle interrupt and control channel data
     *
     * @param aPayload a Payload data
     * @return error if data can't be handled
     */
    TInt InterruptData( const TDesC8& aPayload );

    /**
     * Handles the report
     *
     * @param aReport HID report descriptor
     * @param aField HID field
     * @return KErrNotSupported if report can't be handled
     */
    TInt HandleReport( const TDesC8& aReport, const CField* aField );

    /**
     * Handles the report
     *
     * @param aReportTranslator Report Translator
     */
    void ReleasePressedKeys( TReportTranslator& aReportTranslator );

    /**
     * Handle hook key pres
     *     
     * @param aStatus Hook key status
     */
    void HookKeyPres( TBool aStatus );

    /**
     * Release hook key 
     *
     */
    void ReleaseHookKey();

    /**
     * Get Hook Status
     *     
     * @return hook handling status. 
     */
    THookHandling HookStatus();

    /**
     * Get alarm status
     *     
     * @return ETrue if ui is showing alarm, EFalse if not. 
     */
    TBool AlarmStatus();

    /**
     * MusicPlayingStatus
     *    
     * @return ETrue if plyaer is playing, EFalse if not. 
     */
    TBool MusicPlayingStatus();

    /**
     * HandleNoneHookPress
     * Handle hook press when there are phone call is in idle state
     *      
     */
    void HandleNoneHookPressL();

    /**
     * ReleasePressedVolumeKeys
     * Release volume keys if they are pressed
     *     
     * @param aReportTranslator HID report translator
     */
    void ReleasePressedVolumeKeys( TReportTranslator& aReportTranslator );

    /**
     * ReleasePressedScanKeys
     * Release scan keys if they are pressed
     *     
     * @param aReportTranslator HID report report translator     
     */
    void ReleasePressedScanKeys( TReportTranslator& aReportTranslator );
    /**
     * HandleAlarmHookReleaseL
     * Handle hook release when phone is alarming
     *     
     */
    void HandleAlarmHookReleaseL();

    /**
     * HandleIdleHookReleaseL
     * Handle hook release when phone is not alarming 
     * and call is in idle state
     *  
     */
    void HandleIdleHookReleaseL();

    /**
     * Handle doubleclick timer expiration
     *      
     */
    void ExpiredDoubleClickTimer();

    /**
     * Handle long press timer expiration
     *      
     */
    void ExpiredLongClickTimer();

    /**
     * Handle scan next pressed
     *      
     */
    void HandleScanNextPressL();

    /**
     * Handle scan prev pressed
     *      
     */
    void HandleScanPrevPressL();

    /**
     * Handle scan next release  
     *   
     * @param aKeyCode a Key id
     * @param aValue  a Key value      
     */
    void HandleScanNextRelease( TUint& aKeyCode, TInt& aValue );

    /**
     * Handle scan previous release  
     *    
     * @param aKeyCode a Key id
     * @param aValue a Key value    
     */
    void HandleScanPreviousRelease( TUint& aKeyCode, TInt& aValue );

    /**
     * Handle telephony usage page
     *   
     * @param aReport a Report translator
     * @return KErrNone if report can be handled.  
     */
    TInt HandleTelephonyUsage( TReportTranslator& aReport );

    /**
     * Handle controller usage page
     *    
     * @param aReport a Report translator
     * @return KErrNone if report can be handled.  
     */
    TInt HandleControlUsage( TReportTranslator& aReport );

    /**
     * Handle volume usage
     *    
     * @param aReport a Report translator
     * @return KErrNone if report can be handled.  
     */
    TInt HandleVolumeUsage( TReportTranslator& aReport );

private:

    /**
     * The Generic HID layer
     * Not own.
     */
    MDriverAccess *iGenericHid;

    /**
     * Field list array
     * Own. 
     */
    RPointerArray<CField> iFieldList;

    /**
     * Driver state
     */
    THeadsetDriverState iDriverState;

    /**
     * Connection id
     */
    TInt iConnectionId;

    /**
     * Application menu id 
     */
    TInt iAppMenuId;

    /**
     * On hook status 
     */
    TBool iOnHookPressed;

    /**
     * Off hook 
     */
    TBool iOffHookPressed;

    /**
     * No active calls
     */
    TBool iNoneHookPressed;

    /**
     * Telephony service
     * Own.
     */
    CTelephony* iTelephony;

    /**
     * Double click timer
     * Own.
     */
    CKeyPressTimer* iDoubleClicktimer;

    /**
     * Long click timer
     * Own.
     */
    CKeyPressTimer* iLongClicktimer;

    /**
     * Long click timer     
     */
    TBool iLongPress;

    /**
     * Alarm server session     
     */
    RASCliSession iAlarmServerSession;

    /**
     * Incoming call status
     */
     TBool iIncomingCallStatus;

    /**
     * Alarm statusd     
     */
    TBool iAlarmStatus;

    /**
     * Music player utility
     * Own.     
     */
    MMPXPlaybackUtility* iMusicPlayer;

    /**
     * Playing status     
     */
    TBool iPlayingStatus;

    /**
     * Double next Click  status
     */
    TBool iDoubleNextClick;

    /**
     * Count of supported fields
     */
    TInt iSupportedFieldCount;

    /**
     * Volume up key pressed down
     */
    TBool iVolumeUpPressed;

    /**
     * Volume down key pressed down
     */
    TBool iVolumeDownPressed;

    /**
     * Forward press status
     */
    TScanStatus iForwardStatus;

    /**
     * Backward press status
     */
    TScanStatus iBackwardStatus;

    /**
     * Scan next timer
     * Own.
     */
    CKeyPressTimer* iScanNextTimer;

    /**
     * Scan previous timer
     * Own.
     */
    CKeyPressTimer* iScanPreviousTimer;

    /**
     * Input handling reg
     * Not own.
     */
    CHidInputDataHandlingReg* iInputHandlingReg;

    };

#endif