removed unused buffering in port and count dumped bytes instead of using tellp(), small fix in wait for bus after lost arbitration
This commit is contained in:
@@ -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)
|
||||
|
||||
+28
-72
@@ -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)
|
||||
|
||||
+20
-57
@@ -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<unsigned char> 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
|
||||
|
||||
@@ -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<unsigned>(byte) << endl;
|
||||
|
||||
bytes_read = 0;
|
||||
|
||||
count++;
|
||||
}
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ int main(int argc, char* argv[])
|
||||
cout << hex << setw(2) << setfill('0')
|
||||
<< static_cast<unsigned>(byte) << endl;
|
||||
|
||||
port.send(&byte, 1);
|
||||
port.send(byte);
|
||||
usleep(A.getOptVal<long>("time"));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user