HWBTutorials/TRNG_attack/oscilloscope.py

101 lines
3.4 KiB
Python

import logging
import pyvisa
from pyvisa import constants
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())
def get_oscilloscopes():
rm = pyvisa.ResourceManager('@py')
return rm.list_resources(query = '?*::INSTR')
class Oscilloscope:
def __init__(self, oscilloscope_id):
rm = pyvisa.ResourceManager('@py')
resources = rm.list_resources(query = '?*::INSTR')
self.resource = rm.open_resource(
resources[oscilloscope_id],
read_termination = '\n',
write_termination = '\n')
self.resource.timeout = 20000
logger.debug('timeout set to %dms', self.resource.timeout)
self.resource.query_delay = 0.1
logger.debug('query_delay set to %fs', self.resource.query_delay)
# self.query = self.resource.query
self.write('*CLS')
print('connected to the oscilloscope with *IDN:',
self.query('*IDN?'))
def __del__(self):
self.close()
def close(self):
logger.debug('closing oscilloscope...')
self.resource.close()
def write(self, *args):
logger.debug('%s', ', '.join(map(str, args)))
return self.resource.write(*args)
def query(self, *args):
logger.debug('%s...', ', '.join(map(str, args)))
data = self.resource.query(*args)
logger.debug('%s %s', args[0], data)
return data
def command_binary(self, query, data: bytes):
logger.debug('%s, len: %d', query, len(data))
return self.resource.write_binary_values(
query,
data,
datatype='B')
def query_binary(self, query):
logger.debug('%s...', query)
data = self.resource.query_binary_values(
query,
datatype='B',
container = bytes)
logger.debug('%s, len: %d', query, len(data))
return data
def query_check(self, command):
print(command, self.resource.query(command+'?'))
def command_check(self, command, value):
data = self.resource.write(command + ' ' + value)
self.query_check(command)
return data
def save_conf(self, filename):
logger.debug('to filename %s', filename)
data = self.query_binary(':SYSTem:SETup?')
out_file = open(filename, 'wb')
len_written = out_file.write(data)
out_file.close()
logger.debug('read %d, written %d', len(data), len_written)
return len(data) - len_written
def load_conf(self, filename):
logger.debug('from filename %s', filename)
in_file = open(filename, 'rb')
data = in_file.read()
len_written = self.command_binary(':SYSTem:SETup ', data)
in_file.close()
logger.debug('read %d, written %d', len(data), len_written)
return len(data) - len_written
def setup_measurement(self):
logger.debug('')
self.command_check(":ACQuire:TYPE", "Normal")
# self.command_check(":ACQuire:COUNt", "2")
self.command_check(":TIMebase:MODE", "MAIN")
self.command_check(":WAVeform:UNSigned", "1")
self.command_check(":WAVeform:BYTeorder", "LSBFirst")
self.command_check(":WAVeform:FORMat", "BYTE")
self.command_check(":WAVeform:SOURce", "CHANnel1")
self.command_check(":WAVeform:POINts:MODE", "RAW")
self.command_check(":ACQuire:COMPlete", "100")