diff --git a/src/ebusd/bushandler.cpp b/src/ebusd/bushandler.cpp index a07b1641..393c08dd 100644 --- a/src/ebusd/bushandler.cpp +++ b/src/ebusd/bushandler.cpp @@ -312,8 +312,10 @@ result_t BusHandler::handleSymbol() } // send symbol if necessary + result_t result; if (sending == true) { - if (m_port->send(&sendSymbol, 1) == 1) + result = m_port->send(sendSymbol); + if (result == RESULT_OK) if (m_state == bs_ready) timeout = m_busAcquireTimeout; else @@ -321,26 +323,26 @@ result_t BusHandler::handleSymbol() else { sending = false; timeout = 0; - setState(bs_skip, RESULT_ERR_SEND); + setState(bs_skip, result); } } // receive next symbol (optionally check reception of sent symbol) unsigned char recvSymbol; - ssize_t count = m_port->recv(timeout, 1, &recvSymbol); + result = m_port->recv(timeout, recvSymbol); - if (count < 0) // count < 0 is a RESULT_ERR_ code - return setState(bs_skip, count); // TODO keep "no signal" within auto-syn state + if (result != RESULT_OK) + return setState(bs_skip, result); // TODO keep "no signal" within auto-syn state - //unsigned char recvSymbol = m_port->byte(); // TODO remove me if (recvSymbol == SYN) { - if (sending == false && m_remainLockCount > 0) + if (sending == false && m_remainLockCount > 0 && m_command.size() != 1) m_remainLockCount--; + else if (sending == false && m_remainLockCount == 0 && m_command.size() == 1) + m_remainLockCount = 1; // wait for next AUTO-SYN after SYN / address / SYN (bus locked for own priority) return setState(bs_ready, RESULT_SYN); } unsigned char headerLen, crcPos; - result_t result; switch (m_state) { @@ -360,7 +362,7 @@ result_t BusHandler::handleSymbol() return setState(bs_sendCmd, RESULT_OK); } // arbitration lost. if same priority class found, try again after next AUTO-SYN - m_remainLockCount = isMaster(recvSymbol) ? 2 : 1; + m_remainLockCount = isMaster(recvSymbol) ? 2 : 1; // number of SYN to wait for before next send try if ((recvSymbol & 0x0f) != (sendSymbol & 0x0f) && m_lockCount > m_remainLockCount) // if different priority class found, try again after N AUTO-SYN symbols (at least next AUTO-SYN) diff --git a/src/lib/ebus/port.cpp b/src/lib/ebus/port.cpp index 297be502..04e5315b 100644 --- a/src/lib/ebus/port.cpp +++ b/src/lib/ebus/port.cpp @@ -60,16 +60,16 @@ bool Device::isValid() return true; } -ssize_t Device::sendBytes(const unsigned char* buffer, size_t nbytes) +result_t Device::send(const unsigned char value) { if (isValid() == false) return RESULT_ERR_DEVICE; // write bytes to device - return write(m_fd, buffer, nbytes); + return write(m_fd, &value, 1) == 1 ? RESULT_OK : RESULT_ERR_SEND; } -ssize_t Device::recvBytes(const long timeout, size_t maxCount, unsigned char* buffer) +result_t Device::recv(const long timeout, unsigned char& value) { if (isValid() == false) return RESULT_ERR_DEVICE; @@ -106,41 +106,12 @@ ssize_t Device::recvBytes(const long timeout, size_t maxCount, unsigned char* bu if (ret == 0) return RESULT_ERR_TIMEOUT; } - if (buffer != NULL) { - // read bytes from device directly into provided buffer - ssize_t nbytes = read(m_fd, buffer, maxCount); - if (nbytes == 0) - return RESULT_ERR_EOF; - - return nbytes; - } - - if (maxCount > sizeof(m_buffer)) - maxCount = sizeof(m_buffer); - - // read bytes from device into temporary buffer - ssize_t nbytes = read(m_fd, m_buffer, maxCount); + // directly read byte from device + ssize_t nbytes = read(m_fd, &value, 1); if (nbytes == 0) return RESULT_ERR_EOF; - for (int i = 0; i < nbytes; i++) - m_recvBuffer.push(m_buffer[i]); - - return nbytes; -} - -unsigned char Device::getByte() -{ - unsigned char byte; - - if (m_recvBuffer.empty() == false) { - byte = m_recvBuffer.front(); - m_recvBuffer.pop(); - - return byte; - } - - return 0; + return nbytes < 0 ? RESULT_ERR_DEVICE : RESULT_OK; } @@ -266,7 +237,8 @@ Port::Port(const string deviceName, const bool noDeviceCheck, const bool dumpRaw, const char* dumpRawFile, const long dumpRawMaxSize) : m_deviceName(deviceName), m_noDeviceCheck(noDeviceCheck), m_logRaw(logRaw), m_logRawFunc(logRawFunc), - m_dumpRawFile(dumpRawFile), m_dumpRawMaxSize(dumpRawMaxSize) + m_dumpRawFile(dumpRawFile), m_dumpRawMaxSize(dumpRawMaxSize), + m_dumpRawFileSize(0) { m_device = NULL; @@ -281,32 +253,34 @@ Port::Port(const string deviceName, const bool noDeviceCheck, setDumpRaw(dumpRaw); // open fstream if necessary } -ssize_t Port::send(const unsigned char* buffer, size_t nbytes) +result_t Port::send(const unsigned char value) { - ssize_t ret = m_device->sendBytes(buffer, nbytes); - if (ret>0 && m_logRaw == true && m_logRawFunc != NULL) - (*m_logRawFunc)(buffer[0], false); + result_t ret = m_device->send(value); + if (ret == RESULT_OK && m_logRaw == true && m_logRawFunc != NULL) + (*m_logRawFunc)(value, false); return ret; } -ssize_t Port::recv(const long timeout, size_t maxCount, unsigned char* buffer) +result_t Port::recv(const long timeout, unsigned char& value) { - ssize_t ret = m_device->recvBytes(timeout, maxCount, buffer); - if (buffer && ret > 0) { + result_t ret = m_device->recv(timeout, value); + if (ret == RESULT_OK) { if (m_logRaw == true && m_logRawFunc != NULL) { - for (ssize_t pos = 0; pos < ret; pos++) - (*m_logRawFunc)(buffer[pos], true); + (*m_logRawFunc)(value, true); } if (m_dumpRaw == true && m_dumpRawStream.is_open() == true) { - m_dumpRawStream.write((char*)buffer, ret); - m_dumpRawStream.flush(); + m_dumpRawStream.write((char*)&value, 1); + m_dumpRawFileSize++; + if ((m_dumpRawFileSize%1024) == 0) + m_dumpRawStream.flush(); - if (m_dumpRawStream.tellp() >= m_dumpRawMaxSize * 1024) { + if (m_dumpRawFileSize >= m_dumpRawMaxSize * 1024) { string oldfile = m_dumpRawFile + ".old"; if (rename(m_dumpRawFile.c_str(), oldfile.c_str()) == 0) { m_dumpRawStream.close(); m_dumpRawStream.open(m_dumpRawFile.c_str(), ios::out | ios::binary | ios::app); + m_dumpRawFileSize = 0; } } } @@ -315,28 +289,6 @@ ssize_t Port::recv(const long timeout, size_t maxCount, unsigned char* buffer) return ret; } -unsigned char Port::byte() -{ - unsigned char byte = m_device->getByte(); - - if (m_logRaw == true && m_logRawFunc != NULL) - (*m_logRawFunc)(byte, true); - - if (m_dumpRaw == true && m_dumpRawStream.is_open() == true) { - m_dumpRawStream.write((char*)&byte, 1); - - if (m_dumpRawStream.tellp() >= m_dumpRawMaxSize * 1024) { - string oldfile = m_dumpRawFile + ".old"; - if (rename(m_dumpRawFile.c_str(), oldfile.c_str()) == 0) { - m_dumpRawStream.close(); - m_dumpRawStream.open(m_dumpRawFile.c_str(), ios::out | ios::binary | ios::app); - } - } - } - - return byte; -} - void Port::setDumpRaw(bool dumpRaw) { if (dumpRaw == m_dumpRaw) @@ -346,8 +298,10 @@ void Port::setDumpRaw(bool dumpRaw) if (dumpRaw == false) m_dumpRawStream.close(); - else + else { m_dumpRawStream.open(m_dumpRawFile.c_str(), ios::out | ios::binary | ios::app); + m_dumpRawFileSize = 0; + } } void Port::setDumpRawFile(const string& dumpFile) { @@ -357,8 +311,10 @@ void Port::setDumpRawFile(const string& dumpFile) { m_dumpRawStream.close(); m_dumpRawFile = dumpFile; - if (m_dumpRaw == true) + if (m_dumpRaw == true) { m_dumpRawStream.open(m_dumpRawFile.c_str(), ios::out | ios::binary | ios::app); + m_dumpRawFileSize = 0; + } } void Port::setType(const DeviceType type) diff --git a/src/lib/ebus/port.h b/src/lib/ebus/port.h index 963ad6e0..1922d78d 100644 --- a/src/lib/ebus/port.h +++ b/src/lib/ebus/port.h @@ -38,12 +38,6 @@ enum DeviceType { dt_network /*!< network device */ }; -/** @brief max bytes write to bus. */ -#define MAX_WRITE_SIZE 1 - -/** @brief max size of receive buffer. */ -#define MAX_READ_SIZE 100 - /** * @brief base class for input devices. @@ -82,33 +76,19 @@ public: bool isOpen(); /** - * @brief sendBytes write bytes to opened file descriptor. - * @param buffer data to send. - * @param nbytes number of bytes to send. - * @return number of written bytes or -1 if an error has occured. + * @brief Write a single byte to opened file descriptor. + * @param value the value to send. + * @return the result_t code. */ - ssize_t sendBytes(const unsigned char* buffer, size_t nbytes); + result_t send(const unsigned char value); /** - * @brief recvBytes read bytes from opened file descriptor. - * @param timeout time for new input data [usec]. - * @param maxCount max size of receive buffer. - * @param buffer optional direct buffer to write to (instead of queuing the data). - * @return number of read bytes or -1 if an error has occured. + * @brief Read a single byte from opened file descriptor. + * @param timeout max time out for new input data [usec], or 0 for infinite. + * @param value the reference in which the value is stored. + * @return the result_t code. */ - ssize_t recvBytes(const long timeout, size_t maxCount, unsigned char* buffer=NULL); - - /** - * @brief fetch first byte from receive buffer. - * @return first byte (raw) - */ - unsigned char getByte(); - - /** - * @brief get current size (bytes) of the receive buffer. - * @return number of bytes in queued. - */ - ssize_t sizeRecvBuffer() const { return m_recvBuffer.size(); } + result_t recv(const long timeout, unsigned char& value); protected: /** file descriptor from input device */ @@ -120,12 +100,6 @@ protected: /** true if device check is disabled */ bool m_noDeviceCheck; - /** queue for received bytes */ - queue m_recvBuffer; - - /** receive buffer */ - unsigned char m_buffer[MAX_READ_SIZE]; - private: /** * @brief system check if opened file descriptor is valid @@ -224,33 +198,19 @@ public: bool isOpen() { return m_device->isOpen(); } /** - * @brief send write bytes into opened file descriptor. - * @param buffer data to send. - * @param nbytes number of bytes to send. - * @return number of written bytes or -1 if an error has occured. + * @brief Write a single byte to opened file descriptor. + * @param value the value to send. + * @return the result_t code. */ - ssize_t send(const unsigned char* buffer, size_t nbytes = MAX_WRITE_SIZE); + result_t send(const unsigned char value); /** - * @brief recv read bytes from opened file descriptor. + * @brief Read a single byte from opened file descriptor. * @param timeout max time out for new input data [usec], or 0 for infinite. - * @param maxCount max size of receive buffer. - * @param buffer optional direct buffer to write to (instead of queuing the data). - * @return number of read bytes (never 0) or a negative result_t code. + * @param value the reference in which the value is stored. + * @return the result_t code. */ - ssize_t recv(const long timeout, size_t maxCount = MAX_READ_SIZE, unsigned char* buffer = NULL); - - /** - * @brief fetch first byte from receive buffer. - * @return first byte (raw) - */ - unsigned char byte(); - - /** - * @brief get current size (bytes) of the receive buffer. - * @return number of bytes in queued. - */ - ssize_t size() const { return m_device->sizeRecvBuffer(); } + result_t recv(const long timeout, unsigned char& value); /** * @brief Get whether logging of raw data is enabled. @@ -322,6 +282,9 @@ private: /** the @a ofstream for dumping raw data to. */ ofstream m_dumpRawStream; + /** the number of bytes already written to the @a m_dumpFile. */ + long m_dumpRawFileSize; + /** * @brief internal setter for device type. * @param type of device diff --git a/src/lib/ebus/test/test_port.cpp b/src/lib/ebus/test/test_port.cpp index 853f03db..a65382e7 100644 --- a/src/lib/ebus/test/test_port.cpp +++ b/src/lib/ebus/test/test_port.cpp @@ -36,17 +36,14 @@ int main () int count = 0; while (1) { - ssize_t bytes_read; + result_t result; unsigned char byte = 0; - bytes_read = port.recv(0); + result = port.recv(0, byte); - for (int i = 0; i < bytes_read; i++) - byte = port.byte(); + if (result == RESULT_OK) cout << hex << setw(2) << setfill('0') << static_cast(byte) << endl; - bytes_read = 0; - count++; } diff --git a/src/tools/ebusfeed.cpp b/src/tools/ebusfeed.cpp index 094e6cb1..f795cec5 100644 --- a/src/tools/ebusfeed.cpp +++ b/src/tools/ebusfeed.cpp @@ -82,7 +82,7 @@ int main(int argc, char* argv[]) cout << hex << setw(2) << setfill('0') << static_cast(byte) << endl; - port.send(&byte, 1); + port.send(byte); usleep(A.getOptVal("time")); }