restructure channels, USB + serial1 working
This commit is contained in:
parent
01d334d598
commit
40c4089f86
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue