Module flask_app.Driver.ADS8885

Source code
import logging

logger = logging.getLogger(__name__)

try:
    import smbus
except ImportError:
    def _getBus(self, num):
        return self
    def read_word_data(self, adress, cmd):
        logger.debug("Mock Object -- read word data: addrress" + str(adress) + " cmd: " + str(cmd))
        return 0
    def write_word_data(self, device_address, mode, value):
        logger.debug("Sendind word data emulation: to: " + str(device_address) + " mode: " + str(mode)  + " value: " + str(value));

    obj = type('',(object,),{'read_word_data':read_word_data,'SMBus':_getBus,'write_word_data':write_word_data})()
    smbus = obj
try:
    import spidev
    simul = False
except ImportError:
    simul = True
    logger.error("could not import spidev")
try:
    import RPi.GPIO as GPIO
except ImportError:
    simul = True
    logger.error("could not import GPIO")
# from .PCAL6416 import PCAL6416
# from .PCAL6416 import PinAssignment

import random

SPI_MOSI = 10
SPI_MISO = 9
SPI_CLK = 11


class ResolutionScaler:
    def __init__(self, multiplier, offset):
        self.multiplier = multiplier
        self.offset = offset

    def getScaledValue(self, value):
        return self.multiplier * value + self.offset


class ADS8885:

    voltageMap = {
        1 : {
            "unit":"mV",
            "max":50
        },
        2 : {
            "unit":"mV",
            "max":500
        },
        3 : {
            "unit":"V",
            "max":5
        }
    }
    currentMap = {
        1 : {
            "unit":"uA",
            "max":500
        },
        2 : {
            "unit":"mA",
            "max":50
        }
    }
    """
    A class used to represent the ADS8885 Chip.
    ...

    Attributes
    ----------
    pin1,pin2:  integer which represents the pinnumber of the PCAL chip to control the
                -VSel1/2 pin of the corresponding TS5A3359DCUR chip for the voltage measurement
                -IRngSel1/2 pin used for the current measurement
    measurement ==0 voltage measurement
                ==1 current measurement
    """

    def __init__(self, name, measurement, pinAss1, pinAss2, ioExpander, cspin, resolutionScalers, vref = 2.5):
        self.name = name
        self.vref = vref
        self.pinAss1=pinAss1
        self.pinAss2=pinAss2
        self.ioExpander = ioExpander
        self.resolution = 1
        self.cspin = cspin
        self.measurement=measurement
        self.autoResolution=False

        self.resolutionScalers = resolutionScalers

        if(simul == False):
            GPIO.setup(self.cspin, GPIO.OUT, initial = GPIO.LOW)
            self.ioExpander.setToOutputPinAssignment(pinAss1)
            self.ioExpander.setToOutputPinAssignment(pinAss2)
        #Voltage measurement
        if(measurement == 0):
            self.resolutionMap = self.voltageMap
        else:
            self.resolutionMap = self.currentMap





        # if (simul==False):
        #     self.spi = spidev.SpiDev()
        #     # self.spi.bits_per_word = 8
        #     self.spi.open(0,1)
        #     self.spi.max_speed_hz = 7629 #Todo tweek
        #     self.spi.mode = 0b10
        #     self.spi.cshigh = True
        #     #self.spi.no_cs = True
        #     #self.spi.lsbfirst = True
        #     GPIO.setup(self.cspin, GPIO.OUT)

    def getVoltage(self):
        # print("getVoltage in: " + self.name)

        if(simul):
            return random.randint(0,  int(self.vref))
            # return random.randint(0,self.getMaxRange()) / 100

        data = self.getAdcValue()

        # print("Got data " + bin(data))
        #
        # st = bin(data) + (18-(len(bin(data))-2))*"0";
        #
        # print("n data : " + st,2)
        # # 0000 - 01ffff -> POS
        # # 1000 - 11fffff -> neg
        # print(st)
        # # data = 0x20000
        MSB = (int)((data & (0b1 << 17)) != 0)
        valToXor = (0x3FFFF * MSB)
        xored = (data ^ valToXor)
        val = xored + MSB

        # print(val)
        # print("xored: " + bin(xored))


        maxVal = 0x1FFFF
        # print("maxVal: " + str(maxVal))

        ratio = (val / maxVal)

        value = self.vref * ratio
        if(MSB):
            value *= -1

        # logger.debug("value: " + str(value) + "ratio: " + str(ratio))
        # print("first bit: " + str(data & (0b1 << 17)) == 0)

        return (-1) * value;

    def getVoltageFast(self):
        data = self.getAdcValue()

        MSB = (bool)((data & (0b1 << 17)) != 0)
        val = (data ^  (0x3FFFF * MSB)) + MSB

        value = self.vref * (val / 0x1FFFF)

        if(MSB == False):
                return -value
        return value

    def scaleToResolution(self, value):
        # print(self.name + " get scale to resolution for value : " + str(value))
        # print(self.resolution)
        # print(self.resolutionScalers[self.resolution].multiplier)
        # print(self.resolutionScalers[self.resolution].offset)
        # print("ret: " + str(self.resolutionScalers[self.resolution].getScaledValue(value)))
        return self.resolutionScalers[self.resolution].getScaledValue(value)
        # # self.calibrationMap[self.resolution]
        # return self.muliplier * value + self.offset;
        # # return value
        # # tmp = 0.0114*value**2 + 1.2688 * value + 2.0662
        # # if(self.name == "vm1"):
        # #     return value * 2.3307 - 0.1192 #* 3.133 - 40.6;
        # # elif(self.name == "vm2"):
        # #     return value * 2.3487 + 0.0375 #* 3.133 - 40.6;
        # # return value;

    def getMaxRange(self):
        return self.resolutionMap[self.resolution]["max"]

    def getUnit(self):
        return self.resolutionMap[self.resolution]["unit"]

    def getName(self):
        return self.name

    def getAdcValue(self):
        if(simul):
            return random.randint(0,self.getMaxRange()) / 100

        LOW = GPIO.LOW
        HIGH = GPIO.HIGH

        GPIO.output(SPI_MOSI, HIGH)
        GPIO.output(SPI_CLK, LOW) # Start with clock low
        GPIO.output(self.cspin, HIGH)  # Enable chip

        for i in range(8):  # Send bit pattern starting from bit b4
            GPIO.output(SPI_CLK, HIGH) # Clock pulse
            GPIO.output(SPI_CLK, LOW)

        GPIO.output(SPI_MOSI, LOW)
        GPIO.output(SPI_CLK, LOW)
        GPIO.output(SPI_CLK, LOW)

        # Get reply
        data = 0
        for i in range(18):  # Read 11 bits and insert at right
            GPIO.output(SPI_CLK, HIGH)  # Clock pulse
            data <<= 1  # Shift left, LSB = 0
            if GPIO.input(SPI_MISO): # If high, LSB = 1,
                data |= 0x1
            GPIO.output(SPI_CLK, LOW)

        GPIO.output(self.cspin, LOW) # Disable chip

        return data;

    def setAutoResolution(self, autoResolution):
        self.autoResolution=autoResolution

    def maxResolution(self):
        reached= False
        if self.measurement==0:
            if self.resolution==3:
                reached=True
        if self.measurement==1:
            if self.resolution==2:
                reached=True
        return reached

    def minResolution(self):
        reached= (self.resolution==1)
        return reached


    def setResolution(self,resolution):
        logger.debug("set resolution: name: " +str(self.name) + " resolution: " + str(resolution))
        self.resolution = resolution
        if self.measurement==0:
            #resolution = 50mV
            if resolution== 1:
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)

            #resolution =500mV
            elif resolution== 2:
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)

            #resolution = 5V
            elif resolution== 3:
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)

            else:
                raise ValueError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')


        elif (self.measurement == 1):
            #resolution=500uA
            if resolution ==1:
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)
            #resolution=50mA
            elif resolution==2:
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)
            else:
                raise ValueError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

    """
    returns ture if voltage is close to upper resolution limit
    """
    def reachedResolutionMax(self, value):
        tolerance=0
        reached=False
        resolution= self.resolution
        absVal = abs(value)
        if self.measurement==0:
            #resolution = 50mV
            if resolution== 1:
                reached= (absVal>=(50-tolerance))

            #resolution =500mV
            elif resolution== 2:
                reached= (absVal>=(500-tolerance))

            #resolution = 5V
            elif resolution== 3:
                reached= (absVal>=(5-tolerance))

            else:
                raise absValError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')

        elif self.measurement == 1:
            #resolution=500uA
            if resolution ==1:
                reached= (absVal>=(500-tolerance))

            #resolution=50mA
            elif resolution==2:
                reached= (absVal>=(50-tolerance))

            else:
                raise absValError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

        else:
                raise absValError('measurement for voltage measurement must be 0, measurement for current measurement must be 1')
        return reached

    def getDebugInfos(self):
        ans = self.getName() + " : " + str(self.getMaxRange()) + " : " + str(self.resolution) + "\n";
        ans += "ADC values: " +  str(self.getVoltage()) + " adc val fast " + str(self.getVoltageFast())
        return ans;

    """
    returns ture if voltage is close to lower resolution limit
    """
    def reachedResolutionMin(self, value):
        tolerance=0
        reached=False
        absVal = abs(value)
        resolution= self.resolution
        if self.measurement==0:
            #resolution = 50mV
            if resolution== 1:
                reached=False

            #resolution =500mV
            elif resolution== 2:
                reached= (absVal<=(50+tolerance))

            #resolution = 5V
            elif resolution== 3:
                reached= (absVal<=(0.5+tolerance))

            else:
                raise absValError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')

        elif self.measurement == 1:
            #resolution=500uA
            if resolution ==1:
                reached= False

            #resolution=50mA
            elif resolution==2:
                reached= (absVal<=(0.5+tolerance))

            else:
                raise absValError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

        else:
                raise absValError('measurement for voltage measurement must be 0, measurement for current measurement must be 1')
        return reached
#
# import logging
# try:
#     import smbus
# except ImportError:
#     def _getBus(self, num):
#         return self
#     def read_word_data(self, adress, cmd):
#         print("Mock Object -- read word data: addrress" + str(adress) + " cmd: " + str(cmd))
#         return 0
#     def write_word_data(self, device_address, mode, value):
#         print("Sendind word data emulation: to: " + str(device_address) + " mode: " + str(mode)  + " value: " + str(value));
#
#     obj = type('',(object,),{'read_word_data':read_word_data,'SMBus':_getBus,'write_word_data':write_word_data})()
#     smbus = obj
# try:
#     import spidev
#     simul = False
# except ImportError:
#     simul = True
#     print("could not import spidev")
# import RPi.GPIO as GPIO
# # from .PCAL6416 import PCAL6416
# # from .PCAL6416 import PinAssignment
#
# import random
#
# SPI_CLK = 23
# SPI_MISO = 21
# SPI_MOSI = 19
#
# logger = logging.getLogger(__name__)
#
#
#
# class ADS8885:
#     """
#     A class used to represent the ADS8885 Chip.
#     ...
#
#     Attributes
#     ----------
#     pin1,pin2:  integer which represents the pinnumber of the PCAL chip to control the
#                 -VSel1/2 pin of the corresponding TS5A3359DCUR chip for the voltage measurement
#                 -IRngSel1/2 pin used for the current measurement
#     measurement ==0 voltage measurement
#                 ==1 current measurement
#     """
#
#     def __init__(self, name, measurement, pinAss1, pinAss2, ioExpander, cspin):
#         self.name = name
#
#         self.pinAss1=pinAss1
#         self.pinAss2=pinAss2
#         self.ioExpander = ioExpander
#
#         self.cspin = cspin
#         self.measurement=measurement
#
#         if (simul==False):
#             self.spi = spidev.SpiDev()
#             # self.spi.bits_per_word = 8
#             self.spi.open(0,1)
#             self.spi.max_speed_hz = 7629 #Todo tweek
#             self.spi.mode = 0b10
#             self.spi.cshigh = True
#             #self.spi.no_cs = True
#             #self.spi.lsbfirst = True
#             GPIO.setup(self.cspin, GPIO.OUT)
#
#     def getVoltage(self):
#         if(simul):
#             return random.random() * 5
#
#         # print(bin(0b11001))
#         # print(bin(ReverseByteOrder(0b11001)))
#         print("getting values for " + str(self.name) + " cspin: " + str(self.cspin))
#         data = [0xFF,0x00,0x00,0x00]
#         # GPIO.output(self.cspin, GPIO.HIGH)
#         resp = self.spi.xfer3(data)
#         # GPIO.output(self.cspin, GPIO.LOW)
#         #print("received bits in binary:")
#         #for bit in resp:
#         #    print(bin(bit))
#
#         print("received bytes " + bin(resp[1]) + " " + bin(resp[2]) + " " + bin(resp[3]))
#         val = int.from_bytes([resp[1], resp[2], resp[3]], byteorder='little')
#
#         print("received value " + bin(val))
#         #print(bin(val))
#         #print("reorder MSB to LSB")
#         #myVal = (int)(bin(val)[:1:-1],2)
#         #print(bin(myVal))
#         #val = (resp[1] << 10) & (0b11111) + (resp[2] << 2) + (resp[3] >> 6)
#         #print("mVal: " + bin(val))
#         # val = ReverseByteOrder(val)
#         # val = ReverseByteOrder(resp[0]) + (ReverseByteOrder( resp[1] ) << 8) +(ReverseByteOrder((resp[2] & 0xC0) ) << 16)
#         #print("received value: " + str(val) + " bin: " + bin(val) + " hex: " + hex(val))
#         #maxVal = 2**18 - 1
#         #realVal = (val/maxVal) * vref
#         #print("Got real Value: " + str(realVal))
#         realVal = 5
#         return realVal
#
#     def getName(self):
#         return self.name
#
#     def setResolution(self,resolution):
#
#         if self.measurement==0:
#             #resolution = 50mV
#             if resolution== 1:
#                 self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
#                 self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)
#
#             #resolution =500mV
#             elif resolution== 2:
#                 self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
#                 self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)
#
#             #resolution = 5V
#             elif resolution== 3:
#                 self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
#                 self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)
#
#             else:
#                 raise ValueError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')
#
#
#         elif (self.measurement == 1):
#             #resolution=500uA
#             if resolution ==1:
#                 self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
#                 self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)
#             #resolution=50mA
#             elif resolution==2:
#                 self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
#                 self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)
#             else:
#                 raise ValueError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

Functions

def read_word_data(self, adress, cmd)
Source code
def read_word_data(self, adress, cmd):
    logger.debug("Mock Object -- read word data: addrress" + str(adress) + " cmd: " + str(cmd))
    return 0
def write_word_data(self, device_address, mode, value)
Source code
def write_word_data(self, device_address, mode, value):
    logger.debug("Sendind word data emulation: to: " + str(device_address) + " mode: " + str(mode)  + " value: " + str(value));

Classes

class ADS8885 (name, measurement, pinAss1, pinAss2, ioExpander, cspin, resolutionScalers, vref=2.5)
Source code
class ADS8885:

    voltageMap = {
        1 : {
            "unit":"mV",
            "max":50
        },
        2 : {
            "unit":"mV",
            "max":500
        },
        3 : {
            "unit":"V",
            "max":5
        }
    }
    currentMap = {
        1 : {
            "unit":"uA",
            "max":500
        },
        2 : {
            "unit":"mA",
            "max":50
        }
    }
    """
    A class used to represent the ADS8885 Chip.
    ...

    Attributes
    ----------
    pin1,pin2:  integer which represents the pinnumber of the PCAL chip to control the
                -VSel1/2 pin of the corresponding TS5A3359DCUR chip for the voltage measurement
                -IRngSel1/2 pin used for the current measurement
    measurement ==0 voltage measurement
                ==1 current measurement
    """

    def __init__(self, name, measurement, pinAss1, pinAss2, ioExpander, cspin, resolutionScalers, vref = 2.5):
        self.name = name
        self.vref = vref
        self.pinAss1=pinAss1
        self.pinAss2=pinAss2
        self.ioExpander = ioExpander
        self.resolution = 1
        self.cspin = cspin
        self.measurement=measurement
        self.autoResolution=False

        self.resolutionScalers = resolutionScalers

        if(simul == False):
            GPIO.setup(self.cspin, GPIO.OUT, initial = GPIO.LOW)
            self.ioExpander.setToOutputPinAssignment(pinAss1)
            self.ioExpander.setToOutputPinAssignment(pinAss2)
        #Voltage measurement
        if(measurement == 0):
            self.resolutionMap = self.voltageMap
        else:
            self.resolutionMap = self.currentMap





        # if (simul==False):
        #     self.spi = spidev.SpiDev()
        #     # self.spi.bits_per_word = 8
        #     self.spi.open(0,1)
        #     self.spi.max_speed_hz = 7629 #Todo tweek
        #     self.spi.mode = 0b10
        #     self.spi.cshigh = True
        #     #self.spi.no_cs = True
        #     #self.spi.lsbfirst = True
        #     GPIO.setup(self.cspin, GPIO.OUT)

    def getVoltage(self):
        # print("getVoltage in: " + self.name)

        if(simul):
            return random.randint(0,  int(self.vref))
            # return random.randint(0,self.getMaxRange()) / 100

        data = self.getAdcValue()

        # print("Got data " + bin(data))
        #
        # st = bin(data) + (18-(len(bin(data))-2))*"0";
        #
        # print("n data : " + st,2)
        # # 0000 - 01ffff -> POS
        # # 1000 - 11fffff -> neg
        # print(st)
        # # data = 0x20000
        MSB = (int)((data & (0b1 << 17)) != 0)
        valToXor = (0x3FFFF * MSB)
        xored = (data ^ valToXor)
        val = xored + MSB

        # print(val)
        # print("xored: " + bin(xored))


        maxVal = 0x1FFFF
        # print("maxVal: " + str(maxVal))

        ratio = (val / maxVal)

        value = self.vref * ratio
        if(MSB):
            value *= -1

        # logger.debug("value: " + str(value) + "ratio: " + str(ratio))
        # print("first bit: " + str(data & (0b1 << 17)) == 0)

        return (-1) * value;

    def getVoltageFast(self):
        data = self.getAdcValue()

        MSB = (bool)((data & (0b1 << 17)) != 0)
        val = (data ^  (0x3FFFF * MSB)) + MSB

        value = self.vref * (val / 0x1FFFF)

        if(MSB == False):
                return -value
        return value

    def scaleToResolution(self, value):
        # print(self.name + " get scale to resolution for value : " + str(value))
        # print(self.resolution)
        # print(self.resolutionScalers[self.resolution].multiplier)
        # print(self.resolutionScalers[self.resolution].offset)
        # print("ret: " + str(self.resolutionScalers[self.resolution].getScaledValue(value)))
        return self.resolutionScalers[self.resolution].getScaledValue(value)
        # # self.calibrationMap[self.resolution]
        # return self.muliplier * value + self.offset;
        # # return value
        # # tmp = 0.0114*value**2 + 1.2688 * value + 2.0662
        # # if(self.name == "vm1"):
        # #     return value * 2.3307 - 0.1192 #* 3.133 - 40.6;
        # # elif(self.name == "vm2"):
        # #     return value * 2.3487 + 0.0375 #* 3.133 - 40.6;
        # # return value;

    def getMaxRange(self):
        return self.resolutionMap[self.resolution]["max"]

    def getUnit(self):
        return self.resolutionMap[self.resolution]["unit"]

    def getName(self):
        return self.name

    def getAdcValue(self):
        if(simul):
            return random.randint(0,self.getMaxRange()) / 100

        LOW = GPIO.LOW
        HIGH = GPIO.HIGH

        GPIO.output(SPI_MOSI, HIGH)
        GPIO.output(SPI_CLK, LOW) # Start with clock low
        GPIO.output(self.cspin, HIGH)  # Enable chip

        for i in range(8):  # Send bit pattern starting from bit b4
            GPIO.output(SPI_CLK, HIGH) # Clock pulse
            GPIO.output(SPI_CLK, LOW)

        GPIO.output(SPI_MOSI, LOW)
        GPIO.output(SPI_CLK, LOW)
        GPIO.output(SPI_CLK, LOW)

        # Get reply
        data = 0
        for i in range(18):  # Read 11 bits and insert at right
            GPIO.output(SPI_CLK, HIGH)  # Clock pulse
            data <<= 1  # Shift left, LSB = 0
            if GPIO.input(SPI_MISO): # If high, LSB = 1,
                data |= 0x1
            GPIO.output(SPI_CLK, LOW)

        GPIO.output(self.cspin, LOW) # Disable chip

        return data;

    def setAutoResolution(self, autoResolution):
        self.autoResolution=autoResolution

    def maxResolution(self):
        reached= False
        if self.measurement==0:
            if self.resolution==3:
                reached=True
        if self.measurement==1:
            if self.resolution==2:
                reached=True
        return reached

    def minResolution(self):
        reached= (self.resolution==1)
        return reached


    def setResolution(self,resolution):
        logger.debug("set resolution: name: " +str(self.name) + " resolution: " + str(resolution))
        self.resolution = resolution
        if self.measurement==0:
            #resolution = 50mV
            if resolution== 1:
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)

            #resolution =500mV
            elif resolution== 2:
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)

            #resolution = 5V
            elif resolution== 3:
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)

            else:
                raise ValueError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')


        elif (self.measurement == 1):
            #resolution=500uA
            if resolution ==1:
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)
            #resolution=50mA
            elif resolution==2:
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
                self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)
            else:
                raise ValueError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

    """
    returns ture if voltage is close to upper resolution limit
    """
    def reachedResolutionMax(self, value):
        tolerance=0
        reached=False
        resolution= self.resolution
        absVal = abs(value)
        if self.measurement==0:
            #resolution = 50mV
            if resolution== 1:
                reached= (absVal>=(50-tolerance))

            #resolution =500mV
            elif resolution== 2:
                reached= (absVal>=(500-tolerance))

            #resolution = 5V
            elif resolution== 3:
                reached= (absVal>=(5-tolerance))

            else:
                raise absValError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')

        elif self.measurement == 1:
            #resolution=500uA
            if resolution ==1:
                reached= (absVal>=(500-tolerance))

            #resolution=50mA
            elif resolution==2:
                reached= (absVal>=(50-tolerance))

            else:
                raise absValError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

        else:
                raise absValError('measurement for voltage measurement must be 0, measurement for current measurement must be 1')
        return reached

    def getDebugInfos(self):
        ans = self.getName() + " : " + str(self.getMaxRange()) + " : " + str(self.resolution) + "\n";
        ans += "ADC values: " +  str(self.getVoltage()) + " adc val fast " + str(self.getVoltageFast())
        return ans;

    """
    returns ture if voltage is close to lower resolution limit
    """
    def reachedResolutionMin(self, value):
        tolerance=0
        reached=False
        absVal = abs(value)
        resolution= self.resolution
        if self.measurement==0:
            #resolution = 50mV
            if resolution== 1:
                reached=False

            #resolution =500mV
            elif resolution== 2:
                reached= (absVal<=(50+tolerance))

            #resolution = 5V
            elif resolution== 3:
                reached= (absVal<=(0.5+tolerance))

            else:
                raise absValError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')

        elif self.measurement == 1:
            #resolution=500uA
            if resolution ==1:
                reached= False

            #resolution=50mA
            elif resolution==2:
                reached= (absVal<=(0.5+tolerance))

            else:
                raise absValError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

        else:
                raise absValError('measurement for voltage measurement must be 0, measurement for current measurement must be 1')
        return reached

Class variables

var currentMap

A class used to represent the ADS8885 Chip. …

Attributes

pin1,pin2: integer which represents the pinnumber of the PCAL chip to control the -VSel1/2 pin of the corresponding TS5A3359DCUR chip for the voltage measurement -IRngSel1/2 pin used for the current measurement measurement ==0 voltage measurement ==1 current measurement

var voltageMap

Methods

def getAdcValue(self)
Source code
def getAdcValue(self):
    if(simul):
        return random.randint(0,self.getMaxRange()) / 100

    LOW = GPIO.LOW
    HIGH = GPIO.HIGH

    GPIO.output(SPI_MOSI, HIGH)
    GPIO.output(SPI_CLK, LOW) # Start with clock low
    GPIO.output(self.cspin, HIGH)  # Enable chip

    for i in range(8):  # Send bit pattern starting from bit b4
        GPIO.output(SPI_CLK, HIGH) # Clock pulse
        GPIO.output(SPI_CLK, LOW)

    GPIO.output(SPI_MOSI, LOW)
    GPIO.output(SPI_CLK, LOW)
    GPIO.output(SPI_CLK, LOW)

    # Get reply
    data = 0
    for i in range(18):  # Read 11 bits and insert at right
        GPIO.output(SPI_CLK, HIGH)  # Clock pulse
        data <<= 1  # Shift left, LSB = 0
        if GPIO.input(SPI_MISO): # If high, LSB = 1,
            data |= 0x1
        GPIO.output(SPI_CLK, LOW)

    GPIO.output(self.cspin, LOW) # Disable chip

    return data;
def getDebugInfos(self)
Source code
def getDebugInfos(self):
    ans = self.getName() + " : " + str(self.getMaxRange()) + " : " + str(self.resolution) + "\n";
    ans += "ADC values: " +  str(self.getVoltage()) + " adc val fast " + str(self.getVoltageFast())
    return ans;
def getMaxRange(self)
Source code
def getMaxRange(self):
    return self.resolutionMap[self.resolution]["max"]
def getName(self)
Source code
def getName(self):
    return self.name
def getUnit(self)
Source code
def getUnit(self):
    return self.resolutionMap[self.resolution]["unit"]
def getVoltage(self)
Source code
def getVoltage(self):
    # print("getVoltage in: " + self.name)

    if(simul):
        return random.randint(0,  int(self.vref))
        # return random.randint(0,self.getMaxRange()) / 100

    data = self.getAdcValue()

    # print("Got data " + bin(data))
    #
    # st = bin(data) + (18-(len(bin(data))-2))*"0";
    #
    # print("n data : " + st,2)
    # # 0000 - 01ffff -> POS
    # # 1000 - 11fffff -> neg
    # print(st)
    # # data = 0x20000
    MSB = (int)((data & (0b1 << 17)) != 0)
    valToXor = (0x3FFFF * MSB)
    xored = (data ^ valToXor)
    val = xored + MSB

    # print(val)
    # print("xored: " + bin(xored))


    maxVal = 0x1FFFF
    # print("maxVal: " + str(maxVal))

    ratio = (val / maxVal)

    value = self.vref * ratio
    if(MSB):
        value *= -1

    # logger.debug("value: " + str(value) + "ratio: " + str(ratio))
    # print("first bit: " + str(data & (0b1 << 17)) == 0)

    return (-1) * value;
def getVoltageFast(self)
Source code
def getVoltageFast(self):
    data = self.getAdcValue()

    MSB = (bool)((data & (0b1 << 17)) != 0)
    val = (data ^  (0x3FFFF * MSB)) + MSB

    value = self.vref * (val / 0x1FFFF)

    if(MSB == False):
            return -value
    return value
def maxResolution(self)
Source code
def maxResolution(self):
    reached= False
    if self.measurement==0:
        if self.resolution==3:
            reached=True
    if self.measurement==1:
        if self.resolution==2:
            reached=True
    return reached
def minResolution(self)
Source code
def minResolution(self):
    reached= (self.resolution==1)
    return reached
def reachedResolutionMax(self, value)
Source code
def reachedResolutionMax(self, value):
    tolerance=0
    reached=False
    resolution= self.resolution
    absVal = abs(value)
    if self.measurement==0:
        #resolution = 50mV
        if resolution== 1:
            reached= (absVal>=(50-tolerance))

        #resolution =500mV
        elif resolution== 2:
            reached= (absVal>=(500-tolerance))

        #resolution = 5V
        elif resolution== 3:
            reached= (absVal>=(5-tolerance))

        else:
            raise absValError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')

    elif self.measurement == 1:
        #resolution=500uA
        if resolution ==1:
            reached= (absVal>=(500-tolerance))

        #resolution=50mA
        elif resolution==2:
            reached= (absVal>=(50-tolerance))

        else:
            raise absValError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

    else:
            raise absValError('measurement for voltage measurement must be 0, measurement for current measurement must be 1')
    return reached
def reachedResolutionMin(self, value)
Source code
def reachedResolutionMin(self, value):
    tolerance=0
    reached=False
    absVal = abs(value)
    resolution= self.resolution
    if self.measurement==0:
        #resolution = 50mV
        if resolution== 1:
            reached=False

        #resolution =500mV
        elif resolution== 2:
            reached= (absVal<=(50+tolerance))

        #resolution = 5V
        elif resolution== 3:
            reached= (absVal<=(0.5+tolerance))

        else:
            raise absValError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')

    elif self.measurement == 1:
        #resolution=500uA
        if resolution ==1:
            reached= False

        #resolution=50mA
        elif resolution==2:
            reached= (absVal<=(0.5+tolerance))

        else:
            raise absValError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')

    else:
            raise absValError('measurement for voltage measurement must be 0, measurement for current measurement must be 1')
    return reached
def scaleToResolution(self, value)
Source code
def scaleToResolution(self, value):
    # print(self.name + " get scale to resolution for value : " + str(value))
    # print(self.resolution)
    # print(self.resolutionScalers[self.resolution].multiplier)
    # print(self.resolutionScalers[self.resolution].offset)
    # print("ret: " + str(self.resolutionScalers[self.resolution].getScaledValue(value)))
    return self.resolutionScalers[self.resolution].getScaledValue(value)
def setAutoResolution(self, autoResolution)
Source code
def setAutoResolution(self, autoResolution):
    self.autoResolution=autoResolution
def setResolution(self, resolution)
Source code
def setResolution(self,resolution):
    logger.debug("set resolution: name: " +str(self.name) + " resolution: " + str(resolution))
    self.resolution = resolution
    if self.measurement==0:
        #resolution = 50mV
        if resolution== 1:
            self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
            self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)

        #resolution =500mV
        elif resolution== 2:
            self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
            self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)

        #resolution = 5V
        elif resolution== 3:
            self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
            self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)

        else:
            raise ValueError('resolution for voltage measurement must be 1 (for the 50mV range), 2 (for the 500mV range) or 3 (for the 5V range)')


    elif (self.measurement == 1):
        #resolution=500uA
        if resolution ==1:
            self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss1)
            self.ioExpander.setVoltageHighOnPinAssignment(self.pinAss2)
        #resolution=50mA
        elif resolution==2:
            self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss1)
            self.ioExpander.setVoltageLowOnPinAssignment(self.pinAss2)
        else:
            raise ValueError('resolution for current measurement must be 1 (for the 500uA range) or 2 (for the 50mA range)')
class ResolutionScaler (multiplier, offset)
Source code
class ResolutionScaler:
    def __init__(self, multiplier, offset):
        self.multiplier = multiplier
        self.offset = offset

    def getScaledValue(self, value):
        return self.multiplier * value + self.offset

Methods

def getScaledValue(self, value)
Source code
def getScaledValue(self, value):
    return self.multiplier * value + self.offset