mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-30 05:53:35 +08:00
TransferSender updated; build is still broken
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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?
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user