mirror of
				https://github.com/Show-maket/EthernetMaket.git
				synced 2025-10-29 18:02:46 +00:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			71176f9274
			...
			vanilla-se
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 231b43d8bd | |||
| a4d01ea360 | |||
| a9f75262a5 | |||
| a78990110d | 
| @ -9,7 +9,7 @@ void EthernetMaketServer::setServerHandler(std::function<void(EthernetMaketClien | |||||||
|  |  | ||||||
| void EthernetMaketServer::resetServerHandler() | void EthernetMaketServer::resetServerHandler() | ||||||
| { | { | ||||||
|     serverHandler = [](EthernetMaketClient &sclient) {}; |     serverHandler = [](EthernetMaketClient sclient) {}; | ||||||
| } | } | ||||||
|  |  | ||||||
| // EthernetMaketClient EthernetMaketServer::available(int sock) | // EthernetMaketClient EthernetMaketServer::available(int sock) | ||||||
| @ -90,21 +90,21 @@ void EthernetMaketServer::tick() | |||||||
|         size_t dataSize; |         size_t dataSize; | ||||||
|         if (sclient.connected() && (dataSize = sclient.available()) > 0) |         if (sclient.connected() && (dataSize = sclient.available()) > 0) | ||||||
|         { |         { | ||||||
|             Serial.println("Receive!"); |             // Serial.println("Receive!"); | ||||||
|  |  | ||||||
|             memset(buf,0x00,sizeof(buf)); |             // memset(buf,0x00,sizeof(buf)); | ||||||
|             sclient.read(buf, sizeof(buf)); |             // sclient.read(buf, sizeof(buf)); | ||||||
|  |  | ||||||
|             Serial.print("Received data: "); |             // Serial.print("Received data: "); | ||||||
|             for (int i = 0; i < dataSize; i++) |             // for (int i = 0; i < dataSize; i++) | ||||||
|             { |             // { | ||||||
|                 Serial.print(buf[i], HEX); |             //     Serial.print(buf[i], HEX); | ||||||
|                 Serial.print(" "); |             //     Serial.print(" "); | ||||||
|             } |             // } | ||||||
|             Serial.println("\n"); |             // Serial.println("\n"); | ||||||
|  |  | ||||||
|             // sclient.activityUpdate(); |             // sclient.activityUpdate(); | ||||||
|             //* serverHandler(sclient); |             serverHandler(EthernetMaketClient(sclient)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -10,11 +10,11 @@ class EthernetMaketServer : public EthernetServer | |||||||
| private: | private: | ||||||
|     // EthernetClient available(); |     // EthernetClient available(); | ||||||
|     // void accept(int sock); |     // void accept(int sock); | ||||||
|     std::function<void(EthernetMaketClient&)> serverHandler = [](EthernetMaketClient &sclient) {}; |     std::function<void(EthernetMaketClient)> serverHandler = [](EthernetMaketClient sclient) {}; | ||||||
|     SOCKET serverSocket = MAX_SOCK_NUM; |     SOCKET serverSocket = MAX_SOCK_NUM; | ||||||
|  |  | ||||||
|     bool wasConnected; |     bool wasConnected; | ||||||
|     EthernetMaketClient sclient; |     // EthernetMaketClient sclient; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|     using EthernetServer::EthernetServer; |     using EthernetServer::EthernetServer; | ||||||
|  | |||||||
| @ -108,53 +108,96 @@ void EthernetMaketClient::close(){ | |||||||
| } | } | ||||||
|  |  | ||||||
| void EthernetMaketClient::tick_(){ | void EthernetMaketClient::tick_(){ | ||||||
|  |     // todo Переделать на нативные статусы. Избавиться от костылей | ||||||
|     if(_sock != MAX_SOCK_NUM && connectStatus!=CONNECT_CONNECTED && connectStatus!=CONNECT_STOP_WAITING&&connectStatus!=CONNECT_CONNECTING){ |     if(_sock != MAX_SOCK_NUM && connectStatus!=CONNECT_CONNECTED && connectStatus!=CONNECT_STOP_WAITING&&connectStatus!=CONNECT_CONNECTING){ | ||||||
|         Serial.print("tick_() sock = "); Serial.println(_sock);  |         Serial.print("tick_() sock = "); Serial.print(_sock);  | ||||||
|  |  | ||||||
|  |         uint8_t s = w5500.readSnSR(_sock); | ||||||
|  |         String state = ""; | ||||||
|  |         switch (s) { | ||||||
|  |                 //! костыли ^~^ | ||||||
|  |                 case SnSR::CLOSED      : state = "CLOSED"; connectStatus = CONNECT_STOP_WAITING;    break; | ||||||
|  |                 case SnSR::INIT        : state = "INIT";                                            break; | ||||||
|  |                 case SnSR::LISTEN      : state = "LISTEN";                                          break; | ||||||
|  |                 case SnSR::SYNSENT     : state = "SYNSENT";                                         break; | ||||||
|  |                 case SnSR::SYNRECV     : state = "SYNRECV";                                         break; | ||||||
|  |                 case SnSR::ESTABLISHED : state = "ESTABLISHED"; connectStatus = CONNECT_CONNECTED;  break; | ||||||
|  |                 case SnSR::FIN_WAIT    : state = "FIN_WAIT";    /* goto STOP_START_LABEL; */              break; | ||||||
|  |                 case SnSR::CLOSING     : state = "CLOSING";                                         break; | ||||||
|  |                 case SnSR::TIME_WAIT   : state = "TIME_WAIT";                                       break; | ||||||
|  |                 case SnSR::CLOSE_WAIT  : state = "CLOSE_WAIT"; connectStatus = CONNECT_STOP_START;  break; | ||||||
|  |                 case SnSR::LAST_ACK    : state = "LAST_ACK";                                        break; | ||||||
|  |                 case SnSR::UDP         : state = "UDP";                                             break; | ||||||
|  |                 case SnSR::IPRAW       : state = "IPRAW";                                           break; | ||||||
|  |                 case SnSR::MACRAW      : state = "MACRAW";                                          break; | ||||||
|  |                 case SnSR::PPPOE       : state = "PPPOE";                                           break; | ||||||
|  |                 default                : state = "UNKNOWN";                                         break; | ||||||
|  |         } | ||||||
|  |         String connectStatusStr = ""; | ||||||
|  |         switch (connectStatus) { | ||||||
|  |                 case CONNECT_FAIL: connectStatusStr = "CONNECT_FAIL";  break; | ||||||
|  |                 case CONNECT_SUCCESS: connectStatusStr = "CONNECT_SUCCESS"; break; | ||||||
|  |                 case CONNECT_CONNECTING: connectStatusStr = "CONNECT_CONNECTING"; break; | ||||||
|  |                 case CONNECT_START: connectStatusStr = "CONNECT_START"; break; | ||||||
|  |                 case CONNECT_IDLE: connectStatusStr = "CONNECT_IDLE"; break; | ||||||
|  |                 case CONNECT_CONNECTED: connectStatusStr = "CONNECT_CONNECTED"; break; | ||||||
|  |                 case CONNECT_STOP_START: connectStatusStr = "CONNECT_STOP_START"; break; | ||||||
|  |                 case CONNECT_STOP_WAITING: connectStatusStr = "CONNECT_STOP_WAITING"; break; | ||||||
|  |                 default: connectStatusStr = "UNKNOWN"; break; | ||||||
|  |         } | ||||||
|  |         Serial.print(" state = ");   | ||||||
|  |         Serial.print(state); | ||||||
|  |         Serial.print(" connectStatus = ");   | ||||||
|  |         Serial.print(connectStatusStr);   | ||||||
|  |         Serial.println(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| //todo [] Пересмотреть стейт машину перевести на нативные статусы | //todo [] Пересмотреть стейт машину перевести на нативные статусы | ||||||
|  |     SWITCHLOOP: | ||||||
|     switch (connectStatus) |     switch (connectStatus) | ||||||
|     { |     { | ||||||
|     case CONNECT_START: |     case CONNECT_START: | ||||||
|         Serial.println("CONNECT_START"); |  | ||||||
|         startConnectionTime = millis(); |  | ||||||
|         connectStatus = CONNECT_CONNECTING; |  | ||||||
|         close(); |  | ||||||
|         Serial.println("CONNECT_CONNECTING..."); |  | ||||||
|         { |         { | ||||||
|         for (int i = 0; i < MAX_SOCK_NUM; i++) { |             Serial.println("CONNECT_START"); | ||||||
|             uint8_t s = w5500.readSnSR(i); |             startConnectionTime = millis(); | ||||||
|             String state = ""; |             connectStatus = CONNECT_CONNECTING; | ||||||
|             switch (s) { |             close(); | ||||||
|                 case 0x00: state = "CLOSED"; break; |             Serial.println("CONNECT_CONNECTING..."); | ||||||
|                 case 0x13: state = "INIT"; break; |             for (int i = 0; i < MAX_SOCK_NUM; i++) { | ||||||
|                 case 0x14: state = "LISTEN"; break; |                 uint8_t s = w5500.readSnSR(i); | ||||||
|                 case 0x15: state = "SYNSENT"; break; |                 String state = ""; | ||||||
|                 case 0x16: state = "SYNRECV"; break; |                 switch (s) { | ||||||
|                 case 0x17: state = "ESTABLISHED"; break; |                     case SnSR::CLOSED      : state = "CLOSED"; break; | ||||||
|                 case 0x18: state = "FIN_WAIT"; break; |                     case SnSR::INIT        : state = "INIT"; break; | ||||||
|                 case 0x1A: state = "CLOSING"; break; |                     case SnSR::LISTEN      : state = "LISTEN"; break; | ||||||
|                 case 0x1B: state = "TIME_WAIT"; break; |                     case SnSR::SYNSENT     : state = "SYNSENT"; break; | ||||||
|                 case 0x1C: state = "CLOSE_WAIT"; break; |                     case SnSR::SYNRECV     : state = "SYNRECV"; break; | ||||||
|                 case 0x1D: state = "LAST_ACK"; break; |                     case SnSR::ESTABLISHED : state = "ESTABLISHED"; break; | ||||||
|                 case 0x22: state = "UDP"; break; |                     case SnSR::FIN_WAIT    : state = "FIN_WAIT"; break; | ||||||
|                 case 0x32: state = "IPRAW"; break; |                     case SnSR::CLOSING     : state = "CLOSING"; break; | ||||||
|                 case 0x42: state = "MACRAW"; break; |                     case SnSR::TIME_WAIT   : state = "TIME_WAIT"; break; | ||||||
|                 case 0x5F: state = "PPPOE"; break; |                     case SnSR::CLOSE_WAIT  : state = "CLOSE_WAIT"; break; | ||||||
|                 default: state = "UNKNOWN"; break; |                     case SnSR::LAST_ACK    : state = "LAST_ACK"; break; | ||||||
|  |                     case SnSR::UDP         : state = "UDP"; break; | ||||||
|  |                     case SnSR::IPRAW       : state = "IPRAW"; break; | ||||||
|  |                     case SnSR::MACRAW      : state = "MACRAW"; break; | ||||||
|  |                     case SnSR::PPPOE       : state = "PPPOE"; break; | ||||||
|  |                     default: state = "UNKNOWN"; break; | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |                 Serial.print("SOCK <- ");  | ||||||
|  |                 Serial.print(i); | ||||||
|  |                 Serial.print(" State: "); | ||||||
|  |                 Serial.println(state); | ||||||
|  |             } | ||||||
|  |             goto SWITCHLOOP; | ||||||
|         } |         } | ||||||
|          |  | ||||||
|             Serial.print("SOCK <- ");  |  | ||||||
|             Serial.print(i); |  | ||||||
|             Serial.print(" State: "); |  | ||||||
|             Serial.println(state); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|         break; |         break; | ||||||
|     case CONNECT_CONNECTING: |     case CONNECT_CONNECTING: | ||||||
|         if (millis() - startConnectionTime >= connectionTimeout) |         if (millis() - startConnectionTime >= connectionTimeout) | ||||||
|         {   |         {   | ||||||
|             connectStatus = CONNECT_FAIL; |             connectStatus = CONNECT_FAIL; | ||||||
|  |             goto SWITCHLOOP; | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
| @ -164,16 +207,15 @@ void EthernetMaketClient::tick_(){ | |||||||
|         Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); |         Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); | ||||||
|         Serial.println("\n"); |         Serial.println("\n"); | ||||||
|         connectStatus = CONNECT_STOP_START; |         connectStatus = CONNECT_STOP_START; | ||||||
|  |         goto SWITCHLOOP; | ||||||
|         break; |         break; | ||||||
|     case CONNECT_SUCCESS: |     case CONNECT_SUCCESS: | ||||||
|         Serial.println("CONNECT_SUCCESS"); |         Serial.println("CONNECT_SUCCESS"); | ||||||
|         Serial.print("Connected to server in "); |         Serial.print("Connected to server in "); | ||||||
|         Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); |         Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); | ||||||
|         lastActivityTime = millis(); |         activityUpdate(); | ||||||
|         connectStatus = CONNECT_CONNECTED; |         connectStatus = CONNECT_CONNECTED; | ||||||
|  |         goto SWITCHLOOP; | ||||||
|             lastActivityTime = millis(); // Обновляем время последней активности |  | ||||||
|  |  | ||||||
|         break; |         break; | ||||||
|     case CONNECT_CONNECTED: |     case CONNECT_CONNECTED: | ||||||
|  |  | ||||||
| @ -185,6 +227,7 @@ void EthernetMaketClient::tick_(){ | |||||||
|         { |         { | ||||||
|             Serial.println("Client disconnected"); |             Serial.println("Client disconnected"); | ||||||
|             connectStatus = CONNECT_STOP_START; |             connectStatus = CONNECT_STOP_START; | ||||||
|  |             goto SWITCHLOOP; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Закрытие соединения по таймеру неактивности |         // Закрытие соединения по таймеру неактивности | ||||||
| @ -192,17 +235,20 @@ void EthernetMaketClient::tick_(){ | |||||||
|         { |         { | ||||||
|             Serial.println("Connection closed due to inactivity"); |             Serial.println("Connection closed due to inactivity"); | ||||||
|             connectStatus = CONNECT_STOP_START; |             connectStatus = CONNECT_STOP_START; | ||||||
|  |             goto SWITCHLOOP; | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     case CONNECT_STOP_START: |     case CONNECT_STOP_START: | ||||||
|  |         disconnect();  | ||||||
|  |         STOP_START_LABEL: | ||||||
|         Serial.println("CONNECT_STOP_START"); |         Serial.println("CONNECT_STOP_START"); | ||||||
|         dstIP = IPAddress(0,0,0,0); |         dstIP = IPAddress(0,0,0,0); | ||||||
|         dstPort = 0; |         dstPort = 0; | ||||||
|         disconnect();  |  | ||||||
|         stopStartTime = millis(); |         stopStartTime = millis(); | ||||||
|         connectStatus = CONNECT_STOP_WAITING; |         connectStatus = CONNECT_STOP_WAITING; | ||||||
|         Serial.println("CONNECT_STOP_WAITING"); |         Serial.println("CONNECT_STOP_WAITING"); | ||||||
|  |         goto SWITCHLOOP; | ||||||
|     break; |     break; | ||||||
|  |  | ||||||
|     case CONNECT_STOP_WAITING: |     case CONNECT_STOP_WAITING: | ||||||
| @ -219,7 +265,10 @@ void EthernetMaketClient::tick_(){ | |||||||
|         } |         } | ||||||
|         if(connectStatus == CONNECT_IDLE) { |         if(connectStatus == CONNECT_IDLE) { | ||||||
|             Serial.println("CONNECT_IDLE\n\n"); |             Serial.println("CONNECT_IDLE\n\n"); | ||||||
|  |             goto SWITCHLOOP; | ||||||
|         } |         } | ||||||
|  |         // //! Костыль, блокирует на время ожидания стопа  подобно while(millis() - stopStartTime < stopTimeout) | ||||||
|  |         goto SWITCHLOOP; | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     case CONNECT_IDLE: |     case CONNECT_IDLE: | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user