/*
 * ScanSrv.h
 *
 * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.      
 * All rights reserved.                                                  
 *                                                                       
 * Redistribution and use in source and binary forms, with or without    
 * modification, are permitted provided that the following conditions    
 * are met:                                                              
 *                                                                       
 *  * Redistributions of source code must retain the above copyright     
 *    notice, this list of conditions and the following disclaimer.      
 *  * Redistributions in binary form must reproduce the above copyright  
 *    notice, this list of conditions and the following disclaimer in    
 *    the documentation and/or other materials provided with the         
 *    distribution.                                                      
 *  * Neither the name Texas Instruments nor the names of its            
 *    contributors may be used to endorse or promote products derived    
 *    from this software without specific prior written permission.      
 *                                                                       
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/** \file ScanSrv.h
 *  \brief This file include private definitions for the scan SRV module.
 *
 *  \see   ScanSrv.c, ScanSrvSM.c, ScanSrvSM.h
 */


#ifndef __SCANSRV_H__
#define __SCANSRV_H__

#include "TWDriverInternal.h"
#include "MacServices_api.h"
#include "fsm.h"
#include "ScanSrvSM.h"

/*
 ***********************************************************************
 *  Constant definitions.
 ***********************************************************************
 */
/* guard time for scan (added to calculated scan duration) */
#define SCAN_SRV_FW_GUARD_TIME_MS                       2000
/* module name for driver mode requests */
#define SCAN_SRV_NAME                                   "SSRV"


/*
 ***********************************************************************
 *  Enums.
 ***********************************************************************
 */


/*
 ***********************************************************************
 *  Typedefs.
 ***********************************************************************
 */

/*
 ***********************************************************************
 *  Structure definitions.
 ***********************************************************************
 */

/** \struct scanSRV_t
 * \brief This structure contains the scan SRV object data
 */
typedef struct
{
    TI_HANDLE           hOS;                           /**< OS object handle */
    TI_HANDLE           hReport;                       /**< report object handle */
    TI_HANDLE           hPowerSrv;                     /**< power Server object handle */
    TI_HANDLE           hTWD;                          /**< TWD layer handle */
    TI_HANDLE           hTimer;                        /**< Timer module object handle */
    TI_HANDLE           hEventMbox;                    /**< EventMbox module object handle */
    TI_HANDLE           hCmdBld;                       /**< Command builder object handle */
    TScanSrvCompleteCb  scanCompleteNotificationFunc;  /**< 
                                                         * upper layer (scan concentrator) scan complete 
                                                         * callback function
                                                         */
    TI_HANDLE           scanCompleteNotificationObj;    /**< 
                                                         * upper layer (scan concentrator) scan complete
                                                         * callback function
                                                         */
    
    TCmdResponseCb      commandResponseFunc;            /**<
                                                         * upper layer command response CB. Passed down into the HAL
                                                         * and called when the scan command has been received by the FW
                                                         */
    TI_HANDLE           commandResponseObj;             /**<
                                                         * object parameter passed to the commandResposeFunc by the HAL
                                                         * when it is called 
                                                         */
    TFailureEventCb     failureEventFunc;               /**<
                                                         * upper layer Failure Event CB.
                                                         * called when the scan command has been Timer Expiry
                                                         */
    TI_HANDLE           failureEventObj;                /**<
                                                         * object parameter passed to the failureEventFunc
                                                         * when it is called 
                                                         */
    TI_UINT16           SPSScanResult;                  /**< 
                                                         * bitmap indicating which channels were scanned
                                                         * in an SPS scan
                                                         */
    TI_BOOL             bTSFError;                      /** indicates whether a TSF error occured */                                                        /**< 
                                                         * scan result: indicates a TSF error event and 
                                                         * which channels were scanned in SPS
                                                         */
    TI_BOOL             bDtimOverlapping;               /**< Indicates whether the scan is overlapping DTIM */
    TI_BOOL             bExitFromDriverMode;            /**< 
                                                         * Indicates whether to exit driver mode once scan 
                                                         * is finished
                                                         */
    TI_BOOL             bSendNullData;                  /**< 
                                                         * Indicates whether to send Null data when exiting driver  
                                                         * mode once scan is finished
                                                         */
    TI_BOOL             bScanOnDriverModeFailure;       /**< 
                                                         * Indicates whether to scan if driver mode entry
                                                         * wasn't successful
                                                         */
    TI_BOOL             bHighPriority;                  /**<
                                                         * Indicates whether to request high priority 
                                                         * (overlapping DTIM) scan
                                                         */
    TI_BOOL             bSPSScan;                       /**< 
                                                         * whether the running scan type is SPS (TI_TRUE)
                                                         * or something else (TI_FALSE). Used to stop a
                                                         * running scan.
                                                         */
    TScanParams*        scanParams;                     /**< scan parameters */
    EScanResultTag      eScanTag;                       /**< scan result tag */
    TI_UINT32           uResultCount;                   /**< number of scan results (received from the FW) */
    TI_HANDLE           hScanSrvTimer;                  /**< scan operation timer */
    TI_BOOL             bTimerRunning;                  /**< whether the above timer is running */
    TI_BOOL             bInRequest;                     /**<
                                                         * Indicates whether the SM is run within
                                                         * the scan request context (if so, to avoid
                                                         * re-entrance, the complete function shouldn't
                                                         * be called on failure, but rather an invalid
                                                         * status should be returned)
                                                         */
    TI_STATUS           returnStatus;                   /**< 
                                                         * Holds the return code to the upper layer
                                                         * Used to save errors during SM operation.
                                                         */
    /* state machine */
    fsm_stateMachine_t* SM;                             /**< 
                                                         * state machines for different
                                                         * scan types
                                                         */
    scan_SRVSMStates_e  SMState;                        /**< 
                                                         * state machine current states 
                                                         * for different scan types
                                                         */
    E80211PsMode        psRequest;                      /**< 
                                                         * Indicates if PS was requested or not
                                                         * for current scan
                                                         */
    TI_UINT32           numberOfNoScanCompleteToRecovery;
                                                        /**< 
                                                         * The number of consecutive no scan complete
                                                         * that will trigger a recovery notification
                                                         */
    TI_UINT32           currentNumberOfConsecutiveNoScanCompleteEvents;
                                                        /**<
                                                         * The number of consecutivre no scan complete 
                                                         * events at present
                                                         */
    TI_BOOL             bNoScanCompleteFlag;            /**<
                                                         * Indicates if the last event was start scan
                                                         * (true) or no scan complete (false) to be able
                                                         * to nullify correctly the above counter */
    TI_UINT32           uTriggeredScanTimeOut;          /**<
                                                         * Time out for starting triggered scan between 
                                                         * 2 channels */
    TI_UINT8                uDtimPeriod;
    TI_UINT16               uBeaconInterval;
} scanSRV_t;

/*
 ***********************************************************************
 *  External data definitions.
 ***********************************************************************
 */

/*
 ***********************************************************************
 *  External functions definitions
 ***********************************************************************
 */

/**
 * \author Yuval Adler\n
 * \date 16-Oct-2004\n
 * \brief Creates the scan SRV object
 *
 * Function Scope \e Public.\n
 * \param hOS - handle to the OS object.\n
 * \return a handle to the scan SRV object, NULL if an error occurred.\n
 */
TI_HANDLE MacServices_scanSRV_create( TI_HANDLE hOS );

/**
 * \author Yuval Adler\n
 * \date 29-Dec-2004\n
 * \brief Finalizes the scan SRV module (releasing memory and timer)
 *
 * Function Scope \e Public.\n
 * \param hScanSRV - handle to the scan SRV object.\n
 */
void MacServices_scanSRV_destroy( TI_HANDLE hScanSRV );

/**
 * \author Yuval Adler\n
 * \date 29-Dec-2004\n
 * \brief Initializes the scan SRV module, registers SCAN_COMPLETE to HAL.
 *
 * Function Scope \e Public.\n
 * \param hScanSRV - handle to the scan SRV object.\n
 * \param Handles of other modules.\n
  */
TI_STATUS MacServices_scanSRV_init (TI_HANDLE hMacServices,
                                    TI_HANDLE hReport,
                                    TI_HANDLE hTWD,
                                    TI_HANDLE hTimer,
                                    TI_HANDLE hEventMbox,
                                    TI_HANDLE hCmdBld);

/**
 * \author Ronen Kalish\n
 * \date 26-July-2006\n
 * \brief Configures the scan SRV module with initialization values
 *
 * Function Scope \e Public.\n
 * \param hScanSRV - handle to the scan SRV object.\n
 * \param hReport - handle to the report object.\n
 * \param hHalCtrl - handle to the HAL ctrl object.\n
  */
void MacServices_scanSrv_config( TI_HANDLE hMacServices, TScanSrvInitParams* pInitParams );

/**
 * \author Ronen Kalish\n
 * \date 29-Dec-2004\n
 * \brief Calculates the maximal time required for a scan operation
 *
 * Function Scope \e Public.\n
 * \param hScanSRV - handle to the scan SRV object.\n
 * \param scanParams - the scan parameters
 * \param bConsiderDTIM - whether this scan overlaps DTIM
 * \return the time (in milliseconds)
 */
TI_UINT32 MacServices_scanSRVcalculateScanTimeout( TI_HANDLE hScanSrv, TScanParams* scanParams, TI_BOOL bConsiderDTIM );

/**
 * \author Ronen Kalish\n
 * \date 16-Jan-2005\n
 * \brief Convert time units (1024 usecs) to millisecs
 *
 * Function Scope \e Private.\n
 * \param tu - the time in time units
 * \return the time in milliseconds
 */
TI_UINT32 MacServices_scanSRVConvertTUToMsec( TI_UINT32 tu );

/**
 * \author Yuval Adler\n
 * \date 27-Sep-2005\n
 * \brief This function is the CB which is called as response to 'StartScan' or 'StopScan' \n.
 *        here we check if there is a GWSI command response , and call it if necessary .\n
 * Function Scope \e Private.\n
 * \param hScanSrv - handle to the scan SRV object.\n
 * \param MboxStatus - mailbox status. \n
 */

void MacServices_scanSRVCommandMailBoxCB(TI_HANDLE hScanSrv,TI_UINT16 MboxStatus);


/**
 * \brief Registers a failure event callback for scan error notifications.
 *
 * Function Scope \e Public.\n
 * \param hMacServices - handle to the MacServices object.\n
 * \param failureEventCB - the failure event callback function.\n
 * \param hFailureEventObj - handle to the object passed to the failure event callback function.\n
 */
void scanSRV_registerFailureEventCB( TI_HANDLE hScanSRV, 
                                     void * failureEventCB, TI_HANDLE hFailureEventObj );

void scanSRV_restart( TI_HANDLE hScanSRV);


#endif /* __SCANSRV_H__ */
