Version history Date Comments ========================= 2026-10-16 Change: Log file count limited to 3 instances Fix: Zero-length ramp (e.g. "0 50 Ramp" as first segment) caused division by zero; acts as a step Fix: Ramp type compare was case-sensitive in executor ("RAMP" passed validation but never ramped) Fix: Segment validation accepted invalid characters, used uninitialized values on bad numbers, leaked rows Fix: Segment program make / get-by-ID could return an uninitialized result Fix: Merged segment table dropped rows for devices with more segments than the first device Fix: Merged segment table added one column too many when the last entry filled the last column Fix: Decimal separator forced to '.' app-wide; fractional times/setpoints failed on comma locales (all numbers now display with '.') Fix: Multi-select start/stop/reset/recipe-add saved another device's setpoint into the focused device Fix: Syringe-size check ran on MFC Apply ("Invalid syringe volume", pump fields written to MFC) Fix: Duplicate-time check used exact float compare; fractional times got added twice Fix: Save segment program wrote "name.txt.txt" and leaked the dialog when no device was selected Fix: Load segment program on Cancel reported "Invalid segment program" Fix: Switching time unit back to minutes rescaled the X axis stop with the wrong multiplier Fix: Close / "Reset software" hung forever when a pump was configured (pump threads never marked for termination) Fix: Thread termination ignored its timeout; now waits up to the timeout, logs and forces termination Fix: Second "Reset software" freed a dangling LED pointer Fix: Segment program past its end returned the second-to-last setpoint or kept extrapolating a ramp; now keeps the last setpoint Fix: Adding a segment to a program with fractional times (e.g. 12.5) raised a conversion error Fix: Segment memo restored its scroll position from the data memo Fix: Form stayed disabled if device search raised an exception Fix: New mix dialog never initialised its Mix record Fix: Pump serial conflict for ID 32 resolved Fix: 2Wet pump had an empty user flow unit in one case Fix: Recipe parse ran once per character per line and leaked on every error Fix: StartThread result undefined for unknown device type Fix: Pump re-sent its last dispense command and restarted right before the thread exited on close/reset Fix: Pump thread ignored Terminated; Free/WaitFor could hang Fix: Pump object and its serial port were never freed Fix: Pump response shorter than 3 chars showed a dialog from the thread and then indexed past the string Fix: Pump RampTimeSeconds clamped upward (Max instead of Min) Fix: Pump SendCommand result unassigned when no answer was wanted Fix: Pump slow-dispense speed bisection returned the second-to-last candidate Fix: Pump zero-flow speed branch left result and error unassigned Fix: No data rows were ever logged when a pump was configured (column count off by one); pump column shows setpoint x MaxFlow (ul/min) Fix: MFC thread termination test read an uninitialised setpoint; could never terminate or terminate before the valve closed Fix: MFC uninitialised error flags took the "errors" branch and skipped the setpoint update Fix: MFC setpoint re-sent every loop for most percentages (disturbed the PID); tolerance now 0.5 count Fix: MFC thread spun without sleep when the device did not answer Fix: MFC thread died silently on any exception and the GUI waited forever on close Fix: MFC status parse read field 7 with a guard at 6 (EStringListError killed the thread) Fix: MFC ErrorFlags were cleared on every status read Fix: MFC SendASCII / ChangeGas result unassigned on failure or gas ID out of range Fix: Serial receive buffer of 80 bytes truncated long MFC status lines (3-4 error flags) -> parse exception Fix: Serial debug loop indexed AnsiString from 0 Fix: Gas flow conversion applied the time unit factor twice Fix: Gas flow conversion treated the target temperature as C regardless of unit Fix: Gas flow conversion to uL returned mL (1000x off) Fix: Absolute zero constants were -273.16 C / -427.68 F (now -273.15 / -459.67); check done in Kelvin Fix: GetGasFlowMax and TemperatureConversion left result undefined in default branches Fix: Minutes description short form could print "1m 60s" 2025-06-13 New name: ToFlow 2025-01-15 Partial update on ppm calculator-view 2024-10-14 Unselected segment program graphs clear out 2024-07-31 UI Graphical updates, New mix-designer partially done Improve search speed for pumps, removed search memory leak Moved tools to tools tab, 1-10 loop selector for priming, removed priming memory leak Updated MFC Initialization routine 2024-05-27 Pump device copy protection New feature: Data view for occurring flows in user specified units 2024-04-08 New feature: Data-view shows all segment programs New feature: Load/save for a segment-program 2024-04-03 New feature: Start devices in direct control with individual flows (details in manual) New feature: Remove all graph data New feature: Reset devices New feature: Save segment program to a file 2024-03-25 Added pump initialization sequence that was missing Fix: Pump remembers selected fluid in GUI also Experimental feature: user definable time unit m)inute, h)our, d)ay New feature: Segment program end policy shows flow past end of segment program (for 1% of total program length) it's a visual que New feature: Possibility to add comments for segments 2024-02-23 Updated Decive configurations 2024-02-23 Mixture calculations; partial pressures, per component flows, relative humidity Add segments per mixture MFC now applies the selected gas 2024-02-20 Pump: Direct control and segments work OK. Mixtures: Work started 2024-02-19 Fluid amount calculations, speed test, old code validation, migration Pump thread rudimentary functionality, Direct control mode almost working 2024-02-18 For mass flow controlers: segment program, direct control, initialization 2023-05-30 Prototype version 0.1