static int nova_conexao(void){ if(lista_rede.qua == 0) return 0; printf("\r\nusando a rede cadastrada:"); con_info_rede(rede_atual); con_conectando(); WF_CPSetSsid((unsigned char)lista_rede.prof, (unsigned char *)lista_rede.r[rede_atual].ssid, (unsigned char)strlen(lista_rede.r[rede_atual].ssid)); WF_CPSetSecurity((unsigned char)lista_rede.prof, (unsigned char)lista_rede.r[rede_atual].tipo, MY_DEFAULT_WEP_KEY_INDEX, (unsigned char *)lista_rede.r[rede_atual].senh, (unsigned char)strlen(lista_rede.r[rede_atual].senh)); WF_CMConnect(lista_rede.prof); if(rede_atual < lista_rede.qua - 1){ rede_atual++; return 1; } else { rede_atual = 0; return 2; } }
static void SetMode_NotIdle(UINT8 networkType) { #ifdef STACK_USE_CERTIFICATE_DEBUG DelayMs(100); #endif if(WF_INFRASTRUCTURE == networkType) { WF_CPSetNetworkType(iwconfigCb.cpId, WF_INFRASTRUCTURE); WF_CMConnect(iwconfigCb.cpId); } else if(WF_ADHOC == networkType) { WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CPSetNetworkType(iwconfigCb.cpId, WF_ADHOC); WF_CPSetAdHocBehavior(iwconfigCb.cpId, WF_ADHOC_CONNECT_THEN_START); WF_CMConnect(iwconfigCb.cpId); } else { //To be done } }
/******************************************************************************* Function: uint16_t WF_Scan(uint8_t CpId) Summary: Commands the MRF24W to start a scan operation. This will generate the WF_EVENT_SCAN_RESULTS_READY event. Description: Directs the MRF24W to initiate a scan operation utilizing the input Connection Profile ID. The Host Application will be notified that the scan results are ready when it receives the WF_EVENT_SCAN_RESULTS_READY event. The eventInfo field for this event will contain the number of scan results. Once the scan results are ready they can be retrieved with WF_ScanGetResult(). Scan results are retained on the MRF24W until: 1. Calling WF_Scan() again (after scan results returned from previous call). 2. MRF24W reset. MRF24WB0M & MRF24WG0M support up to max of 60 scan results (SSIDs). Precondition: MACInit must be called first. Parameters: CpId - Connection Profile to use. If the CpId is valid then the values from that Connection Profile will be used for filtering scan results. If the CpId is set to WF_SCAN_ALL (0xFF) then a default filter will be used. Valid CpId * If CP has a defined SSID only scan results with that SSID are retained. * If CP does not have a defined SSID then all scanned SSID’s will be retained * Only scan results from Infrastructure or AdHoc networks are retained, depending on the value of networkType in the Connection Profile * The channel list that is scanned will be determined from channelList in the Connection Algorithm (which must be defined before calling this function). CpId is equal to WF_SCAN_ALL * All scan results are retained (both Infrastructure and Ad Hoc networks). * All channels within the MRF24W’s regional domain will be scanned. * No Connection Profiles need to be defined before calling this function. * The Connection Algorithm does not need to be defined before calling this function. Returns: Operation results. Success or Failure Remarks: Host scan is allowed only in idle or connected state. If MRF24W FW is in the midst of connection ( or reconnection) process, then host scan can hammer connection process, and furthermore it may cause fatal failure in MRF24W FW operation. To use host scan, we strongly recommend the user to disable MRF24W FW connection manager by enabling #define DISABLE_MODULE_FW_CONNECT_MANAGER_IN_INFRASTRUCTURE in drv_wifi_config.h *****************************************************************************/ uint16_t WF_Scan(uint8_t CpId) { uint8_t hdr[4]; #ifndef MRF24WG uint8_t connectionState; uint8_t dummy; #endif /* WARNING !!! : * Host scan is allowed only in idle or connected state. * If module FW is in the midst of connection ( or reconenction) process, then * host scan can hammer connection process, and furthermore it may cause * fatal failure in module FW operation. To be safte to use host scan, we strongly * recommend you to disable module FW connection manager by uncommenting * #define DISABLE_MODULE_FW_CONNECT_MANAGER_IN_INFRASTRUCTURE * in drv_wifi_config.h */ if (!WF_CMIsHostScanAllowed()) return WF_ERROR_OPERATION_CANCELLED; #ifndef MRF24WG WF_CMGetConnectionState(&connectionState, &dummy); if (connectionState == WF_CSTATE_NOT_CONNECTED) WF_CMConnect(0xff); /* 120c host scan bug workaround */ #endif hdr[0] = WF_MGMT_REQUEST_TYPE; hdr[1] = WF_SCAN_START_SUBTYPE; hdr[2] = CpId; /* Connection Profile ID */ hdr[3] = 0; /* not used */ SendMgmtMsg(hdr, /* header */ sizeof(hdr), /* size of header */ NULL, /* no data */ 0); /* no data */ /* wait for mgmt response, free it after it comes in (no data needed) */ WaitForMgmtResponse(WF_SCAN_START_SUBTYPE, FREE_MGMT_BUFFER); return WF_SUCCESS; }
void MyWIFI_Connect(void) { UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); WF_CPSetNetworkType(ConnectionProfileID, MY_DEFAULT_NETWORK_TYPE); WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); WF_CASetChannelList(channelList, sizeof (channelList)); // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. #if (MY_DEFAULT_NETWORK_TYPE == WF_ADHOC) WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_ADHOC); #else WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE); #endif WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); WF_CASetBeaconTimeout(40); WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, AppConfig.WepKeyIndex, /* only used if WEP enabled */ AppConfig.SecurityKey, AppConfig.SecurityKeyLength); MyConsole_SendMsg("Start WiFi Connect\n"); WF_CMConnect(ConnectionProfileID); }
static int WFEasyConfigProcess(void) { UINT8 ConnectionProfileID; UINT8 ConnectionState; #if defined (EZ_CONFIG_STALL) if (CFGCXT.cfg_state == cfg_stopped) { /* State machine just started get current time stamp */ CFGCXT.cfg_state = cfg_stalled; CFGCXT.timeStart = TickGet(); return 0; } /* Wait for stall time to expire */ if (CFGCXT.cfg_state == cfg_stalled) { UINT32 time = TickGet(); if ((time - CFGCXT.timeStart) < WF_STALL_TIME_MS) return 0; } #endif //EZ_CONFIG_STALL /* We will re-use the current profile */ WF_CMGetConnectionState(&ConnectionState, &ConnectionProfileID); /* Need to disconnect */ WF_CMDisconnect(); /* Delete profile */ WF_CPDelete(ConnectionProfileID); /* Create and prepare new profile */ WF_CPCreate(&ConnectionProfileID); /* Now set the various connection profile parameters */ /* Set SSID... */ if (CFGCXT.ssid) #if defined(__18CXX) WF_CPSetSsid(ConnectionProfileID, (ROM char *)CFGCXT.ssid, strlen(CFGCXT.ssid)); #else WF_CPSetSsid(ConnectionProfileID, CFGCXT.ssid, strlen((char*)CFGCXT.ssid)); #endif /* Now deal with security... */ switch ((BYTE)CFGCXT.security) { case WF_SECURITY_OPEN: /* No security */ WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, 0, 0); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: if (CFGCXT.key) { WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, CFGCXT.key, strlen((char *)CFGCXT.key)); } break; case WF_SECURITY_WPA_AUTO_WITH_KEY: if (CFGCXT.key) { WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, CFGCXT.key, 32); } break; case WF_SECURITY_WEP_40: { BYTE keys[20]; int i; if (CFGCXT.key) { /* Clear key */ for (i = 0; i < 20; i++) keys[i] = 0; memcpy(keys, CFGCXT.key, 20); WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WEP_40, CFGCXT.defaultWepKey, keys, 20); } } break; case WF_SECURITY_WEP_104: { BYTE keys[52]; int i; if (CFGCXT.key) { /* Clear key */ for (i = 0; i < 52; i++) keys[i] = 0; memcpy(keys, CFGCXT.key, 52); WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WEP_104, CFGCXT.defaultWepKey, keys, 52); } } break; } #if defined (EZ_CONFIG_STORE) SaveWifiConfig(); #endif /* Set wlan mode */ WF_CPSetNetworkType(ConnectionProfileID, CFGCXT.type); /* Kick off connection now... */ WF_CMConnect(ConnectionProfileID); /* Change state and return TRUE to show we are done! */ CFGCXT.cfg_state = cfg_stopped; return 1; }
static int WFEasyConfigProcess(void) { uint8_t ConnectionProfileID; uint8_t ConnectionState; #if defined (EZ_CONFIG_STALL) if (CFGCXT.cfg_state == cfg_stopped) { /* State machine just started get current time stamp */ CFGCXT.cfg_state = cfg_stalled; CFGCXT.timeStart = TickGet(); return 0; } /* Wait for stall time to expire */ if (CFGCXT.cfg_state == cfg_stalled) { uint32_t time = TickGet(); if ((time - CFGCXT.timeStart) < WF_STALL_TIME_MS) return 0; } #endif //EZ_CONFIG_STALL /* We will re-use the current profile */ WF_CMGetConnectionState(&ConnectionState, &ConnectionProfileID); /* Need to disconnect */ WF_CMDisconnect(); /* Delete profile */ WF_CPDelete(ConnectionProfileID); /* Create and prepare new profile */ WF_CPCreate(&ConnectionProfileID); AppConfig.passPhraseToKeyFlag = 0; /* Now set the various connection profile parameters */ /* Set SSID... */ if (CFGCXT.ssid) #if defined(__XC8) WF_CPSetSsid(ConnectionProfileID, //(ROM char *)CFGCXT.ssid, Note (VMH): fixed compile warning - not sure why this is necessary. CFGCXT.ssid, strlen(CFGCXT.ssid)); #else WF_CPSetSsid(ConnectionProfileID, CFGCXT.ssid, strlen((char*)CFGCXT.ssid)); #endif #if defined(DERIVE_KEY_FROM_PASSPHRASE_IN_HOST) if ((uint8_t)CFGCXT.security == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE) { WF_ConvPassphrase2Key(strlen((char *)CFGCXT.key), CFGCXT.key, strlen((char*)CFGCXT.ssid), CFGCXT.ssid); CFGCXT.security--; #if MY_DEFAULT_NETWORK_TYPE == WF_ADHOC if (AppConfig.SecurityMode == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE) { WF_ConvPassphrase2Key(AppConfig.SecurityKeyLength, AppConfig.SecurityKey, AppConfig.SsidLength, AppConfig.MySSID); AppConfig.SecurityMode--; AppConfig.SecurityKeyLength = 32; AppConfig.passPhraseToKeyFlag = 1; } #endif /* MY_DEFAULT_NETWORK_TYPE == WF_ADHOC */ } #endif /* defined(DERIVE_KEY_FROM_PASSPHRASE_IN_HOST) */ /* Now deal with security... */ switch ((uint8_t)CFGCXT.security) { case WF_SECURITY_OPEN: /* No security */ WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, 0, 0); break; case WF_SECURITY_WEP_40: { uint8_t keys[20]; int i; if (CFGCXT.key) { /* Clear key */ for (i = 0; i < 20; i++) keys[i] = 0; memcpy(keys, (void*)CFGCXT.key, 20); WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WEP_40, CFGCXT.defaultWepKey, keys, 20); } } break; case WF_SECURITY_WEP_104: { uint8_t keys[52]; int i; if (CFGCXT.key) { /* Clear key */ for (i = 0; i < 52; i++) keys[i] = 0; memcpy(keys, (void*)CFGCXT.key, 52); WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WEP_104, CFGCXT.defaultWepKey, keys, 52); } } break; case WF_SECURITY_WPA_AUTO_WITH_KEY: if (CFGCXT.key) { WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, CFGCXT.key, 32); } break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: if (CFGCXT.key) { WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, CFGCXT.key, strlen((char *)CFGCXT.key)); } break; } #if defined (EZ_CONFIG_STORE) SaveAppConfig(&AppConfig); #endif /* Set wlan mode */ WF_CPSetNetworkType(ConnectionProfileID, CFGCXT.type); if (AppConfig.networkType == WF_INFRASTRUCTURE) WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE); #if defined(DISABLE_MODULE_FW_CONNECT_MANAGER_IN_INFRASTRUCTURE) WF_DisableModuleConnectionManager(); #endif #if MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP // SoftAP: To allow redirection, need to hibernate before changing network type. Module FW has SoftAP flag and therefore hibernate mode // is needed to clear this indication and allow proper network change. // This should work for non-SoftAP. But these have not been tested yet. // Operation of hibernate mode // Turned off LDO of the MRF24W module, which is turning off the power completely. Has same effect of resetting the module. // // FW flow of hibernate mode: // Ensure WF_USE_POWER_SAVE_FUNCTIONS is enabled. // In main() loop, StackTask() -> MACProcess() will be called. It will invoke CheckHibernate(), which executes/handles // hibernate mode based on WF_hibernate.state and WF_hibernate.wakeup_notice. WF_hibernate.state = WF_HB_ENTER_SLEEP; WF_hibernate.wakeup_notice = false; //WFConsolePrintRomStr("SoftAP redirection: Put Wi-Fi module into hibernate mode.", true); DelayMs(50); // SOFTAP_ZEROCONF_SUPPORT. Timing reduced from 200 to 50. WF_hibernate.wakeup_notice = true; //WFConsolePrintRomStr("Wakeup Wi-Fi module.", true); #else /* Kick off connection now... */ WF_CMConnect(ConnectionProfileID); #endif /* Change state and return true to show we are done! */ CFGCXT.cfg_state = cfg_stopped; return 1; }
/******************************************************************************* Function: BOOL iwconfigSetMode(void) Summary: Set the mode to idle, managed or adhoc. Description: Idle mode - Force MRF24W module to disconnect from any currently connected network Managed mode - MRF24W module will connect to SSID in infrastructure mode. Ensure all network parameters are correct before this command is invoked. Adhoc mode - MRF24W module will connect to SSID in adhoc mode. Ensure all network parameters are correct before this command is invoked. Parameters: Mode - idle / managed /adhoc Returns: TRUE or FALSE Remarks: None. *****************************************************************************/ static BOOL iwconfigSetMode(void) { UINT8 networkType; WF_CPGetNetworkType(iwconfigCb.cpId, &networkType); if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "idle") == 0) ) { if ( iwconfigCb.isIdle ) { WFConsolePrintRomStr("Already in the idle mode", TRUE); } else { if (WF_CMDisconnect() != WF_SUCCESS) { #if defined(STACK_USE_UART) putsUART("Disconnect failed. Disconnect is allowed only when module is in connected state\r\n"); #endif } WF_PsPollDisable(); } } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "managed") == 0) ) { if ( iwconfigCb.isIdle ) { WF_CPSetNetworkType(iwconfigCb.cpId, WF_INFRASTRUCTURE); WF_CMConnect(iwconfigCb.cpId); } else { WF_CPGetNetworkType(iwconfigCb.cpId, &networkType); if (networkType == WF_INFRASTRUCTURE) { WFConsolePrintRomStr("Already in the managed mode", TRUE); } else { if (WF_CMDisconnect() != WF_SUCCESS) { #if defined(STACK_USE_UART) putsUART("Disconnect failed. Disconnect is allowed only when module is in connected state\r\n"); #endif } WF_CPSetNetworkType(iwconfigCb.cpId, WF_INFRASTRUCTURE); WF_CMConnect(iwconfigCb.cpId); } } } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "adhoc") == 0) ) { if ( iwconfigCb.isIdle ) { WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CPSetNetworkType(iwconfigCb.cpId, WF_ADHOC); WF_CPSetAdHocBehavior(iwconfigCb.cpId, WF_ADHOC_CONNECT_THEN_START); WF_CMConnect(iwconfigCb.cpId); } else { WF_CPGetNetworkType(iwconfigCb.cpId, &networkType); if (networkType == WF_ADHOC) { WFConsolePrintRomStr("Already in the adhoc mode", TRUE); } else { if (WF_CMDisconnect() != WF_SUCCESS) { #if defined(STACK_USE_UART) putsUART("Disconnect failed. Disconnect is allowed only when module is in connected state\r\n"); #endif } WF_CPSetNetworkType(iwconfigCb.cpId, WF_ADHOC); WF_CMConnect(iwconfigCb.cpId); } } } else { WFConsolePrintRomStr("Unknown parameter", TRUE); return FALSE; } return TRUE; }
/***************************************************************************** * FUNCTION: void WF_Connect(void) * * RETURNS: None * * PARAMS: none * * NOTES: This routine creates a Connection Profile Entry, Initializes it * then creates the connection algorithm and establishes the WiFi * connection according to the Profile settings. * Customize this function as needed for your application. * * Wifi Direct, ensure following parameters are set up properly * - AppConfig.MySSID = "DIRECT-" * - sizeof(channelList) == 3) * - channelList[0] == 1 * - channelList[1] == 6 * - channelList[2] == 11 * *****************************************************************************/ void WF_Connect(void) { uint8_t ConnectionProfileID; uint8_t channelList[] = MY_DEFAULT_CHANNEL_LIST; uint8_t channelList_postscan[] = MY_DEFAULT_CHANNEL_LIST_POSTSCAN; /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); AppConfig.passPhraseToKeyFlag = 0; // Enables or disables the MRF24W Regional Domain with RF module FW version 0x3106 or earlier // With RF module FW version 0x3107 and future releases, this function is NOT supported due to changes // in FCC requirements, which does not allow programming of the regional domain. WF_SetRegionalDomain(MY_DEFAULT_DOMAIN); if ((AppConfig.networkType == WF_SOFT_AP) || (AppConfig.networkType == WF_ADHOC)) { /**********************************************************************/ /* Append Last 4 digits to MAC address to SSID - Creating unique SSID */ /* Wifi comm demo SSID : MCHP_xxxx */ /* Wifi G demo SSID : MCHP_G_xxxx */ /**********************************************************************/ sprintf((char *) AppConfig.MySSID, "MCHP_G_%02x%02x", AppConfig.MyMACAddr.v[4], AppConfig.MyMACAddr.v[5]); sprintf((char *) AppConfig.NetBIOSName, "%s%02x%02x", MY_DEFAULT_HOST_NAME, AppConfig.MyMACAddr.v[4], AppConfig.MyMACAddr.v[5]); size_t i = 0; // in the following while loop, all lower case letters have been changed to upper case ones // because browser automatically translates lower case letters to upper case while (i < sizeof (AppConfig.NetBIOSName)) { if (((*((char *) AppConfig.NetBIOSName + i)) >= 'a') & ((*((char *) AppConfig.NetBIOSName + i)) <= 'z')) { *((char *) AppConfig.NetBIOSName + i) = *((char *) AppConfig.NetBIOSName + i) - 32; } else if (*((char *) AppConfig.NetBIOSName + i) == '\0') break; i++; } FormatNetBIOSName(AppConfig.NetBIOSName); } AppConfig.SsidLength = strlen((char *) (AppConfig.MySSID)); WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } #if !defined(MRF24WG) Delay10us(10); /* required for MRF24WB */ #endif #if WF_HOST_DERIVE_KEY_FROM_PASSPHRASE == WF_ENABLED if (AppConfig.SecurityMode == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE) { WF_ConvPassphraseToKey(AppConfig.SecurityKeyLength, AppConfig.SecurityKey, AppConfig.SsidLength, AppConfig.MySSID); AppConfig.SecurityMode--; AppConfig.SecurityKeyLength = 32; AppConfig.passPhraseToKeyFlag = 1; } #endif /* #if WF_HOST_DERIVE_KEY_FROM_PASSPHRASE == WF_ENABLED */ switch (AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: WF_ASSERT(false); break; } WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); if (((CFGCXT.type != WF_SOFT_AP)&&(CFGCXT.prevWLAN == WF_SOFT_AP)) || (AppConfig.networkType != WF_SOFT_AP)) { WF_CASetChannelList(channelList_postscan, sizeof (channelList_postscan)); } else { WF_CASetChannelList(channelList, sizeof (channelList)); } // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. if ((AppConfig.networkType == CFG_WF_ADHOC) || (AppConfig.networkType == CFG_WF_SOFT_AP)) { WF_CASetListRetryCount(ADHOC_RETRY_COUNT); } else /* AppConfig.networkType == CFG_WF_INFRASTRUCTURE */ { WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE); } WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) #if (MY_DEFAULT_PS_POLL == WF_ENABLED) WF_PsPollEnable(true); #else WF_PsPollDisable(); #endif #endif WF_CASetBeaconTimeout(MY_DEFAULT_BEACON_TIMEOUT); #if defined(STACK_USE_UART) WF_OutputConnectionInfo(&AppConfig); #endif if (AppConfig.networkType == CFG_WF_SOFT_AP) { #if (WF_SOFTAP_SEND_KEEP_ALIVE == WF_ENABLED) WF_SetLinkDownThreshold(WF_SOFTAP_LINK_LOST_THRESHOLD); #endif } else { // AppConfig.networkType != CFG_WF_SOFT_AP #if (WF_CHECK_LINK_STATUS == WF_ENABLED) WF_SetLinkDownThreshold(WF_LINK_LOST_THRESHOLD); #endif } // Initiates connection to BSS WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** * FUNCTION: WF_Connect * * RETURNS: None * * PARAMS: None * * NOTES: Connects to an 802.11 network. Customize this function as needed * for your application. *****************************************************************************/ static void WF_Connect(void) { UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; #if defined(WF_USE_POWER_SAVE_FUNCTIONS) BOOL PsPollEnabled; #endif /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); #if defined(STACK_USE_UART) putrsUART("Set SSID ("); putsUART(AppConfig.MySSID); putrsUART(")\r\n"); #endif WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); #if defined(STACK_USE_UART) putrsUART("Set Network Type\r\n"); #endif WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } #if defined(STACK_USE_UART) putrsUART("Set Security\r\n"); #endif switch(AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, AppConfig.SecurityKey, strlen((char*)AppConfig.SecurityKey)); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: { } //#if defined(STACK_USE_UART) // putrsUART("\r\n\r\nCaptain this should NOT happen.\r\n\r\n"); //#endif } #if defined(STACK_USE_UART) putrsUART("Set Scan Type\r\n"); #endif WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); #if defined(STACK_USE_UART) putrsUART("Set Channel List\r\n"); #endif WF_CASetChannelList(channelList, sizeof(channelList)); #if defined(STACK_USE_UART) putrsUART("Set list retry count\r\n"); #endif WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT); #if defined(STACK_USE_UART) putrsUART("Set Event Notify\r\n"); #endif WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) PsPollEnabled = (MY_DEFAULT_PS_POLL == WF_ENABLED); if (!PsPollEnabled) { /* disable low power (PS-Poll) mode */ #if defined(STACK_USE_UART) putrsUART("Disable PS-Poll\r\n"); #endif WF_PsPollDisable(); } else { /* Enable low power (PS-Poll) mode */ #if defined(STACK_USE_UART) putrsUART("Enable PS-Poll\r\n"); #endif WF_PsPollEnable(TRUE); } #endif #if defined(STACK_USE_UART) putrsUART("Set Beacon Timeout\r\n"); #endif WF_CASetBeaconTimeout(40); #if defined(STACK_USE_UART) putrsUART("Start WiFi Connect\r\n"); #endif WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** * FUNCTION: WF_Connect * * RETURNS: None * * PARAMS: None * * NOTES: Connects to an 802.11 network. Customize this function as needed * for your application. *****************************************************************************/ static void WF_Connect(void) { UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; #if defined(WF_USE_POWER_SAVE_FUNCTIONS) BOOL PsPollEnabled; #endif /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); #if defined(STACK_USE_UART) putrsUART("Set SSID ("); putsUART(AppConfig.MySSID); putrsUART(")\r\n"); #endif WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); #if defined(STACK_USE_UART) putrsUART("Set Network Type\r\n"); #endif WF_CPSetNetworkType(ConnectionProfileID, MY_DEFAULT_NETWORK_TYPE); #if defined(STACK_USE_UART) putrsUART("Set Scan Type\r\n"); #endif WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); #if defined(STACK_USE_UART) putrsUART("Set Channel List\r\n"); #endif WF_CASetChannelList(channelList, sizeof(channelList)); #if defined(STACK_USE_UART) putrsUART("Set list retry count\r\n"); #endif // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. #if defined(EZ_CONFIG_STORE) if (AppConfig.networkType == WF_ADHOC) WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_ADHOC); else WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE); #else #if (MY_DEFAULT_NETWORK_TYPE == WF_ADHOC) WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_ADHOC); #else WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE); #endif #endif #if defined(STACK_USE_UART) putrsUART("Set Event Notify\r\n"); #endif WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) PsPollEnabled = (MY_DEFAULT_PS_POLL == WF_ENABLED); if (!PsPollEnabled) { /* disable low power (PS-Poll) mode */ #if defined(STACK_USE_UART) putrsUART("Disable PS-Poll\r\n"); #endif WF_PsPollDisable(); } else { /* Enable low power (PS-Poll) mode */ #if defined(STACK_USE_UART) putrsUART("Enable PS-Poll\r\n"); #endif WF_PsPollEnable(TRUE); } #endif #if defined(STACK_USE_UART) putrsUART("Set Beacon Timeout\r\n"); #endif WF_CASetBeaconTimeout(40); /* Set Security */ #if (MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_OPEN) #if defined(STACK_USE_UART) putrsUART("Set Security (Open)\r\n"); #endif #elif (MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WEP_40) #if defined(STACK_USE_UART) putrsUART("Set Security (WEP40)\r\n"); #endif #elif (MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WEP_104) #if defined(STACK_USE_UART) putrsUART("Set Security (WEP104)\r\n"); #endif #elif MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WPA_WITH_KEY #if defined(STACK_USE_UART) putrsUART("Set Security (WPA with key)\r\n"); #endif #elif MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WPA2_WITH_KEY #if defined(STACK_USE_UART) putrsUART("Set Security (WPA2 with key)\r\n"); #endif #elif MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WPA_WITH_PASS_PHRASE #if defined(STACK_USE_UART) putrsUART("Set Security (WPA with pass phrase)\r\n"); #endif #elif MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WPA2_WITH_PASS_PHRASE #if defined(STACK_USE_UART) putrsUART("Set Security (WPA2 with pass phrase)\r\n"); #endif #elif MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WPA_AUTO_WITH_KEY #if defined(STACK_USE_UART) putrsUART("Set Security (WPA with key, auto-select)\r\n"); #endif #elif MY_DEFAULT_WIFI_SECURITY_MODE == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE #if defined(STACK_USE_UART) putrsUART("Set Security (WPA with pass phrase, auto-select)\r\n"); #endif #endif /* MY_DEFAULT_WIFI_SECURITY_MODE */ WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, AppConfig.WepKeyIndex, /* only used if WEP enabled */ AppConfig.SecurityKey, AppConfig.SecurityKeyLength); #if defined(STACK_USE_UART) putrsUART("Start WiFi Connect\r\n"); #endif WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** * FUNCTION: WF_Connect * * RETURNS: None * * PARAMS: None * * NOTES: Connects to an 802.11 network. Customize this function as needed * for your application. *****************************************************************************/ void WF_Connect(void) { //UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) UINT8 channelList_postscan[] = MY_DEFAULT_CHANNEL_LIST_POSTSCAN; #endif /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); WF_SetRegionalDomain(MY_DEFAULT_DOMAIN); WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } #if !defined(MRF24WG) // Delay10us(10); //If necessary, give time to Roadrunner to clean message buffer, because Security message is a big data package #endif switch(AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, AppConfig.SecurityKey, strlen((char*)AppConfig.SecurityKey)); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: putrsUART("\r\n\r\nCaptain this should NOT happen.\r\n\r\n"); } WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) if (((CFGCXT.type!=WF_SOFT_AP)&&(CFGCXT.prevWLAN==WF_SOFT_AP)) || (AppConfig.networkType!=WF_SOFT_AP)) { // putrsUART("\r\n\r\nWF_Connect: Channel list update when transitioning from SoftAP to non-SoftAP or NOT in SoftAP..\r\n\r\n"); WF_CASetChannelList(channelList_postscan, sizeof(channelList_postscan)); } else { WF_CASetChannelList(channelList, sizeof(channelList)); } #else WF_CASetChannelList(channelList, sizeof(channelList)); #endif // (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) #if (MY_DEFAULT_PS_POLL == WF_ENABLED) WF_PsPollEnable(TRUE); #else WF_PsPollDisable(); #endif #endif WF_CASetBeaconTimeout(MY_DEFAULT_BEACON_TIMEOUT); #if defined(STACK_USE_UART) WF_OutputConnectionInfo(&AppConfig); #endif #if (SOFTAP_CHECK_LINK_STATUS == WF_ENABLED) WF_SetLinkDownThreshold(SOFTAP_LINK_FAILURE_THRESHOLD); #endif WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** * FUNCTION: WF_Connect * * RETURNS: None * * PARAMS: None * * NOTES: Connects to an 802.11 network. Customize this function as needed * for your application. *****************************************************************************/ void WF_Connect(void) { //UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); WF_SetRegionalDomain(MY_DEFAULT_DOMAIN); WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); #if defined(WF_USE_HIDDEN_SSID) WF_CPSetSsidType(ConnectionProfileID, FALSE); #endif WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } switch(AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, AppConfig.SecurityKey, strlen((char*)AppConfig.SecurityKey)); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: putrsUART("\r\n\r\nCaptain this should NOT happen.\r\n\r\n"); } WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); WF_CASetChannelList(channelList, sizeof(channelList)); // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) #if (MY_DEFAULT_PS_POLL == WF_ENABLED) WF_PsPollEnable(TRUE); #else WF_PsPollDisable(); #endif #endif WF_CASetBeaconTimeout(MY_DEFAULT_BEACON_TIMEOUT); #if defined(STACK_USE_UART) WF_OutputConnectionInfo(&AppConfig); #endif WF_CMConnect(ConnectionProfileID); }
static int WFEasyConfigProcess(void) { UINT8 ConnectionProfileID; UINT8 ConnectionState; #if defined (EZ_CONFIG_STALL) if (CFGCXT.cfg_state == cfg_stopped) { /* State machine just started get current time stamp */ CFGCXT.cfg_state = cfg_stalled; CFGCXT.timeStart = TickGet(); return 0; } /* Wait for stall time to expire */ if (CFGCXT.cfg_state == cfg_stalled) { UINT32 time = TickGet(); if ((time - CFGCXT.timeStart) < WF_STALL_TIME_MS) return 0; } #endif //EZ_CONFIG_STALL /* We will re-use the current profile */ WF_CMGetConnectionState(&ConnectionState, &ConnectionProfileID); /* Need to disconnect */ WF_CMDisconnect(); /* Delete profile */ WF_CPDelete(ConnectionProfileID); /* Create and prepare new profile */ WF_CPCreate(&ConnectionProfileID); /* Now set the various connection profile parameters */ /* Set SSID... */ if (CFGCXT.ssid) #if defined(__18CXX) WF_CPSetSsid(ConnectionProfileID, //(ROM char *)CFGCXT.ssid, Note (VMH): fixed compile warning - not sure why this is necessary. CFGCXT.ssid, strlen(CFGCXT.ssid)); #else WF_CPSetSsid(ConnectionProfileID, CFGCXT.ssid, strlen((char*)CFGCXT.ssid)); #endif #if defined(DERIVE_KEY_FROM_PASSPHRASE_IN_HOST) if ((BYTE)CFGCXT.security == WF_SECURITY_WPA_WITH_PASS_PHRASE || (BYTE)CFGCXT.security == WF_SECURITY_WPA2_WITH_PASS_PHRASE || (BYTE)CFGCXT.security == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE) { WF_ConvPassphrase2Key(strlen((char *)CFGCXT.key), CFGCXT.key, strlen((char*)CFGCXT.ssid), CFGCXT.ssid); CFGCXT.security--; } #endif /* defined(DERIVE_KEY_FROM_PASSPHRASE_IN_HOST) */ /* Now deal with security... */ switch ((BYTE)CFGCXT.security) { case WF_SECURITY_OPEN: /* No security */ WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, 0, 0); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: if (CFGCXT.key) { WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, CFGCXT.key, strlen((char *)CFGCXT.key)); } break; case WF_SECURITY_WPA_AUTO_WITH_KEY: if (CFGCXT.key) { WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, CFGCXT.key, 32); } break; case WF_SECURITY_WEP_40: { BYTE keys[20]; int i; if (CFGCXT.key) { /* Clear key */ for (i = 0; i < 20; i++) keys[i] = 0; memcpy(keys, (void*)CFGCXT.key, 20); WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WEP_40, CFGCXT.defaultWepKey, keys, 20); } } break; case WF_SECURITY_WEP_104: { BYTE keys[52]; int i; if (CFGCXT.key) { /* Clear key */ for (i = 0; i < 52; i++) keys[i] = 0; memcpy(keys, (void*)CFGCXT.key, 52); WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WEP_104, CFGCXT.defaultWepKey, keys, 52); } } break; } #if defined (EZ_CONFIG_STORE) SaveAppConfig(&AppConfig); #endif /* Set wlan mode */ WF_CPSetNetworkType(ConnectionProfileID, CFGCXT.type); #if defined(DISABLE_MODULE_FW_CONNECT_MANAGER_IN_INFRASTRUCTURE) WF_DisableModuleConnectionManager(); #endif if (AppConfig.networkType == WF_INFRASTRUCTURE) WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE); #if MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP // SoftAP: To allow redirection, need to hibernate before changing network type. Module FW has SoftAP flag and therefore hibernate mode // is needed to clear this indication and allow proper network change. // This should work for non-SoftAP. But these have not been tested yet. WF_hibernate.state = WF_HB_ENTER_SLEEP; WF_hibernate.wakeup_notice = FALSE; //WFConsolePrintRomStr("SoftAP redirection: Put Wi-Fi module into hibernate mode.", TRUE); DelayMs(200); WF_hibernate.wakeup_notice = TRUE; //WFConsolePrintRomStr("Wakeup Wi-Fi module.", TRUE); #else /* Kick off connection now... */ WF_CMConnect(ConnectionProfileID); #endif /* Change state and return TRUE to show we are done! */ CFGCXT.cfg_state = cfg_stopped; return 1; }