"""Shared constants for protocol, validation, transport, and GUI defaults.""" # ---- Transport / timing BAUDRATE = 115200 SERIAL_TIMEOUT_SEC = 1.0 WAIT_AFTER_SEND_SEC = 0.15 GUI_POLL_INTERVAL_MS = 150 GUI_STATUS_INTERVAL_MS = 1000 # ---- Packet sizes 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 # ---- Supported firmware commands 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 # ---- Setup-word bit layout from firmware app_decode_work_packet() 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.", } # ---- Peripheral control flags from firmware app_types.h AD9102_FLAG_ENABLE = 0x0001 AD9102_FLAG_TRIANGLE = 0x0002 AD9102_FLAG_SRAM = 0x0004 AD9102_FLAG_SRAM_FORMAT_ALT = 0x0008 AD9833_FLAG_ENABLE = 0x0001 AD9833_FLAG_TRIANGLE = 0x0002 DS1809_FLAG_INCREMENT = 0x0001 DS1809_FLAG_DECREMENT = 0x0002 STM32_DAC_FLAG_ENABLE = 0x0001 AD9102_WAVE_OPCODE_BEGIN = 0x0001 AD9102_WAVE_OPCODE_COMMIT = 0x0002 AD9102_WAVE_OPCODE_CANCEL = 0x0003 PROFILE_SAVE_OPCODE_BEGIN = 0x0001 PROFILE_SAVE_OPCODE_COMMIT = 0x0002 PROFILE_SAVE_OPCODE_CANCEL = 0x0003 PROFILE_SAVE_SECTION_PROFILE_TEXT = 0x0001 PROFILE_SAVE_SECTION_WAVEFORM_TEXT = 0x0002 # ---- Physical constants from the existing conversion formulas VREF = 2.5 R1 = 10000 R2 = 2200 R3 = 27000 R4 = 30000 R5 = 27000 R6 = 56000 RREF = 30 R7 = 22000 R8 = 22000 R9 = 5100 R10 = 180000 BETA_INTERNAL = 3900 BETA_EXTERNAL = 3455 T0_K = 298 R0 = 10000 ADC_BITS_16 = 65535 ADC_BITS_12 = 4095 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 # ---- UI / runtime defaults 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