diff --git a/production_apspu.py b/production_apspu.py index de71804fa9d292678b2660037fd76058714da5c2..6e9bd4992318577796b0d1745a46484d9acbec6d 100644 --- a/production_apspu.py +++ b/production_apspu.py @@ -21,298 +21,30 @@ import sys sys.path.insert(0, '.') import os import math -# import time -from APSPU_I2C import * -if os.name == "posix": - from I2C_serial_pi2 import * -else: - from I2C_serial import * - - -I2CBUSNR = 3 -DEBUG = False - -class ApspuClass: - # - # Class that contains all parts on a UniBoard2 - # - def __init__(self): - self.status = False - self.pols = [] - for pol in list(CTR_POLS.keys()): - self.pols.append(PolClass(pol)) - self.dev_i2c_eeprom = I2C(EEPROM) - self.dev_i2c_eeprom.bus_nr = I2CBUSNR - self.fans = FanmonitorClass() - - def write_eeprom(self, data=0x01): - # - # Write the EEPROM with the serial number etc. - # - ret_ack, ret_value = self.dev_i2c_eeprom.read_bytes(0) - if ret_ack < 1: - print("EEPROM not found during write") - return False - else: - self.dev_i2c_eeprom.write_bytes(0x00, data) - sleep(0.1) - return True - - def read_eeprom(self): - # - # Read the EEPROM with the serial number etc. - # - ret_ack, ret_value = self.dev_i2c_eeprom.read_last_reg(1) - if ret_ack < 1: - print("no EEPROM found during read") - return False - else: - ret_ack, ret_value = self.dev_i2c_eeprom.read_bytes(0x00, 1) - return ret_value - - def wr_rd_eeprom(self, value=0x34): - # - # Write and Read the EEPROM to check functionality - # - if self.write_eeprom(value): - ret_value = self.read_eeprom() - stri = "Wrote to EEPROM: 0x{0:X}, Read from EEPROM: 0x{1} ".format(value, ret_value) - print(stri) - return True - - def read_all(self): - # - # Function to read all monitoring points of the UniBoard - # - print("Read POLs") - for pol in self.pols: - pol.read_all() - self.fans.read_all() - return True - - def print_status(self): - # - # Function to dump monitoring information on the screen - # - print("Power supplies") - for pol in self.pols: - pol.print_status() - self.wr_rd_eeprom() - self.fans.print_status() - return True - - def set_pols(self): - for pol in self.pols: - pol.set_vout_pol(VOUT_POLS[pol.name]) - pol.read_vout_set() - - - -class PolClass: - # - # Class to read all monitoring points Point of Load DC/DC converter - # - def __init__(self, name): - # - # All monitoring points Point of Load DC/DC converter - # - self.name = name - self.vout = 0 - self.iout = 0 - self.temp = 0 - self.pol_dev = I2C(CTR_POLS[self.name]) - self.pol_dev.bus_nr = I2CBUSNR - ret_ack, ret_value = self.pol_dev.read_bytes(1) - if ret_ack < 1: - stri = " Device {0} at address 0x{1:X} not found".format(self.name, CTR_POLS[self.name]) - print(stri) - self.status = False - else: - self.status = True - - - def read_vout_set(self): - # - # Function to read the output voltage of the Point of Load DC/DC converter - # - if self.status: - ret_ack, raw_value = self.pol_dev.read_bytes(LP_VOUT_COMMAND, 2) - if len(raw_value)<4: - raw_value = '0' + raw_value - ret_value = [] - ret_value= int(raw_value[2:], 16) * 2**8 - ret_value += int(raw_value[:2], 16) - output_value = ret_value * 2**-11 - print(f"Output set to: = {output_value} V using hex value {raw_value}") - return True - - def set_vout_pol(self, value): - # - # Function to read the output voltage of the Point of Load DC/DC converter - # - if self.status: - set_value = int(value * (2**11)) - hex_set_value = hex(set_value) - wr_value = (hex_set_value[4:6] + hex_set_value[2:4]) - print(f"Calculated wr_value is {wr_value}") - wr_data =[] - wr_data.append(int(hex_set_value[4:6], 16)) - wr_data.append(int(hex_set_value[2:4], 16)) - ret_ack = self.pol_dev.write_bytes(LP_VOUT_COMMAND, wr_data) - return True - - - def read_vout(self): - # - # Function to read the output voltage of the Point of Load DC/DC converter - # - if self.status: - ret_ack, vout_mod = self.pol_dev.read_bytes(LP_VOUT_MODE, 1) - ret_ack, raw_value = self.pol_dev.read_bytes(LP_VOUT, 2) - vout_mod = int(vout_mod, 16) - ret_value = [] - ret_value.append(int(raw_value[:2], 16)) - ret_value.append(int(raw_value[2:], 16)) - self.vout = calc_lin_3bytes(ret_value, [vout_mod]) - else: - self.vout = 999 +from apspu_lib import * - def read_iout(self): - # - # Function to read the output current of the Point of Load DC/DC converter - # - if self.status: - ret_ack, raw_value = self.pol_dev.read_bytes(0x39,2) - ret_ack, raw_value = self.pol_dev.read_bytes(LP_IOUT, 2) - ret_value = [] - ret_value.append(int(raw_value[:2], 16)) - ret_value.append(int(raw_value[2:], 16)) - self.iout = calc_lin_2bytes(ret_value) - else: - self.iout = 999 - - def read_temp(self): - # - # Function to read the temperature of the Point of Load DC/DC converter - # - if self.status: - ret_ack, raw_value = self.pol_dev.read_bytes(LP_temp, 2) - ret_value = [] - ret_value.append(int(raw_value[:2], 16)) - ret_value.append(int(raw_value[2:], 16)) - self.temp = calc_lin_2bytes(ret_value) - else: - self.temp = 999 - - def read_all(self): - # - # Function to read all monitoring points of the Point of Load DC/DC converter - # - self.read_vout() - self.read_iout() - self.read_temp() - - def print_status(self): - # - # Function to dump all monitoring points of the Point of Load DC/DC converter on the screen - # - if self.status: - stri = "POL: " + self.name + " " - stri += "Output voltage :{0: <5.2f} V ".format(self.vout) - stri += "Output Current :{0: <5.2f} A ".format(self.iout) - stri += "temperature :{0: <5.2f} Deg C".format(self.temp) - print(stri) - self.read_vout_set() - -class FanmonitorClass: - # - # Class to read all monitoring points Point of Load DC/DC converter - # - def __init__(self): - # - # All monitoring points Point of Load DC/DC converter - # - self.rpm = [] - self.fanmonitor_dev = I2C(MAX6620) - self.fanmonitor_dev.bus_nr = I2CBUSNR - ret_ack, ret_value = self.fanmonitor_dev.read_bytes(1) - if ret_ack < 1: - stri = " Device {0} at address 0x{1:X} not found".format("MAX6620", MAX6620) - print(stri) - self.status = False - else: - if DEBUG: - stri = "Device {0} at address 0x{1:X} is found ".format("MAX6620", MAX6620) - print(stri) - self.set_active() - self.status = True - - def set_active(self): - # - # Function to activate monitoring - # - ret_ack, reg_before = self.fanmonitor_dev.read_bytes(REG_GLOBAL, 1) - self.fanmonitor_dev.write_bytes(REG_GLOBAL, RUN_MONITOR) - ret_ack, reg_after = self.fanmonitor_dev.read_bytes(REG_GLOBAL, 1) - if DEBUG: - stri = "Reg at address 0x{0} before : {1} and after write action {2}".format(REG_GLOBAL, reg_before, reg_after) - print(stri) - fan_config_reg = int((math.log(TACH_PERIODS) / math.log(2))) << 5 - for fan_cnt in range(NOF_APS_FANS): - self.fanmonitor_dev.write_bytes(0x02 + fan_cnt, 0x88) - self.fanmonitor_dev.write_bytes(0x06 + fan_cnt, fan_config_reg) - - def read_fan(self, fan_nr): - # - # Function to a single fan - # - ret_ack, tach_msb = self.fanmonitor_dev.read_bytes(REG_TACH_MSP_REGS[fan_nr], 1) - tach_msb = int(tach_msb, 16) & 0xFF - if tach_msb > 254: - if DEBUG : - tach_lsb = 255 - tach = 99999 - rpm = 0 - else: - ret_ack, tach_lsb = self.fanmonitor_dev.read_bytes(REG_TACH_LSP_REGS[fan_nr], 1) - tach_lsb = int(tach_lsb, 16) & 0xE0 - tach = tach_msb*16 + tach_lsb/8 - rpm = float((TACH_COUNT_FREQ*TACH_PERIODS*60))/(FAN_TACHS*tach) - if DEBUG: - stri = "MSP: {0}, LSB: {1}, TACH : {2}".format(tach_msb, tach_lsb, tach) - print(stri) - return rpm - - def read_all(self): - # - # Function to read all fan's - # - for fan_counter in range(NOF_APS_FANS): - self.rpm.append(self.read_fan(fan_counter)) - - def print_status(self): - # - # Function to dump all monitoring points of the Point of Load DC/DC converter on the screen - # - if self.status: - stri = "Fan speeds of " - for fan_cnt in range(len(self.rpm)): - stri += "FAN_" + str(fan_cnt+1) - stri += " :{0: <5.2f} RPM ".format(self.rpm[fan_cnt]) - print(stri) - - -def main(): - # - # Function to test the class, read all info and dump on the screen - # - apspu = ApspuClass() - print("read / write EEPROM") - apspu.wr_rd_eeprom(value=0x34) - apspu.set_pols() - apspu.read_all() - apspu.print_status() -if __name__ == "__main__": - main() +if len(sys.argv)<2: + print("Production_apspy.py <ASTRON NR> <Serial number>") + print("e.g. python production_apspy.py 2022-01 1234") + exit() + +apspu = ApspuClass() +#apspu.apspu_on_off(False) +#sleep(5) +#apspu.set_pols() +#apspu.apspu_on_off(True) +#sleep(10) +apspu.read_all() +apspu.print_status() +#apspu.check_apspu() +#apspu.apspu_on_off(False) +#sleep(10) +#apspu.read_all() +#apspu.print_status() +#apspu.apspu_on_off(True) +id = "APSPU-" + sys.argv[1] +serial = sys.argv[2] +apspu.wr_rd_eeprom(id, address=0) +apspu.wr_rd_eeprom(serial, address=0x20)