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 "GwLog.h"
|
||||||
#include "GwHardware.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){
|
GwLog::GwLog(int level, GwLogWriter *writer){
|
||||||
logLevel=level;
|
logLevel=level;
|
||||||
if (writer == NULL) writer=new DefaultLogWriter();
|
|
||||||
this->writer=writer;
|
this->writer=writer;
|
||||||
|
if (!writer){
|
||||||
|
iniBuffer=new char[INIBUFFERSIZE];
|
||||||
|
iniBuffer[0]=0;
|
||||||
|
}
|
||||||
locker = xSemaphoreCreateMutex();
|
locker = xSemaphoreCreateMutex();
|
||||||
}
|
}
|
||||||
GwLog::~GwLog(){
|
GwLog::~GwLog(){
|
||||||
vSemaphoreDelete(locker);
|
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,...){
|
void GwLog::logString(const char *fmt,...){
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args,fmt);
|
va_start(args,fmt);
|
||||||
|
@ -25,16 +43,12 @@ void GwLog::logString(const char *fmt,...){
|
||||||
recordCounter++;
|
recordCounter++;
|
||||||
vsnprintf(buffer,bufferSize-1,fmt,args);
|
vsnprintf(buffer,bufferSize-1,fmt,args);
|
||||||
buffer[bufferSize-1]=0;
|
buffer[bufferSize-1]=0;
|
||||||
if (! writer) {
|
writeOut(prefix.c_str());
|
||||||
xSemaphoreGive(locker);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
writer->write(prefix.c_str());
|
|
||||||
char buf[20];
|
char buf[20];
|
||||||
snprintf(buf,20,"%lu:",millis());
|
snprintf(buf,20,"%lu:",millis());
|
||||||
writer->write(buf);
|
writeOut(buf);
|
||||||
writer->write(buffer);
|
writeOut(buffer);
|
||||||
writer->write("\n");
|
writeOut("\n");
|
||||||
xSemaphoreGive(locker);
|
xSemaphoreGive(locker);
|
||||||
}
|
}
|
||||||
void GwLog::logDebug(int level,const char *fmt,...){
|
void GwLog::logDebug(int level,const char *fmt,...){
|
||||||
|
@ -48,22 +62,24 @@ void GwLog::logDebug(int level,const char *fmt,va_list args){
|
||||||
recordCounter++;
|
recordCounter++;
|
||||||
vsnprintf(buffer,bufferSize-1,fmt,args);
|
vsnprintf(buffer,bufferSize-1,fmt,args);
|
||||||
buffer[bufferSize-1]=0;
|
buffer[bufferSize-1]=0;
|
||||||
if (! writer) {
|
writeOut(prefix.c_str());
|
||||||
xSemaphoreGive(locker);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
writer->write(prefix.c_str());
|
|
||||||
char buf[20];
|
char buf[20];
|
||||||
snprintf(buf,20,"%lu:",millis());
|
snprintf(buf,20,"%lu:",millis());
|
||||||
writer->write(buf);
|
writeOut(buf);
|
||||||
writer->write(buffer);
|
writeOut(buffer);
|
||||||
writer->write("\n");
|
writeOut("\n");
|
||||||
xSemaphoreGive(locker);
|
xSemaphoreGive(locker);
|
||||||
}
|
}
|
||||||
void GwLog::setWriter(GwLogWriter *writer){
|
void GwLog::setWriter(GwLogWriter *writer){
|
||||||
xSemaphoreTake(locker, portMAX_DELAY);
|
xSemaphoreTake(locker, portMAX_DELAY);
|
||||||
if (this->writer) delete this->writer;
|
if (this->writer) delete this->writer;
|
||||||
this->writer=writer;
|
this->writer=writer;
|
||||||
|
if (iniBuffer && iniBufferFill){
|
||||||
|
writer->write(iniBuffer);
|
||||||
|
iniBufferFill=0;
|
||||||
|
delete[] iniBuffer;
|
||||||
|
iniBuffer=nullptr;
|
||||||
|
}
|
||||||
xSemaphoreGive(locker);
|
xSemaphoreGive(locker);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,10 @@ class GwLog{
|
||||||
GwLogWriter *writer;
|
GwLogWriter *writer;
|
||||||
SemaphoreHandle_t locker;
|
SemaphoreHandle_t locker;
|
||||||
long long recordCounter=0;
|
long long recordCounter=0;
|
||||||
|
const size_t INIBUFFERSIZE=1024;
|
||||||
|
char *iniBuffer=nullptr;
|
||||||
|
size_t iniBufferFill=0;
|
||||||
|
void writeOut(const char *data);
|
||||||
public:
|
public:
|
||||||
static const int LOG=1;
|
static const int LOG=1;
|
||||||
static const int ERROR=0;
|
static const int ERROR=0;
|
||||||
|
|
|
@ -11,10 +11,30 @@ GwWifi::GwWifi(const GwConfigHandler *config,GwLog *log, bool fixedApPass){
|
||||||
}
|
}
|
||||||
void GwWifi::setup(){
|
void GwWifi::setup(){
|
||||||
LOG_DEBUG(GwLog::LOG,"Wifi setup");
|
LOG_DEBUG(GwLog::LOG,"Wifi setup");
|
||||||
|
IPAddress defaultAddr(192,168,15,1);
|
||||||
IPAddress AP_local_ip(192, 168, 15, 1); // Static address for AP
|
IPAddress AP_local_ip; // Static address for AP
|
||||||
IPAddress AP_gateway(192, 168, 15, 1);
|
const String apip=config->getString(config->apIp);
|
||||||
IPAddress AP_subnet(255, 255, 255, 0);
|
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
|
WiFi.mode(WIFI_MODE_APSTA); //enable both AP and client
|
||||||
const char *ssid=config->getConfigItem(config->systemName)->asCString();
|
const char *ssid=config->getConfigItem(config->systemName)->asCString();
|
||||||
if (fixedApPass){
|
if (fixedApPass){
|
||||||
|
@ -33,7 +53,7 @@ void GwWifi::setup(){
|
||||||
lastApAccess=millis();
|
lastApAccess=millis();
|
||||||
apShutdownTime=config->getConfigItem(config->stopApTime)->asInt() * 60;
|
apShutdownTime=config->getConfigItem(config->stopApTime)->asInt() * 60;
|
||||||
if (apShutdownTime < 120 && apShutdownTime != 0) apShutdownTime=120; //min 2 minutes
|
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
|
apShutdownTime=apShutdownTime*1000; //ms
|
||||||
clientIsConnected=false;
|
clientIsConnected=false;
|
||||||
connectInternal();
|
connectInternal();
|
||||||
|
@ -65,7 +85,7 @@ void GwWifi::loop(){
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (! clientIsConnected){
|
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;
|
clientIsConnected=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,7 +95,7 @@ void GwWifi::loop(){
|
||||||
lastApAccess=millis();
|
lastApAccess=millis();
|
||||||
}
|
}
|
||||||
if ((lastApAccess + apShutdownTime) < millis()){
|
if ((lastApAccess + apShutdownTime) < millis()){
|
||||||
LOG_DEBUG(GwLog::LOG,"GWWIFI: shutdown AP");
|
LOG_DEBUG(GwLog::ERROR,"GWWIFI: shutdown AP");
|
||||||
WiFi.softAPdisconnect(true);
|
WiFi.softAPdisconnect(true);
|
||||||
apActive=false;
|
apActive=false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -698,6 +698,13 @@ void handleConfigRequestData(AsyncWebServerRequest *request, uint8_t *data, size
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeMonitor monitor(20,0.2);
|
TimeMonitor monitor(20,0.2);
|
||||||
|
class DefaultLogWriter: public GwLogWriter{
|
||||||
|
public:
|
||||||
|
virtual ~DefaultLogWriter(){};
|
||||||
|
virtual void write(const char *data){
|
||||||
|
USBSerial.print(data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
mainLock=xSemaphoreCreateMutex();
|
mainLock=xSemaphoreCreateMutex();
|
||||||
|
@ -713,6 +720,7 @@ void setup() {
|
||||||
USBSerial.begin(115200);
|
USBSerial.begin(115200);
|
||||||
USBSerial.printf("fallback serial enabled\n");
|
USBSerial.printf("fallback serial enabled\n");
|
||||||
logger.prefix="FALLBACK:";
|
logger.prefix="FALLBACK:";
|
||||||
|
logger.setWriter(new DefaultLogWriter());
|
||||||
#endif
|
#endif
|
||||||
userCodeHandler.startInitTasks(MIN_USER_TASK);
|
userCodeHandler.startInitTasks(MIN_USER_TASK);
|
||||||
config.stopChanges();
|
config.stopChanges();
|
||||||
|
|
|
@ -119,6 +119,22 @@
|
||||||
"category": "system",
|
"category": "system",
|
||||||
"capabilities":{"apPwChange":["true"]}
|
"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",
|
"name": "useAdminPass",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
|
|
15
web/index.js
15
web/index.js
|
@ -186,6 +186,21 @@ function checkAdminPass(v){
|
||||||
return checkApPass(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){
|
function checkIpAddress(v,allValues,def){
|
||||||
if (allValues.tclEnabled != "true") return;
|
if (allValues.tclEnabled != "true") return;
|
||||||
if (! v) return "cannot be empty";
|
if (! v) return "cannot be empty";
|
||||||
|
|
Loading…
Reference in New Issue