Example #1
0
    def __init__(self, id, valueType, kinds, compRef, defValue=None, mode='readwrite'):
        """
        Create a new sequence property. Instances behave like list objects.

        Arguments:
          id        - The property ID
          valueType - Type of the property, must be in VALUE_TYPES, or can be struct
          compRef   - Reference to the PropertySet that owns this property
          defValue  - Default Python value for this property (default: None)
          mode      - Mode for the property, must be in MODES (default: 'readwrite')
        """
        if valueType not in SCA_TYPES and valueType != 'structSeq':
            raise('"' + str(valueType) + '"' + ' is not a valid valueType, choose from\n ' + str(SCA_TYPES))
        
        # Initialize the parent Property
        Property.__init__(self, id, type=valueType, kinds=kinds, compRef=compRef, mode=mode, action='external',
                          defValue=defValue)
        
        self.complex = False
        
        #try to set the value type in ref unless this is a sequence of structs
        if valueType != 'structSeq':
            self.valueType = valueType
            if self.valueType == "string":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.StringSeq)
            elif self.valueType == "boolean":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.BooleanSeq)
            elif self.valueType == "ulong":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.ULongSeq)
            elif self.valueType == "short":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.ShortSeq)
            elif self.valueType == "float":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.FloatSeq)
            elif self.valueType == "char":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.CharSeq)
            elif self.valueType == "octet":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.OctetSeq)
            elif self.valueType == "ushort":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.UShortSeq)
            elif self.valueType == "double":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.DoubleSeq)
            elif self.valueType == "long":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.LongSeq)
            elif self.valueType == "longlong":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.LongLongSequence)
            elif self.valueType == "ulonglong":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.UlongLongSequence) 
            elif self.valueType.find("complex") == 0:
                self.typecode = getCFSeqType(self.valueType)

                # It is important to have a means other than .find("complex")
                # to determine complexity, as in the case of a struct sequence,
                # the value of self.valueType may not be a string.
                self.complex = True
Example #2
0
   def testConfigureQuerySeqs(self):
       #######################################################################
       # Launch the component with the default execparams
       execparams = self.getPropertySet(kinds=("execparam",), modes=("readwrite", "writeonly"), includeNil=False)
       execparams = dict([(x.id, any.from_any(x.value)) for x in execparams])
       self.launch(execparams)
       
       #######################################################################
       # Simulate regular component startup
       # Verify that initialize nor configure throw errors
       self.comp_obj.initialize()
       
       values = [1,2,3,4,5]
       phrases = ['one','two','three','four','five']
       phrase = 'testing'
       octetData = struct.pack('5b', *[x for x in values]) #octet data must be packed bytes
       flags = [True, False, True, False]
       
       values_r = copy.deepcopy(values)
       values_r.reverse()
       phrases_r = copy.deepcopy(phrases)
       phrases_r.reverse()
       phrase_r = ([x for x in phrase])
       phrase_r.reverse()
       flags_r = copy.deepcopy(flags)
       flags_r.reverse()
       
       numTestRuns = 10
       for x in range(numTestRuns):    
           stringset = ossie.cf.CF.DataType(id='stringSeq', value=any.to_any(phrases))
           stringset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.StringSeq)
           self.comp_obj.configure([stringset])
             
           boolset = ossie.cf.CF.DataType(id='boolSeq', value=any.to_any(flags))  
           boolset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.BooleanSeq)
           self.comp_obj.configure([boolset])
 
           ulongset = ossie.cf.CF.DataType(id='ulongSeq', value=any.to_any(values))
           ulongset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.ULongSeq)
           self.comp_obj.configure([ulongset])
           
           shortset = ossie.cf.CF.DataType(id='shortSeq', value=any.to_any(values))
           shortset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.ShortSeq)
           self.comp_obj.configure([shortset])
           
           floatset = ossie.cf.CF.DataType(id='floatSeq', value=any.to_any(values))
           floatset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.FloatSeq)
           self.comp_obj.configure([floatset])
           
           charset = ossie.cf.CF.DataType(id='charSeq', value=any.to_any(phrase))
           charset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.CharSeq)
           self.comp_obj.configure([charset])
           
           octetset = ossie.cf.CF.DataType(id='octetSeq', value=any.to_any(octetData))
           octetset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.OctetSeq)
           self.comp_obj.configure([octetset])
           
           ushortset = ossie.cf.CF.DataType(id='ushortSeq', value=any.to_any(values))
           ushortset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.UShortSeq)
           self.comp_obj.configure([ushortset])
           
           doubleset = ossie.cf.CF.DataType(id='doubleSeq', value=any.to_any(values))
           doubleset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.DoubleSeq)
           self.comp_obj.configure([doubleset])
           
           longset = ossie.cf.CF.DataType(id='longSeq', value=any.to_any(values))
           longset.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.LongSeq)
           self.comp_obj.configure([longset])
           
           longlongset = ossie.cf.CF.DataType(id='longlongSeq', value=any.to_any(values))
           longlongset.value._t = tcInternal.typeCodeFromClassOrRepoId(PortTypes.LongLongSequence)
           self.comp_obj.configure([longlongset])
           
           ulonglongset = ossie.cf.CF.DataType(id='ulonglongSeq', value=any.to_any(values))
           ulonglongset.value._t = tcInternal.typeCodeFromClassOrRepoId(PortTypes.UlongLongSequence)
           self.comp_obj.configure([ulonglongset])
   
           simple_list = self.comp_obj.query([
                                      ossie.cf.CF.DataType(id=str('stringSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('boolSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('ulongSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('shortSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('floatSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('charSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('octetSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('ushortSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('doubleSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('longSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('longlongSeq'),value=any.to_any(None)),
                                      ossie.cf.CF.DataType(id=str('ulonglongSeq'),value=any.to_any(None))
                                           ])         
           
           simple_dict = properties.props_to_dict(simple_list)
           
           #the onconfigure for the stringSeq is supposed to reverse the order of the phrases
           self.assertEquals(simple_dict['stringSeq'], phrases_r, msg=str(simple_dict['stringSeq']) + ' != ' + str(phrases_r) + '  for stringSeq')
           simple_dict.pop('stringSeq')
           
           #the onconfigure for the boolSeq is supposed to reverse the order of the flags
           self.assertEquals(simple_dict['boolSeq'], flags_r, msg=str(simple_dict['boolSeq']) + ' != ' + str(flags_r) + '  for boolSeq')
           simple_dict.pop('boolSeq')
           
           #the onconfigure for the charSeq is supposed to reverse the order of the phrase
           self.assertEquals([x for x in simple_dict['charSeq']], phrase_r, msg=str(simple_dict['charSeq']) + ' != ' + str(phrase_r) + '  for charSeq')
           simple_dict.pop('charSeq')
          
           #the onconfigure for the octetSeq is supposed to reverse the order of the phrase
           self.assertEquals([x for x in struct.unpack('5b', simple_dict['octetSeq'])], values_r, 
                             msg=str(struct.unpack('5b', simple_dict['octetSeq'])) + ' != ' + str(values_r) + '  for octetSeq')
           simple_dict.pop('octetSeq')
           
           #the rest of the onconfigures are supposed to reverse the values in the list
           for x in simple_dict:
               self.assertEquals(simple_dict[x], values_r, msg=str(simple_dict[x]) + ' != ' + str(values_r) + '  for ' + x)
Example #3
0
def configureProp(compRef, propName, propValue):
    propRef = _CF.DataType(id=str(str(propName)), value=_any.to_any(None))
    
    #try the query to see if we can get the valid type
    results = compRef.query([propRef])
    if results != None:
        if results[0].value._t != _CORBA.TC_null:
            propRef.value._t = esults[0].value._t
            propRef.value._v = propValue
            compRef.configure([propRef])
            return
    
    #if we couldn't find the type of the property, then we need
    #to try ones that might fit until one works
    applicableTypes = None
    if type(propValue) == list:
        strTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.StringSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.CharSeq)]
        boolTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.BooleanSeq)]
        longTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.ULongSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.ShortSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.OctetSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.UShortSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.LongSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.LongLongSequence),
                       _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.UlongLongSequence)]
        floatTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.FloatSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.DoubleSeq)]
        
        if len(propValue) > 0:
            valueType = type(propValue[0])
        else:
            applicableTypes = strListTypes + boolListTypes + longListTypes + floatListTypes
    else:
        strTypes   = [getTypeCode('string'), 
                      getTypeCode('char')]
        boolTypes  = [getTypeCode('boolean')]
        longTypes  = [getTypeCode('ulong'), 
                      getTypeCode('short'), 
                      getTypeCode('octet'), 
                      getTypeCode('ushort'),
                      getTypeCode('long'), 
                      getTypeCode('longlong'), 
                      getTypeCode('ulonglong')]
        floatTypes = [getTypeCode('float'), 
                      getTypeCode('double')]
        
        valueType = type(propValue)
        
    if not applicableTypes:
        if valueType == str:
            applicableTypes = strTypes
        elif valueType == bool:
            applicableTypes = boolTypes
        elif valueType == long:
            applicableTypes = longTypes
        elif valueType == float:
            applicableTypes = floatTypes
        else:
            raise Exception, 'Could not match "'+str(valueType)+'" to a valid CORBA type'
    
    passConfigure = False
    for propType in applicableTypes:
        propRef.value._t = propType
        propRef.value._v = propValue
        try:
            compRef.configure([propRef])
            passConfigure = True
            break
        except:
            pass
    
    if not passConfigure:
        msg = 'Was not able to configure property: "'+str(propName)+'", trying the following types:\n'
        for propType in applicableTypes:
            msg += ('  ' + str(propType) + '\n')
        raise Exception, msg
Example #4
0
    def test_AllPropTypeCallbacks(self):
        languages = ['Cpp', 'Python']
        for lang in languages:
            self.launchApplication(lang)
            self.preconditions()

            res = self._app.query(
                [CF.DataType(id='simple_string', value=any.to_any(None))])
            self._app.configure(res)
            res = self._app.query([])
            self.checkValue(res, 'simple_string', '42', same=False)

            res = self._app.query([])
            for r in res:
                if r.value._t == CORBA.TC_null:
                    if r.id == 'simple_boolean':
                        r.value = any.to_any(False)
                    elif r.id == 'simple_char':
                        r.value = any.to_any('o')
                        r.value._t = CORBA.TC_char
                    elif r.id == 'simple_string':
                        r.value = any.to_any('foo')
                        r.value._t = CORBA.TC_string
                    elif r.id == 'simple_double':
                        r.value = any.to_any(1.0)
                        r.value._t = CORBA.TC_double
                    elif r.id == 'simple_float':
                        r.value = any.to_any(1.0)
                        r.value._t = CORBA.TC_float
                    elif r.id == 'simple_short':
                        r.value = any.to_any(1)
                        r.value._t = CORBA.TC_short
                    elif r.id == 'simple_ushort':
                        r.value = any.to_any(1)
                        r.value._t = CORBA.TC_ushort
                    elif r.id == 'simple_long':
                        r.value = any.to_any(1)
                        r.value._t = CORBA.TC_long
                    elif r.id == 'simple_longlong':
                        r.value = any.to_any(1)
                        r.value._t = CORBA.TC_longlong
                    elif r.id == 'simple_ulong':
                        r.value = any.to_any(1)
                        r.value._t = CORBA.TC_ulong
                    elif r.id == 'simple_ulonglong':
                        r.value = any.to_any(1)
                        r.value._t = CORBA.TC_ulonglong
                    elif r.id == 'simple_objref':
                        r.value = any.to_any('o')
                        r.value._t = CORBA.TC_string
                    elif r.id == 'simple_octet':
                        r.value = any.to_any(1)
                        r.value._t = CORBA.TC_octet
                    elif r.id == 'simple_sequence_boolean':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/BooleanSeq:1.0")
                    elif r.id == 'simple_sequence_char':
                        r.value = any.to_any('')
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/CharSeq:1.0")
                    elif r.id == 'simple_sequence_double':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/DoubleSeq:1.0")
                    elif r.id == 'simple_sequence_float':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/FloatSeq:1.0")
                    elif r.id == 'simple_sequence_long':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/LongSeq:1.0")
                    elif r.id == 'simple_sequence_longlong':
                        r.value = any.to_any([])
                        r.value._t = _tcInternal.typeCodeFromClassOrRepoId(
                            _PortTypes.LongLongSequence)
                    elif r.id == 'simple_sequence_string':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/StringSeq:1.0")
                    elif r.id == 'simple_sequence_objref':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/StringSeq:1.0")
                    elif r.id == 'simple_sequence_octet':
                        r.value = any.to_any('')
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/OctetSeq:1.0")
                    elif r.id == 'simple_sequence_short':
                        r.value = any.to_any([])
                        r.value._t = _tcInternal.typeCodeFromClassOrRepoId(
                            CORBA.UShortSeq)
                    elif r.id == 'simple_sequence_ulong':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/ULongSeq:1.0")
                    elif r.id == 'simple_sequence_ulonglong':
                        r.value = any.to_any([])
                        r.value._t = _tcInternal.typeCodeFromClassOrRepoId(
                            _PortTypes.UlongLongSequence)
                    elif r.id == 'simple_sequence_ushort':
                        r.value = any.to_any([])
                        r.value._t = CORBA.TypeCode(
                            "IDL:omg.org/CORBA/UShortSeq:1.0")
                if r.id == 'struct_vars':
                    for item in r.value._v:
                        if item.value._t != CORBA.TC_null:
                            continue
                        if item.id == 'struct_string':
                            item.value = any.to_any('foo')
                            item.value._t = CORBA.TC_string
                        elif item.id == 'struct_boolean':
                            item.value = any.to_any(False)
                        elif item.id == 'struct_ulong':
                            item.value = any.to_any(1)
                            item.value._t = CORBA.TC_ulong
                        elif item.id == 'struct_objref':
                            item.value = any.to_any('o')
                            item.value._t = CORBA.TC_string
                        elif item.id == 'struct_short':
                            item.value = any.to_any(1)
                            item.value._t = CORBA.TC_short
                        elif item.id == 'struct_float':
                            item.value = any.to_any(1.0)
                            item.value._t = CORBA.TC_float
                        elif item.id == 'struct_octet':
                            item.value = any.to_any(1)
                            item.value._t = CORBA.TC_octet
                        elif item.id == 'struct_char':
                            item.value = any.to_any('o')
                            item.value._t = CORBA.TC_char
                        elif item.id == 'struct_ushort':
                            item.value = any.to_any(1)
                            item.value._t = CORBA.TC_ushort
                        elif item.id == 'struct_double':
                            item.value = any.to_any(1.0)
                            item.value._t = CORBA.TC_double
                        elif item.id == 'struct_long':
                            item.value = any.to_any(1)
                            item.value._t = CORBA.TC_long
                        elif item.id == 'struct_longlong':
                            item.value = any.to_any(1)
                            item.value._t = CORBA.TC_longlong
                        elif item.id == 'struct_ulonglong':
                            item.value = any.to_any(1)
                            item.value._t = CORBA.TC_ulonglong
                if type(r.value._v) == int or type(r.value._v) == long or type(
                        r.value._v) == float:
                    r.value._v = r.value._v + 1
                elif r.value._t == CORBA.TC_char:
                    r.value._v = 'o'
                elif type(r.value._v) == str:
                    r.value._v = 'foo'
                elif type(r.value._v) == bool:
                    r.value._v = False
                elif type(r.value._v) == list:
                    if r.id == 'simple_sequence_string':
                        r.value._v = ['foo']
                    elif r.id == 'simple_sequence_boolean':
                        r.value._v = [False]
                    elif r.id == 'simple_sequence_ulong':
                        r.value._v = [1]
                    elif r.id == 'simple_sequence_short':
                        r.value._v = [1]
                    elif r.id == 'simple_sequence_float':
                        r.value._v = [1.0]
                    elif r.id == 'simple_sequence_ushort':
                        r.value._v = [1]
                    elif r.id == 'simple_sequence_double':
                        r.value._v = [1.0]
                    elif r.id == 'simple_sequence_long':
                        r.value._v = [1]
                    elif r.id == 'simple_sequence_longlong':
                        r.value._v = [1]
                    elif r.id == 'simple_sequence_ulonglong':
                        r.value._v = [1]

                if r.id == 'struct_seq':
                    if r.value._v == []:
                        seq_vars = CORBA.Any(
                            CORBA.TypeCode("IDL:CF/Properties:1.0"), [
                                CF.DataType(id='struct_seq_string',
                                            value=CORBA.Any(
                                                CORBA.TC_string, 'foo')),
                                CF.DataType(id='struct_seq_boolean',
                                            value=CORBA.Any(
                                                CORBA.TC_boolean, False)),
                                CF.DataType(id='struct_seq_ulong',
                                            value=CORBA.Any(CORBA.TC_ulong,
                                                            1)),
                                CF.DataType(id='struct_seq_objref',
                                            value=CORBA.Any(
                                                CORBA.TC_string, 'o')),
                                CF.DataType(id='struct_seq_short',
                                            value=CORBA.Any(CORBA.TC_short,
                                                            1)),
                                CF.DataType(id='struct_seq_float',
                                            value=CORBA.Any(
                                                CORBA.TC_float, 1.0)),
                                CF.DataType(id='struct_seq_octet',
                                            value=CORBA.Any(CORBA.TC_octet,
                                                            1)),
                                CF.DataType(id='struct_seq_char',
                                            value=CORBA.Any(
                                                CORBA.TC_char, 'o')),
                                CF.DataType(id='struct_seq_ushort',
                                            value=CORBA.Any(
                                                CORBA.TC_ushort, 1)),
                                CF.DataType(id='struct_seq_double',
                                            value=CORBA.Any(
                                                CORBA.TC_double, 1.0)),
                                CF.DataType(id='struct_seq_long',
                                            value=CORBA.Any(CORBA.TC_long, 1)),
                                CF.DataType(id='struct_seq_longlong',
                                            value=CORBA.Any(
                                                CORBA.TC_longlong, 1)),
                                CF.DataType(id='struct_seq_ulonglong',
                                            value=CORBA.Any(
                                                CORBA.TC_ulonglong, 1)),
                            ])
                        r = CF.DataType(
                            id='struct_seq',
                            value=CORBA.Any(
                                CORBA.TypeCode("IDL:omg.org/CORBA/AnySeq:1.0"),
                                [any.to_any(seq_vars)]))
                self._app.configure([r])
            res = self._app.query([])

            self.checkValue(res, 'simple_string', '42')
            self.checkValue(res, 'simple_boolean', True)
            self.checkValue(res, 'simple_ulong', 43)
            self.checkValue(res, 'simple_objref', '44')
            self.checkValue(res, 'simple_short', 45)
            self.checkValue(res, 'simple_float', 46.0)
            self.checkValue(res, 'simple_octet', 47)
            self.checkValue(res, 'simple_char', struct.pack('b', 48))
            self.checkValue(res, 'simple_ushort', 49)
            self.checkValue(res, 'simple_double', 50.0)
            self.checkValue(res, 'simple_long', 51)
            self.checkValue(res, 'simple_longlong', 52)
            self.checkValue(res, 'simple_ulonglong', 53)
            self.checkValue(res, 'simple_sequence_string', '54')
            self.checkValue(res, 'simple_sequence_boolean', True)
            self.checkValue(res, 'simple_sequence_ulong', 55)
            #            self.checkValue(res, 'simple_sequence_objref', '56')   Broken in python
            self.checkValue(res, 'simple_sequence_short', 57)
            self.checkValue(res, 'simple_sequence_float', 58)
            #            self.checkValue(res, 'simple_sequence_octet', struct.pack('B', 59))    Broken in python
            #            self.checkValue(res, 'simple_sequence_char', struct.pack('b', 60))     Borken in python
            self.checkValue(res, 'simple_sequence_ushort', 61)
            self.checkValue(res, 'simple_sequence_double', 62)
            self.checkValue(res, 'simple_sequence_long', 63)
            self.checkValue(res, 'simple_sequence_longlong', 64)
            self.checkValue(res, 'simple_sequence_ulonglong', 65)
            self.checkValue(res, 'struct_vars', '66')
            self.checkValue(res, 'struct_seq', '67')
Example #5
0
    def __init__(self, id, valueType, compRef, defValue=None, mode='readwrite'):
        """ 
        id - (string): the property ID
        valueType - (string): type of the property, must be in VALUE_TYPES, or can be struct
        compRef - (domainless.componentBase) - pointer to the component that owns this property 
        mode - (string): mode for the property, must be in MODES
        
        This class inherits from list so that the property will behave
        as a list when the user wishes to manipulate it
        """
        if valueType not in SCA_TYPES and valueType != 'structSeq':
            raise('"' + str(valueType) + '"' + ' is not a valid valueType, choose from\n ' + str(SCA_TYPES))
        
        # Initialize the parent Property
        Property.__init__(self, id, type=valueType, compRef=compRef, mode=mode, action='external')
        
        self.defValue = defValue
        self.complex = False
        
        #try to set the value type in ref unless this is a sequence of structs
        if valueType != 'structSeq':
            self.valueType = valueType
            if self.valueType == "string":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.StringSeq)
            elif self.valueType == "boolean":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.BooleanSeq)
            elif self.valueType == "ulong":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.ULongSeq)
            elif self.valueType == "short":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.ShortSeq)
            elif self.valueType == "float":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.FloatSeq)
            elif self.valueType == "char":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.CharSeq)
            elif self.valueType == "octet":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.OctetSeq)
            elif self.valueType == "ushort":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.UShortSeq)
            elif self.valueType == "double":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.DoubleSeq)
            elif self.valueType == "long":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_CORBA.LongSeq)
            elif self.valueType == "longlong":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.LongLongSequence)
            elif self.valueType == "ulonglong":
                self.typecode = _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.UlongLongSequence) 
            elif self.valueType.find("complex") == 0:
                self.typecode = getCFSeqType(self.valueType)

                # It is important to have a means other than .find("complex")
                # to determine complexity, as in the case of a struct sequence,
                # the value of self.valueType may not be a string.
                self.complex = True
    
            # DEPRECATED: create the CF.DataType reference, change value to the correct type
            self.propRef = _CF.DataType(id=str(self.id), value=_any.to_any(None))
            self.propRef.value._t = self.typecode
Example #6
0
def configureProp(compRef, propName, propValue):
    propRef = _CF.DataType(id=str(str(propName)), value=_any.to_any(None))
    
    #try the query to see if we can get the valid type
    results = compRef.query([propRef])
    if results != None:
        if results[0].value._t != _CORBA.TC_null:
            propRef.value._t = esults[0].value._t
            propRef.value._v = propValue
            compRef.configure([propRef])
            return
    
    #if we couldn't find the type of the property, then we need
    #to try ones that might fit until one works
    applicableTypes = None
    if type(propValue) == list:
        strTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.StringSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.CharSeq)]
        boolTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.BooleanSeq)]
        longTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.ULongSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.ShortSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.OctetSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.UShortSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.LongSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.LongLongSequence),
                       _tcInternal.typeCodeFromClassOrRepoId(_PortTypes.UlongLongSequence)]
        floatTypes = [_tcInternal.typeCodeFromClassOrRepoId(_CORBA.FloatSeq),
                       _tcInternal.typeCodeFromClassOrRepoId(_CORBA.DoubleSeq)]
        
        if len(propValue) > 0:
            valueType = type(propValue[0])
        else:
            applicableTypes = strListTypes + boolListTypes + longListTypes + floatListTypes
    else:
        strTypes   = [getTypeCode('string'), 
                      getTypeCode('char')]
        boolTypes  = [getTypeCode('boolean')]
        longTypes  = [getTypeCode('ulong'), 
                      getTypeCode('short'), 
                      getTypeCode('octet'), 
                      getTypeCode('ushort'),
                      getTypeCode('long'), 
                      getTypeCode('longlong'), 
                      getTypeCode('ulonglong')]
        floatTypes = [getTypeCode('float'), 
                      getTypeCode('double')]
        
        valueType = type(propValue)
        
    if not applicableTypes:
        if valueType == str:
            applicableTypes = strTypes
        elif valueType == bool:
            applicableTypes = boolTypes
        elif valueType == long:
            applicableTypes = longTypes
        elif valueType == float:
            applicableTypes = floatTypes
        else:
            raise Exception, 'Could not match "'+str(valueType)+'" to a valid CORBA type'
    
    passConfigure = False
    for propType in applicableTypes:
        propRef.value._t = propType
        propRef.value._v = propValue
        try:
            compRef.configure([propRef])
            passConfigure = True
            break
        except:
            pass
    
    if not passConfigure:
        msg = 'Was not able to configure property: "'+str(propName)+'", trying the following types:\n'
        for propType in applicableTypes:
            msg += ('  ' + str(propType) + '\n')
        raise Exception, msg
    def testSeqs(self):
        #######################################################################
        # Launch the component with the default execparams
        execparams = self.getPropertySet(kinds=("execparam",), modes=("readwrite", "writeonly"), includeNil=False)
        execparams = dict([(x.id, any.from_any(x.value)) for x in execparams])
        self.launch(execparams)
        
        #######################################################################
        # Simulate regular component startup
        # Verify that initialize nor configure throw errors
        self.comp_obj.initialize()
        
        consumerPort = MessageConsumerPort()
        self.eventPort = self.comp_obj.getPort('propEvent')
        self.eventPort.connectPort(consumerPort._this(), 'some_id')
        
        numericProps = {"eventShortSeq":CORBA.ShortSeq,
                        "eventUlongSeq":CORBA.ULongSeq,
                        "eventFloatSeq":CORBA.FloatSeq,
                        "eventUshortSeq":CORBA.UShortSeq,
                        "eventDoubleSeq":CORBA.DoubleSeq,
                        "eventLongSeq":CORBA.LongSeq,
                        "eventLonglongSeq":PortTypes.LongLongSequence,
                        "eventUlonglongSeq":PortTypes.UlongLongSequence
                        }
        
        for propID in numericProps:
            #test that an event is created for the first configure
            values = [1,2,3,4,5]
            valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
            valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(numericProps[propID])
            self.comp_obj.configure([valueSet])
            event = consumerPort.getEvent()
            if not event:
                self.fail("No event was generated for " + str(propID) + " for value " + str(values))
            
            #test that an event is not created if the value is not changed
            self.comp_obj.configure([valueSet])
            event = consumerPort.getEvent()
            if event:
                self.fail("An event was generated for " + str(propID) + " when the value was not changed")
            
            #test that an event is created when the value is changed
            values = [1,2,3,4,6]
            valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
            valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(numericProps[propID])
            self.comp_obj.configure([valueSet])
            event = consumerPort.getEvent()
            if not event:
                self.fail("No event was generated for " + str(propID) + " for value " + str(values))
    
            #test that the configure worked properly
            ret = self.comp_obj.query([ossie.cf.CF.DataType(id=propID,value=any.to_any(None))])[0]
            self.assertEquals(ret.value.value(), values, msg='configure failed for ' + str(propID) + ', ' + str(ret.value.value()) + ' != ' + str(values))
    
    
        ###NOW WE TEST THE REMAINING TYPES (eventBoolSeq, eventStringSeq, eventCharSeq, eventOctetSeq)
        #test that an event is created for the first configure
        propID = 'eventBoolSeq'
        values = [True, False, True, False]
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.BooleanSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))
        
        #test that an event is not created if the value is not changed
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if event:
            self.fail("An event was generated for " + str(propID) + " when the value was not changed")
        
        #test that an event is created when the value is changed
        values = [False, True, False, True]
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.BooleanSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))

        #test that the configure worked properly
        ret = self.comp_obj.query([ossie.cf.CF.DataType(id=propID,value=any.to_any(None))])[0]
        self.assertEquals(ret.value.value(), values, msg='configure failed for ' + str(propID) + ', ' + str(ret.value.value()) + ' != ' + str(values))
        
        #test that an event is created for the first configure
        propID = 'eventStringSeq'
        values = ['one','two','three','four','five']
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.StringSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))
        
        #test that an event is not created if the value is not changed
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if event:
            self.fail("An event was generated for " + str(propID) + " when the value was not changed")
        
        #test that an event is created when the value is changed
        values = ['one','two','three','four','six']
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.StringSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))

        #test that the configure worked properly
        ret = self.comp_obj.query([ossie.cf.CF.DataType(id=propID,value=any.to_any(None))])[0]
        self.assertEquals(ret.value.value(), values, msg='configure failed for ' + str(propID) + ', ' + str(ret.value.value()) + ' != ' + str(values))
        
        #test that an event is created for the first configure
        propID = 'eventCharSeq'
        values = 'hello'
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.CharSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))
        
        #test that an event is not created if the value is not changed
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if event:
            self.fail("An event was generated for " + str(propID) + " when the value was not changed")
        
        #test that an event is created when the value is changed
        values = 'goodbye'
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(values))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.CharSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))

        #test that the configure worked properly
        ret = self.comp_obj.query([ossie.cf.CF.DataType(id=propID,value=any.to_any(None))])[0]
        self.assertEquals(str(ret.value.value()), values, msg='configure failed for ' + str(propID) + ', ' + str(ret.value.value()) + ' != ' + str(values))
        
        #test that an event is created for the first configure
        propID = 'eventOctetSeq'
        values = [1,2,3,4,5]
        data = struct.pack('5b', *[x for x in values]) #octet data must be packed bytes
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(data))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.OctetSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))
        
        #test that an event is not created if the value is not changed
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if event:
            self.fail("An event was generated for " + str(propID) + " when the value was not changed")
        
        #test that an event is created when the value is changed
        values = [1,2,3,4,6]
        data = struct.pack('5b', *[x for x in values]) #octet data must be packed bytes
        valueSet = ossie.cf.CF.DataType(id=propID, value=any.to_any(data))
        valueSet.value._t = tcInternal.typeCodeFromClassOrRepoId(CORBA.OctetSeq)
        self.comp_obj.configure([valueSet])
        event = consumerPort.getEvent()
        if not event:
            self.fail("No event was generated for " + str(propID) + " for value " + str(values))

        #test that the configure worked properly
        ret = self.comp_obj.query([ossie.cf.CF.DataType(id=propID,value=any.to_any(None))])[0]
        self.assertEquals([x for x in struct.unpack('5b', ret.value.value())], values, msg='configure failed for ' + str(propID) + ', ' + str(ret.value.value()) + ' != ' + str(values))