Add new PyQt UI
This commit is contained in:
@ -1,122 +1,229 @@
|
||||
"""
|
||||
Constants for laser control module.
|
||||
"""Shared constants for protocol, validation, transport, and GUI defaults."""
|
||||
|
||||
Physical constraints, protocol parameters, and operational limits
|
||||
extracted from original device_commands.py and device_conversion.py.
|
||||
"""
|
||||
|
||||
# ---- Protocol constants
|
||||
# ---- Transport / timing
|
||||
|
||||
BAUDRATE = 115200
|
||||
SERIAL_TIMEOUT_SEC = 1.0
|
||||
WAIT_AFTER_SEND_SEC = 0.15
|
||||
|
||||
GET_DATA_TOTAL_LENGTH = 30 # bytes in device DATA response
|
||||
SEND_PARAMS_TOTAL_LENGTH = 30 # bytes in DECODE_ENABLE command
|
||||
TASK_ENABLE_COMMAND_LENGTH = 32 # bytes in TASK_ENABLE command
|
||||
GUI_POLL_INTERVAL_MS = 150
|
||||
GUI_STATUS_INTERVAL_MS = 1000
|
||||
|
||||
WAIT_AFTER_SEND_SEC = 0.15 # delay after sending a command
|
||||
GUI_POLL_INTERVAL_MS = 5 # GUI event loop timeout
|
||||
# ---- Packet sizes
|
||||
|
||||
# ---- Command codes (as sent to device, already flipped to LE)
|
||||
GET_DATA_TOTAL_LENGTH = 30
|
||||
SEND_PARAMS_TOTAL_LENGTH = 30
|
||||
SHORT_CONTROL_TOTAL_LENGTH = 10
|
||||
WAVE_DATA_TOTAL_LENGTH = 30
|
||||
PROFILE_SAVE_CONTROL_TOTAL_LENGTH = 30
|
||||
PROFILE_SAVE_DATA_TOTAL_LENGTH = 30
|
||||
SHORT_COMMAND_LENGTH = 2
|
||||
STATUS_RESPONSE_LENGTH = 2
|
||||
|
||||
CMD_DECODE_ENABLE = 0x1111 # Set control parameters
|
||||
CMD_DEFAULT_ENABLE = 0x2222 # Reset device
|
||||
CMD_TRANSS_ENABLE = 0x3333 # Request all saved data (not implemented)
|
||||
CMD_TRANS_ENABLE = 0x4444 # Request last data
|
||||
CMD_REMOVE_FILE = 0x5555 # Delete saved data
|
||||
CMD_STATE = 0x6666 # Request state
|
||||
CMD_TASK_ENABLE = 0x7777 # Start a task
|
||||
# ---- Supported firmware commands
|
||||
|
||||
# ---- Error codes from device STATE response (after flipfour)
|
||||
CMD_DECODE_ENABLE = 0x1111
|
||||
CMD_DEFAULT_ENABLE = 0x2222
|
||||
CMD_TRANS_ENABLE = 0x4444
|
||||
CMD_STATE = 0x6666
|
||||
CMD_PROFILE_SAVE_CONTROL = 0x7777
|
||||
CMD_AD9102_CONTROL = 0x8888
|
||||
CMD_AD9833_CONTROL = 0x9999
|
||||
CMD_DS1809_CONTROL = 0xAAAA
|
||||
CMD_STM32_DAC_CONTROL = 0xBBBB
|
||||
CMD_AD9102_WAVE_CONTROL = 0xCCCC
|
||||
CMD_AD9102_WAVE_DATA = 0xDDDD
|
||||
CMD_PROFILE_SAVE_DATA = 0xEEEE
|
||||
|
||||
STATE_OK = '0000'
|
||||
STATE_SD_ERR = '0001' # SD Card read/write error
|
||||
STATE_UART_ERR = '0002' # Command (UART) error
|
||||
STATE_UART_DECODE_ERR = '0004' # Wrong parameter value
|
||||
STATE_TEC1_ERR = '0008' # Laser 1 TEC driver overheat
|
||||
STATE_TEC2_ERR = '0010' # Laser 2 TEC driver overheat
|
||||
STATE_DEFAULT_ERR = '0020' # System reset error
|
||||
STATE_REMOVE_ERR = '0040' # File deletion error
|
||||
# ---- Setup-word bit layout from firmware app_decode_work_packet()
|
||||
|
||||
STATE_DESCRIPTIONS = {
|
||||
STATE_OK: "All ok.",
|
||||
STATE_SD_ERR: "SD Card reading/writing error (SD_ERR).",
|
||||
STATE_UART_ERR: "Command error (UART_ERR).",
|
||||
STATE_UART_DECODE_ERR:"Wrong parameter value error (UART_DECODE_ERR).",
|
||||
STATE_TEC1_ERR: "Laser 1: TEC driver overheat (TEC1_ERR).",
|
||||
STATE_TEC2_ERR: "Laser 2: TEC driver overheat (TEC2_ERR).",
|
||||
STATE_DEFAULT_ERR: "Resetting system error (DEFAULT_ERR).",
|
||||
STATE_REMOVE_ERR: "File deletion error (REMOVE_ERR).",
|
||||
SETUP_WORK_ENABLED = 1 << 0
|
||||
SETUP_SUPPLY_5V1_ENABLED = 1 << 1
|
||||
SETUP_SUPPLY_5V2_ENABLED = 1 << 2
|
||||
SETUP_LASER1_ENABLED = 1 << 3
|
||||
SETUP_LASER2_ENABLED = 1 << 4
|
||||
SETUP_REFERENCE1_ENABLED = 1 << 5
|
||||
SETUP_REFERENCE2_ENABLED = 1 << 6
|
||||
SETUP_TEC1_ENABLED = 1 << 7
|
||||
SETUP_TEC2_ENABLED = 1 << 8
|
||||
SETUP_TEMP_SENSOR1_ENABLED = 1 << 9
|
||||
SETUP_TEMP_SENSOR2_ENABLED = 1 << 10
|
||||
SETUP_PID1_FROM_HOST = 1 << 12
|
||||
SETUP_PID2_FROM_HOST = 1 << 13
|
||||
|
||||
DEFAULT_SETUP_WORD = (
|
||||
SETUP_WORK_ENABLED
|
||||
| SETUP_SUPPLY_5V1_ENABLED
|
||||
| SETUP_SUPPLY_5V2_ENABLED
|
||||
| SETUP_LASER1_ENABLED
|
||||
| SETUP_LASER2_ENABLED
|
||||
| SETUP_REFERENCE1_ENABLED
|
||||
| SETUP_REFERENCE2_ENABLED
|
||||
| SETUP_TEC1_ENABLED
|
||||
| SETUP_TEC2_ENABLED
|
||||
| SETUP_TEMP_SENSOR1_ENABLED
|
||||
| SETUP_TEMP_SENSOR2_ENABLED
|
||||
| SETUP_PID1_FROM_HOST
|
||||
| SETUP_PID2_FROM_HOST
|
||||
)
|
||||
|
||||
# ---- Status-byte flags from firmware app_types.h
|
||||
|
||||
STATUS_FLAG_SD_ERROR = 0x01
|
||||
STATUS_FLAG_UART_ERROR = 0x02
|
||||
STATUS_FLAG_UART_DECODE_ERROR = 0x04
|
||||
STATUS_FLAG_TEC1_ERROR = 0x08
|
||||
STATUS_FLAG_TEC2_ERROR = 0x10
|
||||
STATUS_FLAG_DEFAULT_ERROR = 0x20
|
||||
STATUS_FLAG_AD9102_ERROR = 0x80
|
||||
|
||||
STATUS_DESCRIPTIONS = {
|
||||
STATUS_FLAG_SD_ERROR: "SD card read/write error.",
|
||||
STATUS_FLAG_UART_ERROR: "UART framing or header error.",
|
||||
STATUS_FLAG_UART_DECODE_ERROR: "Command payload validation error.",
|
||||
STATUS_FLAG_TEC1_ERROR: "Laser 1 TEC driver overheat.",
|
||||
STATUS_FLAG_TEC2_ERROR: "Laser 2 TEC driver overheat.",
|
||||
STATUS_FLAG_DEFAULT_ERROR: "Device reset/default handling error.",
|
||||
STATUS_FLAG_AD9102_ERROR: "AD9102 configuration or waveform error.",
|
||||
}
|
||||
|
||||
# ---- Physical / hardware constants (from device_conversion.py)
|
||||
# ---- Peripheral control flags from firmware app_types.h
|
||||
|
||||
VREF = 2.5 # Reference voltage, Volts
|
||||
AD9102_FLAG_ENABLE = 0x0001
|
||||
AD9102_FLAG_TRIANGLE = 0x0002
|
||||
AD9102_FLAG_SRAM = 0x0004
|
||||
AD9102_FLAG_SRAM_FORMAT_ALT = 0x0008
|
||||
|
||||
# Bridge resistors for temperature measurement
|
||||
R1 = 10000 # Ohm
|
||||
R2 = 2200 # Ohm
|
||||
R3 = 27000 # Ohm
|
||||
R4 = 30000 # Ohm
|
||||
R5 = 27000 # Ohm
|
||||
R6 = 56000 # Ohm
|
||||
AD9833_FLAG_ENABLE = 0x0001
|
||||
AD9833_FLAG_TRIANGLE = 0x0002
|
||||
|
||||
RREF = 10 # Current-setting resistor, Ohm
|
||||
# (@1550 nm – 28.7 Ohm; @840 nm – 10 Ohm)
|
||||
DS1809_FLAG_INCREMENT = 0x0001
|
||||
DS1809_FLAG_DECREMENT = 0x0002
|
||||
|
||||
# External thermistor divider resistors
|
||||
R7 = 22000 # Ohm
|
||||
R8 = 22000 # Ohm
|
||||
R9 = 5100 # Ohm
|
||||
R10 = 180000 # Ohm
|
||||
STM32_DAC_FLAG_ENABLE = 0x0001
|
||||
|
||||
# Thermistor Steinhart–Hart B-coefficient (internal / external)
|
||||
BETA_INTERNAL = 3900 # K
|
||||
BETA_EXTERNAL = 3455 # K
|
||||
T0_K = 298 # Kelvin (25 °C reference)
|
||||
R0 = 10000 # Ohm (thermistor nominal at 25 °C)
|
||||
AD9102_WAVE_OPCODE_BEGIN = 0x0001
|
||||
AD9102_WAVE_OPCODE_COMMIT = 0x0002
|
||||
AD9102_WAVE_OPCODE_CANCEL = 0x0003
|
||||
|
||||
# ADC resolution
|
||||
ADC_BITS_16 = 65535 # 2^16 - 1
|
||||
ADC_BITS_12 = 4095 # 2^12 - 1
|
||||
PROFILE_SAVE_OPCODE_BEGIN = 0x0001
|
||||
PROFILE_SAVE_OPCODE_COMMIT = 0x0002
|
||||
PROFILE_SAVE_OPCODE_CANCEL = 0x0003
|
||||
|
||||
# Voltage conversion coefficients
|
||||
U3V3_COEFF = 1.221e-3 # counts → Volts for 3.3V rail
|
||||
U5V_COEFF = 1.8315e-3 # counts → Volts for 5V rails
|
||||
U7V_COEFF = 6.72e-3 # counts → Volts for 7V rail
|
||||
PROFILE_SAVE_SECTION_PROFILE_TEXT = 0x0001
|
||||
PROFILE_SAVE_SECTION_WAVEFORM_TEXT = 0x0002
|
||||
|
||||
# ---- Operational limits (validated in validators.py)
|
||||
# ---- Physical constants from the existing conversion formulas
|
||||
|
||||
TEMP_MIN_C = 15.0 # Minimum allowed laser temperature, °C
|
||||
TEMP_MAX_C = 40.0 # Maximum allowed laser temperature, °C
|
||||
VREF = 2.5
|
||||
|
||||
CURRENT_MIN_MA = 15.0 # Minimum allowed laser current, mA
|
||||
CURRENT_MAX_MA = 60.0 # Maximum allowed laser current, mA
|
||||
R1 = 10000
|
||||
R2 = 2200
|
||||
R3 = 27000
|
||||
R4 = 30000
|
||||
R5 = 27000
|
||||
R6 = 56000
|
||||
|
||||
# Variation step limits
|
||||
CURRENT_STEP_MIN_MA = 0.002 # Minimum current variation step, mA
|
||||
CURRENT_STEP_MAX_MA = 0.5 # Maximum current variation step, mA
|
||||
RREF = 30
|
||||
|
||||
TEMP_STEP_MIN_C = 0.05 # Minimum temperature variation step, °C
|
||||
TEMP_STEP_MAX_C = 1.0 # Maximum temperature variation step, °C
|
||||
R7 = 22000
|
||||
R8 = 22000
|
||||
R9 = 5100
|
||||
R10 = 180000
|
||||
|
||||
# Time parameter limits
|
||||
TIME_STEP_MIN_US = 20 # Minimum time step, microseconds
|
||||
TIME_STEP_MAX_US = 100 # Maximum time step, microseconds
|
||||
BETA_INTERNAL = 3900
|
||||
BETA_EXTERNAL = 3455
|
||||
T0_K = 298
|
||||
R0 = 10000
|
||||
|
||||
DELAY_TIME_MIN_MS = 3 # Minimum delay between pulses, milliseconds
|
||||
DELAY_TIME_MAX_MS = 10 # Maximum delay between pulses, milliseconds
|
||||
ADC_BITS_16 = 65535
|
||||
ADC_BITS_12 = 4095
|
||||
|
||||
# ---- Acceptable voltage tolerances for power rail health check
|
||||
U3V3_COEFF = 1.221e-3
|
||||
U5V_COEFF = 1.8315e-3
|
||||
U7V_COEFF = 6.72e-3
|
||||
|
||||
# ---- Validation limits
|
||||
|
||||
TEMP_MIN_C = 15.0
|
||||
TEMP_MAX_C = 40.0
|
||||
|
||||
CURRENT_MIN_MA = 15.0
|
||||
CURRENT_MAX_MA = 60.0
|
||||
|
||||
AD9102_SAW_STEP_MIN = 1
|
||||
AD9102_SAW_STEP_MAX = 63
|
||||
AD9102_PAT_BASE_MIN = 0
|
||||
AD9102_PAT_BASE_MAX = 15
|
||||
AD9102_PAT_PERIOD_MIN = 0
|
||||
AD9102_PAT_PERIOD_MAX = 65535
|
||||
AD9102_SRAM_SAMPLE_MIN = 2
|
||||
AD9102_SRAM_SAMPLE_MAX = 4096
|
||||
AD9102_SRAM_HOLD_MIN = 0
|
||||
AD9102_SRAM_HOLD_MAX = 15
|
||||
AD9102_SRAM_AMPLITUDE_MIN = 0
|
||||
AD9102_SRAM_AMPLITUDE_MAX = 8191
|
||||
AD9102_WAVE_SAMPLE_MIN = -8192
|
||||
AD9102_WAVE_SAMPLE_MAX = 8191
|
||||
AD9102_WAVE_MAX_CHUNK_SAMPLES = 12
|
||||
AD9102_CLOCK_HZ = 150_000_000
|
||||
|
||||
AD9833_FREQ_WORD_MIN = 0
|
||||
AD9833_FREQ_WORD_MAX = 0x0FFFFFFF
|
||||
AD9833_MCLK_HZ = 20_000_000
|
||||
AD9833_OUTPUT_FREQ_MIN_HZ = 0
|
||||
AD9833_OUTPUT_FREQ_MAX_HZ = AD9833_MCLK_HZ // 2
|
||||
|
||||
DS1809_COUNT_MIN = 1
|
||||
DS1809_COUNT_MAX = 64
|
||||
DS1809_PULSE_MS_MIN = 1
|
||||
DS1809_PULSE_MS_MAX = 500
|
||||
DS1809_PROFILE_POSITION_MIN = 0
|
||||
DS1809_PROFILE_POSITION_MAX = 63
|
||||
|
||||
STM32_DAC_CODE_MIN = 0
|
||||
STM32_DAC_CODE_MAX = 4095
|
||||
|
||||
# ---- Rail tolerances
|
||||
|
||||
VOLT_3V3_MIN = 3.1
|
||||
VOLT_3V3_MAX = 3.5
|
||||
VOLT_5V_MIN = 4.8
|
||||
VOLT_5V_MAX = 5.3
|
||||
VOLT_7V_MIN = 6.5
|
||||
VOLT_7V_MAX = 7.5
|
||||
VOLT_5V_MIN = 4.8
|
||||
VOLT_5V_MAX = 5.3
|
||||
VOLT_7V_MIN = 6.5
|
||||
VOLT_7V_MAX = 7.5
|
||||
|
||||
# ---- Data buffer limits
|
||||
# ---- UI / runtime defaults
|
||||
|
||||
MAX_DATA_POINTS = 1000 # Max stored measurement points
|
||||
PLOT_POINTS = 100 # Points shown in real-time plots
|
||||
DEFAULT_TEMP1_C = 28.0
|
||||
DEFAULT_TEMP2_C = 29.2
|
||||
DEFAULT_CURRENT1_MA = 33.0
|
||||
DEFAULT_CURRENT2_MA = 60.0
|
||||
|
||||
DEFAULT_AD9102_SAW_STEP = 1
|
||||
DEFAULT_AD9102_PAT_BASE = 2
|
||||
DEFAULT_AD9102_PAT_PERIOD = 0xFFFF
|
||||
DEFAULT_AD9102_SAMPLE_COUNT = 16
|
||||
DEFAULT_AD9102_HOLD_CYCLES = 1
|
||||
DEFAULT_AD9102_AMPLITUDE = 8191
|
||||
DEFAULT_AD9102_SAW_FREQUENCY_HZ = 4577
|
||||
DEFAULT_AD9102_SRAM_FREQUENCY_HZ = 9_375_000
|
||||
DEFAULT_AD9833_FREQ_WORD = 0
|
||||
DEFAULT_AD9833_FREQUENCY_HZ = 1_000_000
|
||||
DEFAULT_DS1809_COUNT = 1
|
||||
DEFAULT_DS1809_PULSE_MS = 2
|
||||
DEFAULT_DS1809_PROFILE_POSITION = 39
|
||||
DEFAULT_STM32_DAC_VOLT = 0.52
|
||||
DEFAULT_STM32_DAC_VREF = 2.5
|
||||
DEFAULT_STM32_DAC_CODE = round(
|
||||
DEFAULT_STM32_DAC_VOLT / DEFAULT_STM32_DAC_VREF * STM32_DAC_CODE_MAX
|
||||
)
|
||||
|
||||
DEFAULT_PI_P = 2560
|
||||
DEFAULT_PI_I = 128
|
||||
|
||||
PROFILE_NAME_MAX_LENGTH = 16
|
||||
PROFILE_NAME_ALLOWED_PATTERN = r"[A-Za-z0-9 _-]{1,16}"
|
||||
PROFILE_SAVE_DATA_CHUNK_BYTES = 22
|
||||
|
||||
PLOT_POINTS = 100
|
||||
|
||||
Reference in New Issue
Block a user