Changeset 35:9451e75788ea in xplra for src/client/python


Ignore:
Timestamp:
02/09/13 13:00:42 (12 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
Phase:
public
Message:

Implemented support for multi-dataref setting

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/client/python/xplra.py

    r34 r35  
    131131        """Create a new multi-dataref getter for this X-Plane object."""
    132132        return MultiGetter(self)
     133
     134    def createMultiSetter(self):
     135        """Create a new multi-dataref setter for this X-Plane object."""
     136        return MultiSetter(self)
    133137
    134138    def getInt(self, name):
     
    251255            if arr is not None and length>0:
    252256                arr.fromstring(self._stream.read(length*elementSize))
    253             return arr
     257            return None if arr is None else arr.tolist()
    254258
    255259    def _setSingle(self, name, type, value, offset = None):
     
    524528            self.finalize()
    525529        type = self._dataRefs[id][1]
     530        length = self._dataRefs[id][2]
    526531        if type==TYPE_INT:
    527532            self._values[id] = int(value)
    528         elif type==TYPE_FLOAT:
     533        elif type==TYPE_FLOAT or type==TYPE_DOUBLE:
    529534            self._values[id] = float(value)
    530         elif type==TYPE_DOUBLE:
    531             self._values[id] = double(value)
    532535        elif type==TYPE_FLOAT_ARRAY:
     536            if len(value)!=length:
     537                raise ValueError("xplra.MultiBuffer: expected a list of length %d" % (length,))
    533538            self._values[id] = [float(x) for x in value]
    534539        elif type==TYPE_INT_ARRAY:
     540            if len(value)!=length:
     541                raise ValueError("xplra.MultiBuffer: expected a list of length %d" % (length,))
    535542            self._values[id] = [int(x) for x in value]
    536543        elif type==TYPE_BYTE_ARRAY:
    537             if instanceof(value, str):
    538                 self._values[id] = [ord(x) for x in value]
     544            if isinstance(value, str):
     545                lst = [ord(x) for x in value[:length]]
     546                if len(lst)<length:
     547                    lst += [0] * (length-len(lst))
     548                self._values[id] = lst
    539549            else:
     550                if len(value)!=length:
     551                    raise ValueError("xplra.MultiBuffer: expected a list of length %d" % (length,))
    540552                self._values[id] = [int(x) for x in value]
    541553
     
    578590
    579591#-------------------------------------------------------------------------------
     592
     593class MultiSetter(MultiBuffer):
     594    """Multi-dataref buffer for setting."""
     595    def __init__(self, xplane):
     596        """Construct the getter."""
     597        super(MultiSetter, self).__init__(xplane,
     598                                          COMMAND_REGISTER_SET_MULTI,
     599                                          COMMAND_UNREGISTER_SET_MULTI)
     600
     601    def _executeRegistered(self):
     602        """Execute the query if the buffer is registered."""
     603        self._xplane._writeU8(COMMAND_EXECUTE_SET_MULTI)
     604        self._xplane._writeU32(self._registeredID)
     605        for i in range(0, len(self._dataRefs)):
     606            self._xplane._writeValue(self._dataRefs[i][1], self._values[i])
     607        self._xplane._flush()
     608
     609        self._xplane._checkResult()
     610
     611    def _executeUnregistered(self):
     612        """Execute the query if the buffer is not registered."""
     613        self._xplane._writeU8(COMMAND_SET_MULTI)
     614
     615        numDataRefs = len(self._dataRefs)
     616        self._xplane._writeU32(numDataRefs)
     617
     618        for i in range(0, numDataRefs):
     619            (name, type, length, offset) = self._dataRefs[i]
     620            value = self._values[i]
     621
     622            self._xplane._writeString(name)
     623            self._xplane._writeType(type)
     624            if length is not None and offset is not None:
     625                self._xplane._writeS32(len(value))
     626                self._xplane._writeS32(offset)
     627            self._xplane._writeValue(type, value)
     628
     629        self._xplane._flush()
     630        self._xplane._checkResult()
     631
     632#-------------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.