[Rock-dev] Modifying a complex properties from ruby

Ajish Babu ajish.babu at dfki.de
Fri Sep 5 18:24:18 CEST 2014


On 09/05/2014 03:48 PM, Sylvain Joyeux wrote:
> Could you be more specific as to the type of property.
I have the following types, in effect four nested std::vector types

    namespace ndlcom_device_driver
    {
         struct ConfigureRegisterBit {
             std::string name;
             int bit;
             bool value;t
         };

         typedef std::vector< ConfigureRegisterBit > ConfigureRegisterBits;

         struct ConfigureRegister {
             std::string name;
             representations::RegisterId id;
             double value;
             ConfigureRegisterBits bits;
             std::string valueString;
         };

         typedef std::vector< ConfigureRegister > ConfigureRegisters;

         struct DeviceClassRegister {
             std::string deviceclass;
             ConfigureRegisters registers;
         };

         typedef std::vector< DeviceClassRegister > DeviceClassRegisters;

         struct JointConfig {
             std::string jointName;
             DeviceClassRegisters configureRegisters;
         };

         typedef std::vector< JointConfig > JointsConfig;
    }

The task property is of type JointsConfig. In the ruby script I do

         joints_config = task.joints_config.to_a
         joints_config.each do | joint_config |
            configureRegisters = joint_config.configureRegisters.to_a
            configureRegisters.push(
    Types::NdlcomDeviceDriver::DeviceClassRegister.new )
            joint_config.configureRegisters = configureRegisters
         end
         task.joints_config = joints_config  # This is where it crashes

I also tried something like.

             joints_config.each do | joint |
                 joint.configureRegisters.push( 
Types::NdlcomDeviceDriver::DeviceClassRegister.new )
                 joint.configureRegisters.each do | dc |
                     dc.registers.push( 
Types::NdlcomDeviceDriver::ConfigureRegister.new )
                     dc.registers.each do | reg |
                         reg.bits.push( 
Types::NdlcomDeviceDriver::ConfigureRegisterBit.new )
                     end
                 end
             end

The difference is that then the problem is changing from crash to 
following error message.

    install/lib/ruby/1.9.1/typelib/compound_type.rb:23:in `set':
    invalidated object for
    /ndlcom_device_driver/DeviceClassRegister.registers for
    /ndlcom_device_driver/JointConfig.configureRegisters (TypeError)

Let me know if you need more info.
>
> Moreover, do you try to change the property while the component is running ?
No the task is not running.

Best
Ajish
>
> Sylvain
>
> On Thu, Sep 4, 2014 at 3:19 PM, Ajish Babu <ajish.babu at dfki.de> wrote:
>> Hi all,
>>
>> I have a complex property with std::vector (sub-configs) inside std:vector
>> (configs). I am trying to modify the property from ruby script.
>>
>> Changing any already existing value works fine. But once I try to push a new
>> element to the sub-configs and then write it back like
>>
>>              configs = task.configs.to_a
>>
>>              configs.each do | config |
>>                  sub_configs = config.sub_configs.to_a
>>                  sub_configs.push( Types::SubConfig.new )
>>                  config.sub_configs = sub_configs
>>              end
>>
>>              task.configs = configs
>>
>> it crashes. Does anybody know how this can be achieved?
>>
>> Best
>> Ajish
>>
>>
>>
>>
>> _______________________________________________
>> Rock-dev mailing list
>> Rock-dev at dfki.de
>> http://www.dfki.de/mailman/cgi-bin/listinfo/rock-dev
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.dfki.de/pipermail/rock-dev/attachments/20140905/20021402/attachment-0001.htm 


More information about the Rock-dev mailing list