Changeset 92:6bce4856b4ba in finroc_plugins_parameters


Ignore:
Timestamp:
17.05.2020 07:49:22 (3 weeks ago)
Author:
Max Reichardt <mreichardt@…>
Branch:
17.03
Phase:
public
Message:

Allows to set parameter config entries for parameter interfaces and composite ports. All child parameters without a configuration of their own, will load config file values relative to this parent entry (if config file contains one).

Location:
internal
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • internal/tParameterInfo.cpp

    r90 r92  
    161161} 
    162162 
    163 void tParameterInfo::LoadValue(bool ignore_ready) 
    164 { 
    165   core::tAbstractPort* ann = this->GetAnnotated<core::tAbstractPort>(); 
    166   { 
    167     rrlib::thread::tLock lock(ann->GetStructureMutex()); 
    168     if (ann && (ignore_ready || ann->IsReady())) 
     163void tParameterInfo::LoadValue(bool ignore_ready, const std::string& alternative_config_entry) 
     164{ 
     165  core::tFrameworkElement* annotated = this->GetAnnotated<core::tFrameworkElement>(); 
     166  if ((!annotated) || (!(ignore_ready || annotated->IsReady()))) 
     167  { 
     168    return; 
     169  } 
     170 
     171  rrlib::thread::tLock lock(annotated->GetStructureMutex()); 
     172  if (annotated->GetFlag(core::tFrameworkElementFlag::COMPOSITE_PORT)) // == INTERFACE flag in case this is not a port 
     173  { 
     174    auto& config_entry = alternative_config_entry.length() ? alternative_config_entry : GetConfigEntry(); 
     175    if (config_entry.length()) 
     176    { 
     177      // Load values of unconfigured child parameters also 
     178      for (auto child = annotated->ChildPortsBegin(); child != annotated->ChildPortsEnd(); ++child) 
     179      { 
     180        tParameterInfo* child_info = child->GetAnnotation<tParameterInfo>(); 
     181        if (child_info && child_info->Settings().empty() && (ignore_ready || child->IsReady())) 
     182        { 
     183          child_info->LoadValue(ignore_ready, config_entry + "/" + child->GetName()); 
     184        } 
     185      } 
     186    } 
     187  } 
     188  else if (annotated->IsPort() && data_ports::IsDataFlowType(static_cast<core::tAbstractPort&>(*annotated).GetDataType())) 
     189  { 
     190    auto& abstract_port = static_cast<data_ports::common::tAbstractDataPort&>(*annotated); 
    169191    { 
    170192      // command line option 
     
    175197        if (arg.length() > 0) 
    176198        { 
    177           if (data_ports::IsDataFlowType(ann->GetDataType())) 
     199          if (data_ports::IsDataFlowType(abstract_port.GetDataType())) 
    178200          { 
    179201            rrlib::serialization::tStringInputStream sis(arg); 
    180             data_ports::tGenericPort port = data_ports::tGenericPort::Wrap(*ann); 
     202            data_ports::tGenericPort port = data_ports::tGenericPort::Wrap(abstract_port); 
    181203            data_ports::tPortDataPointer<rrlib::rtti::tGenericObject> buffer = port.GetUnusedBuffer(); 
    182204            try 
     
    186208              if (error.size() > 0) 
    187209              { 
    188                 FINROC_LOG_PRINT(WARNING, "Failed to load parameter '", ann, "' from command line argument '", arg, "': ", error); 
     210                FINROC_LOG_PRINT(WARNING, "Failed to load parameter '", abstract_port, "' from command line argument '", arg, "': ", error); 
    189211              } 
    190212              return; 
     
    192214            catch (const std::exception& e) 
    193215            { 
    194               FINROC_LOG_PRINT(ERROR, "Failed to load parameter '", ann, "' from command line argument '", arg, "': ", e); 
     216              FINROC_LOG_PRINT(ERROR, "Failed to load parameter '", abstract_port, "' from command line argument '", arg, "': ", e); 
    195217            } 
    196218          } 
     
    203225 
    204226      // config file entry 
    205       tConfigFile* cf = tConfigFile::Find(*ann); 
    206       auto& config_entry = GetConfigEntry(); 
     227      tConfigFile* cf = tConfigFile::Find(abstract_port); 
     228      auto& config_entry = alternative_config_entry.length() ? alternative_config_entry : GetConfigEntry(); 
    207229      if (cf && config_entry.length() > 0) 
    208230      { 
    209         std::string full_config_entry = tConfigNode::GetFullConfigEntry(*ann, config_entry); 
     231        std::string full_config_entry = tConfigNode::GetFullConfigEntry(abstract_port, config_entry); 
    210232        if (cf->HasEntry(full_config_entry)) 
    211233        { 
    212234#ifdef _LIB_RRLIB_XML_PRESENT_ 
    213235          rrlib::xml::tNode& node = cf->GetEntry(full_config_entry, false); 
    214           if (data_ports::IsDataFlowType(ann->GetDataType())) 
    215           { 
    216             data_ports::tGenericPort port = data_ports::tGenericPort::Wrap(*ann); 
     236          if (data_ports::IsDataFlowType(abstract_port.GetDataType())) 
     237          { 
     238            data_ports::tGenericPort port = data_ports::tGenericPort::Wrap(abstract_port); 
    217239            data_ports::tPortDataPointer<rrlib::rtti::tGenericObject> buffer = port.GetUnusedBuffer(); 
    218240 
     
    223245              if (error.size() > 0) 
    224246              { 
    225                 FINROC_LOG_PRINT(WARNING, "Failed to load parameter '", ann, "' from config entry '", full_config_entry, "': ", error); 
     247                FINROC_LOG_PRINT(WARNING, "Failed to load parameter '", abstract_port, "' from config entry '", full_config_entry, "': ", error); 
    226248              } 
    227249              return; 
     
    229251            catch (const std::exception& e) 
    230252            { 
    231               FINROC_LOG_PRINT(ERROR, "Failed to load parameter '", ann, "' from config entry '", full_config_entry, "': ", e); 
     253              FINROC_LOG_PRINT(ERROR, "Failed to load parameter '", abstract_port, "' from config entry '", full_config_entry, "': ", e); 
    232254            } 
    233255          } 
     
    244266      if (finstruct_default.length() > 0) 
    245267      { 
    246         if (data_ports::IsDataFlowType(ann->GetDataType())) 
     268        if (data_ports::IsDataFlowType(abstract_port.GetDataType())) 
    247269        { 
    248270          rrlib::serialization::tStringInputStream sis(finstruct_default); 
    249           data_ports::tGenericPort port = data_ports::tGenericPort::Wrap(*ann); 
     271          data_ports::tGenericPort port = data_ports::tGenericPort::Wrap(abstract_port); 
    250272          data_ports::tPortDataPointer<rrlib::rtti::tGenericObject> buffer = port.GetUnusedBuffer(); 
    251273 
     
    256278            if (error.size() > 0) 
    257279            { 
    258               FINROC_LOG_PRINT(WARNING, "Failed to load parameter '", ann, "' from finstruct default '", finstruct_default, "': ", error); 
     280              FINROC_LOG_PRINT(WARNING, "Failed to load parameter '", abstract_port, "' from finstruct default '", finstruct_default, "': ", error); 
    259281            } 
    260282            return; 
     
    262284          catch (const std::exception& e) 
    263285          { 
    264             FINROC_LOG_PRINT(ERROR, "Failed to load parameter '", ann, "' from finstruct default '", finstruct_default, "': ", e); 
     286            FINROC_LOG_PRINT(ERROR, "Failed to load parameter '", abstract_port, "' from finstruct default '", finstruct_default, "': ", e); 
    265287          } 
    266288        } 
  • internal/tParameterInfo.h

    r89 r92  
    103103 
    104104  /*! 
     105   * Clear all settings 
     106   */ 
     107  void ClearSettings() 
     108  { 
     109    settings.clear(); 
     110  } 
     111 
     112  /*! 
    105113   * \return Command line option to set this parameter 
    106114   * (set by outer-most finstructable group) 
     
    146154   * 
    147155   * \param ignore_ready Ignore ready flag? 
    148    */ 
    149   void LoadValue(bool ignore_ready = false); 
     156   * \param alternative_config_entry If set, this config entry is used for loading (instead of any set in this object) 
     157   */ 
     158  void LoadValue(bool ignore_ready = false, const std::string& alternative_config_entry = ""); 
    150159 
    151160  /*! 
Note: See TracChangeset for help on using the changeset viewer.