diff --git a/libuavcan/include/uavcan/node/service_server.hpp b/libuavcan/include/uavcan/node/service_server.hpp index d7181fd0d0..17076b4c5a 100644 --- a/libuavcan/include/uavcan/node/service_server.hpp +++ b/libuavcan/include/uavcan/node/service_server.hpp @@ -120,26 +120,26 @@ private: PublisherType publisher_; Callback callback_; uint32_t response_failure_count_; - ServiceResponseDataStructure response_; virtual void handleReceivedDataStruct(ReceivedDataStructure& request) { UAVCAN_ASSERT(request.getTransferType() == TransferTypeServiceRequest); + + ServiceResponseDataStructure response; + if (try_implicit_cast(callback_, true)) { - // The application needs newly initialized structure - response_ = ServiceResponseDataStructure(); - UAVCAN_ASSERT(response_.isResponseEnabled()); // Enabled by default - callback_(request, response_); + UAVCAN_ASSERT(response.isResponseEnabled()); // Enabled by default + callback_(request, response); } else { handleFatalError("Srv serv clbk"); } - if (response_.isResponseEnabled()) + if (response.isResponseEnabled()) { - const int res = publisher_.publish(response_, TransferTypeServiceResponse, request.getSrcNodeID(), + const int res = publisher_.publish(response, TransferTypeServiceResponse, request.getSrcNodeID(), request.getTransferID()); if (res < 0) {