TransferSender is now capable of broadcasting in passive mode; Frame::isValid() was modified to accept SFT broadcasts with zero SNID

This commit is contained in:
Pavel Kirienko
2015-04-05 11:51:58 +03:00
parent 38c6a0d7ac
commit b4d93df450
7 changed files with 67 additions and 8 deletions
+25 -3
View File
@@ -19,15 +19,37 @@ int TransferSender::send(const uint8_t* payload, unsigned payload_len, Monotonic
MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id,
TransferID tid)
{
if (payload_len > MaxTransferPayloadLen)
{
UAVCAN_ASSERT(0);
return -ErrInvalidParam;
}
Frame frame(data_type_.getID(), transfer_type, dispatcher_.getNodeID(), dst_node_id, 0, tid);
UAVCAN_TRACE("TransferSender", "%s", frame.toString().c_str());
/*
* Checking if we're allowed to send. In passive mode we can send only if:
* - Passive broadcasting is enabled
* - Transfer type is broadcast
* - Transfer payload fits one CAN frame
*/
if (dispatcher_.isPassiveMode())
{
return -ErrPassiveMode;
const bool allow = allow_broadcasting_in_passive_mode_ &&
(transfer_type == TransferTypeMessageBroadcast) &&
(int(payload_len) <= frame.getMaxPayloadLen());
if (!allow)
{
return -ErrPassiveMode;
}
}
dispatcher_.getTransferPerfCounter().addTxTransfer();
Frame frame(data_type_.getID(), transfer_type, dispatcher_.getNodeID(), dst_node_id, 0, tid);
/*
* Sending frames
*/
if (frame.getMaxPayloadLen() >= int(payload_len)) // Single Frame Transfer
{
const int res = frame.setPayload(payload, payload_len);