allow to change the Wifi AP Ip address and mask
This commit is contained in:
		
							parent
							
								
									371372f1f4
								
							
						
					
					
						commit
						b5210a79e8
					
				|  | @ -1,23 +1,41 @@ | |||
| #include "GwLog.h" | ||||
| #include "GwHardware.h" | ||||
| 
 | ||||
| class DefaultLogWriter: public GwLogWriter{ | ||||
|     public: | ||||
|         virtual ~DefaultLogWriter(){}; | ||||
|         virtual void write(const char *data){ | ||||
|             USBSerial.print(data); | ||||
|         } | ||||
| }; | ||||
| 
 | ||||
| GwLog::GwLog(int level, GwLogWriter *writer){ | ||||
|     logLevel=level; | ||||
|     if (writer == NULL) writer=new DefaultLogWriter(); | ||||
|     this->writer=writer; | ||||
|     if (!writer){ | ||||
|         iniBuffer=new char[INIBUFFERSIZE]; | ||||
|         iniBuffer[0]=0; | ||||
|     } | ||||
|     locker = xSemaphoreCreateMutex(); | ||||
| } | ||||
| GwLog::~GwLog(){ | ||||
|     vSemaphoreDelete(locker); | ||||
| } | ||||
| void GwLog::writeOut(const char *data) | ||||
| { | ||||
|     if (!writer) | ||||
|     { | ||||
|         if (iniBuffer && iniBufferFill < (INIBUFFERSIZE - 1)) | ||||
|         { | ||||
|             size_t remain = INIBUFFERSIZE - iniBufferFill-1; | ||||
|             size_t len = strlen(data); | ||||
|             if (len < remain) | ||||
|                 remain = len; | ||||
|             if (remain){ | ||||
|                 memcpy(iniBuffer + iniBufferFill, data, remain); | ||||
|                 iniBufferFill += remain; | ||||
|                 iniBuffer[iniBufferFill] = 0; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         writer->write(data); | ||||
|     } | ||||
| } | ||||
| void GwLog::logString(const char *fmt,...){ | ||||
|     va_list args; | ||||
|     va_start(args,fmt); | ||||
|  | @ -25,16 +43,12 @@ void GwLog::logString(const char *fmt,...){ | |||
|     recordCounter++; | ||||
|     vsnprintf(buffer,bufferSize-1,fmt,args); | ||||
|     buffer[bufferSize-1]=0; | ||||
|     if (! writer) { | ||||
|         xSemaphoreGive(locker); | ||||
|         return; | ||||
|     } | ||||
|     writer->write(prefix.c_str()); | ||||
|     writeOut(prefix.c_str()); | ||||
|     char buf[20]; | ||||
|     snprintf(buf,20,"%lu:",millis()); | ||||
|     writer->write(buf); | ||||
|     writer->write(buffer); | ||||
|     writer->write("\n"); | ||||
|     writeOut(buf); | ||||
|     writeOut(buffer); | ||||
|     writeOut("\n"); | ||||
|     xSemaphoreGive(locker); | ||||
| } | ||||
| void GwLog::logDebug(int level,const char *fmt,...){ | ||||
|  | @ -48,22 +62,24 @@ void GwLog::logDebug(int level,const char *fmt,va_list args){ | |||
|     recordCounter++; | ||||
|     vsnprintf(buffer,bufferSize-1,fmt,args); | ||||
|     buffer[bufferSize-1]=0; | ||||
|     if (! writer) { | ||||
|         xSemaphoreGive(locker); | ||||
|         return; | ||||
|     } | ||||
|     writer->write(prefix.c_str()); | ||||
|     writeOut(prefix.c_str()); | ||||
|     char buf[20]; | ||||
|     snprintf(buf,20,"%lu:",millis()); | ||||
|     writer->write(buf); | ||||
|     writer->write(buffer); | ||||
|     writer->write("\n"); | ||||
|     writeOut(buf); | ||||
|     writeOut(buffer); | ||||
|     writeOut("\n"); | ||||
|     xSemaphoreGive(locker); | ||||
| } | ||||
| void GwLog::setWriter(GwLogWriter *writer){ | ||||
|     xSemaphoreTake(locker, portMAX_DELAY); | ||||
|     if (this->writer) delete this->writer; | ||||
|     this->writer=writer; | ||||
|     if (iniBuffer && iniBufferFill){ | ||||
|         writer->write(iniBuffer); | ||||
|         iniBufferFill=0; | ||||
|         delete[] iniBuffer; | ||||
|         iniBuffer=nullptr; | ||||
|     } | ||||
|     xSemaphoreGive(locker); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,6 +16,10 @@ class GwLog{ | |||
|         GwLogWriter *writer; | ||||
|         SemaphoreHandle_t locker; | ||||
|         long long recordCounter=0; | ||||
|         const size_t INIBUFFERSIZE=1024; | ||||
|         char *iniBuffer=nullptr; | ||||
|         size_t iniBufferFill=0; | ||||
|         void writeOut(const char *data); | ||||
|     public: | ||||
|         static const int LOG=1; | ||||
|         static const int ERROR=0; | ||||
|  |  | |||
|  | @ -11,10 +11,30 @@ GwWifi::GwWifi(const GwConfigHandler *config,GwLog *log, bool fixedApPass){ | |||
| } | ||||
| void GwWifi::setup(){ | ||||
|     LOG_DEBUG(GwLog::LOG,"Wifi setup"); | ||||
|      | ||||
|     IPAddress AP_local_ip(192, 168, 15, 1);  // Static address for AP
 | ||||
|     IPAddress AP_gateway(192, 168, 15, 1); | ||||
|     IPAddress AP_subnet(255, 255, 255, 0); | ||||
|     IPAddress defaultAddr(192,168,15,1); | ||||
|     IPAddress AP_local_ip;  // Static address for AP
 | ||||
|     const String apip=config->getString(config->apIp); | ||||
|     bool cfgIpOk=false; | ||||
|     if (!apip.isEmpty()){ | ||||
|         cfgIpOk= AP_local_ip.fromString(apip); | ||||
|     } | ||||
|     if (! cfgIpOk){ | ||||
|         AP_local_ip=IPAddress(192,168,15,1); | ||||
|         LOG_DEBUG(GwLog::ERROR,"unable to set access point IP %s, falling back to %s", | ||||
|             apip.c_str(),AP_local_ip.toString().c_str()); | ||||
|     } | ||||
|     IPAddress AP_gateway(AP_local_ip); | ||||
|     bool maskOk=false; | ||||
|     IPAddress AP_subnet; | ||||
|     const String apMask=config->getString(config->apMask); | ||||
|     if (!apMask.isEmpty()){ | ||||
|         maskOk=AP_subnet.fromString(apMask); | ||||
|     } | ||||
|     if (! maskOk){ | ||||
|         AP_subnet=IPAddress(255, 255, 255, 0); | ||||
|         LOG_DEBUG(GwLog::ERROR,"unable to set access point mask %s, falling back to %s", | ||||
|             apMask.c_str(),AP_subnet.toString().c_str()); | ||||
|     } | ||||
|     WiFi.mode(WIFI_MODE_APSTA); //enable both AP and client
 | ||||
|     const char *ssid=config->getConfigItem(config->systemName)->asCString(); | ||||
|     if (fixedApPass){ | ||||
|  | @ -33,7 +53,7 @@ void GwWifi::setup(){ | |||
|     lastApAccess=millis(); | ||||
|     apShutdownTime=config->getConfigItem(config->stopApTime)->asInt() * 60; | ||||
|     if (apShutdownTime < 120 && apShutdownTime != 0) apShutdownTime=120; //min 2 minutes
 | ||||
|     LOG_DEBUG(GwLog::LOG,"GWWIFI: AP auto shutdown %s (%ds)",apShutdownTime> 0?"enabled":"disabled",apShutdownTime); | ||||
|     LOG_DEBUG(GwLog::ERROR,"GWWIFI: AP auto shutdown %s (%ds)",apShutdownTime> 0?"enabled":"disabled",apShutdownTime); | ||||
|     apShutdownTime=apShutdownTime*1000; //ms   
 | ||||
|     clientIsConnected=false; | ||||
|     connectInternal();     | ||||
|  | @ -65,7 +85,7 @@ void GwWifi::loop(){ | |||
|         } | ||||
|         else{ | ||||
|             if (! clientIsConnected){ | ||||
|                 LOG_DEBUG(GwLog::LOG,"client %s now connected",wifiSSID->asCString()); | ||||
|                 LOG_DEBUG(GwLog::LOG,"wifiClient %s now connected to",wifiSSID->asCString()); | ||||
|                 clientIsConnected=true; | ||||
|             } | ||||
|         } | ||||
|  | @ -75,7 +95,7 @@ void GwWifi::loop(){ | |||
|             lastApAccess=millis(); | ||||
|         } | ||||
|         if ((lastApAccess + apShutdownTime) < millis()){ | ||||
|             LOG_DEBUG(GwLog::LOG,"GWWIFI: shutdown AP"); | ||||
|             LOG_DEBUG(GwLog::ERROR,"GWWIFI: shutdown AP"); | ||||
|             WiFi.softAPdisconnect(true); | ||||
|             apActive=false; | ||||
|         } | ||||
|  |  | |||
|  | @ -698,6 +698,13 @@ void handleConfigRequestData(AsyncWebServerRequest *request, uint8_t *data, size | |||
| } | ||||
| 
 | ||||
| TimeMonitor monitor(20,0.2); | ||||
| class DefaultLogWriter: public GwLogWriter{ | ||||
|     public: | ||||
|         virtual ~DefaultLogWriter(){}; | ||||
|         virtual void write(const char *data){ | ||||
|             USBSerial.print(data); | ||||
|         } | ||||
| }; | ||||
| 
 | ||||
| void setup() { | ||||
|   mainLock=xSemaphoreCreateMutex(); | ||||
|  | @ -713,6 +720,7 @@ void setup() { | |||
|     USBSerial.begin(115200); | ||||
|     USBSerial.printf("fallback serial enabled\n"); | ||||
|     logger.prefix="FALLBACK:"; | ||||
|   logger.setWriter(new DefaultLogWriter()); | ||||
| #endif | ||||
|   userCodeHandler.startInitTasks(MIN_USER_TASK); | ||||
|   config.stopChanges(); | ||||
|  |  | |||
|  | @ -119,6 +119,22 @@ | |||
|         "category": "system", | ||||
|         "capabilities":{"apPwChange":["true"]} | ||||
|     }, | ||||
|     { | ||||
|         "name": "apIp", | ||||
|         "type": "string", | ||||
|         "default":"192.168.15.1", | ||||
|         "check": "checkApIp", | ||||
|         "description": "The IP address for the access point. Clients will get addresses within the same subnet.", | ||||
|         "category":"system" | ||||
|     }, | ||||
|     { | ||||
|         "name": "apMask", | ||||
|         "type": "string", | ||||
|         "default":"255.255.255.0", | ||||
|         "check": "checkNetMask", | ||||
|         "description": "The net mask for the access point", | ||||
|         "category":"system" | ||||
|     }, | ||||
|     { | ||||
|         "name": "useAdminPass", | ||||
|         "type": "boolean", | ||||
|  |  | |||
							
								
								
									
										15
									
								
								web/index.js
								
								
								
								
							
							
						
						
									
										15
									
								
								web/index.js
								
								
								
								
							|  | @ -186,6 +186,21 @@ function checkAdminPass(v){ | |||
|     return checkApPass(v); | ||||
| } | ||||
| 
 | ||||
| function checkApIp(v,allValues){ | ||||
|     if (! v) return "cannot be empty"; | ||||
|     let err1="must be in the form 192.168.x.x"; | ||||
|     if (! v.match(/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/))return err1; | ||||
|     let parts=v.split("."); | ||||
|     if (parts.length != 4) return err1; | ||||
|     for (let idx=0;idx < 4;idx++){ | ||||
|         let iv=parseInt(parts[idx]); | ||||
|         if (iv < 0 || iv > 255) return err1; | ||||
|     } | ||||
| } | ||||
| function checkNetMask(v,allValues){ | ||||
|     return checkApIp(v,allValues); | ||||
| } | ||||
| 
 | ||||
| function checkIpAddress(v,allValues,def){ | ||||
|     if (allValues.tclEnabled != "true") return; | ||||
|     if (! v) return "cannot be empty"; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 andreas
						andreas