#!/usr/bin/python
#
# arch-tag: 6c1b2289-f037-480f-8363-2967a18c93f5
# Time-stamp: <2005-08-10 08:52:53 mike>
#
# Interface to the power-supply controller
#
try:
    import timeoutsocket
    timeoutsocket.setDefaultSocketTimeout(5)
    commError = (timeoutsocket.Timeout, timeoutsocket.Error)
except:
    import socket
    commError = socket.error
import xmlrpclib

__version__ = '1.1'

class PSC(object):
    def __init__(self, host):
        """Initialize the XMLRPC connection to the power supply
        control system.
        
        arguments:
            host      -  hostname of the power supply controller
        """
        self.server = xmlrpclib.ServerProxy("http://%s:8080/RPC2" % host)
        self.host = host
        self.logger = None
        self.hostup = 0
        
    def __getstate__(self):
        d = {}
        d.update(self.__dict__)
        d['server'] = None
        d['logger'] = None
        return d

    def __setstate__(self, d):
        self.__dict__.update(d)
        self.server = xmlrpclib.ServerProxy("http://%s:8080/RPC2" % self.host)

    def set_logger(self, logger=None):
        self.logger = logger

    def _rpc_dispatch(self, name, *args):
        """Intercept calls to the XML-RPC server so we can catch
        timeout errors.
        """
        f = getattr(self.server, name)
        try:
            self.hostup = 1
            return f(*args)
        except commError:
            self.hostup = 0
            if self.logger:
                self.logger("Comm error in %s" % name)
            self.server = xmlrpclib.ServerProxy("http://%s:8080/RPC2" % self.host)
            return None
        
    def __getattr__(self, name):
        """Dispatch remote function calls to the Server Proxy"""
        return lambda *args: self._rpc_dispatch(name, *args)
