| /* |
| * ScanCncnSmSpecific.c |
| * |
| * 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 ScanCncnSmSpecific.c |
| * \brief Scan concentrator state machine type-specific functions implemenattion |
| * |
| * \see ScanCncnSm.h, ScanCncnSm.c |
| */ |
| |
| |
| #define __FILE_ID__ FILE_ID_80 |
| #include "scrApi.h" |
| #include "GenSM.h" |
| #include "TWDriver.h" |
| #include "ScanCncnSm.h" |
| #include "ScanCncnPrivate.h" |
| #include "apConn.h" |
| |
| /* |
| * Aplication one-shot scan |
| */ |
| /** |
| * \fn scanCncnSmApp1Shot_ScrRequest |
| * \brief Request the SCR for one-shot application scan |
| * |
| * Request the SCR for one-shot application scan. handle different results. |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmApp1Shot_ScrRequest (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| EScrClientRequestStatus eScrReplyStatus; |
| EScePendReason eScrPendReason; |
| |
| /* request the SCR as application scan client, and act according to return status */ |
| switch (eScrReplyStatus = scr_clientRequest (pScanCncnClient->hSCR, SCR_CID_APP_SCAN, |
| SCR_RESOURCE_SERVING_CHANNEL, &eScrPendReason)) |
| { |
| case SCR_CRS_PEND: |
| /* send a reject event to the SM */ |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmApp1Shot_ScrRequest: SCR pending, pend reason: %d.\n", eScrPendReason); |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| break; |
| |
| case SCR_CRS_RUN: |
| /* send a run event to the SM */ |
| TRACE0(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmApp1Shot_ScrRequest: SCR acquired.\n"); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_RUN, hScanCncnClient); |
| break; |
| |
| default: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmApp1Shot_ScrRequest: SCR returned unrecognized status: %d.\n", eScrReplyStatus); |
| /* Send a reject event to recover from this error */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| break; |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmApp1Shot_ScrRelease |
| * \brief Release the SCR as one-shot application scan |
| * |
| * Release the SCR as one-shot application scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmApp1Shot_ScrRelease (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* release the SCR */ |
| scr_clientComplete (pScanCncnClient->hSCR, SCR_CID_APP_SCAN, SCR_RESOURCE_SERVING_CHANNEL); |
| } |
| |
| /** |
| * \fn scanCncnSmApp1Shot_StartScan |
| * \brief Request scan start from TWD for one-shot application scan |
| * |
| * Request scan start from TWD for one-shot application scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmApp1Shot_StartScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TScanCncn *pScanCncn = (TScanCncn*)pScanCncnClient->hScanCncn; |
| TI_BOOL bPsRequired; |
| TI_STATUS tStatus; |
| |
| /* if the STA is connected, it is rquired to enter PS before scan */ |
| bPsRequired = (STA_CONNECTED == pScanCncn->eConnectionStatus ? TI_TRUE : TI_FALSE); |
| |
| /* call the TWD start scan - enter driver mode (PS) only if station is connected */ |
| tStatus = TWD_Scan (pScanCncnClient->hTWD, &(pScanCncnClient->uScanParams.tOneShotScanParams), SCAN_RESULT_TAG_APPLICATION_ONE_SHOT, |
| TI_FALSE, bPsRequired, TI_FALSE, POWER_SAVE_ON, /* this parameter is used only when driver mode requested */ |
| bPsRequired, NULL, NULL); |
| |
| if (TI_OK != tStatus) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmApp1Shot_StartScan: TWD returned status %d, quitting app scan.\n", tStatus); |
| |
| /* mark the return status */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| |
| /* could not start scan, send a scan complete event to reset the SM */ |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmApp1Shot_StopScan |
| * \brief Request scan stop from TWD for one-shot application scan |
| * |
| * Request scan stop from TWD for one-shot application scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmApp1Shot_StopScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TScanCncn *pScanCncn = (TScanCncn*)pScanCncnClient->hScanCncn; |
| TI_STATUS tStatus; |
| |
| /* call the TWD stop scan function */ |
| if (pScanCncn->eConnectionStatus != STA_CONNECTED) |
| { |
| tStatus = TWD_StopScan (pScanCncnClient->hTWD, SCAN_RESULT_TAG_APPLICATION_ONE_SHOT, TI_FALSE, NULL, NULL); |
| } |
| else |
| { |
| tStatus = TWD_StopScan (pScanCncnClient->hTWD, SCAN_RESULT_TAG_APPLICATION_ONE_SHOT, pScanCncnClient->bSendNullDataOnStop, NULL, NULL); |
| } |
| |
| /* if stop scan operation failed, send a scan complete event to reset the SM */ |
| if (TI_OK != tStatus) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmApp1Shot_StopScan: status %d from TWD_StopScan, sending scan complete to SM\n", tStatus); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmApp1Shot_Recovery |
| * \brief Handles recovery during scan for one-shot application scan |
| * |
| * Notifies the scan SRV to stop its timer |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmApp1Shot_Recovery (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* Notify scan SRV to stop its timer */ |
| TWD_StopScanOnFWReset (pScanCncnClient->hTWD); |
| } |
| |
| /* |
| * Aplication Periodic scan |
| */ |
| /** |
| * \fn scanCncnSmAppP_ScrRequest |
| * \brief Request the SCR for periodic application scan |
| * |
| * Request the SCR for periodic application scan. Handle different results |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmAppP_ScrRequest (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| EScrClientRequestStatus eScrReplyStatus; |
| EScePendReason eScrPendReason; |
| |
| /* request the SCR as application scan client, and act according to return status */ |
| switch (eScrReplyStatus = scr_clientRequest (pScanCncnClient->hSCR, SCR_CID_APP_SCAN, |
| SCR_RESOURCE_PERIODIC_SCAN, &eScrPendReason)) |
| { |
| case SCR_CRS_PEND: |
| /* send a reject event to the SM */ |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmAppP_ScrRequest: SCR pending, pend reason: %d.\n", eScrPendReason); |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| break; |
| |
| case SCR_CRS_RUN: |
| /* send a run event to the SM */ |
| TRACE0(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmAppP_ScrRequest: SCR acquired.\n"); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_RUN, hScanCncnClient); |
| break; |
| |
| default: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmAppP_ScrRequest: SCR returned unrecognized status: %d.\n", eScrReplyStatus); |
| /* Send a reject event to recover from this error */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| break; |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmAppP_ScrRelease |
| * \brief Release the SCR as periodic application scan |
| * |
| * Release the SCR as periodic application scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmAppP_ScrRelease (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* release the SCR */ |
| scr_clientComplete (pScanCncnClient->hSCR, SCR_CID_APP_SCAN, SCR_RESOURCE_PERIODIC_SCAN); |
| } |
| |
| /** |
| * \fn scanCncnSmAppP_StartScan |
| * \brief Request scan start from TWD for periodic application scan |
| * |
| * Request scan start from TWD for periodic application scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmAppP_StartScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TScanCncn *pScanCncn = (TScanCncn*)pScanCncnClient->hScanCncn; |
| TI_STATUS tStatus; |
| |
| /* call the TWD start scan */ |
| tStatus = TWD_StartConnectionScan (pScanCncnClient->hTWD, &(pScanCncnClient->uScanParams.tPeriodicScanParams), |
| SCAN_RESULT_TAG_APPLICATION_PEIODIC, |
| pScanCncn->tInitParams.uDfsPassiveDwellTimeMs, NULL, NULL); |
| if (TI_OK != tStatus) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmAppP_StartScan: TWD returned status %d, quitting app scan.\n", tStatus); |
| |
| /* mark the return status */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| |
| /* could not start scan, send a scan complete event to reset the SM */ |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmAppP_StopScan |
| * \brief Request scan stop from TWD for periodic application scan |
| * |
| * Request scan stop from TWD for periodic application scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmAppP_StopScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TI_STATUS status; |
| |
| /* call the TWD stop periodic scan function */ |
| status = TWD_StopPeriodicScan (pScanCncnClient->hTWD, SCAN_RESULT_TAG_APPLICATION_PEIODIC, NULL, NULL); |
| |
| /* if stop scan operation failed, send a scan complete event to reset the SM */ |
| if (TI_OK != status) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmAppP_StopScan: status %d from TWD_StopPeriodicScan, sending scan complete to SM\n", status); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmAppP_Recovery |
| * \brief Handles recovery during scan for periodic application scan |
| * |
| * Handles recovery during scan for periodic application scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmAppP_Recovery (TI_HANDLE hScanCncnClient) |
| { |
| } |
| |
| /* |
| * Driver periodic scan |
| */ |
| /** |
| * \fn scanCncnSmDrvP_ScrRequest |
| * \brief Request the SCR for periodic driver scan |
| * |
| * Request the SCR for periodic driver scan. Handle different results |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmDrvP_ScrRequest (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| EScrClientRequestStatus eScrReplyStatus; |
| EScePendReason eScrPendReason; |
| |
| /* request the SCR as driver scan client, and act according to return status */ |
| switch (eScrReplyStatus = scr_clientRequest( pScanCncnClient->hSCR, SCR_CID_DRIVER_FG_SCAN, |
| SCR_RESOURCE_PERIODIC_SCAN, &eScrPendReason ) ) |
| { |
| case SCR_CRS_PEND: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmAppP_ScrRequest: SCR pending, pend reason: %d.\n", eScrPendReason); |
| |
| /* check the pending reason */ |
| if (SCR_PR_OTHER_CLIENT_ABORTING != eScrPendReason) |
| { |
| /* |
| * send a reject event to the SM - would not scan if not in a different group or |
| * another un-abortable client is running |
| */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| } |
| /* if the pending reason is another client aborting wait untill it finish abort */ |
| break; |
| |
| case SCR_CRS_RUN: |
| /* send a run event to the SM */ |
| TRACE0(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmAppP_ScrRequest: SCR acquired.\n"); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_RUN, hScanCncnClient); |
| break; |
| |
| default: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmAppP_ScrRequest: SCR returned unrecognized status: %d\n", eScrReplyStatus); |
| /* Send a reject event to recover from this error */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| break; |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmDrvP_ScrRelease |
| * \brief Release the SCR as periodic driver scan |
| * |
| * Release the SCR as periodic driver scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmDrvP_ScrRelease (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* release the SCR */ |
| scr_clientComplete (pScanCncnClient->hSCR, SCR_CID_DRIVER_FG_SCAN, SCR_RESOURCE_PERIODIC_SCAN); |
| } |
| |
| /** |
| * \fn scanCncnSmDrvP_StartScan |
| * \brief Request scan start from TWD for periodic driver scan |
| * |
| * Request scan start from TWD for periodic driver scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmDrvP_StartScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TScanCncn *pScanCncn = (TScanCncn*)pScanCncnClient->hScanCncn; |
| TI_STATUS status; |
| |
| /* call the TWD_scan function */ |
| status = TWD_StartConnectionScan (pScanCncnClient->hTWD, &(pScanCncnClient->uScanParams.tPeriodicScanParams), |
| SCAN_RESULT_TAG_DRIVER_PERIODIC, |
| pScanCncn->tInitParams.uDfsPassiveDwellTimeMs, NULL, NULL); |
| |
| if (TI_OK != status) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmDrvP_StartScan: TWD returned status %d, quitting app scan.\n", status); |
| |
| /* mark the return status */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| |
| /* could not start scan, send a scan complete event to reset the SM */ |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmDrvP_StopScan |
| * \brief Request scan stop from TWD for periodic driver scan |
| * |
| * Request scan stop from TWD for periodic driver scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmDrvP_StopScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TI_STATUS status; |
| |
| /* call the TWD stop periodic scan */ |
| status = TWD_StopPeriodicScan (pScanCncnClient->hTWD, SCAN_RESULT_TAG_DRIVER_PERIODIC, NULL, NULL); |
| |
| /* if stop scan operation failed, send a scan complete event to reset the SM */ |
| if (TI_OK != status) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmDrvP_StopScan: status %d from TWD_StopPeriodicScan, sending scan complete to SM\n", status); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmApp1Shot_Recovery |
| * \brief Handles recovery during scan for periodic driver scan |
| * |
| * Handles recovery during scan for periodic driver scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmDrvP_Recovery (TI_HANDLE hScanCncnClient) |
| { |
| } |
| |
| /* |
| * Continuous one-shot scan |
| */ |
| /** |
| * \fn scanCncnSmCont1Shot_ScrRequest |
| * \brief Request the SCR for one-shot continuous scan |
| * |
| * Request the SCR for one-shot continuous scan. Handle different results |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmCont1Shot_ScrRequest (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| EScrClientRequestStatus eScrReplyStatus; |
| EScePendReason eScrPendReason; |
| |
| /* request the SCR as continuous roaming client, and act according to return status */ |
| switch (eScrReplyStatus = scr_clientRequest (pScanCncnClient->hSCR, SCR_CID_CONT_SCAN, |
| SCR_RESOURCE_SERVING_CHANNEL, &eScrPendReason ) ) |
| { |
| case SCR_CRS_PEND: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmCont1Shot_ScrRequest: SCR pending, pend Reason: %d.\n", eScrPendReason); |
| /* check pend reason */ |
| if (SCR_PR_DIFFERENT_GROUP_RUNNING == eScrPendReason) |
| { |
| /* send a reject event to the SM - will not scan if not in connected group */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| } |
| /* for other pending reasons wait untill current client finishes */ |
| break; |
| |
| case SCR_CRS_RUN: |
| /* send a run event to the SM */ |
| TRACE0(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmCont1Shot_ScrRequest: SCR acquired.\n"); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_RUN, hScanCncnClient); |
| break; |
| |
| default: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmCont1Shot_ScrRequest: SCR returned unrecognized status: %d.\n", eScrReplyStatus); |
| /* Send a reject event to recover from this error */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| break; |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmCont1Shot_ScrRelease |
| * \brief Release the SCR as one-shot continuous scan |
| * |
| * Release the SCR as one-shot continuous scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmCont1Shot_ScrRelease (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* release the SCR */ |
| scr_clientComplete (pScanCncnClient->hSCR, SCR_CID_CONT_SCAN, SCR_RESOURCE_SERVING_CHANNEL); |
| } |
| |
| /** |
| * \fn scanCncnSmCont1Shot_StartScan |
| * \brief Request scan start from TWD for one-shot continuous scan |
| * |
| * Request scan start from TWD for one-shot continuous scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmCont1Shot_StartScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TI_STATUS status; |
| |
| /* call the TWD start scan function */ |
| status = TWD_Scan (pScanCncnClient->hTWD, &(pScanCncnClient->uScanParams.tOneShotScanParams), |
| SCAN_RESULT_TAG_CONTINUOUS, TI_FALSE, TI_TRUE, TI_FALSE, POWER_SAVE_ON, TI_TRUE, |
| NULL, NULL); |
| |
| if (TI_OK != status) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmCont1Shot_StartScan: TWD returned status %d, quitting continuous scan.\n", status); |
| |
| /* mark the return status */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| |
| /* could not start scan, send a scan complete event */ |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmCont1Shot_StopScan |
| * \brief Request scan stop from TWD for one-shot continuous scan |
| * |
| * Request scan stop from TWD for one-shot continuous scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmCont1Shot_StopScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TI_STATUS status; |
| |
| /* send a stop scan command to FW */ |
| status = TWD_StopScan (pScanCncnClient->hTWD, SCAN_RESULT_TAG_CONTINUOUS, pScanCncnClient->bSendNullDataOnStop, NULL, NULL); |
| |
| /* if stop scan operation failed, send a scan complete event to reset the SM */ |
| if (TI_OK != status) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmCont1Shot_StopScan: status %d from TWD_StopScan, sending scan complete to SM\n", status); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmCont1Shot_Recovery |
| * \brief Handles recovery during scan for one-shot continuous scan |
| * |
| * Notifies the scan SRV to stop its timer |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmCont1Shot_Recovery (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* Notify scan SRV to stop its timer */ |
| TWD_StopScanOnFWReset (pScanCncnClient->hTWD); |
| } |
| |
| /* |
| * Immediate one-shot scan |
| */ |
| /** |
| * \fn scanCncnSmImmed1Shot_ScrRequest |
| * \brief Request the SCR for one-shot immediate scan |
| * |
| * Request the SCR for one-shot immediate scan. Handle different results |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmImmed1Shot_ScrRequest (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| EScrClientRequestStatus eScrReplyStatus; |
| EScePendReason eScrPendReason; |
| |
| /* request the SCR as immediate roaming client, and act according to return status */ |
| switch (eScrReplyStatus = scr_clientRequest (pScanCncnClient->hSCR, SCR_CID_IMMED_SCAN, |
| SCR_RESOURCE_SERVING_CHANNEL, &eScrPendReason)) |
| { |
| case SCR_CRS_PEND: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmImmed1Shot_ScrRequest: SCR pending, pend Reason: %d.\n", eScrPendReason); |
| |
| /* check pend reason */ |
| if ( SCR_PR_DIFFERENT_GROUP_RUNNING == eScrPendReason ) |
| { |
| /* send a reject event to the SM - will not scan if not in the correct group */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| } |
| /* for other pending reasons wait untill current client finishes */ |
| break; |
| |
| case SCR_CRS_RUN: |
| /* send a run event to the SM */ |
| TRACE0(pScanCncnClient->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnSmImmed1Shot_ScrRequest: SCR acquired.\n"); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_RUN, hScanCncnClient); |
| break; |
| |
| default: |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmImmed1Shot_ScrRequest: SCR returned unrecognized status: %d.\n", eScrReplyStatus); |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| /* Send a reject event to recover from this error */ |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_REJECT, hScanCncnClient); |
| break; |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmImmed1Shot_ScrRelease |
| * \brief Release the SCR as one-shot immediate scan |
| * |
| * Release the SCR as one-shot immediate scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmImmed1Shot_ScrRelease (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* release the SCR */ |
| scr_clientComplete (pScanCncnClient->hSCR, SCR_CID_IMMED_SCAN, SCR_RESOURCE_SERVING_CHANNEL); |
| } |
| |
| /** |
| * \fn scanCncnSmImmed1Shot_StartScan |
| * \brief Request scan start from TWD for one-shot immediate scan |
| * |
| * Request scan start from TWD for one-shot immediate scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmImmed1Shot_StartScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TI_BOOL bPsRequired, bTriggeredScan; |
| TI_STATUS status; |
| |
| /* check whether enter PS is required - according to the roaming reason severity */ |
| bPsRequired = apConn_isPsRequiredBeforeScan (pScanCncnClient->hApConn); |
| bTriggeredScan = ((SCAN_TYPE_TRIGGERED_ACTIVE == pScanCncnClient->uScanParams.tOneShotScanParams.scanType) || |
| (SCAN_TYPE_TRIGGERED_PASSIVE == pScanCncnClient->uScanParams.tOneShotScanParams.scanType) |
| ? TI_TRUE : TI_FALSE); |
| |
| status = TWD_Scan (pScanCncnClient->hTWD, &(pScanCncnClient->uScanParams.tOneShotScanParams), |
| SCAN_RESULT_TAG_IMMEDIATE, !bTriggeredScan, /* Triggered scan cannot be high priority */ |
| TI_TRUE, TI_TRUE, (bPsRequired ? POWER_SAVE_ON : POWER_SAVE_KEEP_CURRENT), |
| bPsRequired, NULL, NULL); |
| |
| /* call the scan SRV start scan */ |
| if (TI_OK != status) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmImmed1Shot_StartScan: TWD start scanreturned status %d, quitting immediate scan.\n", status); |
| |
| /* mark the return status */ |
| pScanCncnClient->eScanResult = SCAN_CRS_SCAN_FAILED; |
| |
| /* could not start scan, send a scan complete event */ |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmImmed1Shot_StopScan |
| * \brief Request scan stop from TWD for one-shot immediate scan |
| * |
| * Request scan stop from TWD for one-shot immediate scan |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmImmed1Shot_StopScan (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| TI_STATUS status; |
| |
| /* call the TWD stop scan */ |
| status = TWD_StopScan (pScanCncnClient->hTWD, SCAN_RESULT_TAG_IMMEDIATE, pScanCncnClient->bSendNullDataOnStop, NULL, NULL); |
| |
| /* if stop scan operation failed, send a scan complete event to reset the SM */ |
| if (TI_OK != status) |
| { |
| TRACE1(pScanCncnClient->hReport, REPORT_SEVERITY_ERROR , "scanCncnSmImmed1Shot_StopScan: status %d from TWD_StopScan, sending scan complete to SM\n", status); |
| genSM_Event (pScanCncnClient->hGenSM, SCAN_CNCN_SM_EVENT_SCAN_COMPLETE, hScanCncnClient); |
| } |
| } |
| |
| /** |
| * \fn scanCncnSmImmed1Shot_Recovery |
| * \brief Handles recovery during scan for one-shot immediate scan |
| * |
| * Notifies the scan SRV to stop its timer |
| * |
| * \param hScanCncnClient - handle to the specific client object |
| * \return None |
| */ |
| void scanCncnSmImmed1Shot_Recovery (TI_HANDLE hScanCncnClient) |
| { |
| TScanCncnClient *pScanCncnClient = (TScanCncnClient*)hScanCncnClient; |
| |
| /* Notify scan SRV to stop its timer */ |
| TWD_StopScanOnFWReset (pScanCncnClient->hTWD); |
| } |
| |