int TransferSender::send(const uint8_t* payload, unsigned payload_len, MonotonicTime tx_deadline, MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id) const { /* * TODO: TID is not needed for anonymous transfers, this part of the code can be skipped? */ const OutgoingTransferRegistryKey otr_key(data_type_id_, transfer_type, dst_node_id); UAVCAN_ASSERT(!tx_deadline.isZero()); const MonotonicTime otr_deadline = tx_deadline + max(max_transfer_interval_ * 2, OutgoingTransferRegistry::MinEntryLifetime); TransferID* const tid = dispatcher_.getOutgoingTransferRegistry().accessOrCreate(otr_key, otr_deadline); if (tid == UAVCAN_NULLPTR) { UAVCAN_TRACE("TransferSender", "OTR access failure, dtid=%d tt=%i", int(data_type_id_.get()), int(transfer_type)); return -ErrMemory; } const TransferID this_tid = tid->get(); tid->increment(); return send(payload, payload_len, tx_deadline, blocking_deadline, transfer_type, dst_node_id, this_tid); }
void TransferReceiver::updateTransferTimings() { UAVCAN_ASSERT(!this_transfer_ts_.isZero()); const MonotonicTime prev_prev_ts = prev_transfer_ts_; prev_transfer_ts_ = this_transfer_ts_; if ((!prev_prev_ts.isZero()) && (!prev_transfer_ts_.isZero()) && (prev_transfer_ts_ >= prev_prev_ts)) { uint64_t interval_usec = uint64_t((prev_transfer_ts_ - prev_prev_ts).toUSec()); interval_usec = min(interval_usec, uint64_t(MaxTransferIntervalUSec)); interval_usec = max(interval_usec, uint64_t(MinTransferIntervalUSec)); transfer_interval_usec_ = static_cast<uint32_t>((uint64_t(transfer_interval_usec_) * 7 + interval_usec) / 8); } }
int TransferSender::send(const uint8_t* payload, int payload_len, MonotonicTime tx_deadline, MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id) { const OutgoingTransferRegistryKey otr_key(data_type_.getID(), transfer_type, dst_node_id); assert(!tx_deadline.isZero()); const MonotonicTime otr_deadline = tx_deadline + max_transfer_interval_; TransferID* const tid = dispatcher_.getOutgoingTransferRegistry().accessOrCreate(otr_key, otr_deadline); if (tid == NULL) { UAVCAN_TRACE("TransferSender", "OTR access failure, dtd=%s tt=%i", data_type_.toString().c_str(), int(transfer_type)); return -ErrMemory; } const TransferID this_tid = tid->get(); tid->increment(); return send(payload, payload_len, tx_deadline, blocking_deadline, transfer_type, dst_node_id, this_tid); }