TransferSender updated; build is still broken

This commit is contained in:
Pavel Kirienko 2015-06-29 19:13:47 +03:00
parent 350761fa7a
commit a565a9025e
2 changed files with 21 additions and 43 deletions

View File

@ -45,7 +45,7 @@ public:
MonotonicDuration max_transfer_interval = getDefaultMaxTransferInterval())
: max_transfer_interval_(max_transfer_interval)
, dispatcher_(dispatcher)
, priority_(TransferPriorityNormal)
, priority_(TransferPriority::Default)
, qos_(CanTxQueue::Qos())
, flags_(CanIOFlags(0))
, iface_mask_(AllIfacesMask)
@ -57,7 +57,7 @@ public:
TransferSender(Dispatcher& dispatcher, MonotonicDuration max_transfer_interval = getDefaultMaxTransferInterval())
: max_transfer_interval_(max_transfer_interval)
, dispatcher_(dispatcher)
, priority_(TransferPriorityNormal)
, priority_(TransferPriority::Default)
, qos_(CanTxQueue::Qos())
, flags_(CanIOFlags(0))
, iface_mask_(AllIfacesMask)
@ -78,22 +78,8 @@ public:
iface_mask_ = iface_mask;
}
/**
* Transfer priority can be assigned only for message transfers.
* Attempt to change priority of a service transfer will not have any effect.
*/
TransferPriority getPriority() const { return priority_; }
void setPriority(TransferPriority prio)
{
if (prio < NumTransferPriorities && prio != TransferPriorityService)
{
priority_ = prio;
}
else
{
UAVCAN_ASSERT(0);
}
}
void setPriority(TransferPriority prio) { priority_ = prio; }
/**
* Anonymous transfers (i.e. transfers that don't carry a valid Source Node ID) can be sent if

View File

@ -28,18 +28,11 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id,
TransferID tid) const
{
if (payload_len > getMaxPayloadLenForTransferType(transfer_type))
{
return -ErrTransferTooLong;
}
Frame frame(data_type_id_, transfer_type, dispatcher_.getNodeID(), dst_node_id, tid);
frame.setPriority(priority_);
frame.setStartOfTransfer(true);
Frame frame(data_type_id_, transfer_type, dispatcher_.getNodeID(), dst_node_id, 0, tid);
if (transfer_type == TransferTypeMessageBroadcast ||
transfer_type == TransferTypeMessageUnicast)
{
UAVCAN_ASSERT(priority_ != TransferPriorityService);
frame.setPriority(priority_);
}
UAVCAN_TRACE("TransferSender", "%s", frame.toString().c_str());
/*
@ -50,7 +43,7 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
{
const bool allow = allow_anonymous_transfers_ &&
(transfer_type == TransferTypeMessageBroadcast) &&
(int(payload_len) <= frame.getMaxPayloadLen());
(int(payload_len) <= frame.getPayloadCapacity());
if (!allow)
{
return -ErrPassiveMode;
@ -62,7 +55,7 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
/*
* Sending frames
*/
if (frame.getMaxPayloadLen() >= int(payload_len)) // Single Frame Transfer
if (frame.getPayloadCapacity() >= payload_len) // Single Frame Transfer
{
const int res = frame.setPayload(payload, payload_len);
if (res != int(payload_len))
@ -72,8 +65,10 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
registerError();
return (res < 0) ? res : -ErrLogic;
}
frame.makeLast();
UAVCAN_ASSERT(frame.isLast() && frame.isFirst());
frame.setEndOfTransfer(true);
UAVCAN_ASSERT(frame.isStartOfTransfer() && frame.isEndOfTransfer() && !frame.getToggle());
return dispatcher_.send(frame, tx_deadline, blocking_deadline, qos_, flags_, iface_mask_);
}
else // Multi Frame Transfer
@ -101,7 +96,7 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
UAVCAN_ASSERT(int(payload_len) > offset);
}
int next_frame_index = 1;
int num_sent = 0;
while (true)
{
@ -112,11 +107,14 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
return send_res;
}
if (frame.isLast())
num_sent++;
if (frame.isEndOfTransfer())
{
return next_frame_index; // Number of frames transmitted
return num_sent; // Number of frames transmitted
}
frame.setIndex(next_frame_index++);
frame.setStartOfTransfer(false);
frame.flipToggle();
UAVCAN_ASSERT(offset >= 0);
const int write_res = frame.setPayload(payload + offset, payload_len - unsigned(offset));
@ -131,7 +129,7 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
UAVCAN_ASSERT(offset <= int(payload_len));
if (offset >= int(payload_len))
{
frame.makeLast();
frame.setEndOfTransfer(true);
}
}
}
@ -143,12 +141,6 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
int TransferSender::send(const uint8_t* payload, unsigned payload_len, MonotonicTime tx_deadline,
MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id) const
{
// This check must be performed before TID is incremented to avoid skipping TID values on failures
if (payload_len > getMaxPayloadLenForTransferType(transfer_type))
{
return -ErrTransferTooLong;
}
/*
* TODO: TID is not needed for anonymous transfers, this part of the code can be skipped?
*/