#!/usr/bin/python
#
# arch-tag: NPC buses module
# Time-stamp: <2005-06-21 16:16:06 mike>
#
from NPCData import adc_offset, dio_offset
from io import IOP, ADC
from elementtree import ElementTree
import xmlenc as xml

__version__ = '1.5'

VSCALE = {'v400' : 400./4.,
          'v48' : 48./4.,
          'v12' : 12./4.,
          'v5' : 5./4.,
          'v-12' : 12./4.}

class Bus(object):
    def __init__(self, desc):
        self.__dict__.update(desc)
        type,v = self.name.split('/')
        self.vscale = VSCALE[v]
        self.voltage = ADC(**self.voltage)
        try:
            self.current = ADC(**self.current)
        except AttributeError:
            pass
        
    def _to_mV(self, v):
        """Convert A/D voltage to a bus voltage value in millivolts"""
        return int(v*self.vscale*1000.)

    def _to_mA(self, v):
        """Convert A/D voltage to a bus current value in milliamps"""
        return int(v*10000.)

    def status(self, record):
        d = {}
        d['voltage'] = self._to_mV(self.voltage.read(record))
        try:
            d['current'] = self._to_mA(self.current.read(record))
        except AttributeError:
            d['current'] = 0
        d['name'] = self.name
        return d
    
    def as_xml(self):
        """Return the XML description of the bus as an ElementTree object"""
        root = ElementTree.Element('bus')
        root.set('id', self.name)
        root.set('version', __version__)
        child = ElementTree.SubElement(root, 'monitor')
        child.append(xml.sensor('voltage', self.voltage, units='mV',
                                cal=[0, self.vscale*1000.],
                                name='bus/%s/voltage' % self.name))
        try:
            child.append(xml.sensor('current', self.current, units='mA',
                                    cal=[0, 10000],
                                    name='bus/%s/current' % self.name))
        except AttributeError:
            pass
        return root
        
