TransferReceiver updated; build is still broken

This commit is contained in:
Pavel Kirienko 2015-06-29 19:22:59 +03:00
parent a565a9025e
commit 287d9dd942
2 changed files with 23 additions and 25 deletions

View File

@ -34,8 +34,7 @@ private:
enum { IfaceIndexNotSet = MaxCanIfaces };
enum { BufferWritePosMask = 4095 };
enum { ErrorCntMask = 15 };
enum { ErrorCntMask = 31 };
enum { IfaceIndexMask = MaxCanIfaces };
MonotonicTime prev_transfer_ts_;
@ -44,15 +43,14 @@ private:
uint16_t transfer_interval_msec_;
uint16_t this_transfer_crc_;
// 2 byte aligned bitfields:
uint16_t buffer_write_pos_ : 12;
mutable uint16_t error_cnt_ : 4;
uint16_t buffer_write_pos_;
TransferID tid_; // 1 byte field
// 1 byte aligned bitfields:
uint8_t next_frame_index_ : 6;
uint8_t next_toggle_ : 1;
uint8_t iface_index_ : 2;
mutable uint8_t error_cnt_ : 5;
bool isInitialized() const { return iface_index_ != IfaceIndexNotSet; }
@ -72,9 +70,9 @@ public:
transfer_interval_msec_(DefaultTransferIntervalMSec),
this_transfer_crc_(0),
buffer_write_pos_(0),
error_cnt_(0),
next_frame_index_(0),
iface_index_(IfaceIndexNotSet)
next_toggle_(false),
iface_index_(IfaceIndexNotSet),
error_cnt_(0)
{
#if UAVCAN_DEBUG
StaticAssert<sizeof(TransferReceiver) == 32>::check();

View File

@ -53,7 +53,7 @@ void TransferReceiver::updateTransferTimings()
void TransferReceiver::prepareForNextTransfer()
{
tid_.increment();
next_frame_index_ = 0;
next_toggle_ = false;
buffer_write_pos_ = 0;
}
@ -63,22 +63,22 @@ bool TransferReceiver::validate(const RxFrame& frame) const
{
return false;
}
if (frame.isFirst() && !frame.isLast() && (frame.getPayloadLen() < TransferCRC::NumBytes))
if (frame.isStartOfTransfer() && !frame.isEndOfTransfer() && (frame.getPayloadLen() < TransferCRC::NumBytes))
{
UAVCAN_TRACE("TransferReceiver", "CRC expected, %s", frame.toString().c_str());
registerError();
return false;
}
if ((frame.getIndex() == frame.getMaxIndex()) && !frame.isLast())
if (frame.isStartOfTransfer() && frame.getToggle())
{
UAVCAN_TRACE("TransferReceiver", "Unterminated transfer, %s", frame.toString().c_str());
UAVCAN_TRACE("TransferReceiver", "Toggle bit is not cleared, %s", frame.toString().c_str());
registerError();
return false;
}
if (frame.getIndex() != next_frame_index_)
if (frame.getToggle() != next_toggle_)
{
UAVCAN_TRACE("TransferReceiver", "Unexpected frame index (not %i), %s",
int(next_frame_index_), frame.toString().c_str());
UAVCAN_TRACE("TransferReceiver", "Unexpected toggle bit (not %i), %s",
int(next_toggle_), frame.toString().c_str());
registerError();
return false;
}
@ -96,7 +96,7 @@ bool TransferReceiver::writePayload(const RxFrame& frame, ITransferBuffer& buf)
const uint8_t* const payload = frame.getPayloadPtr();
const unsigned payload_len = frame.getPayloadLen();
if (frame.isFirst()) // First frame contains CRC, we need to extract it now
if (frame.isStartOfTransfer()) // First frame contains CRC, we need to extract it now
{
if (frame.getPayloadLen() < TransferCRC::NumBytes)
{
@ -110,7 +110,7 @@ bool TransferReceiver::writePayload(const RxFrame& frame, ITransferBuffer& buf)
const bool success = res == static_cast<int>(effective_payload_len);
if (success)
{
buffer_write_pos_ = static_cast<uint16_t>(buffer_write_pos_ + effective_payload_len) & BufferWritePosMask;
buffer_write_pos_ = static_cast<uint16_t>(buffer_write_pos_ + effective_payload_len);
}
return success;
}
@ -120,7 +120,7 @@ bool TransferReceiver::writePayload(const RxFrame& frame, ITransferBuffer& buf)
const bool success = res == static_cast<int>(payload_len);
if (success)
{
buffer_write_pos_ = static_cast<uint16_t>(buffer_write_pos_ + payload_len) & BufferWritePosMask;
buffer_write_pos_ = static_cast<uint16_t>(buffer_write_pos_ + payload_len);
}
return success;
}
@ -129,13 +129,13 @@ bool TransferReceiver::writePayload(const RxFrame& frame, ITransferBuffer& buf)
TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame, TransferBufferAccessor& tba)
{
// Transfer timestamps are derived from the first frame
if (frame.isFirst())
if (frame.isStartOfTransfer())
{
this_transfer_ts_ = frame.getMonotonicTimestamp();
first_frame_ts_ = frame.getUtcTimestamp();
}
if (frame.isFirst() && frame.isLast())
if (frame.isStartOfTransfer() && frame.isEndOfTransfer())
{
tba.remove();
updateTransferTimings();
@ -165,9 +165,9 @@ TransferReceiver::ResultCode TransferReceiver::receive(const RxFrame& frame, Tra
registerError();
return ResultNotComplete;
}
next_frame_index_++;
next_toggle_ = !next_toggle_;
if (frame.isLast())
if (frame.isEndOfTransfer())
{
updateTransferTimings();
prepareForNextTransfer();
@ -198,7 +198,7 @@ TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame, Tr
const bool not_initialized = !isInitialized();
const bool receiver_timed_out = isTimedOut(frame.getMonotonicTimestamp());
const bool same_iface = frame.getIfaceIndex() == iface_index_;
const bool first_fame = frame.isFirst();
const bool first_fame = frame.isStartOfTransfer();
const TidRelation tid_rel = getTidRelation(frame);
const bool iface_timed_out =
(frame.getMonotonicTimestamp() - this_transfer_ts_).toUSec() > (int64_t(transfer_interval_msec_) * 1000 * 2);
@ -224,7 +224,7 @@ TransferReceiver::ResultCode TransferReceiver::addFrame(const RxFrame& frame, Tr
tba.remove();
iface_index_ = frame.getIfaceIndex() & IfaceIndexMask;
tid_ = frame.getTransferID();
next_frame_index_ = 0;
next_toggle_ = false;
buffer_write_pos_ = 0;
this_transfer_crc_ = 0;
if (!first_fame)