#!/usr/bin/python3 import time import serial import sys class HendiCtrl(): def __init__(self, port, baudrate): self.ser = serial.Serial(port, baudrate) try: self.ser.open() except: self.ser.close() self.ser.open() self.ser.timeout = 1.000 self.prompt = b':' def reset(self): self.ser.dtr = True self.ser.rts = False time.sleep(0.01) self.ser.dtr = True self.ser.rts = True def enter_bootloader(self): self.ser.dtr = True self.ser.rts = False time.sleep(0.01) self.ser.dtr = False self.ser.rts = True def firmware_update(self, filename): print("Start firmware update") self.enter_bootloader() self.ser.readline() self.ser.flushInput() with open(filename, 'r') as fp: line_count = 0 while (True): s = fp.readline() if s == '': break data = s.encode() self.ser.write(data) ack = self.ser.read() sys.stdout.write(ack.decode('utf-8')) sys.stdout.flush() if line_count == 64: line_count = 0 sys.stdout.write("\n") line_count += 1 self.ser.readline() self.ser.flushInput() self.ser.write(b'q') self.ser.flushOutput() def __write(self, s): self.ser.flushInput() data = s.encode() self.ser.write(data + b'\r') def __read(self): # Read line echo self.ser.readline() # Read answer line answer = self.ser.readline().decode('utf-8').replace('\r', '').replace('\n', '') if ':' in answer: result = answer.split(':') else: result = answer return result def cmd(self, s): self.__write(s) rsp = self.__read() print(rsp) if "OK" in rsp[0]: return rsp[1] return None def getCapabilties(self): caps = { "name" : self.getSoftwareIdentifier(), "ver" : self.getSoftwareVersion(), "pwr_watts_min" : 500, "pwr_watts_max" : 3500, "pwr_digits_min" : 4095, "pwr_digits_max" : 0 } return caps def getInfo(self): result = { 'caps' : self.getCapabilties(), 'state' : self.getState(), 'pwr_digits' : self.getPowerDigits(), 'Switch_state' : self.getSwitch() } return result def _debugEnable(self, enable): return self.cmd("D" + str(int(enable))) def _isDebugEnable(self): return self.cmd("D?") def getSoftwareIdentifier(self): return self.cmd("I?") def getSoftwareVersion(self): return self.cmd("V?") def getState(self): return self.cmd("T?") def remoteEnable(self, enable): return self.cmd("R" + str(int(enable))) def isRemoteEnable(self): return self.cmd("R?") def setPowerDigits(self, power_digits): return self.cmd("P" + str(power_digits)) def getPowerDigits(self): return self.cmd("P?") def setSwitch(self, enable): return self.cmd("S" + str(int(enable))) def getSwitch(self): return self.cmd("S?") if __name__ == '__main__': hendi = HendiCtrl('/dev/ttyUSB0', 115200) hendi.firmware_update("HendiCtrl.srec") hendi.reset() time.sleep(0.5) hendi.getState() hendi.getSoftwareIdentifier() hendi.getSoftwareVersion() hendi.setPower(1234) hendi.setSwitch(1) hendi.remoteEnable(True) if hendi.isRemoteEnable(): switch_state = 1 for p in range(0, 4000, 10): hendi.setPowerDigits(p) hendi.setSwitch(switch_state) switch_state = not switch_state hendi.remoteEnable(False) print ("End of program.")