/********************************************************************* * Function: void FTPServer(void) * * PreCondition: FTPInit() must already be called. * * Input: None * * Output: Opened FTP connections are served. * * Side Effects: None * * Overview: * * Note: This function acts as a task (similar to one in * RTOS). This function performs its task in * co-operative manner. Main application must call * this function repeatdly to ensure all open * or new connections are served on time. ********************************************************************/ BOOL FTPServer(void) { BYTE v; TICK currentTick; if ( !TCPIsConnected(FTPSocket) ) { FTPStringLen = 0; FTPCommand = FTP_CMD_NONE; smFTP = SM_FTP_NOT_CONNECTED; FTPFlags.Val = 0; smFTPCommand = SM_FTP_CMD_IDLE; return TRUE; } if ( TCPIsGetReady(FTPSocket) ) { lastActivity = TickGet(); while( TCPGet(FTPSocket, &v ) ) { USARTPut(v); FTPString[FTPStringLen++] = v; if ( FTPStringLen == MAX_FTP_CMD_STRING_LEN ) FTPStringLen = 0; } TCPDiscard(FTPSocket); if ( v == '\n' ) { FTPString[FTPStringLen] = '\0'; FTPStringLen = 0; ParseFTPString(); FTPCommand = ParseFTPCommand(FTP_argv[0]); } } else if ( smFTP != SM_FTP_NOT_CONNECTED ) { currentTick = TickGet(); currentTick = TickGetDiff(currentTick, lastActivity); if ( currentTick >= FTP_TIMEOUT ) { lastActivity = TickGet(); FTPCommand = FTP_CMD_QUIT; smFTP = SM_FTP_CONNECTED; } } switch(smFTP) { case SM_FTP_NOT_CONNECTED: FTPResponse = FTP_RESP_BANNER; lastActivity = TickGet(); /* No break - Continue... */ case SM_FTP_RESPOND: SM_FTP_RESPOND_Label: if(!TCPIsPutReady(FTPSocket)) { return TRUE; } else { ROM char* pMsg; pMsg = FTPResponseString[FTPResponse]; while( (v = *pMsg++) ) { USARTPut(v); TCPPut(FTPSocket, v); } TCPFlush(FTPSocket); FTPResponse = FTP_RESP_NONE; smFTP = SM_FTP_CONNECTED; } // No break - this will speed up little bit case SM_FTP_CONNECTED: if ( FTPCommand != FTP_CMD_NONE ) { if ( ExecuteFTPCommand(FTPCommand) ) { if ( FTPResponse != FTP_RESP_NONE ) smFTP = SM_FTP_RESPOND; else if ( FTPCommand == FTP_CMD_QUIT ) smFTP = SM_FTP_NOT_CONNECTED; FTPCommand = FTP_CMD_NONE; smFTPCommand = SM_FTP_CMD_IDLE; } else if ( FTPResponse != FTP_RESP_NONE ) { smFTP = SM_FTP_RESPOND; goto SM_FTP_RESPOND_Label; } } break; } return TRUE; }
/********************************************************************* * Function: void FTPServer(void) * * PreCondition: FTPInit() must already be called. * * Input: None * * Output: Opened FTP connections are served. * * Side Effects: None * * Overview: * * Note: This function acts as a task (similar to one in * RTOS). This function performs its task in * co-operative manner. Main application must call * this function repeatdly to ensure all open * or new connections are served on time. ********************************************************************/ BOOL FTPServer(void) { BYTE v; DWORD currentTick; if ( !TCPIsConnected(FTPSocket) ) { FTPStringLen = 0; FTPCommand = FTP_CMD_NONE; smFTP = SM_FTP_NOT_CONNECTED; FTPFlags.Val = 0; smFTPCommand = SM_FTP_CMD_IDLE; if(FTPDataSocket != INVALID_SOCKET) { TCPDisconnect(FTPDataSocket); FTPDataSocket = INVALID_SOCKET; } return TRUE; } if ( TCPIsGetReady(FTPSocket) ) { lastActivity = TickGet(); while( TCPGet(FTPSocket, &v ) ) { FTPString[FTPStringLen++] = v; if ( FTPStringLen == MAX_FTP_CMD_STRING_LEN ) FTPStringLen = 0; } if ( v == '\n' ) { FTPString[FTPStringLen] = '\0'; FTPStringLen = 0; ParseFTPString(); FTPCommand = ParseFTPCommand(FTP_argv[0]); } } else if ( smFTP != SM_FTP_NOT_CONNECTED ) { currentTick = TickGet(); currentTick = currentTick - lastActivity; if ( currentTick >= FTP_TIMEOUT ) { lastActivity = TickGet(); FTPCommand = FTP_CMD_QUIT; smFTP = SM_FTP_CONNECTED; } } switch(smFTP) { case SM_FTP_NOT_CONNECTED: FTPResponse = FTP_RESP_BANNER; lastActivity = TickGet(); // No break - Continue... case SM_FTP_RESPOND: SM_FTP_RESPOND_Label: // Make sure there is enough TCP TX FIFO space to put our response if(TCPIsPutReady(FTPSocket) < strlenpgm(FTPResponseString[FTPResponse])) return TRUE; TCPPutROMString(FTPSocket, (ROM BYTE*)FTPResponseString[FTPResponse]); TCPFlush(FTPSocket); FTPResponse = FTP_RESP_NONE; smFTP = SM_FTP_CONNECTED; // No break - this will speed up little bit case SM_FTP_CONNECTED: if ( FTPCommand != FTP_CMD_NONE ) { if ( ExecuteFTPCommand(FTPCommand) ) { if ( FTPResponse != FTP_RESP_NONE ) smFTP = SM_FTP_RESPOND; else if ( FTPCommand == FTP_CMD_QUIT ) smFTP = SM_FTP_NOT_CONNECTED; FTPCommand = FTP_CMD_NONE; smFTPCommand = SM_FTP_CMD_IDLE; } else if ( FTPResponse != FTP_RESP_NONE ) { smFTP = SM_FTP_RESPOND; goto SM_FTP_RESPOND_Label; } } break; } return TRUE; }