Пример #1
0
    def __init__(self,
                 channel,
                 data,
                 dbf=None,
                 meta=META.PLAIN,
                 dbf_conv=None,
                 wait=False):
        """Start a new write request
        
        channel: PV name
        data: value array
        dbf: Field type to write
        meta: Meta data class to send
        dbf_conv: Treat value array as different field type.
                  Does a client-side conversion
        wait: Request notification on completion
        """
        self._chan, self.dbf = channel, dbf
        self._data, self.dbf_conv = data, dbf_conv
        self._meta, self._wait = meta, wait

        self.done, self.ioid = True, None
        self.__D = None

        if dbf_conv is None and dbf is not None:
            self.meta = caMeta(dbf)
        elif dbf_conv is not None:
            self.meta = caMeta(dbf_conv)
        else:
            self.meta = None

        self.restart(data)
Пример #2
0
    def __init__(self,
                 channel,
                 dbf=None,
                 count=None,
                 meta=META.PLAIN,
                 dbf_conv=None):
        """Start a new request.
        
        channel: PV name
        dbf: Field type requested from server
        count: length requested from server
        meta: Meta-data class requested
        dbf_conv: Additional client side conversion
                  before data is returned to user.

        Note: Server will never return more then count
              elements, but may return less.
        """
        self._chan, self.dbf = channel, dbf
        self._meta, self.count = meta, count
        self.dbf_conv = dbf_conv

        if dbf_conv is None and dbf is not None:
            self.meta = caMeta(dbf)
        elif dbf_conv is not None:
            self.meta = caMeta(dbf_conv)
        else:
            self.meta = None

        self.restart()
Пример #3
0
def main():
    lmeta=caMeta(DBF.LONG)
    
    test=PV('test', value=['hello world'], meta=caMeta(DBF.STRING))
    test2=PV('test2', value=[42], meta=caMeta(DBF.LONG))
    test3=PV('test3', value=range(10), meta=caMetaProxy(test2.meta))

    p = Server(pvs=[test,test2,test3])
    
    reactor.run()
    
    p.close()
Пример #4
0
 def test_ro(self):
     m=cadata.caMeta(defs.DBF.INT)
     p=cadata.caMetaProxy(m, ro=True)
     
     m.stamp=5.1
     self.assertEqual(p.stamp, 5.1)
     def x():
         p.stamp=4.9
     self.assertRaises(TypeError, x)
Пример #5
0
 def test_cow(self):
     m=cadata.caMeta(defs.DBF.INT)
     p=cadata.caMetaProxy(m)
     
     m.stamp=5.1
     self.assertEqual(p.stamp, 5.1)
     p.stamp=4.9
     self.assertEqual(m.stamp, 5.1)
     self.assertEqual(p.stamp, 4.9)
Пример #6
0
    def _chanOk(self, chan):
        self.__D = None
        if chan is None:
            self.close()
            # channel has shutdown
            return
        assert self._chan is chan

        self.ioid = chan._circ.pendingActions.add(self)

        dbf = self.dbf
        if dbf is None:
            dbf, _ = dbr_to_dbf(chan.dbr)
        dbr = dbf_to_dbr(dbf, self._meta)

        meta = self.meta
        if meta is None:
            meta = caMeta(dbf)

        data = self._data
        cnt = len(data)
        if cnt > chan.maxcount:
            cnt = chan.maxcount
            data = data[:chan.maxcount]

        data, cnt = tostring(data, meta, dbr, cnt)

        log.debug('Set %s to %s', chan, data)

        cmd = 19 if self._wait else 4

        msg = CAmessage(cmd=cmd,
                        size=len(data),
                        dtype=dbr,
                        count=cnt,
                        p1=chan.sid,
                        p2=self.ioid,
                        body=data).pack()
        chan._circ.send(msg)

        if not self._wait:
            log.debug('Send put request (no wait) %s', self._chan.name)
            # do completion here
            self.ioid = None
            self.done = True
            self._comp.callback(ECA_NORMAL)

        else:
            log.debug('Send put request (wait) %s', self._chan.name)
            d = self.__D = self._chan.whenDis
            d.addCallback(self._circuitLost)

        return chan
Пример #7
0
    def _chanOk(self, chan):
        self.__D=None
        if chan is None:
            self.close()
            # channel shutdown
            return
        assert self._chan is chan
        
        ver=chan._circ.version

        self.subid=chan._circ.subscriptions.add(self)

        dbf=self.dbf
        if dbf is None:
            self.dbf,_=dbr_to_dbf(chan.dbr)
        dbr=dbf_to_dbr(self.dbf, self._meta)

        if self.dbf_conv is None:
            self.meta=caMeta(self.dbf)
        else:
            self.meta=caMeta(dbf_conv)

        # use dynamic array length whenever possible
        cnt=self.count if ver<13 else 0
        if cnt is None or cnt>chan.maxcount:
            cnt=chan.maxcount

        b=monitormask.pack(self.mask)

        msg=CAmessage(cmd=1, size=len(b),
                      dtype=dbr, count=cnt,
                      p1=chan.sid, p2=self.subid,
                      body=b).pack()
        chan._circ.send(msg)
        log.debug('Start monitor %s (%d)',chan.name,self.mask)

        d=self.__D=self._chan.whenDis
        d.addCallback(self._circuitLost)

        return chan
Пример #8
0
    def test_int(self):
        meta = cadata.caMeta(defs.DBF.INT)
        val=[5]
        meta.status=0x1234
        meta.severity=0x1020
        meta.stamp=1284327459.1030619

        one, count=cadata.tostring(val, meta, defs.DBR.INT, 1)
        self.assertEqual(count, 1)
        self.assertEqual(one, '\x00\x05'+('\0'*6))

        one, count=cadata.tostring(val, meta, defs.DBR.STRING, 1)
        self.assertEqual(count, 1)
        self.assertEqual(one, '5'+('\0'*7))
Пример #9
0
    def test_intarray(self):
        meta = cadata.caMeta(defs.DBF.INT)
        val=range(5,15)
        meta.status=0x1234
        meta.severity=0x1020
        meta.stamp=1284327459.1030619

        one, count=cadata.tostring(val, meta, defs.DBR.INT, 20)
        self.assertEqual(count, 10)
        self.assertEqual(one,
            reduce(str.__add__,[chr(0)+chr(n) for n in range(5,15)],'')
            +('\0'*4))

        one, count=cadata.tostring(val, meta, defs.DBR.STRING, 1)
        self.assertEqual(count, 1)
        self.assertEqual(one, '5, 6, 7, 8, 9, 10, 11, 12, 13, 14'+('\0'*7))
Пример #10
0
    def dispatch(self, pkt, circuit, peer=None):
        if pkt.cmd != 15:
            log.warning('Channel %s get ignoring pkt %s', self._chan.name, pkt)
            # wait for real reply
            chan._circ.pendingActions[self.ioid] = self
            return

        meta = self.meta
        if meta is None:
            dbf, _ = dbr_to_dbf(pkt.dtype)
            meta = caMeta(dbf)

        data = fromstring(pkt.body, pkt.dtype, pkt.count, meta)

        self.ioid = None
        self.done = True
        self._result.callback(data)
Пример #11
0
    def test_string(self):
        meta = cadata.caMeta(defs.DBF.STRING)
        val=['hello world']
        meta.status=0x1234
        meta.severity=0x1020
        meta.stamp=1284327459.1030619

        one, count=cadata.tostring(val, meta, defs.DBR.STRING, 1)
        self.assertEqual(meta.dbf, defs.DBF.STRING)
        self.assertEqual(count, 1)
        self.assertEqual(one, 'hello world'+('\0'*5))

        one, count=cadata.tostring(val, meta, defs.DBR.STS_STRING, 1)
        self.assertEqual(meta.dbf, defs.DBF.STRING)
        self.assertEqual(count, 1)
        self.assertEqual(len(one), 24)
        self.assertEqual(one, '\x12\x34\x10\x20hello world'+('\0'*9))

        one, count=cadata.tostring(val, meta, defs.DBR.CHAR, 16)
        self.assertEqual(meta.dbf, defs.DBF.STRING)
        self.assertEqual(count, 11)
        self.assertEqual(len(one), 16)
        self.assertEqual(one, 'hello world'+('\0'*5))
Пример #12
0
 def setUp(self):
     self.meta=cadata.caMeta(defs.DBF.STRING)
     self.bmeta=deepcopy(self.meta)