def __init__(self): config = conf.Config() self.connection_type = config.MTM_PowerModule_Connection["link_type"] self.link_module_serial_number = config.MTM_PowerModule_Connection["link_serial_number"] self.power_module_serial_number = config.MTM_PowerModule_Connection["power_module_serial_number"] self.voltage = config.MTM_PowerModule["default_voltage_output"] self.current_limit = config.MTM_PowerModule["default_current_limit"] # self.is_first_time_setup = config.MTM_PowerModule_Connection['first_time_setup'] self.MTMPowerModuleAddress = config.MTM_PowerModule_Connection["power_module_address"] self.routerAddress = config.MTM_PowerModule_Connection["router_address"] if self.connection_type == "MTM_EtherStem": self.link_stem = MTMEtherStem() elif self.connection_type == "MTM_USBStem": self.link_stem = MTMUSBStem() self.power_module = MTMPM1()
class PowerSupplyControl(plugs.BasePlug): # pylint: disable=no-init """Acronmae power module control plug.""" def __init__(self): config = conf.Config() self.connection_type = config.MTM_PowerModule_Connection["link_type"] self.link_module_serial_number = config.MTM_PowerModule_Connection["link_serial_number"] self.power_module_serial_number = config.MTM_PowerModule_Connection["power_module_serial_number"] self.voltage = config.MTM_PowerModule["default_voltage_output"] self.current_limit = config.MTM_PowerModule["default_current_limit"] # self.is_first_time_setup = config.MTM_PowerModule_Connection['first_time_setup'] self.MTMPowerModuleAddress = config.MTM_PowerModule_Connection["power_module_address"] self.routerAddress = config.MTM_PowerModule_Connection["router_address"] if self.connection_type == "MTM_EtherStem": self.link_stem = MTMEtherStem() elif self.connection_type == "MTM_USBStem": self.link_stem = MTMUSBStem() self.power_module = MTMPM1() def DiscoverAndConnectModule(self): """ Discover a power module if it is not connected yet. Connect the one with the serial number specified in config yaml file. """ # spec = discover.find_first_module(Spec.TCPIP) # print "Is power module connected?" # print self.power_module.is_connected() if self.connection_type == "USB": # spec = discover.find_all(Spec.USB) # spec = discover.find_module(Spec.USB,self.power_module_serial_number) # print "spec: "+str(spec) # print "USB serial number: 0x" + str(hex(spec[0].serial_number)) res = self.power_module.connect(self.power_module_serial_number) # print "power module connection res: %d"%res """ if self.is_first_time_setup: res = self.power_module.system.setRouter(self.MTMPowerModuleAddress) #CheckReturnCode(res, "setRouterAddress") res = self.power_module.system.save() #CheckReturnCode(res, "LinkStemSave") res = self.power_module.system.reset() #CheckReturnCode(res, "PowerModulereset") sleep(0.1) """ # print("is power module connected? %d"%self.power_module.is_connected()) # CheckReturnCode(res, "power_module.connect") _LOG.info("Connected to Power Module with serial number: ", hex(self.power_module_serial_number).upper()) else: # print "Connecting to link stem..." res = self.link_stem.connect(self.link_module_serial_number) # CheckReturnCode(res, "link_stem.connect") _LOG.info("Connected to Link Module with serial number: ", hex(self.link_module_serial_number).upper()) # print "Is link stem connected now?" # print self.link_stem.is_connected() res = self.power_module.connect_through_link_module(self.link_stem) # print "Is power module connected now?" # print self.power_module.is_connected() """ if self.is_first_time_setup: # This is one-time configuration to set up the network res = self.link_stem.i2c[0].setPullup(1) #CheckReturnCode(res, "LinkStemsetPullUp") # set link stem object to talk to the power module # res = self.link_stem.setModuleAddress(self.MTMPowerModuleAddress) # CheckReturnCode(res, "setModuleAddress") # get the module address the link_stem's link is connected to # we will set this as the BrainStem network router #res = self.link_stem.module() #routerAddress = res # set the link stem's module address offsets to 0 # we will assume the link stem hardware offsets are 0 res = self.link_stem.system.setModuleSoftwareOffset(0) # set the link stem's router address res = self.link_stem.system.setRouter(self.routerAddress) #CheckReturnCode(res, "setRouterAddress") res = self.power_module.system.setRouter(self.routerAddress) #CheckReturnCode(res, "setRouterAddress") res = self.link_stem.system.save() #CheckReturnCode(res, "LinkStemSave") res = self.power_module.system.save() #CheckReturnCode(res, "PowerModuleSave") res = self.power_module.system.reset() #CheckReturnCode(res, "PowerModulereset") res = self.link_stem.system.reset() #CheckReturnCode(res, "Linkreset") sleep(0.1) """ # print "Is power module connected now?" # print self.power_module.is_connected() # res = self.power_module.connect_through_link_module(self.EtherStem) # CheckReturnCode(res, "PowerModuleConnectThroughLink") # res = self.link_stem.connect(self.link_module_serial_number) # CheckReturnCode(res, "PowerModuleConnectThroughLink") # res = self.power_module.connect_through_link_module(self.link_stem) # CheckReturnCode(res, "PowerModuleConnectThroughLink") def NoShortCircuit(self): """ Check if there is short on Power Module by driving one GPIO high. And read GPIO state to ensure it is actually high. """ self.power_module.digital[0].setConfiguration(1) self.power_module.digital[0].setState(1) digital0State = self.power_module.digital[0].getState() nAttempts = 3 while (digital0State.value != 1) and nAttempts: digital0State = self.power_module.digital[0].getState() nAttempts = nAttempts - 1 # print "power_module digital0State: %d" %digital0State.value _LOG.info("power_module digital0State: " + str(digital0State.value)) if digital0State.value != 1: _LOG.info("digital0State: " + str(digital0State.value)) # print "digital0State: %d" %digital0State.value self.power_module.rail[0].setEnableExternal(0) self.power_module.digital[0].setState(0) _LOG.info("Power module is not in right state.There is short circuit. Close connection.") raise PowerModuleError # print "Power module is not in right state. Close connection." # return False else: # print "Power module is in right state. Continue." return True def ConfigurePowerSupply(self): # pylint: disable=no-self-use """Set Voltage, Current Limit, operational mode, kelvin sensing mode...""" res = self.power_module.rail[0].setKelvinSensingMode(1) # CheckReturnCode(res,"setKelvinSensingMode") res = self.power_module.rail[0].setOperationalMode(1) # CheckReturnCode(res,"setOperationalMode") self.Set_Voltage_and_CurrentLimit(self.voltage, self.current_limit) # self.ChangeVoltage(self.voltage) # self.ChangeCurrentLimit(self.current_limit) def TurnOnPowerSupply(self): """""" res = self.power_module.rail[0].setEnableExternal(1) voltage_meas = self.GetVoltage() if res == 0 and ((self.voltage - 0.5e6) <= voltage_meas <= (self.voltage + 500000)): # print "Succeed in turning on power supply." _LOG.info("Succeed in turning on power supply.") else: # print "Error enabling rail0: res = "+str(res) # print "GetVoltage: %d"%voltage_meas # print "Error turning on power supply." _LOG.info("Error turning on power supply.") CheckReturnCode(res, "TurnOnPowerSupply") def GetVoltage(self): """Measure voltage and return voltage value.""" for i in range(3): res = self.power_module.rail[0].getVoltage() vmeas = 0.0 if res.error == 0: vmeas = res.value break elif i == 2: # print "GetVoltage(): Error getting power module voltage: %d"%(res.error) # print "GetVoltage(): %.3f" % (res.value) CheckReturnCode(res.error, "GetVoltage") return 0.0 # print ("vmeas = %d uV" %vmeas) # v = round((float(vmeas)/float(1000000))) return vmeas def GetCurrent(self): """Measure current and return current value.""" imeas = self.power_module.rail[0].getCurrent().value error = self.power_module.rail[0].getCurrent().error # print("GetCurrent Error:%d"%error) # print("imeas=%d uA" %imeas) # i = float(imeas/1000000) return imeas def Set_Voltage_and_CurrentLimit(self, voltage_uV, current_limit_uA): """Set output voltage value and current limit.""" # res1 = self.power_module.rail[0].setEnableExternal(0) # sleep(0.5) for i in range(3): res = self.power_module.rail[0].setVoltage(voltage_uV) # sleep(0.1) # vmeas_uV = self.GetVoltage() # print "change vmeas=: %d"%vmeas_uV if res == 0: # if res==0 and ( # (voltage_uV-500000)<=vmeas_uV<=(voltage_uV+500000)): # res3 = self.power_module.rail[0].setEnableExternal(1) # if res3 ==0: # print "Succeed in changing voltage." _LOG.info("Succeed in changing voltage.") break # else: # raise ChangeVoltageError elif i == 2: # print "Error in changing voltage: res: %d" %res # print "vmeas_uV=: %d"%vmeas_uV _LOG.info("Error in changing voltage.") CheckReturnCode(res, "SetVoltageOuput") res = self.power_module.rail[0].setCurrentLimit(current_limit_uA) # print ("vmeas = %d uV" %vmeas) # v = round((float(vmeas)/float(1000000))) CheckReturnCode(res, "SetCurrentLimit") """ def SetVoltage(self, voltage_uV): # Set output voltage value. # res1 = self.power_module.rail[0].setEnableExternal(0) # sleep(0.5) for i in range(3): res = self.power_module.rail[0].setVoltage(voltage_uV) #sleep(0.1) vmeas_uV = self.GetVoltage() # print "change vmeas=: %d"%vmeas_uV if res==0 and ( (voltage_uV-500000)<=vmeas_uV<=(voltage_uV+500000)): # res3 = self.power_module.rail[0].setEnableExternal(1) # if res3 ==0: # print "Succeed in changing voltage." _LOG.info("Succeed in changing voltage.") break #else: # raise ChangeVoltageError elif i==2: # print "Error in changing voltage: res: %d" %res # print "vmeas_uV=: %d"%vmeas_uV _LOG.info("Error in changing voltage.") raise PowerModuleError def SetCurrentLimit(self,current_limit_uA): # Set current limit value. # res1 = self.power_module.rail[0].setEnableExternal(0) # sleep(0.5) res = self.power_module.rail[0].setCurrentLimit(current_limit_uA) # print ("vmeas = %d uV" %vmeas) # v = round((float(vmeas)/float(1000000))) CheckReturnCode(res,"ChangeCurrentLimit") """ def PowerOff(self): """""" for i in range(3): res = self.power_module.rail[0].setEnableExternal(0) if res == 0: # print "Succeed in turning off power supply." _LOG.info("Succeed in turning off power supply.") break elif i == 2: # print "Error turning off power supply:" # print "res = %d" %res _LOG.info("Error turning of power supply.") CheckReturnCode(res, "PowerOff") def Disconnect(self): """""" self.power_module.disconnect() if self.connection_type != "USB": self.link_stem.disconnect() def TearDown(self): """This method is optional. If implemented, it will be called at the end of the test. """ self.Disconnect()