PIIODevice::bytesAvailible()

fix pistringlist pibinarystream write
pibinarystream::binaryStreamSize()
PIByteArray pibinarystream read with more size fix
pistring pibinarystream read optimization
fix bug in PIIOBinaryStream read and write if failed
workaround in PIIOString::readDevice
PISPI readDevice bug Fixed
This commit is contained in:
Бычков Андрей
2022-07-27 15:43:04 +03:00
parent d13e68c206
commit 3873f0b03b
50 changed files with 323 additions and 253 deletions

View File

@@ -409,8 +409,9 @@ int PIBinaryLog::readDevice(void *read_to, int max_size) {
if (max_size <= 0 || read_to == 0) return -1;
BinLogRecord br;
br.id = 0;
if (filterID.isEmpty()) br = readRecord();
else {
if (filterID.isEmpty()) {
br = readRecord();
} else {
while (!filterID.contains(br.id) && !isEnd()) br = readRecord();
}
if (br.id == -1) {

View File

@@ -301,18 +301,18 @@ public:
static bool joinBinLogsSerial(const PIStringList & src, const PIString & dst);
protected:
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual int readDevice(void *read_to, int max_size) override;
virtual int writeDevice(const void * data, int size) override;
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual void propertyChanged(const char * s) override;
virtual bool threadedRead(const uchar *readed, int size) override;
virtual void threadedReadTerminated() override {pausemutex.unlock();}
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
int readDevice(void *read_to, int max_size) override;
int writeDevice(const void * data, int size) override;
bool openDevice() override;
bool closeDevice() override;
void propertyChanged(const char * s) override;
bool threadedRead(const uchar *readed, int size) override;
void threadedReadTerminated() override {pausemutex.unlock();}
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
private:
struct PIP_EXPORT BinLogRecord {

View File

@@ -41,15 +41,15 @@ public:
int readedCANID() const;
protected:
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
bool openDevice() override;
bool closeDevice() override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
private:
int sock;

View File

@@ -462,24 +462,24 @@ public:
protected:
explicit PIEthernet(int sock, PIString ip_port);
virtual void propertyChanged(const char * name) override;
void propertyChanged(const char * name) override;
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual bool configureDevice(const void * e_main, const void * e_parent = 0) override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
virtual DeviceInfoFlags deviceInfoFlags() const override;
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
bool configureDevice(const void * e_main, const void * e_parent = 0) override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
DeviceInfoFlags deviceInfoFlags() const override;
//! Executes when any read function was successful. Default implementation does nothing
virtual void received(const void * data, int size) {;}
void construct();
virtual bool init() override;
virtual bool openDevice() override;
virtual bool closeDevice() override;
bool init() override;
bool openDevice() override;
bool closeDevice() override;
void closeSocket(int & sd);
void applyTimeouts();
void applyTimeout(int fd, int opt, double ms);

View File

@@ -180,7 +180,7 @@ public:
//! \~english Immediate write all buffered data to disk
//! \~russian Немедленно записывает все буферизированные данные на диск
virtual void flush() override;
void flush() override;
//! \~english Move read/write position to "position"
//! \~russian Перемещает позицию чтения/записи на "position"
@@ -226,6 +226,8 @@ public:
//! \~english Returns file size in bytes
//! \~russian Возвращает размер файла в байтах
llong size() const;
ssize_t bytesAvailible() const override {return size() - pos();}
//! \~english Returns read/write position
//! \~russian Возвращает позицию чтения/записи
@@ -324,15 +326,15 @@ public:
//! \}
protected:
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
bool openDevice() override;
bool closeDevice() override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
private:
PIString strType(const PIIODevice::DeviceMode type);

View File

@@ -112,9 +112,9 @@ private:
void exportGPIO(int gpio_num);
void openGPIO(GPIOData & g);
bool getPinState(int gpio_num);
void begin();
void run();
void end();
void begin() override;
void run() override;
void end() override;
static PIString GPIOName(int gpio_num);

View File

@@ -83,12 +83,17 @@ public:
//! \~english Insert data "ba" into content at current position
//! \~russian Вставляет данные "ba" в содержимое буфера в текущую позицию
int writeByteArray(const PIByteArray & ba);
ssize_t bytesAvailible() const override {
if (data_) return data_->size();
else return 0;
}
protected:
virtual bool openDevice() override;
virtual int readDevice(void * read_to, int size) override;
virtual int writeDevice(const void * data_, int size) override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
bool openDevice() override;
int readDevice(void * read_to, int size) override;
int writeDevice(const void * data_, int size) override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
ssize_t pos;
PIByteArray * data_;

View File

@@ -230,8 +230,7 @@ void PIIODevice::stop(bool hard) {
PIByteArray PIIODevice::read(int max_size) {
buffer_in.resize(max_size);
int ret = readDevice(buffer_in.data(), max_size);
if (ret < 0)
return PIByteArray();
if (ret < 0) return PIByteArray();
return buffer_in.resized(ret);
}

View File

@@ -66,7 +66,7 @@ typedef bool (*ReadRetFunc)(const uchar *, int, void *);
PIOBJECT_SUBCLASS(name, PIIODevice) \
PIIODevice * copy() const override {return new name();} \
public: \
virtual PIConstChars fullPathPrefix() const override {return prefix;} \
PIConstChars fullPathPrefix() const override {return prefix;} \
static PIConstChars fullPathPrefixS() {return prefix;} \
private:
@@ -284,6 +284,17 @@ public:
//! \~russian Читает из устройства не более "max_size" байт и возвращает данные как PIByteArray
PIByteArray read(int max_size);
//! \~english Returns the number of bytes that are available for reading.
//! \~russian Возвращает количество байт
//! \~\details
//! \~english This function is commonly used with sequential devices
//! to determine the number of bytes to allocate in a buffer before reading.
//! If function returns -1 it mean that number of bytes undefined.
//! \~russian Эта функция как правило используется чтобы знать какой
//! размер буфера нужен в памяти для чтения.
//! Если функция возвращает -1 это значит что количество байт для чтения не известно.
virtual ssize_t bytesAvailible() const {return -1;}
//! \~english Write maximum "max_size" bytes of "data" to device
//! \~russian Пишет в устройство не более "max_size" байт из "data"
int write(const void * data, int max_size) {return writeDevice(data, max_size);}
@@ -536,7 +547,7 @@ private:
EVENT_HANDLER2(void, check_start, void * , data, int, delim);
EVENT_HANDLER(void, write_func);
virtual PIIODevice * copy() const {return 0;}
virtual PIIODevice * copy() const {return nullptr;}
PIString fullPathOptions() const;
void _init();
void begin() override;

View File

@@ -47,12 +47,17 @@ public:
bool binaryStreamAppendImp(const void * d, size_t s) {
if (!dev) return false;
return dev->write(d, s);
return (dev->write(d, s) == (int)s);
}
bool binaryStreamTakeImp(void * d, size_t s) {
if (!dev) return false;
return dev->read(d, s);
return (dev->read(d, s) == (int)s);
}
ssize_t binaryStreamSizeImp() const {
if (!dev) return 0;
return dev->bytesAvailible();
}
private:

View File

@@ -56,9 +56,9 @@ bool PIIOString::open(const PIString & string) {
PIString PIIOString::readLine() {
if (!canRead() || !str) return PIString();
int np = pos;
while (++np < str->size_s())
if ((*str)[np] == '\n')
break;
while (++np < str->size_s()) {
if ((*str)[np] == '\n') break;
}
PIString ret = str->mid(pos, np - pos);
pos = piMini(np + 1, str->size_s());
return ret;
@@ -66,7 +66,7 @@ PIString PIIOString::readLine() {
int PIIOString::readDevice(void * read_to, int max_size) {
if (!canRead() || !str) return -1;
if (!canRead() || !str || max_size <= 0) return -1;
PIString rs = str->mid(pos, max_size);
pos += max_size;
if (pos > str->size_s()) pos = str->size_s();

View File

@@ -88,11 +88,16 @@ public:
//! \~russian Вставляет строку "string" в содержимое буфера в текущую позицию
int writeString(const PIString & string);
ssize_t bytesAvailible() const override {
if (str) return str->size() - pos;
else return 0;
}
protected:
virtual bool openDevice() override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
bool openDevice() override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential | PIIODevice::Reliable;}
ssize_t pos;
PIString * str;

View File

@@ -924,6 +924,15 @@ void PIPeer::changeName(const PIString &new_name) {
}
ssize_t PIPeer::bytesAvailible() const {
ssize_t ret = 0;
read_buffer_mutex.lock();
if (!read_buffer.isEmpty()) ret = read_buffer.back().size();
read_buffer_mutex.unlock();
return ret;
}
int PIPeer::readDevice(void *read_to, int max_size) {
read_buffer_mutex.lock();
bool empty = read_buffer.isEmpty();

View File

@@ -116,6 +116,8 @@ public:
void setTrustPeerName(const PIString & peer_name) {trust_peer = peer_name;}
void setTcpServerIP(const PIString & ip) {server_ip = ip; tcpClientReconnect();}
ssize_t bytesAvailible() const override;
EVENT2(dataReceivedEvent, const PIString &, from, const PIByteArray &, data);
EVENT1(peerConnectedEvent, const PIString &, name);
@@ -164,15 +166,15 @@ private:
void addToRemoved(const PeerInfo & pi) {removed[pi.name] = PIPair<int, PISystemTime>(pi.cnt, pi.time);}
bool isRemoved(const PeerInfo & pi) const {return (removed.value(pi.name) == PIPair<int, PISystemTime>(pi.cnt, pi.time));}
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString &full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int size) override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
bool openDevice() override;
bool closeDevice() override;
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString &full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int size) override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
PeerInfo * quickestPeer(const PIString & to);
bool sendToNeighbour(PeerInfo * peer, const PIByteArray & ba);
@@ -198,7 +200,7 @@ private:
bool destroyed, no_timer;
PIString trust_peer;
PIString server_ip;
PIMutex read_buffer_mutex;
mutable PIMutex read_buffer_mutex;
PIQueue<PIByteArray> read_buffer;
int read_buffer_size;
PIMutex mc_mutex, eth_mutex, peers_mutex, send_mutex, send_mc_mutex;

View File

@@ -282,19 +282,19 @@ public:
//! \}
protected:
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual bool configureDevice(const void * e_main, const void * e_parent = 0) override;
virtual void optionsChanged() override;
virtual void threadedReadBufferSizeChanged() override;
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
bool configureDevice(const void * e_main, const void * e_parent = 0) override;
void optionsChanged() override;
void threadedReadBufferSizeChanged() override;
//! \~english Basic read function
//! \~russian Базовое чтение
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential;}
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential;}
//! Executes when any read function was successful. Default implementation does nothing
virtual void received(const void * data, int size) {;}
@@ -306,8 +306,8 @@ protected:
bool setBit(int bit, bool on, const PIString & bname);
bool isBit(int bit, const PIString & bname) const;
virtual bool openDevice() override;
virtual bool closeDevice() override;
bool openDevice() override;
bool closeDevice() override;
PRIVATE_DECLARATION(PIP_EXPORT)
int fd, vtime;

View File

@@ -91,15 +91,15 @@ public:
protected:
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual int readDevice(void * read_to, int max_size) override {return read(read_to, max_size, 0);}
virtual int writeDevice(const void * data, int max_size) override {return write(data, max_size, 0);}
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
bool openDevice() override;
bool closeDevice() override;
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
int readDevice(void * read_to, int max_size) override {return read(read_to, max_size, 0);}
int writeDevice(const void * data, int max_size) override {return write(data, max_size, 0);}
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
private:
void initPrivate();

View File

@@ -88,6 +88,11 @@ bool PISPI::isParameterSet(PISPI::Parameters parameter) const {
}
ssize_t PISPI::bytesAvailible() const {
return recv_buf.size();
}
bool PISPI::openDevice() {
#ifdef PIP_SPI
int ret = 0;
@@ -126,7 +131,7 @@ bool PISPI::closeDevice() {
int PISPI::readDevice(void * read_to, int max_size) {
int sz = piMini(recv_buf.size_s(), max_size);
memcpy(read_to, recv_buf.data(), sz);
recv_buf.resize(recv_buf.size_s() - sz);
recv_buf.remove(0, sz);
return sz;
}

View File

@@ -60,18 +60,19 @@ public:
//! Returns parameters
PIFlags<PISPI::Parameters> parameters() const {return spi_mode;}
ssize_t bytesAvailible() const override;
protected:
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
bool openDevice() override;
bool closeDevice() override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual PIPropertyStorage constructVariantDevice() const override;
virtual void configureFromVariantDevice(const PIPropertyStorage & d) override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential;}
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
PIPropertyStorage constructVariantDevice() const override;
void configureFromVariantDevice(const PIPropertyStorage & d) override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Sequential;}
private:
uint spi_speed;

View File

@@ -49,6 +49,15 @@ PITransparentDevice::~PITransparentDevice() {
}
ssize_t PITransparentDevice::bytesAvailible() const {
ssize_t ret = 0;
que_mutex.lock();
if (que.isNotEmpty()) ret = que.back().size();
que_mutex.unlock();
return ret;
}
int PITransparentDevice::readDevice(void * read_to, int max_size) {
if (!canRead()) return -1;
que_mutex.lock();

View File

@@ -44,14 +44,16 @@ public:
virtual ~PITransparentDevice();
protected:
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
virtual DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
ssize_t bytesAvailible() const override;
PIMutex que_mutex;
protected:
bool openDevice() override;
bool closeDevice() override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
mutable PIMutex que_mutex;
PIQueue<PIByteArray> que;
};

View File

@@ -160,14 +160,14 @@ public:
virtual void flush() override;
protected:
virtual bool configureDevice(const void * e_main, const void * e_parent = 0) override;
virtual PIString constructFullPathDevice() const override;
virtual void configureFromFullPathDevice(const PIString & full_path) override;
virtual int readDevice(void * read_to, int max_size) override;
virtual int writeDevice(const void * data, int max_size) override;
virtual bool openDevice() override;
virtual bool closeDevice() override;
virtual DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
bool configureDevice(const void * e_main, const void * e_parent = 0) override;
PIString constructFullPathDevice() const override;
void configureFromFullPathDevice(const PIString & full_path) override;
int readDevice(void * read_to, int max_size) override;
int writeDevice(const void * data, int max_size) override;
bool openDevice() override;
bool closeDevice() override;
DeviceInfoFlags deviceInfoFlags() const {return PIIODevice::Reliable;}
PIVector<PIUSB::Endpoint> eps;
ushort vid_, pid_;