Files
scanengine-3/pymso/test_channel.py
T
Thomas Ales [M S E] fc43fbe4b0 Initial commit: merge nuescan, pymso, pybbd202, and pypewpewhops into scanengine-3
- Merged four separate hardware control projects into unified platform
- Created unified requirements.txt with all dependencies
- Added comprehensive .gitignore
- Added project overview README

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-16 20:11:31 -06:00

258 lines
11 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Test script for channel control functionality.
"""
from tektronix_base import TektronixOscilloscopeBase
def main():
"""Test channel control functions on oscilloscope at 192.168.10.105"""
scope_ip = "192.168.10.105"
print(f"Connecting to oscilloscope at {scope_ip}...")
scope = TektronixOscilloscopeBase(resource_name=scope_ip)
try:
# Connect to scope
scope.connect()
print(f"Connected to {scope.identify()}\n")
# Test with CH1
test_channel = 1
print(f"=== Testing Channel {test_channel} ===\n")
# Query all channel parameters
print("Querying all channel parameters...")
all_params = scope.query_channel(test_channel)
print(f"CH{test_channel} parameters: {all_params[:100]}...\n")
# Get current settings to restore later
print("Getting current channel settings...")
current_bandwidth = scope.get_channel_bandwidth(test_channel)
current_coupling = scope.get_channel_coupling(test_channel)
current_termination = scope.get_channel_termination(test_channel)
current_scale = scope.get_channel_scale(test_channel)
current_offset = scope.get_channel_offset(test_channel)
current_position = scope.get_channel_position(test_channel)
current_label_name = scope.get_channel_label_name(test_channel)
current_label_color = scope.get_channel_label_color(test_channel)
current_label_font_size = scope.get_channel_label_font_size(test_channel)
current_label_font_type = scope.get_channel_label_font_type(test_channel)
current_label_xpos = scope.get_channel_label_xpos(test_channel)
current_label_ypos = scope.get_channel_label_ypos(test_channel)
print(f" Current bandwidth: {current_bandwidth}")
print(f" Current coupling: {current_coupling}")
print(f" Current termination: {current_termination} ohms")
print(f" Current scale: {current_scale} V/div")
print(f" Current offset: {current_offset} V")
print(f" Current position: {current_position} divisions")
print(f" Current label name: {current_label_name}")
print(f" Current label color: {current_label_color}")
print(f" Current label font size: {current_label_font_size} pt")
print(f" Current label font type: {current_label_font_type}")
print(f" Current label X position: {current_label_xpos} px")
print(f" Current label Y position: {current_label_ypos} px\n")
# Test coupling modes
print("Testing coupling modes:")
for coupling in ['DC', 'AC']:
print(f" Setting coupling to {coupling}...")
scope.set_channel_coupling(test_channel, coupling)
actual = scope.get_channel_coupling(test_channel)
print(f" Actual coupling: {actual}")
# Test termination
print("\nTesting termination settings:")
for term in [50, 1000000]:
print(f" Setting termination to {term} ohms...")
scope.set_channel_termination(test_channel, term)
actual = scope.get_channel_termination(test_channel)
print(f" Actual termination: {actual} ohms")
# Test vertical scale
print("\nTesting vertical scale:")
test_scales = [0.1, 0.5, 1.0, 2.0]
for scale in test_scales:
print(f" Setting scale to {scale} V/div...")
scope.set_channel_scale(test_channel, scale)
actual = scope.get_channel_scale(test_channel)
print(f" Actual scale: {actual} V/div")
# Test vertical offset
print("\nTesting vertical offset:")
test_offsets = [0.0, 0.5, -0.5, 1.0]
for offset in test_offsets:
print(f" Setting offset to {offset} V...")
scope.set_channel_offset(test_channel, offset)
actual = scope.get_channel_offset(test_channel)
print(f" Actual offset: {actual} V")
# Test vertical position
print("\nTesting vertical position:")
test_positions = [0.0, 1.0, -1.0, 2.5]
for position in test_positions:
print(f" Setting position to {position} divisions...")
scope.set_channel_position(test_channel, position)
actual = scope.get_channel_position(test_channel)
print(f" Actual position: {actual} divisions")
# Test label name
print("\nTesting label name:")
test_names = ["Test Signal", "CH1-Custom", "Probe Input"]
for name in test_names:
print(f" Setting label to '{name}'...")
scope.set_channel_label_name(test_channel, name)
actual = scope.get_channel_label_name(test_channel)
print(f" Actual label: {actual}")
# Test label color
print("\nTesting label color:")
test_colors = ["#FF0000", "#00FF00", "#0000FF", "#FFFF00"]
for color in test_colors:
print(f" Setting color to {color}...")
scope.set_channel_label_color(test_channel, color)
actual = scope.get_channel_label_color(test_channel)
print(f" Actual color: {actual}")
# Test label font size
print("\nTesting label font size:")
test_sizes = [10, 12, 14, 16]
for size in test_sizes:
print(f" Setting font size to {size} pt...")
scope.set_channel_label_font_size(test_channel, size)
actual = scope.get_channel_label_font_size(test_channel)
print(f" Actual font size: {actual} pt")
# Test label font type
print("\nTesting label font type:")
test_fonts = ["Arial", "Helvetica", "Courier"]
for font in test_fonts:
print(f" Setting font to {font}...")
scope.set_channel_label_font_type(test_channel, font)
actual = scope.get_channel_label_font_type(test_channel)
print(f" Actual font: {actual}")
# Test label position
print("\nTesting label X position:")
test_xpos = [100, 200, 300]
for xpos in test_xpos:
print(f" Setting X position to {xpos} px...")
scope.set_channel_label_xpos(test_channel, xpos)
actual = scope.get_channel_label_xpos(test_channel)
print(f" Actual X position: {actual} px")
print("\nTesting label Y position:")
test_ypos = [50, 100, 150]
for ypos in test_ypos:
print(f" Setting Y position to {ypos} px...")
scope.set_channel_label_ypos(test_channel, ypos)
actual = scope.get_channel_label_ypos(test_channel)
print(f" Actual Y position: {actual} px")
# Test using string channel format
print("\nTesting with string channel format ('CH2'):")
print(" Setting CH2 coupling to AC...")
scope.set_channel_coupling('CH2', 'AC')
actual = scope.get_channel_coupling('CH2')
print(f" Actual CH2 coupling: {actual}")
print(" Setting CH2 scale to 0.5 V/div...")
scope.set_channel_scale('CH2', 0.5)
actual = scope.get_channel_scale('CH2')
print(f" Actual CH2 scale: {actual} V/div")
# Restore original settings
print(f"\nRestoring original settings for CH{test_channel}...")
scope.set_channel_coupling(test_channel, current_coupling)
scope.set_channel_termination(test_channel, current_termination)
scope.set_channel_scale(test_channel, current_scale)
scope.set_channel_offset(test_channel, current_offset)
scope.set_channel_position(test_channel, current_position)
scope.set_channel_label_name(test_channel, current_label_name)
scope.set_channel_label_color(test_channel, current_label_color)
scope.set_channel_label_font_size(test_channel, current_label_font_size)
scope.set_channel_label_font_type(test_channel, current_label_font_type)
scope.set_channel_label_xpos(test_channel, current_label_xpos)
scope.set_channel_label_ypos(test_channel, current_label_ypos)
print(f" Restored coupling: {scope.get_channel_coupling(test_channel)}")
print(f" Restored termination: {scope.get_channel_termination(test_channel)} ohms")
print(f" Restored scale: {scope.get_channel_scale(test_channel)} V/div")
# Test invalid inputs
print("\n=== Testing Error Handling ===\n")
print("Testing invalid channel number (should raise ValueError)...")
try:
scope.get_channel_coupling(5)
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\nTesting invalid channel string (should raise ValueError)...")
try:
scope.get_channel_coupling('CH5')
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\nTesting invalid coupling (should raise ValueError)...")
try:
scope.set_channel_coupling(1, 'INVALID')
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\nTesting invalid termination (should raise ValueError)...")
try:
scope.set_channel_termination(1, 75)
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\nTesting invalid scale (should raise ValueError)...")
try:
scope.set_channel_scale(1, -1.0)
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\nTesting invalid color format (should raise ValueError)...")
try:
scope.set_channel_label_color(1, "FF0000") # Missing #
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\nTesting invalid font size (should raise ValueError)...")
try:
scope.set_channel_label_font_size(1, -5)
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\nTesting invalid X position (should raise ValueError)...")
try:
scope.set_channel_label_xpos(1, -10)
print(" ERROR: Should have raised ValueError!")
except ValueError as e:
print(f" Correctly raised ValueError: {e}")
print("\n=== All tests completed successfully! ===")
except Exception as e:
print(f"Error: {type(e).__name__}: {e}")
import traceback
traceback.print_exc()
finally:
if scope.is_connected:
scope.disconnect()
print("\nDisconnected from oscilloscope")
if __name__ == "__main__":
main()