diff --git a/contrib/ecalhdf5/include/ecalhdf5/eh5_meas.h b/contrib/ecalhdf5/include/ecalhdf5/eh5_meas.h index d13e08165..d728ab1b7 100644 --- a/contrib/ecalhdf5/include/ecalhdf5/eh5_meas.h +++ b/contrib/ecalhdf5/include/ecalhdf5/eh5_meas.h @@ -63,15 +63,21 @@ namespace eCAL ~HDF5Meas(); /** - * @brief Copy operator + * @brief Copy constructor deleted **/ HDF5Meas(const HDF5Meas& other) = delete; + /** + * @brief Move assignemnt deleted + **/ HDF5Meas& operator=(const HDF5Meas& other) = delete; /** - * @brief Move operator + * @brief Move constructor **/ HDF5Meas(HDF5Meas&&) = default; + /** + * @brief Move assignment + **/ HDF5Meas& operator=(HDF5Meas&&) = default; /** diff --git a/contrib/ecalhdf5/include/ecalhdf5/eh5_types.h b/contrib/ecalhdf5/include/ecalhdf5/eh5_types.h index 044ec51e9..4afe8164e 100644 --- a/contrib/ecalhdf5/include/ecalhdf5/eh5_types.h +++ b/contrib/ecalhdf5/include/ecalhdf5/eh5_types.h @@ -39,7 +39,6 @@ namespace eCAL const std::string kFileVerAttrTitle ("Version"); const std::string kTimestampAttrTitle ("Timestamps"); const std::string kChnAttrTitle ("Channels"); - //!< @endcond /** * @brief Info struct for a single measurement entry diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 58c108b2b..d040f6abb 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -99,6 +99,7 @@ set(DOXYGEN_FILE_PATTERNS "*.h") set(DOXYGEN_RECURSIVE NO) set(DOXYGEN_OUTPUT_DIRECTORY ${DOC_SOURCE_DIRECTORY}) set(DOXYGEN_XML_OUTPUT ${DOC_SOURCE_DIRECTORY}/_doxygen) +set(DOXYGEN_DISTRIBUTE_GROUP_DOC NO) # Allow @experimental to be used in headers to mark an API as experimental and add it to a list of # experimental APIs. diff --git a/ecal/core/include/ecal/ecal_config.h b/ecal/core/include/ecal/ecal_config.h index 626baa8a8..40f49e861 100644 --- a/ecal/core/include/ecal/ecal_config.h +++ b/ecal/core/include/ecal/ecal_config.h @@ -25,6 +25,7 @@ #include +//@{ namespace eCAL { namespace Config @@ -133,3 +134,4 @@ namespace eCAL } } } +//@} \ No newline at end of file diff --git a/ecal/core/include/ecal/ecal_deprecate.h b/ecal/core/include/ecal/ecal_deprecate.h index 64c3c2ebe..0debb4f39 100644 --- a/ecal/core/include/ecal/ecal_deprecate.h +++ b/ecal/core/include/ecal/ecal_deprecate.h @@ -27,32 +27,32 @@ #include #if ECAL_VERSION_INTEGER >= ECAL_VERSION_CALCULATE(5, 4, 0) -#define ECAL_DEPRECATE_SINCE_5_4(__message__) [[deprecated(__message__)]] +#define ECAL_DEPRECATE_SINCE_5_4(__message__) [[deprecated(__message__)]] //!< Deprecate the following function with eCAL Version 5.4.0 #else -#define ECAL_DEPRECATE_SINCE_5_4(__message__) +#define ECAL_DEPRECATE_SINCE_5_4(__message__) //!< Deprecate the following function with eCAL Version 5.4.0 #endif #if ECAL_VERSION_INTEGER >= ECAL_VERSION_CALCULATE(5, 10, 0) -#define ECAL_DEPRECATE_SINCE_5_10(__message__) [[deprecated(__message__)]] +#define ECAL_DEPRECATE_SINCE_5_10(__message__) [[deprecated(__message__)]] //!< Deprecate the following function with eCAL Version 5.10.0 #else -#define ECAL_DEPRECATE_SINCE_5_10(__message__) +#define ECAL_DEPRECATE_SINCE_5_10(__message__) //!< Deprecate the following function with eCAL Version 5.10.0 #endif #if ECAL_VERSION_INTEGER >= ECAL_VERSION_CALCULATE(5, 11, 0) -#define ECAL_DEPRECATE_SINCE_5_11(__message__) [[deprecated(__message__)]] +#define ECAL_DEPRECATE_SINCE_5_11(__message__) [[deprecated(__message__)]] //!< Deprecate the following function with eCAL Version 5.11.0 #else -#define ECAL_DEPRECATE_SINCE_5_11(__message__) +#define ECAL_DEPRECATE_SINCE_5_11(__message__) //!< Deprecate the following function with eCAL Version 5.11.0 #endif #if ECAL_VERSION_INTEGER >= ECAL_VERSION_CALCULATE(5, 12, 0) -#define ECAL_DEPRECATE_SINCE_5_12(__message__) [[deprecated(__message__)]] +#define ECAL_DEPRECATE_SINCE_5_12(__message__) [[deprecated(__message__)]] //!< Deprecate the following function with eCAL Version 5.12.0 #else -#define ECAL_DEPRECATE_SINCE_5_12(__message__) +#define ECAL_DEPRECATE_SINCE_5_12(__message__) //!< Deprecate the following function with eCAL Version 5.12.0 #endif #if ECAL_VERSION_INTEGER >= ECAL_VERSION_CALCULATE(5, 13, 0) -#define ECAL_DEPRECATE_SINCE_5_13(__message__) [[deprecated(__message__)]] +#define ECAL_DEPRECATE_SINCE_5_13(__message__) [[deprecated(__message__)]] //!< Deprecate the following function with eCAL Version 5.13.0 #else -#define ECAL_DEPRECATE_SINCE_5_13(__message__) +#define ECAL_DEPRECATE_SINCE_5_13(__message__) //!< Deprecate the following function with eCAL Version 5.13.0 #endif diff --git a/ecal/core/include/ecal/ecal_log_level.h b/ecal/core/include/ecal/ecal_log_level.h index 52facccf4..532844ef2 100644 --- a/ecal/core/include/ecal/ecal_log_level.h +++ b/ecal/core/include/ecal/ecal_log_level.h @@ -41,7 +41,4 @@ enum eCAL_Logging_eLogLevel log_level_debug4 = 128, }; -/* -* @brief This type is to be used as a bitmask for the activated logging levels -*/ -typedef char eCAL_Logging_Filter; \ No newline at end of file +typedef char eCAL_Logging_Filter; //!< This type is to be used as a bitmask for the activated logging levels \ No newline at end of file diff --git a/ecal/core/include/ecal/ecal_publisher.h b/ecal/core/include/ecal/ecal_publisher.h index 1a88fc305..8dce53e11 100644 --- a/ecal/core/include/ecal/ecal_publisher.h +++ b/ecal/core/include/ecal/ecal_publisher.h @@ -71,8 +71,8 @@ namespace eCAL { public: - ECAL_API static constexpr long long DEFAULT_TIME_ARGUMENT = -1; - ECAL_API static constexpr long long DEFAULT_ACKNOWLEDGE_ARGUMENT = -1; + ECAL_API static constexpr long long DEFAULT_TIME_ARGUMENT = -1; /*!< Use DEFAULT_TIME_ARGUMENT in the `Send()` function to let eCAL determine the send timestamp */ + ECAL_API static constexpr long long DEFAULT_ACKNOWLEDGE_ARGUMENT = -1; /*!< Use DEFAULT_ACKNOWLEDGE_ARGUMENT in the `Send()` function to let eCAL determine from configuration if the send operation needs to be acknowledged. */ /** * @brief Constructor. @@ -101,7 +101,6 @@ namespace eCAL * @brief Constructor. * * @param topic_name_ Unique topic name. - * @param topic_info_ Topic information (encoding, type, descriptor) **/ ECAL_API CPublisher(const std::string& topic_name_); @@ -156,7 +155,6 @@ namespace eCAL * @brief Creates this object. * * @param topic_name_ Unique topic name. - * @param topic_info_ Topic information (encoding, type, descriptor) * * @return True if it succeeds, false if it fails. **/ diff --git a/ecal/core/include/ecal/ecal_types.h b/ecal/core/include/ecal/ecal_types.h index ffd338744..2ec952c9b 100644 --- a/ecal/core/include/ecal/ecal_types.h +++ b/ecal/core/include/ecal/ecal_types.h @@ -18,7 +18,7 @@ */ /** - * @file topic_information.h + * @file ecal_types.h * @brief This file contains type definitions for information associated with a given topic **/ @@ -37,6 +37,7 @@ namespace eCAL std::string encoding; //!< encoding of the datatype (e.g. protobuf, flatbuffers, capnproto) std::string descriptor; //!< descriptor information of the datatype (necessary for reflection) + //!< @cond bool operator==(const SDataTypeInformation& other) const { return name == other.name && encoding == other.encoding && descriptor == other.descriptor; @@ -46,6 +47,7 @@ namespace eCAL { return !(*this == other); } + //!< @endcond }; /** @@ -56,6 +58,7 @@ namespace eCAL { SDataTypeInformation topic_type; //!< Data type description of the topic + //!< @cond bool operator==(const STopicInformation& other) const { return topic_type == other.topic_type; @@ -65,6 +68,7 @@ namespace eCAL { return !(*this == other); } + //!< @endcond }; /** @@ -76,6 +80,7 @@ namespace eCAL SDataTypeInformation request_type; //!< Data type description of the request SDataTypeInformation response_type; //!< Data type description of the response + //!< @cond bool operator==(const SServiceMethodInformation& other) const { return request_type == other.request_type && response_type == other.response_type; @@ -85,6 +90,7 @@ namespace eCAL { return !(*this == other); } + //!< @endcond }; } diff --git a/ecal/core/include/ecal/ecal_util.h b/ecal/core/include/ecal/ecal_util.h index 7f534d966..f47af149d 100644 --- a/ecal/core/include/ecal/ecal_util.h +++ b/ecal/core/include/ecal/ecal_util.h @@ -18,7 +18,7 @@ */ /** - * @file ecal_util.h + * @file * @brief eCAL utility interface **/ @@ -35,6 +35,7 @@ #include #include + namespace eCAL { namespace Util @@ -166,7 +167,7 @@ namespace eCAL * * @return True if succeeded. **/ - ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API bool GetTopicTypeName(const std::string& topic_name_, std::string& topic_type_); /** @@ -176,7 +177,7 @@ namespace eCAL * * @return Topic type name. **/ - ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API std::string GetTopicTypeName(const std::string& topic_name_); /** @@ -187,7 +188,7 @@ namespace eCAL * * @return True if succeeded. **/ - ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the descriptor from the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the descriptor from the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API bool GetTopicDescription(const std::string& topic_name_, std::string& topic_desc_); /** @@ -197,7 +198,7 @@ namespace eCAL * * @return Topic description. **/ - ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the descriptor from the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the descriptor from the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API std::string GetTopicDescription(const std::string& topic_name_); /** @@ -252,39 +253,39 @@ namespace eCAL /** * @brief Gets type name of the specified topic. * - * This function is deprecated with eCAL 5.10. Please use GetDataTypeInformation. + * This function is deprecated with eCAL 5.10. Please use GetTopicDataTypeInformation. * * @param topic_name_ Topic name. * @param topic_type_ String to store type name. * * @return True if succeeded. **/ - ECAL_DEPRECATE_SINCE_5_10("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_10("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API bool GetTypeName(const std::string& topic_name_, std::string& topic_type_); /** * @brief Gets type name of the specified topic. * - * This function is deprecated with eCAL 5.10. Please use GetDataTypeInformation. + * This function is deprecated with eCAL 5.10. Please use GetTopicDataTypeInformation. * * @param topic_name_ Topic name. * * @return Topic type name. **/ - ECAL_DEPRECATE_SINCE_5_10("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_10("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API std::string GetTypeName(const std::string& topic_name_); /** * @brief Gets description of the specified topic. * - * This function is deprecated with eCAL 5.10. Please use GetDataTypeInformation. + * This function is deprecated with eCAL 5.10. Please use GetTopicDataTypeInformation. * * @param topic_name_ Topic name. * @param topic_desc_ String to store description. * * @return True if succeeded. **/ - ECAL_DEPRECATE_SINCE_5_10("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_10("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API bool GetDescription(const std::string& topic_name_, std::string& topic_desc_); /** @@ -296,13 +297,13 @@ namespace eCAL * * @return Topic description. **/ - ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") + ECAL_DEPRECATE_SINCE_5_13("Please use the method bool GetTopicDataTypeInformation(const std::string& topic_name_, SDataTypeInformation& topic_info_) instead. You can extract the type information from the members encoding and type of the STopicInformation variable. This function will be removed in eCAL6.") ECAL_API std::string GetDescription(const std::string& topic_name_); /** * @brief Splits the topic type (eCAL < 5.12) into encoding and types (>= eCAL 5.12) * - * @param topictype_name_ "Old" typename. + * @param combined_topic_type_ "Old" typename. * * @return std::pair(encoding, typename). **/ @@ -317,6 +318,5 @@ namespace eCAL * @return "Old" typename. ( encoding:typename ). **/ ECAL_API std::string CombinedTopicEncodingAndType(const std::string& topic_encoding_, const std::string& topic_type_); - } } diff --git a/ecal/core/include/ecal/msg/publisher.h b/ecal/core/include/ecal/msg/publisher.h index bcd8026a6..1d19f89fe 100644 --- a/ecal/core/include/ecal/msg/publisher.h +++ b/ecal/core/include/ecal/msg/publisher.h @@ -47,17 +47,20 @@ namespace eCAL { public: /** - * @brief Constructor. + * @brief Default Constructor. + * Using this constructor, the object is not actually in a usable state. + * Before being able to send data, one has to call the `Create()` function, first. **/ CMsgPublisher() : CPublisher() { } /** - * @brief Constructor. + * @brief Constructor, that automatically intializes the Publisher. + * This function will be deprecated with eCAL 5.13, please use one of other constructors instead. * * @param topic_name_ Unique topic name. - * @param topic_type_ Type name (optional for type checking). + * @param topic_type_ Type name. * @param topic_desc_ Type description (optional for description checking). **/ ECAL_DEPRECATE_SINCE_5_13("Please use the constructor CMsgPublisher(const std::string& topic_name_, const SDataTypeInformation& topic_info_) instead. This function will be removed in eCAL6. ") @@ -65,10 +68,23 @@ namespace eCAL { } + /** + * @brief Constructor, that automatically intializes the Publisher. + * This should be the preferred constructor. + * + * @param topic_name_ Unique topic name. + * @param topic_info_ Struct that contains information of the datatype (name, encoding, description) of the topic. + **/ CMsgPublisher(const std::string& topic_name_, const SDataTypeInformation& topic_info_) : CPublisher(topic_name_, topic_info_) { } + /** + * @brief Constructor, that automatically intializes the Publisher. + * If no datatype information about the topic is available, this constructor can be used. + * + * @param topic_name_ Unique topic name. + **/ CMsgPublisher(const std::string& topic_name_) : CMsgPublisher(topic_name_, GetDataTypeInformation()) { } diff --git a/ecal/core/src/ecal_util.cpp b/ecal/core/src/ecal_util.cpp index b4d72147f..df8806be9 100644 --- a/ecal/core/src/ecal_util.cpp +++ b/ecal/core/src/ecal_util.cpp @@ -17,10 +17,6 @@ * ========================= eCAL LICENSE ================================= */ -/** - * @brief eCAL utility functions -**/ - #include #include #include @@ -45,11 +41,6 @@ namespace eCAL { - /** - * @brief Return the eCAL process state. - * - * @return True if eCAL is in proper state. - **/ bool Ok() { return(g_shutdown == 0); @@ -72,11 +63,6 @@ namespace eCAL return(monitoring); } - /** - * @brief Send shutdown event to specified local user process using it's process name. - * - * @param process_name_ Fully qualified process name (including the absolute path) - **/ void ShutdownProcess(const std::string& process_name_) { const eCAL::pb::Monitoring monitoring = GetMonitoring(); @@ -101,11 +87,6 @@ namespace eCAL } } - /** - * @brief Send shutdown event to specified local user process using it's process id. - * - * @param process_id_ Process id. - **/ void ShutdownProcess(const int process_id_) { const std::string event_name = EVENT_SHUTDOWN_PROC + std::string("_") + std::to_string(process_id_); @@ -118,9 +99,6 @@ namespace eCAL } } - /** - * @brief Send shutdown event to all local user processes. - **/ void ShutdownProcesses() { const eCAL::pb::Monitoring monitoring = GetMonitoring(); @@ -154,9 +132,6 @@ namespace eCAL } } - /** - * @brief Send shutdown event to all core components. - **/ void ShutdownCore() { const eCAL::pb::Monitoring monitoring = GetMonitoring(); @@ -190,35 +165,16 @@ namespace eCAL } } - /** - * @brief Enable eCAL message loop back, - * that means subscriber will receive messages from - * publishers of the same process (default == false). - * - * @param Switch on message loop back.. - **/ void EnableLoopback(bool state_) { if (g_registration_receiver()) g_registration_receiver()->EnableLoopback(state_); } - /** - * @brief Enable process wide eCAL publisher topic type sharing - * that is needed for reflection on subscriber side. - * - * @param state_ Switch on type sharing - **/ void PubShareType(bool state_) { if (g_pubgate()) g_pubgate()->ShareType(state_); } - /** - * @brief Enable process wide eCAL publisher topic description sharing - * that is needed for reflection on subscriber side. - * - * @param state_ Switch on description sharing - **/ void PubShareDescription(bool state_) { if (g_pubgate()) g_pubgate()->ShareDescription(state_); @@ -230,26 +186,12 @@ namespace eCAL g_descgate()->GetTopics(topic_info_map_); } - - /** - * @brief Get all topic names. - * - * @param topic_names_ Vector to store the topic names. - **/ void GetTopicNames(std::vector& topic_names_) { if (!g_descgate()) return; g_descgate()->GetTopicNames(topic_names_); } - /** - * @brief Gets type name of the specified topic. - * - * @param topic_name_ Topic name. - * @param topic_type_ String to store type name. - * - * @return True if succeeded. - **/ // [[deprecated]] bool GetTopicTypeName(const std::string& topic_name_, std::string& topic_type_) { @@ -265,13 +207,6 @@ namespace eCAL return GetTopicTypeName(topic_name_, topic_type_); } - /** - * @brief Gets type name of the specified topic. - * - * @param topic_name_ Topic name. - * - * @return Topic type name. - **/ // [[deprecated]] std::string GetTopicTypeName(const std::string& topic_name_) { @@ -289,14 +224,6 @@ namespace eCAL return GetTopicTypeName(topic_name_); } - /** - * @brief Gets description of the specified topic. - * - * @param topic_name_ Topic name. - * @param topic_desc_ String to store description. - * - * @return True if succeeded. - **/ // [[deprecated]] bool GetTopicDescription(const std::string& topic_name_, std::string& topic_desc_) { @@ -312,13 +239,6 @@ namespace eCAL return GetTopicDescription(topic_name_, topic_desc_); } - /** - * @brief Gets description of the specified topic. - * - * @param topic_name_ Topic name. - * - * @return Topic description. - **/ // [[deprecated]] std::string GetTopicDescription(const std::string& topic_name_) { @@ -371,55 +291,24 @@ namespace eCAL } } - /** - * @brief Get complete service map (including request and response types and descriptions). - * - * @param service_info_map_ Map to store the topic informations. - * Map { (ServiceName, MethodName) -> ( (ReqType, ReqDescription), (RespType, RespDescription) ) } mapping of all currently known services. - **/ void GetServices(std::map, SServiceMethodInformation>& service_info_map_) { if (!g_descgate()) return; g_descgate()->GetServices(service_info_map_); } - /** - * @brief Get all service/method names. - * - * @param service_names_ Vector to store the service/method tuples (Vector { (ServiceName, MethodName) }). - **/ void GetServiceNames(std::vector>& service_method_names_) { if (!g_descgate()) return; g_descgate()->GetServiceNames(service_method_names_); } - /** - * @brief Gets service method request and response type names. - * - * @param service_name_ Service name. - * @param method_name_ Method name. - * @param req_type_ String to store request type. - * @param resp_type_ String to store response type. - * - * @return True if succeeded. - **/ bool GetServiceTypeNames(const std::string& service_name_, const std::string& method_name_, std::string& req_type_, std::string& resp_type_) { if (!g_descgate()) return(false); return(g_descgate()->GetServiceTypeNames(service_name_, method_name_, req_type_, resp_type_)); } - /** - * @brief Gets service method request and response descriptions. - * - * @param service_name_ Service name. - * @param method_name_ Method name. - * @param req_desc_ String to store request description. - * @param resp_desc_ String to store response description. - * - * @return True if succeeded. - **/ bool GetServiceDescription(const std::string& service_name_, const std::string& method_name_, std::string& req_desc_, std::string& resp_desc_) { if (!g_descgate()) return(false);