diff --git a/libuavcan/dsdl_compiler/data_type_template.tmpl b/libuavcan/dsdl_compiler/data_type_template.tmpl index fb75a4855c..fab0b7b497 100644 --- a/libuavcan/dsdl_compiler/data_type_template.tmpl +++ b/libuavcan/dsdl_compiler/data_type_template.tmpl @@ -40,12 +40,14 @@ namespace ${nsc} UAVCAN_PACKED_BEGIN #endif +% if t.kind != t.KIND_SERVICE: template +% endif struct ${t.cpp_type_name} { -<%def name="generate_primary_body(typedef_name, ctor_name, max_bitlen, fields, constants)" buffered="True"> - typedef const ${typedef_name}& ParameterType; - typedef ${typedef_name}& ReferenceType; +<%def name="generate_primary_body(type_name, max_bitlen, fields, constants)" buffered="True"> + typedef const ${type_name}& ParameterType; + typedef ${type_name}& ReferenceType; <%def name="expand_attr_types(group_name, attrs)"> struct ${group_name} @@ -87,7 +89,7 @@ struct ${t.cpp_type_name} typename ::uavcan::StorageType< typename FieldTypes::${a.name} >::Type ${a.name}; % endfor - ${ctor_name}() + ${type_name}() % for idx,a in enumerate(fields): ${':' if idx == 0 else ','} ${a.name}() % endfor @@ -96,6 +98,7 @@ struct ${t.cpp_type_name} ::uavcan::StaticAssert::check(); ::uavcan::StaticAssert::check(); // Usage check + #if UAVCAN_DEBUG /* * Cross-checking MaxBitLen provided by the DSDL compiler. @@ -137,17 +140,22 @@ ${'::uavcan::TailArrayOptDisabled' if (idx + 1) < len(fields) else 'tao_mode'}); ${generate_codec_calls_per_field('decode', 'ReferenceType')} % if t.kind == t.KIND_SERVICE: - struct Request + template + struct Request_ { - ${generate_primary_body('Request', 'Request', t.get_max_bitlen_request(), t.request_fields, t.request_constants) | indent} + ${generate_primary_body('Request_', t.get_max_bitlen_request(), t.request_fields, t.request_constants) | indent} }; - struct Response + template + struct Response_ { - ${generate_primary_body('Response', 'Response', t.get_max_bitlen_response(), t.response_fields, t.response_constants) | indent} + ${generate_primary_body('Response_', t.get_max_bitlen_response(), t.response_fields, t.response_constants) | indent} }; + + typedef Request_<0> Request; + typedef Response_<0> Response; % else: - ${generate_primary_body(t.cpp_type_name + '', t.cpp_type_name, t.get_max_bitlen(), t.fields, t.constants)} + ${generate_primary_body(t.cpp_type_name, t.get_max_bitlen(), t.fields, t.constants)} % endif /* @@ -197,24 +205,28 @@ private: % for a in constants: % if not a.cpp_use_enum: template -const typename ::uavcan::StorageType< typename ${scope_prefix}::ConstantTypes::${a.name} >::Type - ${scope_prefix}::${a.name} = ${a.cpp_value}; // ${a.init_expression} +const typename ::uavcan::StorageType< typename ${scope_prefix}::ConstantTypes::${a.name} >::Type + ${scope_prefix}::${a.name} = ${a.cpp_value}; // ${a.init_expression} %endif % endfor % if t.kind == t.KIND_SERVICE: -${define_out_of_line_constants(t.cpp_type_name + '::Request', t.request_constants)} -${define_out_of_line_constants(t.cpp_type_name + '::Response', t.response_constants)} +${define_out_of_line_constants(t.cpp_type_name + '::Request_', t.request_constants)} +${define_out_of_line_constants(t.cpp_type_name + '::Response_', t.response_constants)} % else: -${define_out_of_line_constants(t.cpp_type_name + '', t.constants)} +${define_out_of_line_constants(t.cpp_type_name, t.constants)} % endif #if UAVCAN_PACK_STRUCTS UAVCAN_PACKED_END #endif +% if t.kind == t.KIND_SERVICE: +typedef ${t.cpp_type_name} ${t.short_name}; +% else: typedef ${t.cpp_type_name}<0> ${t.short_name}; +% endif % if t.has_default_dtid: namespace diff --git a/libuavcan/include/uavcan/server.hpp b/libuavcan/include/uavcan/server.hpp index 18d51658bb..f9cafebdad 100644 --- a/libuavcan/include/uavcan/server.hpp +++ b/libuavcan/include/uavcan/server.hpp @@ -18,21 +18,23 @@ class Server : public GenericSubscriber SubscriberType; - typedef GenericPublisher PublisherType; + typedef GenericSubscriber SubscriberType; + typedef GenericPublisher PublisherType; PublisherType publisher_; Callback callback_; uint32_t response_failure_count_; - typename DataType::Response response_; + ResponseType response_; - void handleReceivedDataStruct(ReceivedDataStructure& request) + void handleReceivedDataStruct(ReceivedDataStructure& request) { if (try_implicit_cast(callback_, true)) { - response_ = typename DataType::Response(); // The application needs newly initialized structure + response_ = ResponseType(); // The application needs newly initialized structure callback_(request, response_); } else diff --git a/libuavcan/test/dsdl_test/root_ns_a/3.ReportBackSoldier.uavcan b/libuavcan/test/dsdl_test/root_ns_a/3.ReportBackSoldier.uavcan index bab4623c2d..ba13284492 100644 --- a/libuavcan/test/dsdl_test/root_ns_a/3.ReportBackSoldier.uavcan +++ b/libuavcan/test/dsdl_test/root_ns_a/3.ReportBackSoldier.uavcan @@ -1,6 +1,7 @@ bool TRUE = true bool NOT_TRUE = false * true uint64 BIG = (1 << 64) - 1 +float64 FLOAT_CONSTANT = 3.14 uint8[<128] string_request --- float64 FLOAT_CONSTANT = 1.79769313486231570815e+308 diff --git a/libuavcan/test/server.cpp b/libuavcan/test/server.cpp index b7ba6e1ba7..22ab4887ae 100644 --- a/libuavcan/test/server.cpp +++ b/libuavcan/test/server.cpp @@ -16,8 +16,8 @@ struct ServerImpl ServerImpl(const char* string_response) : string_response(string_response) { } - void handleRequest(const uavcan::ReceivedDataStructure& request, - typename root_ns_a::StringService::Response& response) + void handleRequest(const uavcan::ReceivedDataStructure& request, + root_ns_a::StringService::Response& response) { std::cout << request << std::endl; response.string_response = request.string_request; @@ -27,8 +27,8 @@ struct ServerImpl } typedef uavcan::MethodBinder&, - typename root_ns_a::StringService::Response&)> Binder; + void (ServerImpl::*)(const uavcan::ReceivedDataStructure&, + root_ns_a::StringService::Response&)> Binder; Binder bind() { return Binder(this, &ServerImpl::handleRequest); } };