restructure channels, USB + serial1 working

This commit is contained in:
andreas 2024-11-03 17:33:55 +01:00
parent 01d334d598
commit 40c4089f86
2 changed files with 117 additions and 101 deletions

View File

@ -18,6 +18,7 @@ class SerInit{
}; };
std::vector<SerInit> serialInits; std::vector<SerInit> serialInits;
static int typeFromMode(const char *mode){ static int typeFromMode(const char *mode){
if (strcmp(mode,"UNI") == 0) return GWSERIAL_TYPE_UNI; if (strcmp(mode,"UNI") == 0) return GWSERIAL_TYPE_UNI;
if (strcmp(mode,"BI") == 0) return GWSERIAL_TYPE_BI; if (strcmp(mode,"BI") == 0) return GWSERIAL_TYPE_BI;
@ -31,90 +32,94 @@ static int typeFromMode(const char *mode){
static GwInitializer<SerInit> __serial ## ser ## _init \ static GwInitializer<SerInit> __serial ## ser ## _init \
(serialInits,SerInit(ser,__VA_ARGS__)); (serialInits,SerInit(ser,__VA_ARGS__));
#ifdef _GWI_SERIAL1 #ifdef _GWI_SERIAL1
CFG_SERIAL(0,_GWI_SERIAL1) CFG_SERIAL(SERIAL1_CHANNEL_ID,_GWI_SERIAL1)
#endif #endif
#ifdef _GWI_SERIAL2 #ifdef _GWI_SERIAL2
CFG_SERIAL(1,_GWI_SERIAL2) CFG_SERIAL(SERIAL2_CHANNEL_ID,_GWI_SERIAL2)
#endif #endif
//handle separate defines // handle separate defines
//serial 1 // serial 1
#ifndef GWSERIAL_TX #ifndef GWSERIAL_TX
#define GWSERIAL_TX -1 #define GWSERIAL_TX -1
#endif #endif
#ifndef GWSERIAL_RX #ifndef GWSERIAL_RX
#define GWSERIAL_RX -1 #define GWSERIAL_RX -1
#endif #endif
#ifdef GWSERIAL_TYPE #ifdef GWSERIAL_TYPE
CFG_SERIAL(0,GWSERIAL_RX,GWSERIAL_TX,GWSERIAL_TYPE) CFG_SERIAL(SERIAL1_CHANNEL_ID, GWSERIAL_RX, GWSERIAL_TX, GWSERIAL_TYPE)
#else #else
#ifdef GWSERIAL_MODE #ifdef GWSERIAL_MODE
CFG_SERIAL(0,GWSERIAL_RX,GWSERIAL_TX,typeFromMode(GWSERIAL_MODE)) CFG_SERIAL(SERIAL1_CHANNEL_ID, GWSERIAL_RX, GWSERIAL_TX, typeFromMode(GWSERIAL_MODE))
#endif #endif
#endif #endif
//serial 2 // serial 2
#ifndef GWSERIAL2_TX #ifndef GWSERIAL2_TX
#define GWSERIAL2_TX -1 #define GWSERIAL2_TX -1
#endif #endif
#ifndef GWSERIAL2_RX #ifndef GWSERIAL2_RX
#define GWSERIAL2_RX -1 #define GWSERIAL2_RX -1
#endif #endif
#ifdef GWSERIAL2_TYPE #ifdef GWSERIAL2_TYPE
CFG_SERIAL(1,GWSERIAL2_RX,GWSERIAL2_TX,GWSERIAL2_TYPE) CFG_SERIAL(SERIAL2_CHANNEL_ID, GWSERIAL2_RX, GWSERIAL2_TX, GWSERIAL2_TYPE)
#else #else
#ifdef GWSERIAL2_MODE #ifdef GWSERIAL2_MODE
CFG_SERIAL(1,GWSERIAL2_RX,GWSERIAL2_TX,typeFromMode(GWSERIAL2_MODE)) CFG_SERIAL(SERIAL2_CHANNEL_ID, GWSERIAL2_RX, GWSERIAL2_TX, typeFromMode(GWSERIAL2_MODE))
#endif #endif
#endif #endif
class GwSerialLog : public GwLogWriter class GwSerialLog : public GwLogWriter
{
static const size_t bufferSize = 4096;
char *logBuffer = NULL;
int wp = 0;
GwSerial *writer;
bool disabled = false;
public:
GwSerialLog(GwSerial *writer, bool disabled)
{ {
this->writer = writer; static const size_t bufferSize = 4096;
this->disabled = disabled; char *logBuffer = NULL;
logBuffer = new char[bufferSize]; int wp = 0;
wp = 0; GwSerial *writer;
} bool disabled = false;
virtual ~GwSerialLog() {}
virtual void write(const char *data) public:
{ GwSerialLog(GwSerial *writer, bool disabled)
if (disabled)
return;
int len = strlen(data);
if ((wp + len) >= (bufferSize - 1))
return;
strncpy(logBuffer + wp, data, len);
wp += len;
logBuffer[wp] = 0;
}
virtual void flush()
{
size_t handled = 0;
if (!disabled)
{ {
while (handled < wp) this->writer = writer;
{ this->disabled = disabled;
if ( !writer->flush()) break; logBuffer = new char[bufferSize];
size_t rt = writer->sendToClients(logBuffer + handled, -1, true); wp = 0;
handled += rt; }
} virtual ~GwSerialLog() {}
if (handled < wp){ virtual void write(const char *data)
if (handled > 0){ {
memmove(logBuffer,logBuffer+handled,wp-handled); if (disabled)
wp-=handled; return;
logBuffer[wp]=0; int len = strlen(data);
} if ((wp + len) >= (bufferSize - 1))
return; return;
} strncpy(logBuffer + wp, data, len);
wp += len;
logBuffer[wp] = 0;
}
virtual void flush()
{
size_t handled = 0;
if (!disabled)
{
while (handled < wp)
{
if (!writer->flush())
break;
size_t rt = writer->sendToClients(logBuffer + handled, -1, true);
handled += rt;
}
if (handled < wp)
{
if (handled > 0)
{
memmove(logBuffer, logBuffer + handled, wp - handled);
wp -= handled;
logBuffer[wp] = 0;
}
return;
}
}
wp = 0;
logBuffer[0] = 0;
} }
wp = 0;
logBuffer[0] = 0;
}
}; };
@ -192,9 +197,23 @@ GwSerial* createSerial(GwLog *logger, T* s,int id, bool canRead=true){
return new GwSerialImpl<T>(logger,s,id,canRead); return new GwSerialImpl<T>(logger,s,id,canRead);
} }
static SerialParam * findSerialParam(int id){
SerialParam *param=nullptr;
for (auto && p: serialParameters){
if (id == p.id){
param=&p;
break;
}
}
return param;
}
static GwChannel * createSerialChannel(GwConfigHandler *config,GwLog *logger, int idx,int type,int rx,int tx, bool setLog=false){ static GwChannel * createSerialChannel(GwConfigHandler *config,GwLog *logger, int idx,int type,int rx,int tx, bool setLog=false){
if (idx < 0 || idx >= sizeof(serialParameters)/sizeof(SerialParam*)) return nullptr; SerialParam *param=findSerialParam(idx);
SerialParam *param=&serialParameters[idx]; if (param == nullptr){
LOG_DEBUG(GwLog::ERROR,"invalid serial channel id %d",idx);
return nullptr;
}
bool canRead=false; bool canRead=false;
bool canWrite=false; bool canWrite=false;
bool validType=false; bool validType=false;
@ -225,9 +244,8 @@ static GwChannel * createSerialChannel(GwConfigHandler *config,GwLog *logger, in
LOG_DEBUG(GwLog::ERROR,"invalid type for serial channel %d: %d",param->id,type); LOG_DEBUG(GwLog::ERROR,"invalid type for serial channel %d: %d",param->id,type);
return nullptr; return nullptr;
} }
if (rx < 0) canRead=false; LOG_DEBUG(GwLog::DEBUG,"serial set up: channel=%d, type=%d,rx=%d,canRead=%d,tx=%d,canWrite=%d",
if (tx < 0) canWrite=false; idx,
LOG_DEBUG(GwLog::DEBUG,"serial set up: type=%d,rx=%d,canRead=%d,tx=%d,canWrite=%d",
type,rx,(int)canRead,tx,(int)canWrite); type,rx,(int)canRead,tx,(int)canWrite);
GwSerial *serialStream=nullptr; GwSerial *serialStream=nullptr;
GwLog *streamLog=setLog?nullptr:logger; GwLog *streamLog=setLog?nullptr:logger;
@ -275,28 +293,20 @@ void GwChannelList::addChannel(GwChannel * channel){
return; return;
} }
} }
LOG_DEBUG(GwLog::LOG, "adding channel %s", channel->toString().c_str()); LOG_INFO("adding channel %s", channel->toString().c_str());
theChannels.push_back(channel); theChannels.push_back(channel);
} }
void GwChannelList::preinit(){ void GwChannelList::preinit(){
for (auto &&init:serialInits){ for (auto &&init:serialInits){
LOG_INFO("serial config found for %d",init.serial);
if (init.fixedBaud >= 0){ if (init.fixedBaud >= 0){
switch(init.serial){ SerialParam *param=findSerialParam(init.serial);
case 1: if (! param){
{ LOG_ERROR("invalid serial definition %d found",init.serial)
LOG_DEBUG(GwLog::DEBUG,"setting fixed baud %d for serial",init.fixedBaud); return;
config->setValue(GwConfigDefinitions::serialBaud,String(init.fixedBaud),GwConfigInterface::READONLY);
}
break;
case 2:
{
LOG_DEBUG(GwLog::DEBUG,"setting fixed baud %d for serial2",init.fixedBaud);
config->setValue(GwConfigDefinitions::serial2Baud,String(init.fixedBaud),GwConfigInterface::READONLY);
}
break;
default:
LOG_DEBUG(GwLog::ERROR,"invalid serial definition %d found",init.serial)
} }
LOG_DEBUG(GwLog::DEBUG,"setting fixed baud %d for serial %d",init.fixedBaud,init.serial);
config->setValue(param->baud,String(init.fixedBaud),GwConfigInterface::READONLY);
} }
} }
} }
@ -312,7 +322,7 @@ void GwChannelList::begin(bool fallbackSerial){
GwChannel *channel=NULL; GwChannel *channel=NULL;
//usb //usb
if (! fallbackSerial){ if (! fallbackSerial){
GwChannel *usb=createSerialChannel(config, logger,0,GWSERIAL_TYPE_BI,GWUSB_RX,GWUSB_TX,true); GwChannel *usb=createSerialChannel(config, logger,USB_CHANNEL_ID,GWSERIAL_TYPE_BI,GWUSB_RX,GWUSB_TX,true);
addChannel(usb); addChannel(usb);
} }
//TCP server //TCP server
@ -335,7 +345,11 @@ void GwChannelList::begin(bool fallbackSerial){
//new serial config handling //new serial config handling
for (auto &&init:serialInits){ for (auto &&init:serialInits){
(logger,init.serial,init.rx,init.tx,init.mode); LOG_INFO("creating serial channel %d, rx=%d,tx=%d,type=%d",init.serial,init.rx,init.tx,init.mode);
GwChannel *ser=createSerialChannel(config,logger,init.serial,init.mode,init.rx,init.tx);
if (ser != nullptr){
addChannel(ser);
}
} }
//tcp client //tcp client

View File

@ -38,5 +38,7 @@ class GwLog{
long long getRecordCounter(){return recordCounter;} long long getRecordCounter(){return recordCounter;}
}; };
#define LOG_DEBUG(level,...){ if (logger != NULL && logger->isActive(level)) logger->logDebug(level,__VA_ARGS__);} #define LOG_DEBUG(level,...){ if (logger != NULL && logger->isActive(level)) logger->logDebug(level,__VA_ARGS__);}
#define LOG_INFO(...){ if (logger != NULL && logger->isActive(GwLog::LOG)) logger->logDebug(GwLog::LOG,__VA_ARGS__);}
#define LOG_ERROR(...){ if (logger != NULL && logger->isActive(GwLog::ERROR)) logger->logDebug(GwLog::ERROR,__VA_ARGS__);}
#endif #endif