Source code for NovoptelUSB

# Downloaded from https://www.novoptel.de/Home/Downloads_de.php on 07.02.2025
# Copyright Novoptel GmbH

from time import sleep
import sys, ftd2xx as ftd
from ctypes import *
import re


[docs] class NovoptelUSB(): # Parameters baudrate = 230400 DEVNO = -1 def __init__(self, instrument_str = None): self.isConnected = False self.d=0 if isinstance(instrument_str, str): #Code from mweizel pattern = rf'^{instrument_str}.*' # list all connected ftdi devices dlist=ftd.listDevices(2) if len(dlist) > 0: for idx, dev in enumerate(dlist[:]): if re.match(pattern, dev.decode('UTF-8')): #if instrument_str is found self.DEVNO = idx if self.DEVNO>=0: try: print(f"Try connecting to {dlist[self.DEVNO].decode('UTF-8')}") self.connect() except: self.DEVNO = -1 print("Not Connected.") else: print(" No Instrument found") return else: #Code form Novoptel # list all connected ftdi devices dlist=ftd.listDevices(2) if len(dlist) > 0: counter=0 for dev in dlist[:]: print(" " + str(counter) + ": " + dev.decode('UTF-8')) counter = counter + 1 print(" Select Instrument (-1 to Quit):") self.DEVNO = int(input()) if self.DEVNO>=0: self.connect() else: print(" No Instrument found") return
[docs] def connect( self): self.d = ftd.open(self.DEVNO) # Open selected FTDI device self.d.setBaudRate(self.baudrate) self.d.setDataCharacteristics(8, 0, 0) self.isConnected = True print( "Connected." ) return
[docs] def close( self ): self.d.close() self.isConnected = False print( "Closed." ) return
[docs] def write(self, addr, data): sleep(0.01) txstring = 'W' + '{:03X}'.format(addr) + '{:04X}'.format(data) + chr(13) tx = create_string_buffer(txstring.encode('utf-8'), 9) self.d.write(tx) return
[docs] def read(self, addr): self.d.purge() # clear buffers #sleep(0.01) # send request command txstring = 'R' + '{:03X}'.format(addr) + '0000' + chr(13) #print(txstring) tx = create_string_buffer(txstring.encode('utf-8'), 9) self.d.write(tx) # wait for RX bytesavailable=0 tries=0 while bytesavailable<5 and tries<1000: bytesavailable=self.d.getQueueStatus() tries += 1 sleep(0.001) # get RX res=self.d.read(bytesavailable) #print(len(res)) #print(type(res)) #for ires in res[:]: # print(ires) #print(tries) #print(res.decode("utf-8")) #print(int(res.decode("utf-8"),16)) # return RX as integer if bytesavailable>4: val = int(res.decode("utf-8"),16) else: val = -1 return val