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>
This commit is contained in:
Thomas Ales [M S E]
2026-01-16 20:11:31 -06:00
commit fc43fbe4b0
65 changed files with 19127 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
#!/usr/bin/env python3
"""
Test script for horizontal mode control functionality.
"""
from tektronix_base import TektronixOscilloscopeBase
def main():
"""Test horizontal mode 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")
# Get current horizontal settings
print("Getting current horizontal settings...")
current_record_length = scope.get_record_length()
current_sample_rate = scope.get_sample_rate()
current_time_scale = scope.get_time_scale()
print(f"✓ Current record length: {current_record_length} samples")
print(f"✓ Current sample rate: {current_sample_rate} S/s")
print(f"✓ Current time scale: {current_time_scale} s/div\n")
# Test setting record length
print("Testing record length changes:")
test_lengths = [1000, 10000, 100000]
for length in test_lengths:
print(f" Setting record length to {length}...")
scope.set_record_length(length)
actual_length = scope.get_record_length()
print(f" ✓ Actual record length: {actual_length}")
# Test setting sample rate
print("\nTesting sample rate changes:")
test_rates = [1e6, 10e6, 100e6] # 1 MS/s, 10 MS/s, 100 MS/s
for rate in test_rates:
print(f" Setting sample rate to {rate:.0f} S/s...")
scope.set_sample_rate(rate)
actual_rate = scope.get_sample_rate()
print(f" ✓ Actual sample rate: {actual_rate:.0f} S/s")
# Test setting time scale
print("\nTesting time scale changes:")
test_scales = [1e-6, 10e-6, 100e-6, 1e-3] # 1 µs/div, 10 µs/div, 100 µs/div, 1 ms/div
for scale in test_scales:
print(f" Setting time scale to {scale:.6f} s/div...")
scope.set_time_scale(scale)
actual_scale = scope.get_time_scale()
print(f" ✓ Actual time scale: {actual_scale:.6f} s/div")
# Restore original settings
print(f"\nRestoring original settings...")
scope.set_record_length(current_record_length)
scope.set_sample_rate(current_sample_rate)
scope.set_time_scale(current_time_scale)
print(f"✓ Restored record length: {scope.get_record_length()}")
print(f"✓ Restored sample rate: {scope.get_sample_rate()}")
print(f"✓ Restored time scale: {scope.get_time_scale()}")
# Test invalid inputs
print("\nTesting invalid record length (should raise ValueError)...")
try:
scope.set_record_length(-1)
print("✗ ERROR: Should have raised ValueError!")
except ValueError as e:
print(f"✓ Correctly raised ValueError: {e}")
print("\nTesting invalid sample rate (should raise ValueError)...")
try:
scope.set_sample_rate(0)
print("✗ ERROR: Should have raised ValueError!")
except ValueError as e:
print(f"✓ Correctly raised ValueError: {e}")
print("\nTesting invalid time scale (should raise ValueError)...")
try:
scope.set_time_scale(-1.0)
print("✗ ERROR: Should have raised ValueError!")
except ValueError as e:
print(f"✓ Correctly raised ValueError: {e}")
except Exception as e:
print(f"✗ Error: {type(e).__name__}: {e}")
import traceback
traceback.print_exc()
finally:
if scope.is_connected:
scope.disconnect()
print("\n✓ Disconnected from oscilloscope")
if __name__ == "__main__":
main()