def ui_run(self):
     if not self._ui:
         self._ui = SpadicControlUI(self.control)
     self._ui.run()
 def ui_run(self):
     if not self._ui:
         self._ui = SpadicControlUI(self.control)
     self._ui.run()
class SpadicControlClient:
    """Client for the RF/SR/DLM parts of the SpadicServer."""

    def __init__(self, server_address, port_base=None,
                       reset=False, load=None, ui=False):
        self.rf_client = SpadicRFClient()
        self.sr_client = SpadicSRClient()
        self.dlm_client = SpadicDLMClient()

        # nested function generators!
        def gen_write_gen(client):
            def write_gen(name, addr):
                def write(value):
                    client.write_registers({name: value})
                return write
            return write_gen
        def gen_read_gen(client):
            def read_gen(name, addr):
                def read():
                    return client.read_registers([name])[name]
                return read
            return read_gen

        self.rf_client.connect(server_address, port_base)
        self.sr_client.connect(server_address, port_base)
        self.dlm_client.connect(server_address, port_base)

        # Create registerfile and shiftregister representations providing
        # the appropriate read and write methods.
        # The "use_cache" argument is set to False, because other clients can
        # modify the register configuration without our knowledge, so we
        # have to really read and write a register every time and cannot
        # rely on our last known values.
        self._registerfile = SpadicRegisterFile(
                                 gen_write_gen(self.rf_client),
                                 gen_read_gen(self.rf_client),
                                 use_cache=False)

        # The shiftregister actually behaves like the registerfile here,
        # we only have to override the default register map using SPADIC_SR.
        # format: {name: (address, size), ...}, (address not used here)
        sr_map = {name: (0, len(bits))
                  for (name, bits) in SPADIC_SR.iteritems()}
        self._shiftregister = SpadicRegisterFile(
                                  gen_write_gen(self.sr_client),
                                  gen_read_gen(self.sr_client),
                                  register_map=sr_map,
                                  use_cache=False)

        # this is exactly like in main.Spadic
        self.control = SpadicController(self._registerfile,
                                        self._shiftregister, reset, load)
 
        # controller user interface
        self._ui = None
        if ui:
            self.ui_run()

    def ui_run(self):
        if not self._ui:
            self._ui = SpadicControlUI(self.control)
        self._ui.run()

    def send_dlm(self, value):
        self.dlm_client.send_dlm(value)

    def __enter__(self):
        return self

    def __exit__(self, *args, **kwargs):
        self.rf_client.__exit__(*args, **kwargs)
        self.sr_client.__exit__(*args, **kwargs)
        self.dlm_client.__exit__(*args, **kwargs)
class SpadicControlClient:
    """Client for the RF/SR/DLM parts of the SpadicServer."""
    def __init__(self,
                 server_address,
                 port_base=None,
                 reset=False,
                 load=None,
                 ui=False):
        self.rf_client = SpadicRFClient()
        self.sr_client = SpadicSRClient()
        self.dlm_client = SpadicDLMClient()

        # nested function generators!
        def gen_write_gen(client):
            def write_gen(name, addr):
                def write(value):
                    client.write_registers({name: value})

                return write

            return write_gen

        def gen_read_gen(client):
            def read_gen(name, addr):
                def read():
                    return client.read_registers([name])[name]

                return read

            return read_gen

        self.rf_client.connect(server_address, port_base)
        self.sr_client.connect(server_address, port_base)
        self.dlm_client.connect(server_address, port_base)

        # Create registerfile and shiftregister representations providing
        # the appropriate read and write methods.
        # The "use_cache" argument is set to False, because other clients can
        # modify the register configuration without our knowledge, so we
        # have to really read and write a register every time and cannot
        # rely on our last known values.
        self._registerfile = SpadicRegisterFile(gen_write_gen(self.rf_client),
                                                gen_read_gen(self.rf_client),
                                                use_cache=False)

        # The shiftregister actually behaves like the registerfile here,
        # we only have to override the default register map using SPADIC_SR.
        # format: {name: (address, size), ...}, (address not used here)
        sr_map = {
            name: (0, len(bits))
            for (name, bits) in SPADIC_SR.iteritems()
        }
        self._shiftregister = SpadicRegisterFile(gen_write_gen(self.sr_client),
                                                 gen_read_gen(self.sr_client),
                                                 register_map=sr_map,
                                                 use_cache=False)

        # this is exactly like in main.Spadic
        self.control = SpadicController(self._registerfile,
                                        self._shiftregister, reset, load)

        # controller user interface
        self._ui = None
        if ui:
            self.ui_run()

    def ui_run(self):
        if not self._ui:
            self._ui = SpadicControlUI(self.control)
        self._ui.run()

    def send_dlm(self, value):
        self.dlm_client.send_dlm(value)

    def __enter__(self):
        return self

    def __exit__(self, *args, **kwargs):
        self.rf_client.__exit__(*args, **kwargs)
        self.sr_client.__exit__(*args, **kwargs)
        self.dlm_client.__exit__(*args, **kwargs)