static BOOL iwconfigSetChannel(void) { UINT8 *p1, *p2; UINT8 *p_channelList; UINT8 index = 0; UINT16 temp; if (ARGC < 3u) { WFConsolePrintRomStr("Missing value for last parameter", TRUE); return FALSE; } if ( !iwconfigCb.isIdle ) { WFConsolePrintRomStr("Channel can only be set in idle mode", TRUE); return FALSE; } p_channelList = (UINT8*) ARGV[2]; p1 = p2 = p_channelList; if ( strlen( (char*) p_channelList) == 0u ) return FALSE; if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "all") == 0) ) { WF_CASetChannelList(p_channelList, 0); // reset to domain default channel list return TRUE; } do { if ( (p2 = (UINT8*) strchr( (const char *) p1, (int) ',')) != NULL ) { *p2='\0'; p2++; } if( !ConvertASCIIUnsignedDecimalToBinary((INT8 *)p1, &temp) ) return FALSE; p1 = p2; p_channelList[index] = (UINT8) temp; index++; } while ( p2 != NULL ); WF_CASetChannelList(p_channelList, index); return TRUE; }
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); }
int main(void) #endif { BYTE i; static DWORD t = 0; static DWORD dwLastIP = 0; static UINT8 updateDisplay = 0; #if defined (EZ_CONFIG_STORE) static DWORD ButtonPushStart = 0; #endif #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST_PRESCAN; // WF_PRESCAN tWFScanResult bssDesc; #endif // Initialize application specific hardware InitializeBoard(); // Initiates board setup process if button is depressed // on startup if (BUTTON1_IO == 0u) { while (BUTTON1_IO == 0); SelfTestMode(); } //#if defined(USE_LCD) /*******************************************************************/ // Initialize the LCD /*******************************************************************/ ConfigureLCD_SPI(); LCDInit(); /*******************************************************************/ // Display Start-up Splash Screen /*******************************************************************/ LCDBacklightON(); LEDS_ON(); LCDErase(); sprintf((char *) LCDText, (char*) " MiWi - WiFi "); sprintf((char *) &(LCDText[16]), (char*) " Gateway Demo"); LCDUpdate(); /*******************************************************************/ // Initialize the MiWi Protocol Stack. The only input parameter indicates // if previous network configuration should be restored. /*******************************************************************/ MiApp_ProtocolInit(FALSE); /*******************************************************************/ // Set Device Communication Channel /*******************************************************************/ if (MiApp_SetChannel(myChannel) == FALSE) { LCDDisplay((char *) "ERROR: Unable to Set Channel..", 0, TRUE); while (1); } /*******************************************************************/ // Set the connection mode. The possible connection modes are: // ENABLE_ALL_CONN: Enable all kinds of connection // ENABLE_PREV_CONN: Only allow connection already exists in // connection table // ENABL_ACTIVE_SCAN_RSP: Allow response to Active scan // DISABLE_ALL_CONN: Disable all connections. /*******************************************************************/ MiApp_ConnectionMode(ENABLE_ALL_CONN); /*******************************************************************/ // Function MiApp_EstablishConnection try to establish a new // connection with peer device. // The first parameter is the index to the active scan result, // which is acquired by discovery process (active scan). If // the value of the index is 0xFF, try to establish a // connection with any peer. // The second parameter is the mode to establish connection, // either direct or indirect. Direct mode means connection // within the radio range; indirect mode means connection // may or may not in the radio range. /*******************************************************************/ i = MiApp_EstablishConnection(0xFF, CONN_MODE_DIRECT); /*******************************************************************/ // Display current opertion on LCD of demo board, if applicable /*******************************************************************/ if (i != 0xFF) { ; // Connected Peer on Channel } else { /*******************************************************************/ // If no network can be found and join, we need to start a new // network by calling function MiApp_StartConnection // // The first parameter is the mode of start connection. There are // two valid connection modes: // - START_CONN_DIRECT start the connection on current // channel // - START_CONN_ENERGY_SCN perform an energy scan first, // before starting the connection on // the channel with least noise // - START_CONN_CS_SCN perform a carrier sense scan // first, before starting the // connection on the channel with // least carrier sense noise. Not // supported for current radios // // The second parameter is the scan duration, which has the same // definition in Energy Scan. 10 is roughly 1 second. 9 is a // half second and 11 is 2 seconds. Maximum scan duration is // 14, or roughly 16 seconds. // // The third parameter is the channel map. Bit 0 of the // double word parameter represents channel 0. For the 2.4GHz // frequency band, all possible channels are channel 11 to // channel 26. As the result, the bit map is 0x07FFF800. Stack // will filter out all invalid channels, so the application // only needs to pay attention to the channels that are not // preferred. /*******************************************************************/ MiApp_StartConnection(START_CONN_DIRECT, 10, 0); } // Turn OFF LCD after setting up MiWi Connection LCDBacklightOFF(); // Initialize stack-related hardware components that may be // required by the UART configuration routines TickInit(); #if defined(STACK_USE_MPFS2) MPFSInit(); #endif // Initialize Stack and application related NV variables into AppConfig. InitAppConfig(); dwLastIP = AppConfig.MyIPAddr.Val; // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); #if defined ( EZ_CONFIG_SCAN ) WFInitScan(); #endif #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) // WF_PRESCAN: Pre-scan before starting up as SoftAP mode WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); WF_CASetChannelList(channelList, sizeof (channelList)); if (WFStartScan() == WF_SUCCESS) { SCAN_SET_DISPLAY(SCANCXT.scanState); SCANCXT.displayIdx = 0; //putsUART("main: Prescan WFStartScan() success ................. \r\n"); } // Needed to trigger g_scan_done WFRetrieveScanResult(0, &bssDesc); #else #if defined(WF_CS_TRIS) WF_Connect(); #endif // defined(WF_CS_TRIS) #endif // (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) // Initialize any application-specific modules or functions/ // For this demo application, this only includes the // UART 2 TCP Bridge #if defined(STACK_USE_UART2TCP_BRIDGE) UART2TCPBridgeInit(); #endif #if defined(STACK_USE_ZEROCONF_LINK_LOCAL) ZeroconfLLInitialize(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSInitialize(MY_DEFAULT_HOST_NAME); mDNSServiceRegister( (const char *) AppConfig.NetBIOSName, // base name of the service "_http._tcp.local", // type of the service 80, // TCP or UDP port, at which this service is available ((const BYTE *) "path=/index.htm"), // TXT info 1, // auto rename the service when if needed NULL, // no callback function NULL // no application context ); mDNSMulticastFilterRegister(); #endif #if defined(WF_CONSOLE) WFConsoleInit(); #endif // Now that all items are initialized, begin the co-operative // multitasking loop. This infinite loop will continuously // execute all stack-related tasks, as well as your own // application's functions. Custom functions should be added // at the end of this loop. // Note that this is a "co-operative mult-tasking" mechanism // where every task performs its tasks (whether all in one shot // or part of it) and returns so that other tasks can do their // job. // If a task needs very long time to do its job, it must be broken // down into smaller pieces so that other tasks can have CPU time. LEDS_OFF(); while (1) { /*******************************************************************/ // Check Button Events /*******************************************************************/ if (BUTTON1_IO == 0u) { while (BUTTON1_IO == 0); LCDErase(); sprintf((char *) LCDText, (char*) "Erase Room Info?"); sprintf((char *) &(LCDText[16]), (char*) "SW0:Yes SW2:No"); LCDUpdate(); while (1) { if (BUTTON1_IO == 0u) { while (BUTTON1_IO == 0); LCDDisplay((char *) "STATUS: Erasing...", 0, TRUE); EraseRoomInfo(); DisplaySSID(); break; } else if (BUTTON2_IO == 0u) { while (BUTTON2_IO == 0); DisplaySSID(); break; } } } // Blink LED0 twice per sec when unconfigured, once per sec after config if ((TickGet() - t >= TICK_SECOND / (4ul - (CFGCXT.isWifiDoneConfigure * 2ul)))) { t = TickGet(); LED0_INV(); } if(CFGCXT.isWifiNeedToConfigure) updateDisplay = 1; #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) if (g_scan_done) { if (g_prescan_waiting) { SCANCXT.displayIdx = 0; while (IS_SCAN_STATE_DISPLAY(SCANCXT.scanState)) { WFDisplayScanMgr(); } #if defined(WF_CS_TRIS) WF_Connect(); #endif DisplaySSID(); g_scan_done = 0; g_prescan_waiting = 0; } } #endif // (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) // This task performs normal stack task including checking // for incoming packet, type of packet and calling // appropriate stack entity to process it. StackTask(); WiFiTask(); // This tasks invokes each of the core stack application tasks StackApplications(); #if defined(STACK_USE_ZEROCONF_LINK_LOCAL) ZeroconfLLProcess(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSProcess(); // Use this function to exercise service update function // HTTPUpdateRecord(); #endif // Process application specific tasks here. // For this demo app, this will include the Generic TCP // client and servers, and the SNMP, Ping, and SNMP Trap // demos. Following that, we will process any IO from // the inputs on the board itself. // Any custom modules or processing you need to do should // go here. #if defined(WF_CONSOLE) //WFConsoleProcess(); // #if !defined(STACK_USE_EZ_CONFIG) // IperfAppCall(); // #endif //WFConsoleProcessEpilogue(); wait_console_input: #endif #if defined(STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE) GenericTCPClient(); #endif #if defined(STACK_USE_GENERIC_TCP_SERVER_EXAMPLE) GenericTCPServer(); #endif #if defined(STACK_USE_SMTP_CLIENT) SMTPDemo(); #endif #if defined(STACK_USE_ICMP_CLIENT) PingDemo(); //PingConsole(); #endif #if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED) //User should use one of the following SNMP demo // This routine demonstrates V1 or V2 trap formats with one variable binding. SNMPTrapDemo(); #if defined(SNMP_STACK_USE_V2_TRAP) || defined(SNMP_V1_V2_TRAP_WITH_SNMPV3) //This routine provides V2 format notifications with multiple (3) variable bindings //User should modify this routine to send v2 trap format notifications with the required varbinds. //SNMPV2TrapDemo(); #endif if (gSendTrapFlag) SNMPSendTrap(); #endif #if defined ( WF_CONSOLE ) && defined ( EZ_CONFIG_SCAN ) WFDisplayScanMgr(); #endif #if defined(STACK_USE_BERKELEY_API) BerkeleyTCPClientDemo(); BerkeleyTCPServerDemo(); BerkeleyUDPClientDemo(); #endif if((updateDisplay && CFGCXT.isWifiDoneConfigure) || (dwLastIP != AppConfig.MyIPAddr.Val)) { if(dwLastIP != AppConfig.MyIPAddr.Val) dwLastIP = AppConfig.MyIPAddr.Val; if(updateDisplay && CFGCXT.isWifiDoneConfigure) updateDisplay = 0; #if defined(STACK_USE_ANNOUNCE) AnnounceIP(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSFillHostRecord(); #endif DisplaySSID(); } } }
static BOOL iwconfigSetConnect(void) { // IWCONFIG CONNECT [ssid] [channel] [power-mode] //[security-mode] [WEP-key/passphrase] [retry-attempt] UINT8 networkType; if(ARGC < 3u) { putsUART("Wrong command, correct command is:IWCONFIG CONNECT [ssid] [bssid] [channel] [power-mode]\r\n"); return FALSE; } networkType = SetMode_idle(); if(ARGC >= 3u) // ssid { WF_CPSetSsid(iwconfigCb.cpId, (UINT8 *)ARGV[2], strlen((char*)ARGV[2])); } if(ARGC >= 4u) //channel { int int_channel; sscanf((const char *)ARGV[3], (const char *)"%d",&int_channel); if((int_channel>=1)&&(int_channel<=14)) { WF_CASetChannelList((UINT8 *)&int_channel, 1); } else { WFConsolePrintRomStr("channel err (1~14): Unknown parameter", TRUE); return FALSE; } } if(ARGC >= 5u) //channel { int int_channel; UINT8 channel; sscanf((const char *)ARGV[4], (const char *)"%d",&int_channel); if((int_channel>=1)&&(int_channel<=14)) { channel = int_channel; //{char buf_t[20];sprintf(buf_t,"channel=%d\r\n",int_channel);putsUART(buf_t);} WF_CASetChannelList(&channel, 1); DelayMs(100); } else { WFConsolePrintRomStr("channel err (1~14): Unknown parameter", TRUE); return FALSE; } } if(ARGC >= 6u) // power-mode { if (strcmppgm2ram((char*)ARGV[5], "reenable") == 0) { // reenable power saving #if defined(WF_USE_POWER_SAVE_FUNCTIONS) WF_PsPollEnable(TRUE); #endif } else if (strcmppgm2ram((char*)ARGV[5], "disable") == 0) { // disable power saving #if defined(WF_USE_POWER_SAVE_FUNCTIONS) WF_PsPollDisable(); #endif } else if (strcmppgm2ram((char*)ARGV[5], "unicast") == 0) { // enable power saving but don't poll for DTIM #if defined(WF_USE_POWER_SAVE_FUNCTIONS) WF_PsPollEnable(FALSE); #endif } else if (strcmppgm2ram((char*)ARGV[5], "all") == 0) { // enable power saving and poll for DTIM #if defined(WF_USE_POWER_SAVE_FUNCTIONS) WF_PsPollEnable(TRUE); #endif } else { WFConsolePrintRomStr("Unknown parameter", TRUE); return FALSE; } } if(ARGC >= 7u) // [security-mode] { } SetMode_NotIdle(networkType); return TRUE; }
/******************************************************************************* Function: BOOL iwconfigSetDomain(void) Summary: Set the domain. Description: Set the MRF24W Regional Domain. For MRF24WG 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. Parameters: Domain - fcc / etsi /japan / other Returns: TRUE or FALSE Remarks: None. *****************************************************************************/ static BOOL iwconfigSetDomain(void) { UINT8 domain; if (ARGC < 3u) { WFConsolePrintRomStr("Missing value for last parameter", TRUE); return FALSE; } if ( !iwconfigCb.isIdle ) { WFConsolePrintRomStr("Domain can only be set in idle mode", TRUE); return FALSE; } #if defined(MRF24WG) if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "fcc") == 0) ) { domain = WF_DOMAIN_FCC; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "etsi") == 0) ) { domain = WF_DOMAIN_ETSI; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "japan") == 0) ) { domain = WF_DOMAIN_JAPAN; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "other") == 0) ) { domain = WF_DOMAIN_OTHER; } else { WFConsolePrintRomStr("Unknown domain", TRUE); return FALSE; } #else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "fcc") == 0) ) { domain = WF_DOMAIN_FCC; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "ic") == 0) ) { domain = WF_DOMAIN_IC; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "etsi") == 0) ) { domain = WF_DOMAIN_ETSI; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "spain") == 0) ) { domain = WF_DOMAIN_SPAIN; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "france") == 0) ) { domain = WF_DOMAIN_FRANCE; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "japana") == 0) ) { domain = WF_DOMAIN_JAPAN_A; } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "japanb") == 0) ) { domain = WF_DOMAIN_JAPAN_B; } else { WFConsolePrintRomStr("Unknown domain", TRUE); return FALSE; } #endif WF_SetRegionalDomain(domain); WF_CASetChannelList(NULL, 0); // reset to domain default channel list 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); }
int main(void) #endif { static DWORD t = 0; static DWORD dwLastIP = 0; #if defined (EZ_CONFIG_STORE) static DWORD ButtonPushStart = 0; #endif #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST_PRESCAN; // WF_PRESCAN tWFScanResult bssDesc; #endif // Initialize application specific hardware InitializeBoard(); #if defined(USE_LCD) // Initialize and display the stack version on the LCD LCDInit(); DelayMs(100); strcpypgm2ram((char*)LCDText, "TCPStack " TCPIP_STACK_VERSION " " " "); LCDUpdate(); #endif // Initialize stack-related hardware components that may be // required by the UART configuration routines TickInit(); #if defined(STACK_USE_MPFS2) MPFSInit(); #endif // Initialize Stack and application related NV variables into AppConfig. InitAppConfig(); // Initiates board setup process if button is depressed // on startup if(BUTTON0_IO == 0u) { #if defined(EEPROM_CS_TRIS) || defined(SPIFLASH_CS_TRIS) // Invalidate the EEPROM contents if BUTTON0 is held down for more than 4 seconds DWORD StartTime = TickGet(); LED_PUT(0x00); while(BUTTON0_IO == 0u) { if(TickGet() - StartTime > 4*TICK_SECOND) { #if defined(EEPROM_CS_TRIS) XEEBeginWrite(0x0000); XEEWrite(0xFF); XEEWrite(0xFF); XEEEndWrite(); #elif defined(SPIFLASH_CS_TRIS) SPIFlashBeginWrite(0x0000); SPIFlashWrite(0xFF); SPIFlashWrite(0xFF); #endif #if defined(STACK_USE_UART) putrsUART("\r\n\r\nBUTTON0 held for more than 4 seconds. Default settings restored.\r\n\r\n"); #endif LED_PUT(0x0F); while((LONG)(TickGet() - StartTime) <= (LONG)(9*TICK_SECOND/2)); LED_PUT(0x00); while(BUTTON0_IO == 0u); Reset(); break; } } #endif #if defined(STACK_USE_UART) DoUARTConfig(); #endif } // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); #if defined ( EZ_CONFIG_SCAN ) WFInitScan(); #endif #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) // WF_PRESCAN: Pre-scan before starting up as SoftAP mode WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); WF_CASetChannelList(channelList, sizeof(channelList)); if (WFStartScan() == WF_SUCCESS) { SCAN_SET_DISPLAY(SCANCXT.scanState); SCANCXT.displayIdx = 0; //putsUART("main: Prescan WFStartScan() success ................. \r\n"); } // Needed to trigger g_scan_done WFRetrieveScanResult(0, &bssDesc); #else #if defined(WF_CS_TRIS) WF_Connect(); #endif // defined(WF_CS_TRIS) #endif // (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) // Initialize any application-specific modules or functions/ // For this demo application, this only includes the // UART 2 TCP Bridge #if defined(STACK_USE_UART2TCP_BRIDGE) UART2TCPBridgeInit(); #endif #if defined(STACK_USE_ZEROCONF_LINK_LOCAL) ZeroconfLLInitialize(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSInitialize(MY_DEFAULT_HOST_NAME); #if defined(STACK_USE_TCP_MOBILE_APP_SERVER) mDNSServiceRegister( (const char *) "HomeControlServer", // base name of the service "_home-control._tcp.local", // type of the service 27561, // TCP or UDP port, at which this service is available ((const BYTE *)"control home devices"), // TXT info 1, // auto rename the service when if needed NULL, // no callback function NULL // no application context ); #else /* !defined(STACK_USE_TCP_MOBILE_APP_SERVER) */ mDNSServiceRegister( (const char *) "DemoWebServer", // base name of the service "_http._tcp.local", // type of the service 80, // TCP or UDP port, at which this service is available ((const BYTE *)"path=/index.htm"), // TXT info 1, // auto rename the service when if needed NULL, // no callback function NULL // no application context ); #endif /* defined(STACK_USE_TCP_MOBILE_APP_SERVER) */ mDNSMulticastFilterRegister(); #endif #if defined(WF_CONSOLE) WFConsoleInit(); #endif // Now that all items are initialized, begin the co-operative // multitasking loop. This infinite loop will continuously // execute all stack-related tasks, as well as your own // application's functions. Custom functions should be added // at the end of this loop. // Note that this is a "co-operative mult-tasking" mechanism // where every task performs its tasks (whether all in one shot // or part of it) and returns so that other tasks can do their // job. // If a task needs very long time to do its job, it must be broken // down into smaller pieces so that other tasks can have CPU time. while(1) { #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) if (g_scan_done) { if (g_prescan_waiting) { putrsUART((ROM char*)"\n SoftAP prescan results ........ \r\n\n"); SCANCXT.displayIdx = 0; while (IS_SCAN_STATE_DISPLAY(SCANCXT.scanState)) { WFDisplayScanMgr(); } putrsUART((ROM char*)"\r\n "); #if defined(WF_CS_TRIS) WF_Connect(); #endif g_scan_done = 0; g_prescan_waiting = 0; } } #endif // (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) #if defined(WF_PRE_SCAN_IN_ADHOC) if(g_prescan_adhoc_done) { WFGetScanResults(); g_prescan_adhoc_done = 0; } #endif #if defined (EZ_CONFIG_STORE) // Hold button3 for 4 seconds to reset to defaults. if (BUTTON3_IO == 0u) { // Button is pressed if (ButtonPushStart == 0) //Just pressed ButtonPushStart = TickGet(); else if(TickGet() - ButtonPushStart > 4*TICK_SECOND) RestoreWifiConfig(); } else { ButtonPushStart = 0; //Button release reset the clock } if (AppConfig.saveSecurityInfo) { // set true by WF_ProcessEvent after connecting to a new network // get the security info, and if required, push the PSK to EEPROM if ((AppConfig.SecurityMode == WF_SECURITY_WPA_WITH_PASS_PHRASE) || (AppConfig.SecurityMode == WF_SECURITY_WPA2_WITH_PASS_PHRASE) || (AppConfig.SecurityMode == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE)) { // only need to save when doing passphrase tWFCPElements profile; UINT8 connState; UINT8 connID; WF_CMGetConnectionState(&connState, &connID); WF_CPGetElements(connID, &profile); memcpy((char*)AppConfig.SecurityKey, (char*)profile.securityKey, 32); AppConfig.SecurityMode--; // the calc psk is exactly one below for each passphrase option AppConfig.SecurityKeyLength = 32; SaveAppConfig(&AppConfig); } AppConfig.saveSecurityInfo = FALSE; } #endif // EZ_CONFIG_STORE #if defined (STACK_USE_EZ_CONFIG) // Blink LED0 twice per sec when unconfigured, once per sec after config if((TickGet() - t >= TICK_SECOND/(4ul - (CFGCXT.isWifiDoneConfigure*2ul)))) #else // Blink LED0 (right most one) every second. if(TickGet() - t >= TICK_SECOND/2ul) #endif // STACK_USE_EZ_CONFIG { t = TickGet(); LED0_IO ^= 1; } // This task performs normal stack task including checking // for incoming packet, type of packet and calling // appropriate stack entity to process it. StackTask(); // This tasks invokes each of the core stack application tasks StackApplications(); #if defined(STACK_USE_ZEROCONF_LINK_LOCAL) ZeroconfLLProcess(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSProcess(); // Use this function to exercise service update function // HTTPUpdateRecord(); #endif // Process application specific tasks here. // For this demo app, this will include the Generic TCP // client and servers, and the SNMP, Ping, and SNMP Trap // demos. Following that, we will process any IO from // the inputs on the board itself. // Any custom modules or processing you need to do should // go here. #if defined(WF_CONSOLE) WFConsoleProcess(); WFConsoleProcessEpilogue(); #endif #if defined(STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE) GenericTCPClient(); #endif #if defined(STACK_USE_GENERIC_TCP_SERVER_EXAMPLE) GenericTCPServer(); #endif #if defined(STACK_USE_TCP_MOBILE_APP_SERVER) MobileTCPServer(); #endif #if defined(STACK_USE_SMTP_CLIENT) SMTPDemo(); #endif #if defined(STACK_USE_ICMP_CLIENT) PingDemo(); PingConsole(); #endif #if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED) //User should use one of the following SNMP demo // This routine demonstrates V1 or V2 trap formats with one variable binding. SNMPTrapDemo(); #if defined(SNMP_STACK_USE_V2_TRAP) || defined(SNMP_V1_V2_TRAP_WITH_SNMPV3) //This routine provides V2 format notifications with multiple (3) variable bindings //User should modify this routine to send v2 trap format notifications with the required varbinds. //SNMPV2TrapDemo(); #endif if(gSendTrapFlag) SNMPSendTrap(); #endif #if defined(STACK_USE_BERKELEY_API) BerkeleyTCPClientDemo(); BerkeleyTCPServerDemo(); BerkeleyUDPClientDemo(); #endif // If the local IP address has changed (ex: due to DHCP lease change) // write the new IP address to the LCD display, UART, and Announce // service if(dwLastIP != AppConfig.MyIPAddr.Val) { dwLastIP = AppConfig.MyIPAddr.Val; #if defined(STACK_USE_UART) putrsUART((ROM char*)"\r\nNew IP Address: "); #endif DisplayIPValue(AppConfig.MyIPAddr); #if defined(STACK_USE_UART) putrsUART((ROM char*)"\r\n"); #endif #if defined(STACK_USE_ANNOUNCE) AnnounceIP(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSFillHostRecord(); #endif } } }
// ************************************************************ // Main application entry point. // ************************************************************ int main(void) { static DWORD t = 0; static DWORD dwLastIP = 0; #if defined (EZ_CONFIG_STORE) static DWORD ButtonPushStart = 0; #endif UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST_PRESCAN; // WF_PRESCAN tWFScanResult bssDesc; #if 0 INT8 TxPower; // Needed to change MRF24WG transmit power. #endif // Initialize application specific hardware InitializeBoard(); // Initialize TCP/IP stack timer TickInit(); // Timer 3 interrupt for refreshing motor status inside here demo_TickInit(); #if defined(STACK_USE_MPFS2) // Initialize the MPFS File System // Generate a WifiGDemoMPFSImg.c file using the MPFS utility (refer to Convert WebPages to MPFS.bat) // that gets compiled into source code and programmed into the flash of the uP. MPFSInit(); #endif // Initialize Stack and application related NV variables into AppConfig. InitAppConfig(); // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); Exosite_Init("microchip","dv102412",IF_WIFI, 0); #if 0 // Below is used to change MRF24WG transmit power. // This has been verified to be functional (Jan 2013) if (AppConfig.networkType == WF_SOFT_AP) { WF_TxPowerGetMax(&TxPower); WF_TxPowerSetMax(TxPower); } #endif // Run Self Test if SW0 pressed on startup if(SW0_IO == 1) SelfTest(); #ifdef STACK_USE_TELNET_SERVER // Initialize Telnet and // Put Remote client in Remote Character Echo Mode TelnetInit(); putc(0xff, stdout); // IAC = Interpret as Command putc(0xfe, stdout); // Type of Operation = DONT putc(0x22, stdout); // Option = linemode putc(0xff, stdout); // IAC = Interpret as Command putc(0xfb, stdout); // Type of Operation = DO putc(0x01, stdout); // Option = echo #endif #if defined ( EZ_CONFIG_SCAN ) // Initialize WiFi Scan State Machine NV variables WFInitScan(); #endif // WF_PRESCAN: Pre-scan before starting up as SoftAP mode WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); WF_CASetChannelList(channelList, sizeof(channelList)); if (WFStartScan() == WF_SUCCESS) { SCAN_SET_DISPLAY(SCANCXT.scanState); SCANCXT.displayIdx = 0; } // Needed to trigger g_scan_done WFRetrieveScanResult(0, &bssDesc); #if defined(STACK_USE_ZEROCONF_LINK_LOCAL) // Initialize Zeroconf Link-Local state-machine, regardless of network type. ZeroconfLLInitialize(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) // Initialize DNS Host-Name from TCPIPConfig.h, regardless of network type. mDNSInitialize(MY_DEFAULT_HOST_NAME); mDNSServiceRegister( // (const char *) AppConfig.NetBIOSName, // base name of the service. Ensure uniformity with CheckHibernate(). (const char *) "DemoWebServer", // base name of the service. Ensure uniformity with CheckHibernate(). "_http._tcp.local", // type of the service 80, // TCP or UDP port, at which this service is available ((const BYTE *)"path=/index.htm"), // TXT info 1, // auto rename the service when if needed NULL, // no callback function NULL // no application context ); mDNSMulticastFilterRegister(); #endif #if defined(WF_CONSOLE) // Initialize the WiFi Console App WFConsoleInit(); #endif // Now that all items are initialized, begin the co-operative // multitasking loop. This infinite loop will continuously // execute all stack-related tasks, as well as your own // application's functions. Custom functions should be added // at the end of this loop. // Note that this is a "co-operative mult-tasking" mechanism // where every task performs its tasks (whether all in one shot // or part of it) and returns so that other tasks can do their // job. // If a task needs very long time to do its job, it must be broken // down into smaller pieces so that other tasks can have CPU time. #ifndef PERIOD #define PERIOD 3120 // set 3120 for get to timer interrupt every 20ms, 40MHz PBUS, div by 256 #endif OpenTimer3(T3_ON | T3_SOURCE_INT | T3_PS_1_256, PERIOD); while(1) { if (AppConfig.networkType == WF_SOFT_AP) { if (g_scan_done) { if (g_prescan_waiting) { SCANCXT.displayIdx = 0; while (IS_SCAN_STATE_DISPLAY(SCANCXT.scanState)) { WFDisplayScanMgr(); } #if defined(WF_CS_TRIS) WF_Connect(); #endif g_scan_done = 0; g_prescan_waiting = 0; } } } #if defined (EZ_CONFIG_STORE) // Hold SW0 for 4 seconds to reset to defaults. if (SW0_IO == 1u) { // Button is pressed button_state = 1; if (ButtonPushStart == 0) //Just pressed ButtonPushStart = TickGet(); else if(TickGet() - ButtonPushStart > 4*TICK_SECOND) RestoreWifiConfig(); } else { ButtonPushStart = 0; //Button release reset the clock } if (AppConfig.saveSecurityInfo) { // set true by WF_ProcessEvent after connecting to a new network // get the security info, and if required, push the PSK to EEPROM if ((AppConfig.SecurityMode == WF_SECURITY_WPA_WITH_PASS_PHRASE) || (AppConfig.SecurityMode == WF_SECURITY_WPA2_WITH_PASS_PHRASE) || (AppConfig.SecurityMode == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE)) { // only need to save when doing passphrase tWFCPElements profile; UINT8 connState; UINT8 connID; WF_CMGetConnectionState(&connState, &connID); WF_CPGetElements(connID, &profile); memcpy((char*)AppConfig.SecurityKey, (char*)profile.securityKey, 32); AppConfig.SecurityMode--; // the calc psk is exactly one below for each passphrase option AppConfig.SecurityKeyLength = 32; SaveAppConfig(&AppConfig); } AppConfig.saveSecurityInfo = FALSE; } #endif // EZ_CONFIG_STORE // Blink LED0 twice per sec when unconfigured, once per sec after config if((TickGet() - t >= TICK_SECOND/(4ul - (CFGCXT.isWifiDoneConfigure*3ul)))) { t = TickGet(); LED0_INV(); } // This task performs normal stack task including checking // for incoming packet, type of packet and calling // appropriate stack entity to process it. StackTask(); // This task invokes each of the core stack application tasks if (cloud_mode == 0) StackApplications(); // Enable WF_USE_POWER_SAVE_FUNCTIONS WiFiTask(); #if defined(STACK_USE_ZEROCONF_LINK_LOCAL) ZeroconfLLProcess(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSProcess(); #endif Exosite_Demo(); // Process application specific tasks here. // Any custom modules or processing you need to do should // go here. #if defined(WF_CONSOLE) WFConsoleProcess(); WFConsoleProcessEpilogue(); #endif // If the local IP address has changed (ex: due to DHCP lease change) // write the new IP address to the LCD display, UART, and Announce // service if(dwLastIP != AppConfig.MyIPAddr.Val) { dwLastIP = AppConfig.MyIPAddr.Val; DisplayIPValue(AppConfig.MyIPAddr); #if defined(STACK_USE_ANNOUNCE) AnnounceIP(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSFillHostRecord(); #endif } } }
/***************************************************************************** * 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); }