mirror of
				https://github.com/Show-maket/EthernetMaket.git
				synced 2025-10-31 02:42:44 +00:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			vanilla-se
			...
			todo-Rewor
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b883d3a757 | 
| @ -9,120 +9,106 @@ void EthernetMaketServer::setServerHandler(std::function<void(EthernetMaketClien | ||||
|  | ||||
| void EthernetMaketServer::resetServerHandler() | ||||
| { | ||||
|     serverHandler = [](EthernetMaketClient sclient) {}; | ||||
|     serverHandler = [](EthernetMaketClient &sclient) {}; | ||||
| } | ||||
|  | ||||
| // EthernetMaketClient EthernetMaketServer::available(int sock) | ||||
| // { | ||||
| //     accept(sock); | ||||
| //     EthernetClient client(sock); | ||||
| //     if (EthernetClass::_server_port[sock] == _port && | ||||
| //         (client.status() == SnSR::ESTABLISHED || | ||||
| //          client.status() == SnSR::CLOSE_WAIT)) | ||||
| //     { | ||||
| //         if (client.available()) | ||||
| //         { | ||||
| //             return std::move(EthernetMaketClient(client)); | ||||
| //         } | ||||
| //     } | ||||
| //     return std::move(EthernetMaketClient(MAX_SOCK_NUM)); | ||||
| // } | ||||
| EthernetMaketClient EthernetMaketServer::available(int sock) | ||||
| { | ||||
|     accept(sock); | ||||
|     EthernetClient client(sock); | ||||
|     if (EthernetClass::_server_port[sock] == _port && | ||||
|         (client.status() == SnSR::ESTABLISHED || | ||||
|          client.status() == SnSR::CLOSE_WAIT)) | ||||
|     { | ||||
|         if (client.available()) | ||||
|         { | ||||
|             return std::move(EthernetMaketClient(client)); | ||||
|         } | ||||
|     } | ||||
|     return std::move(EthernetMaketClient(MAX_SOCK_NUM)); | ||||
| } | ||||
|  | ||||
| // void EthernetMaketServer::accept(int sock) | ||||
| // { | ||||
| //     int listening = 0; | ||||
| //     EthernetClient client(sock); | ||||
| void EthernetMaketServer::accept(int sock) | ||||
| { | ||||
|     int listening = 0; | ||||
|     EthernetClient client(sock); | ||||
|  | ||||
| //     if (EthernetClass::_server_port[sock] == _port) | ||||
| //     { | ||||
| //         if (client.status() == SnSR::LISTEN) | ||||
| //         { | ||||
| //             listening = 1; | ||||
| //         } | ||||
| //         else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) | ||||
| //         { | ||||
| //             Serial.println("HARD STOP"); | ||||
| //             client.stop(); | ||||
| //         } | ||||
| //     } | ||||
|     if (EthernetClass::_server_port[sock] == _port) | ||||
|     { | ||||
|         if (client.status() == SnSR::LISTEN) | ||||
|         { | ||||
|             listening = 1; | ||||
|         } | ||||
|         else if (client.status() == SnSR::CLOSE_WAIT && !client.available()) | ||||
|         { | ||||
|             Serial.println("HARD STOP"); | ||||
|             client.stop(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| //     if (!listening) | ||||
| //     { | ||||
| //         // begin(); | ||||
| //         begin(sock); // added | ||||
| //     } | ||||
| // } | ||||
|     if (!listening) | ||||
|     { | ||||
|         begin(); | ||||
|         // begin(sock); // added | ||||
|     } | ||||
| } | ||||
|  | ||||
| // void EthernetMaketServer::begin(int sock) | ||||
| // { | ||||
| //     EthernetClient client(sock); | ||||
| //     if (client.status() == SnSR::CLOSED) | ||||
| //     { | ||||
| //         socket(sock, SnMR::TCP, _port, 0); | ||||
| //         listen(sock); | ||||
| //         EthernetClass::_server_port[sock] = _port; | ||||
| //         serverSocket = sock;  | ||||
| //         return; | ||||
| //     }  | ||||
| //     // Serial.println(F("EthernetMaketServer::begin() FAIL")); | ||||
| // } | ||||
| void EthernetMaketServer::begin(int sock) | ||||
| { | ||||
|     EthernetClient client(sock); | ||||
|     if (client.status() == SnSR::CLOSED) | ||||
|     { | ||||
|         socket(sock, SnMR::TCP, _port, 0); | ||||
|         listen(sock); | ||||
|         EthernetClass::_server_port[sock] = _port; | ||||
|         serverSocket = sock;  | ||||
|         return; | ||||
|     }  | ||||
|     // Serial.println(F("EthernetMaketServer::begin() FAIL")); | ||||
| } | ||||
|  | ||||
| void EthernetMaketServer::begin() | ||||
| { | ||||
|     for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { | ||||
|     EthernetClient client(sock); | ||||
|     if (client.status() == SnSR::CLOSED) { | ||||
|         socket(sock, SnMR::TCP, _port, 0); | ||||
|         listen(sock); | ||||
|         EthernetClass::_server_port[sock] = _port; | ||||
|         serverSocket = sock; | ||||
|         break; | ||||
|         } | ||||
|     }  | ||||
|     // Serial.println(F("EthernetMaketServer::begin() FAIL")); | ||||
| } | ||||
|  | ||||
| // void EthernetMaketServer::begin() | ||||
| // { | ||||
| //     for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { | ||||
| //     EthernetClient client(sock); | ||||
| //     if (client.status() == SnSR::CLOSED) { | ||||
| //         socket(sock, SnMR::TCP, _port, 0); | ||||
| //         listen(sock); | ||||
| //         EthernetClass::_server_port[sock] = _port; | ||||
| //         serverSocket = sock; | ||||
| //         break; | ||||
| //         } | ||||
| //     }  | ||||
| //     // Serial.println(F("EthernetMaketServer::begin() FAIL")); | ||||
| // } | ||||
| uint8_t buf[256]; | ||||
| void EthernetMaketServer::tick() | ||||
| { | ||||
|     // for (int sock = 0; sock < MAX_SOCK_NUM; sock++) | ||||
|     { | ||||
|         EthernetClient sclient = available(/* serverSocket */); | ||||
|         size_t dataSize; | ||||
|         if (sclient.connected() && (dataSize = sclient.available()) > 0) | ||||
|         sclient = available(serverSocket); | ||||
|         if (sclient.connected() && sclient.available() > 0) | ||||
|         { | ||||
|             // Serial.println("Receive!"); | ||||
|  | ||||
|             // memset(buf,0x00,sizeof(buf)); | ||||
|             // sclient.read(buf, sizeof(buf)); | ||||
|  | ||||
|             // Serial.print("Received data: "); | ||||
|             // for (int i = 0; i < dataSize; i++) | ||||
|             // { | ||||
|             //     Serial.print(buf[i], HEX); | ||||
|             //     Serial.print(" "); | ||||
|             // } | ||||
|             // Serial.println("\n"); | ||||
|  | ||||
|             // sclient.activityUpdate(); | ||||
|             serverHandler(EthernetMaketClient(sclient)); | ||||
|             sclient.activityUpdate(); | ||||
|             serverHandler(sclient); | ||||
|         } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|         // if (!wasConnected && sclient.connected()) | ||||
|         // { | ||||
|         //     wasConnected = true; | ||||
|         //     Serial.println("Client connected"); | ||||
|         // } | ||||
|         if (!wasConnected && sclient.connected()) | ||||
|         { | ||||
|             wasConnected = true; | ||||
|             Serial.println("Client connected"); | ||||
|         } | ||||
|  | ||||
|         // if (wasConnected && !sclient.connected()) | ||||
|         // { | ||||
|         //     wasConnected = false; | ||||
|         //     sclient.stop(); | ||||
|         //     // begin(serverSocket); | ||||
|         //     Serial.println("Client disconnected"); | ||||
|         // } | ||||
|         if (wasConnected && !sclient.connected()) | ||||
|         { | ||||
|             wasConnected = false; | ||||
|             sclient.stop(); | ||||
|             // begin(serverSocket); | ||||
|             Serial.println("Client disconnected"); | ||||
|         } | ||||
|         // // Закрытие соединения по таймеру неактивности | ||||
|         // if (sclient.connected() && (millis() - lastActivityTime > timeout)) | ||||
|         // { | ||||
| @ -131,5 +117,5 @@ void EthernetMaketServer::tick() | ||||
|         //     // begin(serverSocket); | ||||
|         // } | ||||
|     } | ||||
|     // sclient.tick_(); | ||||
|     sclient.tick_(); | ||||
| } | ||||
|  | ||||
| @ -8,22 +8,22 @@ class EthernetMaketClient; | ||||
| class EthernetMaketServer : public EthernetServer | ||||
| { | ||||
| private: | ||||
|     // EthernetClient available(); | ||||
|     // void accept(int sock); | ||||
|     std::function<void(EthernetMaketClient)> serverHandler = [](EthernetMaketClient sclient) {}; | ||||
|     EthernetClient available(); | ||||
|     void accept(int sock); | ||||
|     std::function<void(EthernetMaketClient&)> serverHandler = [](EthernetMaketClient &sclient) {}; | ||||
|     SOCKET serverSocket = MAX_SOCK_NUM; | ||||
|  | ||||
|     bool wasConnected; | ||||
|     // EthernetMaketClient sclient; | ||||
|     EthernetMaketClient sclient; | ||||
|  | ||||
| public: | ||||
|     using EthernetServer::EthernetServer; | ||||
|     // EthernetMaketClient available(int sock); | ||||
|     EthernetMaketClient available(int sock); | ||||
|  | ||||
|     void setServerHandler(std::function<void(EthernetMaketClient)> handler); | ||||
|     void resetServerHandler(); | ||||
|     // void begin() override; | ||||
|     // void begin(int sock); | ||||
|     void begin() override; | ||||
|     void begin(int sock); | ||||
|     void tick(); | ||||
| }; | ||||
|  | ||||
|  | ||||
| @ -108,96 +108,53 @@ void EthernetMaketClient::close(){ | ||||
| } | ||||
|  | ||||
| void EthernetMaketClient::tick_(){ | ||||
|     // todo Переделать на нативные статусы. Избавиться от костылей | ||||
|     if(_sock != MAX_SOCK_NUM && connectStatus!=CONNECT_CONNECTED && connectStatus!=CONNECT_STOP_WAITING&&connectStatus!=CONNECT_CONNECTING){ | ||||
|         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(); | ||||
|         Serial.print("tick_() sock = "); Serial.println(_sock);  | ||||
|     } | ||||
|  | ||||
| //todo [] Пересмотреть стейт машину перевести на нативные статусы | ||||
|     SWITCHLOOP: | ||||
|     switch (connectStatus) | ||||
|     { | ||||
|     case CONNECT_START: | ||||
|         Serial.println("CONNECT_START"); | ||||
|         startConnectionTime = millis(); | ||||
|         connectStatus = CONNECT_CONNECTING; | ||||
|         close(); | ||||
|         Serial.println("CONNECT_CONNECTING..."); | ||||
|         { | ||||
|             Serial.println("CONNECT_START"); | ||||
|             startConnectionTime = millis(); | ||||
|             connectStatus = CONNECT_CONNECTING; | ||||
|             close(); | ||||
|             Serial.println("CONNECT_CONNECTING..."); | ||||
|             for (int i = 0; i < MAX_SOCK_NUM; i++) { | ||||
|                 uint8_t s = w5500.readSnSR(i); | ||||
|                 String state = ""; | ||||
|                 switch (s) { | ||||
|                     case SnSR::CLOSED      : state = "CLOSED"; 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"; break; | ||||
|                     case SnSR::FIN_WAIT    : state = "FIN_WAIT"; break; | ||||
|                     case SnSR::CLOSING     : state = "CLOSING"; break; | ||||
|                     case SnSR::TIME_WAIT   : state = "TIME_WAIT"; break; | ||||
|                     case SnSR::CLOSE_WAIT  : state = "CLOSE_WAIT"; 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; | ||||
|         for (int i = 0; i < MAX_SOCK_NUM; i++) { | ||||
|             uint8_t s = w5500.readSnSR(i); | ||||
|             String state = ""; | ||||
|             switch (s) { | ||||
|                 case 0x00: state = "CLOSED"; break; | ||||
|                 case 0x13: state = "INIT"; break; | ||||
|                 case 0x14: state = "LISTEN"; break; | ||||
|                 case 0x15: state = "SYNSENT"; break; | ||||
|                 case 0x16: state = "SYNRECV"; break; | ||||
|                 case 0x17: state = "ESTABLISHED"; break; | ||||
|                 case 0x18: state = "FIN_WAIT"; break; | ||||
|                 case 0x1A: state = "CLOSING"; break; | ||||
|                 case 0x1B: state = "TIME_WAIT"; break; | ||||
|                 case 0x1C: state = "CLOSE_WAIT"; break; | ||||
|                 case 0x1D: state = "LAST_ACK"; break; | ||||
|                 case 0x22: state = "UDP"; break; | ||||
|                 case 0x32: state = "IPRAW"; break; | ||||
|                 case 0x42: state = "MACRAW"; break; | ||||
|                 case 0x5F: state = "PPPOE"; break; | ||||
|                 default: state = "UNKNOWN"; break; | ||||
|         } | ||||
|          | ||||
|             Serial.print("SOCK <- ");  | ||||
|             Serial.print(i); | ||||
|             Serial.print(" State: "); | ||||
|             Serial.println(state); | ||||
|         } | ||||
|     } | ||||
|         break; | ||||
|     case CONNECT_CONNECTING: | ||||
|         if (millis() - startConnectionTime >= connectionTimeout) | ||||
|         {   | ||||
|             connectStatus = CONNECT_FAIL; | ||||
|             goto SWITCHLOOP; | ||||
|             break; | ||||
|         } | ||||
|         break; | ||||
| @ -207,15 +164,16 @@ void EthernetMaketClient::tick_(){ | ||||
|         Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); | ||||
|         Serial.println("\n"); | ||||
|         connectStatus = CONNECT_STOP_START; | ||||
|         goto SWITCHLOOP; | ||||
|         break; | ||||
|     case CONNECT_SUCCESS: | ||||
|         Serial.println("CONNECT_SUCCESS"); | ||||
|         Serial.print("Connected to server in "); | ||||
|         Serial.println(isNonBlocking ? "non-blocking mode" : "blocking mode"); | ||||
|         activityUpdate(); | ||||
|         lastActivityTime = millis(); | ||||
|         connectStatus = CONNECT_CONNECTED; | ||||
|         goto SWITCHLOOP; | ||||
|  | ||||
|             lastActivityTime = millis(); // Обновляем время последней активности | ||||
|  | ||||
|         break; | ||||
|     case CONNECT_CONNECTED: | ||||
|  | ||||
| @ -227,7 +185,6 @@ void EthernetMaketClient::tick_(){ | ||||
|         { | ||||
|             Serial.println("Client disconnected"); | ||||
|             connectStatus = CONNECT_STOP_START; | ||||
|             goto SWITCHLOOP; | ||||
|         } | ||||
|  | ||||
|         // Закрытие соединения по таймеру неактивности | ||||
| @ -235,20 +192,17 @@ void EthernetMaketClient::tick_(){ | ||||
|         { | ||||
|             Serial.println("Connection closed due to inactivity"); | ||||
|             connectStatus = CONNECT_STOP_START; | ||||
|             goto SWITCHLOOP; | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|     case CONNECT_STOP_START: | ||||
|         disconnect();  | ||||
|         STOP_START_LABEL: | ||||
|         Serial.println("CONNECT_STOP_START"); | ||||
|         dstIP = IPAddress(0,0,0,0); | ||||
|         dstPort = 0; | ||||
|         disconnect();  | ||||
|         stopStartTime = millis(); | ||||
|         connectStatus = CONNECT_STOP_WAITING; | ||||
|         Serial.println("CONNECT_STOP_WAITING"); | ||||
|         goto SWITCHLOOP; | ||||
|     break; | ||||
|  | ||||
|     case CONNECT_STOP_WAITING: | ||||
| @ -265,10 +219,7 @@ void EthernetMaketClient::tick_(){ | ||||
|         } | ||||
|         if(connectStatus == CONNECT_IDLE) { | ||||
|             Serial.println("CONNECT_IDLE\n\n"); | ||||
|             goto SWITCHLOOP; | ||||
|         } | ||||
|         // //! Костыль, блокирует на время ожидания стопа  подобно while(millis() - stopStartTime < stopTimeout) | ||||
|         goto SWITCHLOOP; | ||||
|         break; | ||||
|  | ||||
|     case CONNECT_IDLE: | ||||
|  | ||||
		Reference in New Issue
	
	Block a user