void ExecuteMenuChoice(MENU_CMD choice) { char response[MAX_USER_RESPONSE_LEN]; IP_ADDR tempIPValue; IP_ADDR *destIPValue; serPutByte('\r'); serPutByte('\n'); serPutRomString(menuCommandPrompt[choice-'0'-1]); switch(choice) { case MENU_CMD_SERIAL_NUMBER: itoa(AppConfig.SerialNumber.Val, response); serPutString((BYTE*)response); serPutByte(')'); serPutByte(':'); serPutByte(' '); if ( USARTGetString(response, sizeof(response)) ) { AppConfig.SerialNumber.Val = atoi(response); AppConfig.MyMACAddr.v[4] = AppConfig.SerialNumber.v[1]; AppConfig.MyMACAddr.v[5] = AppConfig.SerialNumber.v[0]; } else goto HandleInvalidInput; break; case MENU_CMD_IP_ADDRESS: destIPValue = &AppConfig.MyIPAddr; goto ReadIPConfig; case MENU_CMD_GATEWAY_ADDRESS: destIPValue = &AppConfig.MyGateway; goto ReadIPConfig; case MENU_CMD_SUBNET_MASK: destIPValue = &AppConfig.MyMask; ReadIPConfig: DisplayIPValue(destIPValue, FALSE); serPutByte(')'); serPutByte(':'); serPutByte(' '); USARTGetString(response, sizeof(response)); if ( !StringToIPAddress(response, &tempIPValue) ) { HandleInvalidInput: serPutRomString(InvalidInputMsg); while( !serIsGetReady() ); serGetByte(); } else { destIPValue->Val = tempIPValue.Val; } break; case MENU_CMD_ENABLE_AUTO_CONFIG: AppConfig.Flags.bIsDHCPEnabled = TRUE; break; case MENU_CMD_DISABLE_AUTO_CONFIG: AppConfig.Flags.bIsDHCPEnabled = FALSE; break; case MENU_CMD_DOWNLOAD_MPFS: #if defined(MPFS_USE_EEPROM) DownloadMPFS(); #endif break; case MENU_CMD_QUIT: #if defined(MPFS_USE_EEPROM) appcfgSave(); #endif break; } }
void DoUARTConfig(void) { BYTE response[MAX_USER_RESPONSE_LEN]; IP_ADDR tempIPValue; IP_ADDR *destIPValue; WORD_VAL wvTemp; BOOL bQuit = FALSE; while(!bQuit) { // Display the menu putrsUART("\r\n\r\n\rMicrochip TCP/IP Config Application ("TCPIP_STACK_VERSION", " __DATE__ ")\r\n\r\n"); putrsUART("\t1: Change serial number:\t\t"); wvTemp.v[1] = AppConfig.MyMACAddr.v[4]; wvTemp.v[0] = AppConfig.MyMACAddr.v[5]; uitoa(wvTemp.Val, response); putsUART((char *)response); putrsUART("\r\n\t2: Change host name:\t\t\t"); putsUART((char *)AppConfig.NetBIOSName); putrsUART("\r\n\t3: Change static IP address:\t\t"); DisplayIPValue(AppConfig.MyIPAddr); putrsUART("\r\n\t4: Change static gateway address:\t"); DisplayIPValue(AppConfig.MyGateway); putrsUART("\r\n\t5: Change static subnet mask:\t\t"); DisplayIPValue(AppConfig.MyMask); putrsUART("\r\n\t6: Change static primary DNS server:\t"); DisplayIPValue(AppConfig.PrimaryDNSServer); putrsUART("\r\n\t7: Change static secondary DNS server:\t"); DisplayIPValue(AppConfig.SecondaryDNSServer); putrsUART("\r\n\t8: "); putrsUART((ROM char*)(AppConfig.Flags.bIsDHCPEnabled ? "Dis" : "En")); putrsUART("able DHCP & IP Gleaning:\t\tDHCP is currently "); putrsUART((ROM char*)(AppConfig.Flags.bIsDHCPEnabled ? "enabled" : "disabled")); putrsUART("\r\n\t9: Download MPFS image."); putrsUART("\r\n\t0: Save & Quit."); putrsUART("\r\nEnter a menu choice: "); // Wait for the user to press a key while(!DataRdyUART()); putrsUART((ROM char*)"\r\n"); // Execute the user selection switch(ReadUART()) { case '1': putrsUART("New setting: "); if(ReadStringUART(response, sizeof(response))) { wvTemp.Val = atoi((char*)response); AppConfig.MyMACAddr.v[4] = wvTemp.v[1]; AppConfig.MyMACAddr.v[5] = wvTemp.v[0]; } break; case '2': putrsUART("New setting: "); ReadStringUART(response, sizeof(response) > sizeof(AppConfig.NetBIOSName) ? sizeof(AppConfig.NetBIOSName) : sizeof(response)); if(response[0] != '\0') { memcpy(AppConfig.NetBIOSName, (void*)response, sizeof(AppConfig.NetBIOSName)); FormatNetBIOSName(AppConfig.NetBIOSName); } break; case '3': destIPValue = &AppConfig.MyIPAddr; goto ReadIPConfig; case '4': destIPValue = &AppConfig.MyGateway; goto ReadIPConfig; case '5': destIPValue = &AppConfig.MyMask; goto ReadIPConfig; case '6': destIPValue = &AppConfig.PrimaryDNSServer; goto ReadIPConfig; case '7': destIPValue = &AppConfig.SecondaryDNSServer; goto ReadIPConfig; ReadIPConfig: putrsUART("New setting: "); ReadStringUART(response, sizeof(response)); if(StringToIPAddress(response, &tempIPValue)) destIPValue->Val = tempIPValue.Val; else putrsUART("Invalid input.\r\n"); break; case '8': AppConfig.Flags.bIsDHCPEnabled = !AppConfig.Flags.bIsDHCPEnabled; break; case '9': #if (defined(MPFS_USE_EEPROM)|| defined(MPFS_USE_SPI_FLASH)) && defined(STACK_USE_MPFS2) DownloadMPFS(); #endif break; case '0': bQuit = TRUE; #if defined(EEPROM_CS_TRIS) || defined(SPIFLASH_CS_TRIS) SaveAppConfig(&AppConfig); putrsUART("Settings saved.\r\n"); #else putrsUART("External EEPROM/Flash not present -- settings will be lost at reset.\r\n"); #endif break; } } }
int main(void) #endif { static TICK t = 0; TICK nt = 0; //TICK is DWORD, thus 32 bits BYTE loopctr = 0; //ML Debugging WORD lloopctr = 14; //ML Debugging static DWORD dwLastIP = 0; // Initialize interrupts and application specific hardware InitializeBoard(); // Initialize and display message on the LCD LCDInit(); DelayMs(100); DisplayString (0,"Olimex"); //first arg is start position on 32 pos LCD // Initialize Timer0, and low priority interrupts, used as clock. TickInit(); // Initialize Stack and application related variables in AppConfig. InitAppConfig(); // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); // 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 multi-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) { // Blink LED0 (right most one) every second. nt = TickGetDiv256(); if((nt - t) >= (DWORD)(TICK_SECOND/1024ul)) { t = nt; LED0_IO ^= 1; ClrWdt(); //Clear the watchdog } // 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(); // Process application specific tasks here. // 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(__SDCC__) DisplayIPValue(dwLastIP); // must be a WORD: sdcc does not // pass aggregates #else DisplayIPValue(AppConfig.MyIPAddr); #endif } }//end of while(1) }//end of main()
/* * Main entry point. */ void main(void) { static TICK t = 0; BYTE c, i; WORD w; BYTE buf[10]; /* * Initialize any application specific hardware. */ InitializeBoard(); /* * Initialize all stack related components. * Following steps must be performed for all applications using * PICmicro TCP/IP Stack. */ TickInit(); /* * Initialize MPFS file system. */ MPFSInit(); //Intialize HTTP Execution unit htpexecInit(); //Initialze serial port serInit(); /* * Initialize Stack and application related NV variables. */ appcfgInit(); appcfgUSART(); //Configure the USART #ifdef SER_USE_INTERRUPT //Interrupt enabled serial ports have to be enabled serEnable(); #endif appcfgCpuIO(); // Configure the CPU's I/O port pins appcfgADC(); // Configure ADC unit appcfgPWM(); // Configure PWM unit //Clear Screen serPutRomString(AnsiEscClearScreen); /* * Wait a couple of seconds for user input. * - If something is detected, start config. * - If nothing detected, start main program. */ serPutRomString(PressKeyForConfig); for (i = 60; i > 0; --i) //Delay for 50mS x 60 = 3 sec { if ((i % 8) == 0) serPutByte('.'); if (serIsGetReady()) { SetConfig(); break; } DelayMs(50); } serPutByte('\r'); serPutByte('\n'); StackInit(); #if defined(STACK_USE_HTTP_SERVER) HTTPInit(); #endif #if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) FTPInit(); #endif #if defined(STACK_USE_DHCP) || defined(STACK_USE_IP_GLEANING) if (!AppConfig.Flags.bIsDHCPEnabled ) { /* * Force IP address display update. */ myDHCPBindCount = 1; #if defined(STACK_USE_DHCP) DHCPDisable(); #endif } #endif #if defined( STACK_USE_VSCP ) vscp2_udpinit(); // init VSCP subsystem #endif /* * Once all items are initialized, go into infinite loop and let * stack items execute their tasks. * If application needs to perform its own task, it should be * done at the end of while 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 broken * down into smaller pieces so that other tasks can have CPU time. */ while ( 1 ) { /* * Blink SYSTEM LED every second. */ if ( TickGetDiff( TickGet(), t ) >= TICK_SECOND/2 ) { t = TickGet(); LATB6 ^= 1; } //Perform routine tasks MACTask(); /* * This task performs normal stack task including checking * for incoming packet, type of packet and calling * appropriate stack entity to process it. */ StackTask(); #if defined(STACK_USE_HTTP_SERVER) /* * This is a TCP application. It listens to TCP port 80 * with one or more sockets and responds to remote requests. */ HTTPServer(); #endif #if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) FTPServer(); #endif /* * In future, as new TCP/IP applications are written, it * will be added here as new tasks. */ /* * Add your application speicifc tasks here. */ ProcessIO(); /* XEEBeginRead( EEPROM_CONTROL, 0x0530 ); while ( 1 ) { c = XEERead(); c = 1; } //c = XEERead(); XEEEndRead(); */ #if defined( STACK_USE_VSCP ) vscp2_Task(); #endif /* * For DHCP information, display how many times we have renewed the IP * configuration since last reset. */ if ( DHCPBindCount != myDHCPBindCount ) { DisplayIPValue(&AppConfig.MyIPAddr, TRUE); myDHCPBindCount = DHCPBindCount; } } }
// // Main application entry point. // int main(void) { #if defined(APP_USE_IPERF) static uint8_t iperfOk = 0; #endif static SYS_TICK startTick = 0; static IP_ADDR dwLastIP[sizeof (TCPIP_HOSTS_CONFIGURATION) / sizeof (*TCPIP_HOSTS_CONFIGURATION)]; uint8_t i; // perform system initialization if(!SYS_Initialize()) { return 0; } SYS_CONSOLE_MESSAGE("\r\n\n\n --- Unified TCPIP Demo Starts! --- \r\n"); SYS_OUT_MESSAGE("TCPStack " TCPIP_STACK_VERSION " "" "); #if defined(TCPIP_STACK_USE_MPFS) || defined(TCPIP_STACK_USE_MPFS2) MPFSInit(); #endif // Initiates board setup process if button is depressed // on startup if(BUTTON0_IO == 0u) { #if defined(TCPIP_STACK_USE_STORAGE) && (defined(SPIFLASH_CS_TRIS) || defined(EEPROM_CS_TRIS)) // Invalidate the EEPROM contents if BUTTON0 is held down for more than 4 seconds SYS_TICK StartTime = SYS_TICK_Get(); LED_PUT(0x00); while(BUTTON0_IO == 0u) { if(SYS_TICK_Get() - StartTime > 4*SYS_TICK_TicksPerSecondGet()) { TCPIP_STORAGE_HANDLE hStorage; // just in case we execute this before the stack is initialized TCPIP_STORAGE_Init(0); hStorage = TCPIP_STORAGE_Open(0, false); // no refresh actually needed if(hStorage) { TCPIP_STORAGE_Erase(hStorage); SYS_CONSOLE_MESSAGE("\r\n\r\nBUTTON0 held for more than 4 seconds. Default settings restored.\r\n\r\n"); TCPIP_STORAGE_Close(hStorage); } else { SYS_ERROR(SYS_ERROR_WARN, "\r\n\r\nCould not restore the default settings!!!.\r\n\r\n"); } TCPIP_STORAGE_DeInit(0); LED_PUT(0x0F); // wait 4.5 seconds here then reset while((SYS_TICK_Get() - StartTime) <= (9*SYS_TICK_TicksPerSecondGet()/2)); LED_PUT(0x00); while(BUTTON0_IO == 0u); SYS_Reboot(); break; } } #endif // defined(TCPIP_STACK_USE_STORAGE) && (defined(SPIFLASH_CS_TRIS) || defined(EEPROM_CS_TRIS)) } // Initialize the TCPIP stack if(!TCPIP_STACK_Init(TCPIP_HOSTS_CONFIGURATION, sizeof(TCPIP_HOSTS_CONFIGURATION)/sizeof(*TCPIP_HOSTS_CONFIGURATION), TCPIP_STACK_MODULE_CONFIG_TBL, sizeof(TCPIP_STACK_MODULE_CONFIG_TBL)/sizeof(*TCPIP_STACK_MODULE_CONFIG_TBL) )) { return 0; } #if defined(TCPIP_STACK_USE_TELNET_SERVER) TelnetRegisterCallback(ProcessIO); #endif // defined(TCPIP_STACK_USE_TELNET_SERVER) #if defined (TCPIP_STACK_USE_IPV6) TCPIP_ICMPV6_RegisterCallback (ICMPv6Callback); #endif #if defined(TCPIP_STACK_USE_ICMP_CLIENT) || defined(TCPIP_STACK_USE_ICMP_SERVER) ICMPRegisterCallback (PingProcessIPv4); #endif #if defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) TCPIP_NET_HANDLE hWiFi = TCPIP_STACK_NetHandle("MRF24W"); if(hWiFi) { TCPIP_STACK_SetNotifyEvents(hWiFi, TCPIP_EV_RX_ALL|TCPIP_EV_TX_ALL|TCPIP_EV_RXTX_ERRORS); TCPIP_STACK_SetNotifyHandler(hWiFi, StackNotification, 0); } #endif // defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) #if defined(APP_USE_IPERF) IperfConsoleInit(); iperfOk = IperfAppInit(TCPIP_HOSTS_CONFIGURATION[0].interface); #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) { // Blink LED0 (right most one) every second. if(SYS_TICK_Get() - startTick >= SYS_TICK_TicksPerSecondGet()/2ul) { startTick = SYS_TICK_Get(); 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. TCPIP_STACK_Task(); // 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(TCPIP_STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE) GenericTCPClient(); #endif #if defined(TCPIP_STACK_USE_GENERIC_TCP_SERVER_EXAMPLE) GenericTCPServer(); #endif #if defined(TCPIP_STACK_USE_SMTP_CLIENT) SMTPDemo(); #endif #if defined(TCPIP_STACK_USE_ICMP_CLIENT) || defined (TCPIP_STACK_USE_ICMP_SERVER) || defined (TCPIP_STACK_USE_IPV6) // use ping on the default interface PingDemoTask(); #endif #if defined(TCPIP_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(TCPIP_STACK_USE_BERKELEY_API) BerkeleyTCPClientDemo(); BerkeleyTCPServerDemo(); BerkeleyUDPClientDemo(0); #endif #if defined(APP_USE_IPERF) IperfConsoleProcess(); if (iperfOk) IperfAppCall(); // Only running in case of init succeed IperfConsoleProcessEpilogue(); #endif // If the local IP address has changed (ex: due to DHCP lease change) // write the new IP address to the console display, UART, and Announce // service // We use the default interface for (i = 0; i < sizeof(TCPIP_HOSTS_CONFIGURATION)/sizeof(*TCPIP_HOSTS_CONFIGURATION); i++) { TCPIP_NET_HANDLE netH = TCPIP_STACK_NetHandle(TCPIP_HOSTS_CONFIGURATION[i].interface); if((uint32_t)dwLastIP[i].Val != TCPIP_STACK_NetAddress(netH)) { dwLastIP[i].Val = TCPIP_STACK_NetAddress(netH); SYS_CONSOLE_MESSAGE(TCPIP_HOSTS_CONFIGURATION[i].interface); SYS_CONSOLE_MESSAGE(" new IP Address: "); DisplayIPValue(dwLastIP[i]); SYS_CONSOLE_MESSAGE("\r\n"); } } #if defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) if(stackNotifyCnt) { stackNotifyCnt = 0; ProcessNotification(stackNotifyHandle); } #endif // defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) } }
/***************************************************************************** FUNCTION TCPIPTask Main function to handle the TCPIP stack RETURNS None PARAMS None *****************************************************************************/ void TCPIPTask() { WFConnection = WF_CUSTOM; ConnectionProfileID = 0; static DWORD dwLastIP = 0; WFStatus = NOT_CONNECTED; dwLastIP = 0; // Function pointers for the callback function of the TCP/IP and WiFi stack #if defined (FLYPORT) FP[1] = cWFConnect; FP[2] = cWFDisconnect; FP[3] = cWFScan; FP[5] = cWFPsPollDisable; FP[6] = cWFPsPollEnable; FP[7] = cWFScanList; FP[10] = cWFStopConnecting; #endif #if defined (FLYPORTETH) FP[1] = cETHRestart; #endif FP[16] = cTCPRxFlush; FP[17] = cTCPpRead; FP[18] = cTCPRemote; FP[19] = cTCPServerDetach; FP[20] = cTCPGenericOpen; FP[21] = cTCPRead; FP[22] = cTCPWrite; FP[23] = cTCPGenericClose; FP[24] = cTCPisConn; FP[25] = cTCPRxLen; #if defined(STACK_USE_SMTP_CLIENT) FP[26] = cSMTPStart; FP[27] = cSMTPSetServer; FP[28] = cSMTPSetMsg; FP[29] = cSMTPSend; FP[30] = cSMTPBusy; FP[31] = cSMTPStop; FP[32] = cSMTPReport; #endif FP[ARP_RESOLVE] = cARPResolveMAC; #if MAX_UDP_SOCKETS_FREERTOS>0 FP[35] = cUDPGenericOpen; FP[36] = cUDPWrite; FP[37] = cUDPGenericClose; #endif // Initialize stack-related hardware components that may be // required by the UART configuration routines // Initialization of tick only at the startup of the device if (hFlyTask == NULL) { TickInit(); } #if defined(STACK_USE_MPFS) || defined(STACK_USE_MPFS2) 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(); if (hFlyTask == NULL) { NETConf[0] = AppConfig; NETConf[1] = AppConfig; } #if defined(WF_CS_TRIS) if (WFStatus == CONNECTION_LOST) WF_Connect(WFConnection); #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 *) "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 ); mDNSMulticastFilterRegister(); #endif // INITIALIZING UDP #if MAX_UDP_SOCKETS_FREERTOS>0 #if defined (STACK_USE_UART) UARTWrite(1, "Initializing UDP...\r\n"); #endif UDPInit(); activeUdpSocket=0; while (activeUdpSocket < MAX_UDP_SOCKETS_FREERTOS) { tmp_len[activeUdpSocket]=0; if (activeUdpSocket == 0) { BUFFER_UDP_LEN[0] = BUFFER1_UDP_LEN; udpBuffer[activeUdpSocket] = udpBuffer1; udpSocket[0] = INVALID_UDP_SOCKET; } #if MAX_UDP_SOCKETS_FREERTOS>1 if (activeUdpSocket == 1) { BUFFER_UDP_LEN[1] = BUFFER2_UDP_LEN; udpBuffer[activeUdpSocket] = udpBuffer2; udpSocket[1] = INVALID_UDP_SOCKET; } #endif #if MAX_UDP_SOCKETS_FREERTOS>2 if (activeUdpSocket == 2) { BUFFER_UDP_LEN[2] = BUFFER3_UDP_LEN; udpBuffer[activeUdpSocket] = udpBuffer3; udpSocket[2] = INVALID_UDP_SOCKET; } #endif #if MAX_UDP_SOCKETS_FREERTOS>3 if (activeUdpSocket == 3) { BUFFER_UDP_LEN[3] = BUFFER4_UDP_LEN; udpBuffer[activeUdpSocket] = udpBuffer4; udpSocket[3] = INVALID_UDP_SOCKET; } #endif p_udp_wifiram[activeUdpSocket] = udpBuffer[activeUdpSocket]; p_udp_data[activeUdpSocket] = udpBuffer[activeUdpSocket]; activeUdpSocket++; } #endif if (hFlyTask == NULL) { // Creates the task dedicated to user code xTaskCreate(FlyportTask,(signed char*) "FLY" , (configMINIMAL_STACK_SIZE * 4), NULL, tskIDLE_PRIORITY + 1, &hFlyTask); } //------------------------------------------------------------------------------------------- //| --- COOPERATIVE MULTITASKING LOOP --- | //------------------------------------------------------------------------------------------- while(1) { #if defined (FLYPORT) if (WFStatus != TURNED_OFF) { // Check to verify the connection. If it's lost or failed, the device tries to reconnect if ((WFStatus == CONNECTION_LOST) || (WFStatus == CONNECTION_FAILED)) WF_Connect(WFConnection); #else { #endif // This task performs normal stack task including checking // for incoming packet, type of packet and calling // appropriate stack entity to process it. vTaskSuspendAll(); StackTask(); xTaskResumeAll(); #if defined(STACK_USE_HTTP_SERVER) || defined(STACK_USE_HTTP2_SERVER) vTaskSuspendAll(); HTTPServer(); xTaskResumeAll(); #endif // 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 #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) //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 // Check on the queue to verify if other task have requested some stack function xStatus = xQueueReceive(xQueue,&Cmd,0); CmdCheck(); // 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) UARTWrite(1,"\r\nNew IP Address: "); #endif DisplayIPValue(AppConfig.MyIPAddr); #if defined(STACK_USE_UART) UARTWrite(1,"\r\n"); #endif #if defined(STACK_USE_ANNOUNCE) AnnounceIP(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSFillHostRecord(); #endif } } //end check turnoff } }
/* * Main entry point. */ void main(void) { static TICK t = 0; BYTE c, i; /* * Initialize any application specific hardware. */ InitializeBoard(); /* * Initialize all stack related components. * Following steps must be performed for all applications using * PICmicro TCP/IP Stack. */ TickInit(); /* * Following steps must be performed for all applications using * PICmicro TCP/IP Stack. */ MPFSInit(); /* * Initialize Stack and application related NV variables. */ InitAppConfig(); /* * Depending on whether internal program memor is used or external * EEPROM is used, keep/remove these block. */ /* * Wait a couple of seconds for user input. * - If something is detected, start config. * - If nothing detected, start main program. */ USARTPutROMString(PressKeyForConfig); for (i = 60; i > 0; --i) //Delay for 50mS x 60 = 3 sec { if ((i % 8) == 0) USARTPut('.'); if (USARTIsGetReady()) { #if defined(APP_USE_LCD) XLCDGoto(1, 0); XLCDPutROMString(SetupMsg); #endif SetConfig(); break; } DelayMs(50); } USARTPut('\r'); USARTPut('\n'); StackInit(); #if defined(STACK_USE_HTTP_SERVER) HTTPInit(); #endif #if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) FTPInit(); #endif #if defined(STACK_USE_DHCP) || defined(STACK_USE_IP_GLEANING) if ( AppConfig.Flags.bIsDHCPEnabled ) { #if defined(APP_USE_LCD) XLCDGoto(1, 0); XLCDPutROMString(DHCPMsg); #endif } else { /* * Force IP address display update. */ myDHCPBindCount = 1; #if defined(STACK_USE_DHCP) DHCPDisable(); #endif } #endif /* * Once all items are initialized, go into infinite loop and let * stack items execute their tasks. * If application needs to perform its own task, it should be * done at the end of while 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 broken * down into smaller pieces so that other tasks can have CPU time. */ while(1) { //Turn off the heater after about 1min to prevent over heating if(heater_started ==1) { if ( TickGetDiff(TickGet(), t) >= 9000 ) { LATB4 = 0; heater_started = 0; } }else { t = TickGet(); } /* * This task performs normal stack task including checking * for incoming packet, type of packet and calling * appropriate stack entity to process it. */ StackTask(); #if defined(STACK_USE_HTTP_SERVER) /* * This is a TCP application. It listens to TCP port 80 * with one or more sockets and responds to remote requests. */ HTTPServer(); #endif #if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM) FTPServer(); #endif /* * In future, as new TCP/IP applications are written, it * will be added here as new tasks. */ /* * Add your application speicifc tasks here. */ ProcessIO(); /* * For DHCP information, display how many times we have renewed the IP * configuration since last reset. */ if ( DHCPBindCount != myDHCPBindCount ) { DisplayIPValue(&AppConfig.MyIPAddr, TRUE); myDHCPBindCount = DHCPBindCount; #if defined(APP_USE_LCD) if ( AppConfig.Flags.bIsDHCPEnabled ) { XLCDGoto(1, 14); if ( myDHCPBindCount < 0x0a ) XLCDPut(myDHCPBindCount + '0'); else XLCDPut(myDHCPBindCount + 'A'); } #endif } } }
// // Main application entry point. // int main(void) { #if defined(HOST_CM_TEST) DWORD t1 = 0; char st[80]; BOOL host_scan = FALSE; UINT16 scan_count = 0; #endif static IPV4_ADDR dwLastIP[sizeof (TCPIP_HOSTS_CONFIGURATION) / sizeof (*TCPIP_HOSTS_CONFIGURATION)]; int i, nNets; #if defined(SYS_USERIO_ENABLE) static SYS_TICK startTick = 0; int32_t LEDstate=SYS_USERIO_LED_DEASSERTED; #endif // defined(SYS_USERIO_ENABLE) TCPIP_NET_HANDLE netH; const char *netName=0; const char *netBiosName; #if defined (TCPIP_STACK_USE_ZEROCONF_MDNS_SD) char mDNSServiceName[] = "MyWebServiceNameX "; // base name of the service Must not exceed 16 bytes long // the last digit will be incremented by interface #endif // defined (TCPIP_STACK_USE_ZEROCONF_MDNS_SD) // perform system initialization if(!SYS_Initialize()) { return 0; } SYS_CONSOLE_MESSAGE("\r\n\n\n --- TCPIP Demo Starts! --- \r\n"); SYS_OUT_MESSAGE("TCPIPStack " TCPIP_STACK_VERSION " "" "); // Initialize the TCPIP stack if (!TCPIP_STACK_Init(TCPIP_HOSTS_CONFIGURATION, sizeof (TCPIP_HOSTS_CONFIGURATION) / sizeof (*TCPIP_HOSTS_CONFIGURATION), TCPIP_STACK_MODULE_CONFIG_TBL, sizeof (TCPIP_STACK_MODULE_CONFIG_TBL) / sizeof (*TCPIP_STACK_MODULE_CONFIG_TBL))) { return 0; } // Display the names associated with each interface // Perform mDNS registration if mDNS is enabled nNets = TCPIP_STACK_NetworksNo(); for(i = 0; i < nNets; i++) { netH = TCPIP_STACK_IxToNet(i); netName = TCPIP_STACK_NetName(netH); netBiosName = TCPIP_STACK_NetBIOSName(netH); #if defined(TCPIP_STACK_USE_NBNS) SYS_CONSOLE_PRINT(" Interface %s on host %s - NBNS enabled\r\n", netName, netBiosName); #else SYS_CONSOLE_PRINT(" Interface %s on host %s - NBNS disabled\r\n", netName, netBiosName); #endif // defined(TCPIP_STACK_USE_NBNS) #if defined (TCPIP_STACK_USE_ZEROCONF_MDNS_SD) mDNSServiceName[sizeof(mDNSServiceName) - 2] = '1' + i; mDNSServiceRegister( netH , mDNSServiceName // 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 //TCPIP_STACK_USE_ZEROCONF_MDNS_SD } #if defined (TCPIP_STACK_USE_IPV6) TCPIP_ICMPV6_RegisterCallback(ICMPv6Callback); #endif #if defined(TCPIP_STACK_USE_ICMP_CLIENT) ICMPRegisterCallback(PingProcessIPv4); #endif #if defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) TCPIP_NET_HANDLE hWiFi = TCPIP_STACK_NetHandle("MRF24W"); if (hWiFi) { TCPIP_STACK_RegisterHandler(hWiFi, TCPIP_EV_RX_ALL | TCPIP_EV_TX_ALL | TCPIP_EV_RXTX_ERRORS, StackNotification, 0); } #endif // defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) #if defined(WF_UPDATE_FIRMWARE_UART_24G) extern bool WF_FirmwareUpdate_Uart_24G(void); WF_FirmwareUpdate_Uart_24G(); #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) { SYS_Tasks(); #if defined(SYS_USERIO_ENABLE) // Blink LED0 (right most one) every second. if (SYS_TICK_Get() - startTick >= SYS_TICK_TicksPerSecondGet() / 2ul) { startTick = SYS_TICK_Get(); LEDstate ^= SYS_USERIO_LED_ASSERTED; SYS_USERIO_SetLED(SYS_USERIO_LED_0, LEDstate); } #endif // defined(SYS_USERIO_ENABLE) // This task performs normal stack task including checking // for incoming packet, type of packet and calling // appropriate stack entity to process it. TCPIP_STACK_Task(); // 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(TCPIP_STACK_USE_TCP) && defined(APP_USE_FTP_CLIENT_DEMO) FTPClient(); #endif #if defined(TCPIP_STACK_USE_TCP) && defined(APP_USE_GENERIC_TCP_CLIENT_DEMO) GenericTCPClient(); #endif #if defined(TCPIP_STACK_USE_TCP) && defined(APP_USE_GENERIC_TCP_SERVER_DEMO) GenericTCPServer(); #endif #if defined(TCPIP_STACK_USE_SMTP_CLIENT) && defined(APP_USE_SMTP_CLIENT_DEMO) SMTPDemo(); #endif #if (defined(TCPIP_STACK_USE_ICMP_CLIENT) || defined (TCPIP_STACK_USE_IPV6)) && defined(APP_USE_PING_DEMO) // use ping on the default interface PingDemoTask(); #endif #if defined(TCPIP_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(); //This function sends the both SNMP trap version1 and 2 type of notifications #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(); //This function sends the SNMP trap version 2 type of notifications #endif /* SNMPSendTrap() is used to send trap notification to previously configured ip address if trap notification is enabled. There are different trap notification code. The current implementation sends trap for authentication failure (4). PreCondition: If application defined event occurs to send the trap. Declare a notification flag and update as the event occurs. Uncomment the below function if the application requires. if(notification flag is updated by the application as a predefined event occured) { SNMPSendTrap(); } */ #endif #if defined(TCPIP_STACK_USE_BERKELEY_API) && defined(APP_USE_BERKELEY_API_DEMO) BerkeleyTCPClientDemo(); BerkeleyTCPServerDemo(); BerkeleyUDPClientDemo(0); #endif // If the local IP address has changed (ex: due to DHCP lease change) // write the new IP address to the console display, UART, and Announce // service // We use the default interface for (i = 0; i < sizeof (TCPIP_HOSTS_CONFIGURATION) / sizeof (*TCPIP_HOSTS_CONFIGURATION); i++) { netH = TCPIP_STACK_NetHandle(TCPIP_HOSTS_CONFIGURATION[i].interface); if ((uint32_t) dwLastIP[i].Val != TCPIP_STACK_NetAddress(netH)) { dwLastIP[i].Val = TCPIP_STACK_NetAddress(netH); SYS_CONSOLE_PRINT("Interface Name is: %s\r\n", TCPIP_HOSTS_CONFIGURATION[i].interface); SYS_CONSOLE_MESSAGE("New IP Address is: "); DisplayIPValue(dwLastIP[i]); SYS_CONSOLE_MESSAGE("\r\n"); } } #if defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) if (stackNotifyCnt) { stackNotifyCnt = 0; ProcessNotification(stackNotifyHandle); } #endif // defined(TCPIP_STACK_USE_EVENT_NOTIFICATION) #if defined(WF_UPDATE_FIRMWARE_TCPCLIENT_24G) void WF_FirmwareUpdate_TcpClient_24G(void); WF_FirmwareUpdate_TcpClient_24G(); #endif //defined(WF_UPDATE_FIRMWARE_TCPCLIENT_24G) #if defined(HOST_CM_TEST) switch (g_event) { case WF_EVENT_CONNECTION_PERMANENTLY_LOST: case WF_EVENT_CONNECTION_FAILED: g_event = 0xff; // clear current event // if host scan is active, it can be forced inactive by connection/re-connection process // so just reset host scan state to inactive. host_scan = FALSE; // host scan inactive SYS_CONSOLE_MESSAGE("Reconnecting....\r\n"); WF_Connect(); break; case WF_EVENT_CONNECTION_SUCCESSFUL: g_event = 0xff; // clear current event // if host scan is active, it can be forced inactive by connection/re-connection process // so just reset host scan state to inactive. host_scan = FALSE; // host scan inactive break; case WF_EVENT_SCAN_RESULTS_READY: g_event = 0xff; // clear current event host_scan = FALSE; // host scan inactive // Scan results are valid - OK to retrieve if (SCANCXT.numScanResults > 0) { SCAN_SET_DISPLAY(SCANCXT.scanState); SCANCXT.displayIdx = 0; while (IS_SCAN_STATE_DISPLAY(SCANCXT.scanState)) WFDisplayScanMgr(); } break; case WF_EVENT_CONNECTION_TEMPORARILY_LOST: // This event can happened when CM in module is enabled. g_event = 0xff; // clear current event // if host scan is active, it can be forced inactive by connection/re-connection process // so just reset host scan state to inactive. host_scan = FALSE; // host scan inactive break; default: //sprintf(st,"skip event = %d\r\n",g_event); //SYS_CONSOLE_MESSAGE(st); break; } if (g_DhcpSuccessful) { /* Send and Receive UDP packets */ if(UDPIsOpened(socket1)) { // UDP TX every 10 msec if(SYS_TICK_Get() - timeudp >= SYS_TICK_TicksPerSecondGet() / 100) { timeudp = SYS_TICK_Get(); tx_number++; LED0_IO ^= 1; sprintf(str,"rem=%12lu",tx_number); for(cntstr=16;cntstr<999;cntstr++) str[cntstr]=cntstr; str[999]=0; // Send tx_number (formatted in a string) if(UDPIsTxPutReady(socket1,1000)!=0) { UDPPutString(socket1,(BYTE *)str); UDPFlush(socket1); SYS_CONSOLE_MESSAGE("."); } } // UDP RX tx_number of remote board if(UDPIsGetReady(socket1)!=0) { LED1_IO ^= 1; UDPGetArray(socket1,(BYTE *)str,1000); str[16]=0; //sprintf((char*)LCDText,"%sloc=%12lu",str,tx_number); // Write on EXP16 LCD local and remote TX number //strcpypgm2ram(LCDText,str); //LCDUpdate(); SYS_CONSOLE_MESSAGE("Rx"); } } // Do host scan if((SYS_TICK_Get() - t1) >= SYS_TICK_TicksPerSecondGet() * 20) { t1 = SYS_TICK_Get(); if (!host_scan) // allow host scan if currently inactive { sprintf(st,"%d Scanning ..... event = %d\r\n",++scan_count, g_event); SYS_CONSOLE_MESSAGE(st); host_scan = TRUE; // host scan active WF_Scan(0xff); // scan on all channels } } } // DHCP status #endif //HOST_CM_TEST } }
int main(void) #endif { static DWORD t = 0; static DWORD dwLastIP = 0; // Initialize application specific hardware InitializeBoard(); #if defined(USE_LCD) // Initialize and display the stack version on the LCD LCDInit(); DelayMs(100); strcpypgm2ram((char*)LCDText, "WebVend Demo App" " "); 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 } // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); #if defined(WF_CS_TRIS) WF_Connect(); #endif // 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 *) "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 ); mDNSMulticastFilterRegister(); #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) { // Blink LED0 (right most one) every second. if(TickGet() - t >= TICK_SECOND/2ul) { 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. ProcessIO(); // 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 // If not vending, show the new IP if(smVend == SM_IDLE || smVend == SM_DISPLAY_WAIT) { memcpypgm2ram(LCDText, "WebVend Demo App", 16); DisplayIPValue(AppConfig.MyIPAddr); // Print to UART #if defined(STACK_USE_UART) putrsUART((ROM char*)"\r\n"); #endif displayTimeout = TickGet() + 2*TICK_SECOND; smVend = SM_DISPLAY_WAIT; } #if defined(STACK_USE_ANNOUNCE) AnnounceIP(); #endif #if defined(STACK_USE_ZEROCONF_MDNS_SD) mDNSFillHostRecord(); #endif } } }
int main(void) #endif { // static DWORD t = 0; static DWORD dwLastIP = 0; #if defined (EZ_CONFIG_STORE) // static DWORD ButtonPushStart = 0; #endif // Initialize application specific hardware InitializeBoard(); // Initialize stack-related hardware components that may be // required by the UART configuration routines TickInit(); MPFSInit(); InitDataBuffers(); Slave_SpiInit(); // Initialize Stack and application related NV variables into AppConfig. InitAppConfig(); // Initiates board setup process if button is depressed // on startup /* #if defined (WIFI_BOARD_FOC_HUB) XEEBeginWrite(0x0000); XEEWrite(0xFF); XEEWrite(0xFF); XEEEndWrite(); #else 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 } #endif */ // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); #if defined ( EZ_CONFIG_SCAN ) WFInitScan(); #endif #if defined(WF_CS_TRIS) WF_Connect(); #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 *) "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 ); mDNSMulticastFilterRegister(); #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 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(); // Process command received from Motherboad via SPI interface. //ProcessReceivedSpiCmds(); #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 (WIFI_BOARD_FOC_HUB) ProcessWiFiTransfers(); // Handles TCP/IP transfers DoWiFiWork(); // Handles SPI incoming requests #endif #if defined(WF_CONSOLE) WFConsoleProcess(); IperfAppCall(); 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_SMTP_CLIENT) SMTPDemo(); #endif #if defined(STACK_USE_ICMP_CLIENT) PingDemo(); #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 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; WiFiInfo.CurrentConfigPtr->MyIPAddr.Val = 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 } } }
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 } } }
void NIST_DAYTIME_Client(void) { WORD w; char NistRspBuffer[31]; BCD_RTCC rtc_time; static DWORD NistIP_addr =0; static DWORD Timer; static TCP_SOCKET sock = INVALID_SOCKET; switch (ThisState) { case SM_START: if (NistIP_addr == 0) // initialize the IP address for the time server to call NistIP_addr = WX.TimeServer.NIST1.Val; else if (NistIP_addr == WX.TimeServer.NIST1.Val) // toggle server address every time we try to call NistIP_addr = WX.TimeServer.NIST2.Val; else NistIP_addr = WX.TimeServer.NIST1.Val; // Connect a socket to the remote TCP server //sock = TCPOpen((DWORD) NIST_TIME_URL, TCP_OPEN_ROM_HOST, NIST_DAYTIME_PORT, TCP_PURPOSE_DEFAULT); // or with IP address ( faster, and uses less space in eeprom) // sock = TCPOpen((DWORD) "128.138.140.44", TCP_OPEN_ROM_HOST, NIST_DAYTIME_PORT, TCP_PURPOSE_DEFAULT); sock = TCPOpen( NistIP_addr, TCP_OPEN_IP_ADDRESS, NIST_DAYTIME_PORT, TCP_PURPOSE_DEFAULT); // Abort operation if no socket of proper type is available // If this ever happens, you need to go add one to TCPIPConfig.h if (sock == INVALID_SOCKET) { putrsUART((ROM char*) "NIST ERROR: no Socket of proper type defined in .h file\r\n"); ThisState = SM_IDLE; break; } ThisState++; Timer = TickGet(); putrsUART((ROM char*) "NIST waiting for socket connect on "); DisplayIPValue((IP_ADDR) NistIP_addr); putsUART(" Port 13\r\n"); break; case SM_SOCKET_OBTAINED: // Wait for the remote server to accept our connection request if (!TCPIsConnected(sock)) { // Time out if too much time is spent in this state if (TickGet() - Timer > NIST_TIMEOUT * TICK_SECOND) { putrsUART((ROM char*) "NIST connection timed out,aborting\r\n"); // Close the socket so it can be used by other modules ThisState = SM_DISCONNECT; } break; } Timer = TickGet(); ThisState++; break; case SM_PROCESS_RESPONSE: // collect the time data output from the sever and/or react to a Disconnect from the server // The Server automatically disconnects from the client after it outputs the data w = sizeof (NistRspBuffer) - 1; if (TCPIsGetReady(sock) >= w) { NistRspBuffer[28] = 0xff; w = TCPGetArray(sock, (unsigned char *)NistRspBuffer, w); if (NistRspBuffer[28] - '0' < 2) // The time servers health status { putrsUART((ROM char*) "NIST got good time\r\n"); //extracting the time from the response and setting the RTC clock rtc_time.yr = ((NistRspBuffer[7] - '0') << 4) + (NistRspBuffer[8] - '0'); rtc_time.mth = ((NistRspBuffer[10] - '0') << 4) + (NistRspBuffer[11] - '0'); rtc_time.day = ((NistRspBuffer[13] - '0') << 4) + (NistRspBuffer[14] - '0'); rtc_time.hr = ((NistRspBuffer[16] - '0') << 4) + (NistRspBuffer[17] - '0'); rtc_time.min = ((NistRspBuffer[19] - '0') << 4) + (NistRspBuffer[20] - '0'); rtc_time.sec = ((NistRspBuffer[22] - '0') << 4) + (NistRspBuffer[23] - '0'); // TT field ==0 indicates Standard time in efect, NOTE sotred in decimal format rtc_time.TT = ((NistRspBuffer[25] - '0') *10) + (NistRspBuffer[26] - '0'); RTC_Set_BCD_time(&rtc_time); // SET THE RTC with the current time NistGotGoodTime = TRUE; // set flag that we got good time } else putrsUART((ROM char*) "NIST server has healt issues\r\n"); ThisState = SM_DISCONNECT; } else { // wait to get data and abort if it takes too long if (TickGet() - Timer > NIST_TIMEOUT * TICK_SECOND) { putrsUART((ROM char*) "Nist data timeout, aborting\r\n"); ThisState = SM_DISCONNECT; break; } } if (!TCPIsConnected(sock)) { // If the Server disconnects before we do putrsUART((ROM char*) "NIST Server disconnected\r\n"); ThisState = SM_DISCONNECT; } break; case SM_DISCONNECT: // Close the socket so it can be used by other modules putrsUART((ROM char*) "NIST Client disconnected\r\n"); TCPDisconnect(sock); // This sends a "RST" TCPDisconnect(sock); // This sends a "FIN" sock = INVALID_SOCKET; if (NistGotGoodTime ) { ThisState = SM_IDLE; } else ThisState = SM_RETRY; break; case SM_RETRY: Timer = TickGet(); ThisState++; break; case SM_RETRY_DELAY: if (TickGet() - Timer > NIST_TIMEOUT * TICK_SECOND) ThisState = SM_START; break; case SM_IDLE: default: break; } }
int main(void) #endif { static DWORD t = 0; static DWORD dwLastIP = 0; #if defined(WF_USE_POWER_SAVE_FUNCTIONS) BOOL PsPollEnabled; BOOL psConfDone = FALSE; #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(WF_CS_TRIS) WF_Connect(); #endif // 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 *) "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 ); mDNSMulticastFilterRegister(); #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) { //while (1) /*{ if(BUTTON0_IO == 0u && LED0_IO == 0) { LED0_IO =1; } if(BUTTON0_IO == 0u && LED0_IO ==1) { LED0_IO =0; } }*/ #if defined(WF_USE_POWER_SAVE_FUNCTIONS) if (!psConfDone && WFisConnected()) { 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); } psConfDone = TRUE; } #endif // Blink LED0 (right most one) every second. // if(TickGet() - t >= TICK_SECOND/2ul) // { // 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(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(); #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 ProcessIO(); // 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 } } }
int main(void) #endif { unsigned char counter = 0; static DWORD Ping_Start_Time = 0; static unsigned char Ping_Counter = 0; static DWORD t = 0; static DWORD dwLastIP = 0; LED0_TRIS = 0; LED0_IO = 1; Delay10KTCYx(0); // Initialize application specific hardware InitializeBoard(); #ifdef APP_USE_USB InitializeUSB(); #if defined(USB_INTERRUPT) USBDeviceAttach(); #endif #endif #if defined(USE_LCD) // Initialize and display the stack version on the LCD LCDInit(); DelayMs(100); strcpypgm2ram((char*)LCDText, "TCPStack " VERSION " " " "); LCDUpdate(); #endif // Initialize stack-related hardware components that may be // required by the UART configuration routines TickInit(); #if defined(STACK_USE_MPFS) || 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); #ifdef TRANSCEIVER_BOARD #elif defined( SINGLEPHASEMETER_MCU1 ) while(BUTTON0_IO == 0u) { if(TickGet() - StartTime > 4*TICK_SECOND) { #if defined(EEPROM_CS_TRIS) XEEBeginWrite(0x0000); XEEWrite(0xFF); XEEEndWrite(); #elif defined(SPIFLASH_CS_TRIS) SPIFlashBeginWrite(0x0000); 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; } } #else #error "No board defined." #endif #endif #if defined(STACK_USE_UART) DoUARTConfig(); #endif } // Initialize core stack layers (MAC, ARP, TCP, UDP) and // application modules (HTTP, SNMP, etc.) StackInit(); // 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 #ifdef SINGLEPHASEMETER_MCU1 MCUOpen(); #endif #ifdef APP_USE_ZIGBEE ZigbeeOpen(); #else //#error no zigbee. #endif #ifdef APP_USE_RGB OpenRGB(); #endif // ROUTER CODES #ifdef APP_USE_ROUTER_CODES { } #endif // END // 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) { #ifdef SINGLEPHASEMETER_MCU1 MCUTasks(); #endif #ifdef APP_USE_RGB RGBTasks(); #endif /**********************************************/ /**** Handle USB ******************************/ /**********************************************/ #if defined(USB_POLLING) // Check bus status and service USB interrupts. USBDeviceTasks(); // Interrupt or polling method. If using polling, must call // this function periodically. This function will take care // of processing and responding to SETUP transactions // (such as during the enumeration process when you first // plug in). USB hosts require that USB devices should accept // and process SETUP packets in a timely fashion. Therefore, // when using polling, this function should be called // frequently (such as once about every 100 microseconds) at any // time that a SETUP packet might reasonably be expected to // be sent by the host to your device. In most cases, the // USBDeviceTasks() function does not take very long to // execute (~50 instruction cycles) before it returns. #endif // Application-specific tasks. // Application related code may be added here, or in the ProcessIO() function. ProcessUSBIO(); /**********************************************/ /**** Handle Zigbee ******************************/ /**********************************************/ #ifdef APP_USE_ZIGBEE ZigbeeTasks(); { if( counter++ > 200 ) { char s[16] = {0x10, 0x01, 0, 0, 0, 0, 0, 0, 0xff, 0xfe, 0xff, 0xfe, 0, 0, 'A', '4'}; // , 0x64}; ZigbeeAPISendString(16, s); counter = 0; } } #endif // Main program loop. // Set up ping and node statuses. A ping is sent every 4 mins and a check is done every minute. // Nodes that have not pinged within 5 min frame will be delisted as in the network. if( Ping_Start_Time != 0 && (TickGet() - Ping_Start_Time) > (TICK_MINUTE) ) { // Check nodes that have not sent their ping within the past 5 minutes. {} // Send out a ping if 4 minutes have lapsed. if( Ping_Counter++ >= 4 ) {} } Ping_Start_Time = TickGet(); // Blink LED0 (right most one) every second. if(TickGet() - t >= TICK_SECOND/2ul) { 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(); // 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(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(); #endif #if defined(STACK_USE_SNMP_SERVER) && !defined(SNMP_TRAP_DISABLED) SNMPTrapDemo(); if(gSendTrapFlag) SNMPSendTrap(); #endif #if defined(STACK_USE_BERKELEY_API) BerkeleyTCPClientDemo(); BerkeleyTCPServerDemo(); BerkeleyUDPClientDemo(); #endif #ifdef APP_USE_RGB RGBTasks(); #endif //ProcessIO(); // 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 } } }