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
@@ -45,7 +45,7 @@ public:
MonotonicDuration max_transfer_interval = getDefaultMaxTransferInterval()) MonotonicDuration max_transfer_interval = getDefaultMaxTransferInterval())
: max_transfer_interval_(max_transfer_interval) : max_transfer_interval_(max_transfer_interval)
, dispatcher_(dispatcher) , dispatcher_(dispatcher)
, priority_(TransferPriorityNormal) , priority_(TransferPriority::Default)
, qos_(CanTxQueue::Qos()) , qos_(CanTxQueue::Qos())
, flags_(CanIOFlags(0)) , flags_(CanIOFlags(0))
, iface_mask_(AllIfacesMask) , iface_mask_(AllIfacesMask)
@@ -57,7 +57,7 @@ public:
TransferSender(Dispatcher& dispatcher, MonotonicDuration max_transfer_interval = getDefaultMaxTransferInterval()) TransferSender(Dispatcher& dispatcher, MonotonicDuration max_transfer_interval = getDefaultMaxTransferInterval())
: max_transfer_interval_(max_transfer_interval) : max_transfer_interval_(max_transfer_interval)
, dispatcher_(dispatcher) , dispatcher_(dispatcher)
, priority_(TransferPriorityNormal) , priority_(TransferPriority::Default)
, qos_(CanTxQueue::Qos()) , qos_(CanTxQueue::Qos())
, flags_(CanIOFlags(0)) , flags_(CanIOFlags(0))
, iface_mask_(AllIfacesMask) , iface_mask_(AllIfacesMask)
@@ -78,22 +78,8 @@ public:
iface_mask_ = iface_mask; 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_; } TransferPriority getPriority() const { return priority_; }
void setPriority(TransferPriority prio) void setPriority(TransferPriority prio) { priority_ = prio; }
{
if (prio < NumTransferPriorities && prio != TransferPriorityService)
{
priority_ = prio;
}
else
{
UAVCAN_ASSERT(0);
}
}
/** /**
* Anonymous transfers (i.e. transfers that don't carry a valid Source Node ID) can be sent if * Anonymous transfers (i.e. transfers that don't carry a valid Source Node ID) can be sent if
+18 -26
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, MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id,
TransferID tid) const TransferID tid) const
{ {
if (payload_len > getMaxPayloadLenForTransferType(transfer_type)) Frame frame(data_type_id_, transfer_type, dispatcher_.getNodeID(), dst_node_id, tid);
{
return -ErrTransferTooLong; 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()); 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_ && const bool allow = allow_anonymous_transfers_ &&
(transfer_type == TransferTypeMessageBroadcast) && (transfer_type == TransferTypeMessageBroadcast) &&
(int(payload_len) <= frame.getMaxPayloadLen()); (int(payload_len) <= frame.getPayloadCapacity());
if (!allow) if (!allow)
{ {
return -ErrPassiveMode; return -ErrPassiveMode;
@@ -62,7 +55,7 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
/* /*
* Sending frames * 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); const int res = frame.setPayload(payload, payload_len);
if (res != int(payload_len)) if (res != int(payload_len))
@@ -72,8 +65,10 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
registerError(); registerError();
return (res < 0) ? res : -ErrLogic; 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_); return dispatcher_.send(frame, tx_deadline, blocking_deadline, qos_, flags_, iface_mask_);
} }
else // Multi Frame Transfer 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); UAVCAN_ASSERT(int(payload_len) > offset);
} }
int next_frame_index = 1; int num_sent = 0;
while (true) while (true)
{ {
@@ -112,11 +107,14 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
return send_res; 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); UAVCAN_ASSERT(offset >= 0);
const int write_res = frame.setPayload(payload + offset, payload_len - unsigned(offset)); 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)); UAVCAN_ASSERT(offset <= int(payload_len));
if (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, int TransferSender::send(const uint8_t* payload, unsigned payload_len, MonotonicTime tx_deadline,
MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id) const 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? * TODO: TID is not needed for anonymous transfers, this part of the code can be skipped?
*/ */