Cause:
- Preadjustment Completion and TBF Q3 calibration results required configurable database persistence.
- Both write operations required diagnostics and simulation support.
Solution:
1. Added independent database writer configurations
- Added PreadjustmentCompletionWriter and Q3CalibrationWriter to gci_config.
- Support SQL commands, stored procedures and parameter mappings.
- Added SQL table creation and verification scripts.
2. Added Preadjustment Completion storage
- Store PCB ID, meter size, amplitude settings, temperature offsets, zero-flow offsets, timestamp and overall result.
- Use captured Completion readout values.
- Preserve the original HTTP reporting.
- Report SQL connection and write status in the corresponding slot diagnostics.
3. Added Q3 calibration storage
- Forward TBF results through GCI Bridge to the GCI database API.
- Store signed deviations and written calibration factors for all three paths.
- Write to SQL after successful calibration register writes and StoreCalibration.
- Include PCB ID and UTC timestamp.
4. Added simulation support
- Generate sample Completion and Q3 records for simulated slots.
- Perform real SQL writes when the corresponding writer is enabled.
- Log connection progress, write outcomes and generated record IDs.
5. Separated calibration and database outcomes
- Preserve meter operation results when database storage fails.
- Expose database write status independently.
6. Increased revision
- Updated revision from 3.9.3146.108 to 3.9.3146.109.
Validation:
- Confirmed successful SQL storage for simulated Completion.
- Confirmed successful Q3 calibration result storage.
ToDo:
- Use the GCI Q3 storage API as the foundation for future migration of Q3 calibration from the direct TBF communication branch to GCI.
Cause:
- GCI streaming port ownership interfered with regular TBF measurements using direct streaming access.
- Streaming handoff recreated both connections and required unnecessary login attempts between phases.
- Sequential port acquisition delayed execution, while unavailable meters could prevent healthy slots from continuing.
- Repeated initialization retained exclusions from the previous attempt.
Solution:
1. Integrated two communication approaches
- Enable coexistence of the GCI Bridge workflow, which uses request and streaming ports, and the TBF workflow, which accesses the streaming port directly.
- Transfer streaming port ownership explicitly between both workflows.
- Preserve the GCI request connection and authentication during streaming handoff.
2. Updated ExternalProjects - GenesisCore/GenesisMeter
- Added ConnectStreamingPort and DisconnectStreamingPort.
- Separate streaming port lifecycle from request connection lifecycle.
- Allow streaming port ownership to move between both technological branches without reconnecting the request port or repeating login.
- Preserve process configuration and release streaming resources on completion, cancellation or acquisition failure.
3. Updated ExternalProjects - CordonelPreadjustmentUi
- Adapt ZeroFlowGenesisMeter data collection to streaming port handoff.
- Support repeated StartRecordData calls without duplicate subscriptions.
- Prevent duplicate record processing and repeated amplitude scaling.
- Coordinate preadjustment data subscription startup and shutdown with streaming ownership.
4. Restored parallel slot handling
- Acquire, check and release ports concurrently across slots.
- Isolate unavailable or failed meters without excluding healthy slots.
- Drain pending operations before cleanup on STOP.
5. Corrected repeated execution and results
- Reset exclusions and result state on explicit preadjustment initialization.
- Evaluate results separately for each slot.
- Prevent empty phases from being reported as successful measurements.
- Return the streaming port for subsequent non-GCI measurements.
6. Updated revision
- Set revision to 3.9.3146.108.
Related dependency changes:
- This commit requires the corresponding changes in:
- ExternalProjects - GenesisCore/GenesisMeter.
- ExternalProjects - CordonelPreadjustmentUi.
- Build and deploy both updated assemblies together with the matching TBF/GCI changes.
Architecture milestone:
- Established functional integration of two communication architectures: GCI Bridge access to both ports and direct TBF access to the streaming port.
- This version, together with the corresponding ExternalProjects changes, provides the baseline for their future unification.
ToDo:
- Use this baseline to unify request and streaming communication behind the GCI interface.
- Migrate remaining direct streaming access to GCI while preserving parallel slot execution, cancellation and diagnostic logging.
- Centralize ownership and lifecycle management of both ports in GCI.
Cause:
- Temperature calibration results lacked measured meter temperatures and comparison details.
- Diagnostics closed immediately after a phase, preventing inspection of failures.
- Push Temperature remained visible when temperature was supplied directly from T1/T2.
- Automatic phase transitions provided insufficient settling time before temperature calibration, causing temperature checks to fail.
Solution:
1. Added structured temperature calibration results
- Return reference temperature, meter temperature, absolute difference, effective limit and sample count per slot.
- Distinguish temperature check status from overall calibration completion.
- Preserve existing API signatures and add typed result methods.
2. Improved temperature diagnostics
- Log sample count, invalid values, minimum, maximum and mean for each path.
- Add bounded TEMP-RAW capture with raw temperature, scaling factor, decoded temperature, timestamps and frame content.
- Attach diagnostic capture only during the temperature check and detach it afterwards, including on cancellation.
- Preserve the original streaming handler used during Amplitude Test.
- Keep the original comparison algorithm and temperature deviation limit.
- Remove configurable deviation from the GCI Bridge component dialog.
3. Added optional hold after preadjustment
- Add the Hold after preadjustment procedure parameter.
- Keep completed results and diagnostics visible until Continue is pressed.
- Process STOP during hold and exclude hold time from measurement duration.
4. Updated phase display
- Hide Push Temperature in sensor mode unless that action is explicitly running.
- Keep failed slots and their exclusion status visible during hold.
5. Corrected settling time
- Remove initialization overrides that forced OffsetTestSettlingTime to zero.
- Set OffsetTestSettlingTime to 20 seconds.
- Apply settling before temperature calibration and during Offset Test.
- Preserve STOP handling during the wait.
- The existing inclusive countdown produces approximately 21 seconds of waiting.
6. Aligned project versions
- Update TBF revision to 3.9.3146.107.
- The corresponding Laatzen PreadjustmentUI project state matches this TBF revision exactly.
- Build and deploy these matching project versions together.
Validation:
- Compared raw temperature frames from GCI GUI and GenesisCommunication.
- Confirmed that decoded Meter temperatures matched the raw frame values.
- Confirmed that adding a pause after Amplitude Test allowed temperature calibration to pass.
Cause:
- Settling and data collection updated only StatusLabel, leaving slot diagnostic memos without progress messages.
- One error message had no slot assigned and was ignored by slot diagnostics.
Solution:
1. Added slot-specific progress logging
- Log settling countdown every second.
- Log collected record count every collection cycle.
- Log completion of data collection.
2. Corrected error routing
- Include slot and PCB ID in the bad-data warning.
3. Preserved test behaviour
- Keep existing timing, calculations and validation unchanged.
4. Increased revision
- Updated revision to 3.9.3146.106.
Cause:
- Optional preadjustment phases remained in the Pending state after a later phase had already started.
- Running and skipped phases required clearer visual distinction.
Solution:
1. Improved preadjustment phase states
- Mark preceding unexecuted phases as Skipped when a later preadjustment phase starts.
- Allow a skipped phase to transition normally to Running if it is executed later.
2. Improved diagnostic colors
- Display running phases in blue.
- Display skipped phases in orange.
- Preserve green for passed, red for failed and grey for pending phases.
3. Increased revision
- Updated revision to 3.9.3146.105.
Cause:
- GenesisRegReader configured the GCI streaming port as NA.
- GCI Bridge therefore received no calibration streaming data during the Amplitude Test.
- The request port remained functional, so register writes succeeded while TOF data collection failed.
Solution:
1. Corrected streaming port ownership
- Pass the configured Genesis opto COM port to GCI Bridge as the UART streaming port.
- Stop GenesisRegReader streaming before handing the port over to GCI Bridge.
- Validate request and streaming ports during preadjustment detection.
- Release the GCI connection after preadjustment so the port can be reused by subsequent tests.
2. Increased revision
- Updated revision to 3.9.3146.104.
Cause:
* Genesis preadjustment activities lacked a dedicated real-time diagnostic view.
* It was difficult to monitor slot workers, requests, phase progress and slot-specific logs during execution.
* GCI Bridge simulation did not provide configurable timing and results for individual preadjustment activities.
* Failed slots could incorrectly continue in subsequent preadjustment phases.
* Live log refresh prevented reliable scrolling and copying while messages were arriving.
Solution:
1. Added preadjustment diagnostic logging
* Added detailed logging for GenesisCommunication preadjustment execution.
* Added GCI Bridge worker, queue, request and operation diagnostics.
* Routed diagnostic messages through AppDiagnostic.
2. Added a dedicated preadjustment diagnostics form
* Opens automatically while a preadjustment activity is running.
* Closes automatically when the activity finishes.
* Uses a stable position within the TBF results area.
* Displays GCI slot and worker status in real time.
3. Added dynamic slot diagnostics
* Creates a tab for every selected slot.
* Displays all eight preadjustment phases.
* Shows Pending, Running, Passed and Failed states using distinct colors.
* Preserves phase history between independently executed activities.
* Keeps failed and excluded slots visible.
4. Added slot-specific live logs
* Routes progress and simulation messages to the corresponding slot memo.
* Appends only new messages instead of replacing the complete text.
* Preserves the operator's scroll position while new messages arrive.
* Removed duplicate timestamps.
5. Added configurable preadjustment simulation
* Added configurable simulation duration, Success and ErrorMessage parameters.
* Added per-operation simulation profiles to GCI Bridge.
* Applies procedure-specific simulation values dynamically before executing a GCI operation.
* Rejects invalid simulation-mode combinations.
6. Added parallel per-slot simulation workers
* Executes simulated preadjustment operations independently for every selected slot.
* Uses a dedicated worker and queue state for each slot.
* Waits for all participating operations using Task.WhenAll.
* Aggregates individual slot results into the batch result.
7. Added failed-slot exclusion
* Stores preadjustment results for the current batch.
* Excludes failed slots from subsequent preadjustment activities.
* Keeps excluded slots visible and marked as failed.
* Limits exclusion to preadjustment activities.
8. Increased revision
* Updated revision to 3.9.3146.103.
Validation:
* Confirmed real-time phase and slot diagnostics.
* Confirmed parallel simulation using dedicated slot workers.
* Confirmed configurable simulation timing and results.
* Confirmed live slot logs remain scrollable and copyable.
Cause:
- Live diagnostics required logging from multiple applications without blocking TBF.
- Shared nlog.config files caused configuration conflicts.
- The original viewer lacked configurable colors and practical log controls.
- Inconsistent diagnostic deployment caused log transfer failures and locked shared DLLs during builds.
Solution:
1. Added universal diagnostic transport
- Added AppDiagnostic.Logging with an NLog target and named-pipe communication.
- Added background buffering and automatic reconnection.
- Registered the diagnostic connector programmatically.
2. Separated diagnostic window lifecycle
- Run AppDiagnostic as an independent process.
- Activate the existing window on repeated launches.
- Keep TBF running when the diagnostic window closes.
3. Corrected diagnostic deployment
- Copy the complete diagnostic output into a dedicated AppDiagnostic subdirectory during build.
- Overwrite existing deployment files to prevent inconsistent versions.
- Validate and launch the executable from that subdirectory with an explicit working directory.
4. Improved the log viewer
- Added configurable substring colors with a palette and live preview.
- Added text, level and application filters.
- Added line wrapping, clipboard actions and log export.
- Added Pause/Resume, Refresh, Clear, auto-scroll and Always on top.
- Added connection and log counters.
- Persist color rules between sessions.
5. Removed legacy dependencies
- Replaced LiveLogCache with structured diagnostic storage.
- Removed AppDiagnostic dependencies on log4net and SharedComponents.
Validation:
- Confirmed successful log transfer when launching AppDiagnostic from TBF.
Cause:
- GenesisCommunication did not expose GCI preadjustment phases as selectable test activities.
- Meter size and temperature inputs required by preadjustment could not be configured.
- The configuration control incorrectly expected the iPerlCommunication configuration type.
- Preadjustment results were not propagated to TBF test and meter results.
Solution:
1. Added standalone preadjustment activities
- Added Initialization, Detect, Preparation, Amplitude Test, Temperature Calibration, Push Temperature, Offset Test and Completion.
- Each phase can be selected and executed independently.
2. Added preadjustment parameters
- Added configurable meter size and temperature.
- Added validation and supported meter-size selection.
3. Added batch preadjustment execution
- Resolves enabled Genesis register readers and their slots.
- Verifies that all readers use the same GCI Bridge instance.
- Dispatches the selected activity through the corresponding GCI Bridge API.
4. Added result processing
- Stores execution time and completion status.
- Updates test and meter results according to the GCI response.
5. Fixed the configuration control
- Corrected TestMethodCfgCtrl to accept the GenesisCommunication TestMethodCfg type.
6. Increased revision
- Updated revision to 3.9.3146.101.
A – Registration and execution
- Register GenesisCommunication Factory in the component list.
- Separate the Genesis form and sequence from iPerl communication.
B – Communication activities
- Restore initialization, connection, PCB reading, password and login.
- Include grouped login, mode switching and disconnection.
- Support processing up to 10 slots.
C1 – Input calibration factors
- Read three factors from Water meters / Text1–Text3.
- Validate integer values in the range 1–65535.
- Preserve the default of 15625 when all three fields are empty.
D – Q3 calibration
- Connect the Prepare Q3 → measurement → Write Q3 workflow.
- Add channel processing to FlyingStart and FlyingStartMassCollection.
- Reset previous measurement data and validate calculated factors.
- Mark factors as stored only after StoreCalibration succeeds.
E – Results and database
- Store calibration factors separately for each meter and channel.
- Add result entities, mappings and Q3 data.
- Extend DB.cs / EnsureSchema to create and update the schema.
- Preserve compatibility with the existing binary format.
Validation:
- Debug build and 18 tests passed.
- Simulated communication runs follow the same activity sequence.
- The complete Q3 workflow has not yet been verified on hardware.
Known limitation:
- An inherited mismatch in simulated responses and error propagation
can produce an incorrect OK result; this change does not fix it.
Cause:
* A configuration control can reject an incompatible configuration and return null.
* ComponentsManagerDlg accessed the rejected configuration without validation, causing a NullReferenceException and closing TBF.
* The standard MessageBox was difficult to read and did not provide convenient access to technical details.
Solution:
1. Added configuration validation
* Validates the configuration returned by the component control.
* Logs the rejected control and configuration types.
* Cancels the add operation without terminating TBF.
2. Added a reusable error details dialog
* Displays a clear error summary and structured technical details.
* Allows the diagnostic text to be selected and copied.
* Added Copy and Close actions and registered the new form in TBF.csproj.
3. Increased revision
* Updated revision to 3.9.3145.109.
Cause:
- GciBridge Factory used an incorrect namespace substring offset when generating the component class name.
- The generated value was `geComponents.GciBridge` instead of `BridgeComponents.GciBridge`.
- The invalid class name could prevent correct component registration and lookup.
Solution:
1. Corrected class name generation
- Changed the namespace substring offset from 12 to 8.
- GciBridge Factory now returns the correct `BridgeComponents.GciBridge` class name.
2. Restored component identification
- GciBridge can now be registered and resolved using the expected TBF component class name.
3. Increased revision
- Updated revision to 3.9.3145.108.
Cause:
- GciBridge threw an exception when the configured UniDataStorageReader or UniDataStorageWriter was not available during component initialization.
- The exception prevented TBF from starting and made it impossible to correct the component configuration through the UI.
Solution:
1. Improved missing component handling
- Replaced fatal exceptions for missing storage components with warning logs.
- Allowed GciBridge and TBF to continue initialization.
2. Preserved existing behavior
- Available UniDataStorageReader and UniDataStorageWriter components are still linked as before.
- Existing GciBridge configurations remain compatible.
3. Increased revision
- Updated revision to 3.9.3145.107.
Cause:
- Repeating XML output always included every published meter test.
- The existing TestID/Prüfpunkt configuration was not used to filter generated XML test records.
- A configured TestID could be evaluated in an incorrect repeating test context.
Solution:
1. Added optional test filtering
- Non-empty TestID values define the tests included in repeating XML output.
- Multiple configured TestID values act as a whitelist.
2. Preserved existing behavior
- When no TestID is configured, all published tests are exported as before.
- Existing configurations remain compatible without migration.
3. Prevented cross-test evaluation
- Test-dependent items are evaluated only for their matching TestID.
- Values from one test are no longer reused in another test record.
4. Improved source formatting
- Reformatted ResultsWriter.cs for easier reading and searching.
5. Increased revision
- Updated revision to 3.9.3145.106.
Cause:
- Previous results opens the ResultsWriter configuration through GetControl(null).
- The component entity list is therefore unavailable.
- The DropDownList could not display the saved ParentName because it was not present in its Items collection.
Solution:
1. Restored the saved parent writer
- Adds the configured ParentName to the list when it is not already available.
- Selects the restored UniDataStorageWriter in parentComboBox.
2. Preserved standard configuration behavior
- All available UDSW components are still loaded when component entities are provided.
- Previous results can now display and use the previously configured parent writer.
3. Improved source formatting
- Removed inappropriate line wrapping from ResultsWriterCfgCtrl.cs.
4. Increased revision
- Updated revision to 3.9.3145.105.
Cause:
- ResultsWriter explicitly suppressed the existing TestID column.
- Users could not configure the test identifier for test-dependent result variables.
- In the German localization, the corresponding Prüfpunkt column was therefore hidden.
Solution:
1. Enabled TestID configuration
- Set SupressTestIDColumn to false.
- The TestID/Prüfpunkt column is now displayed after Merge.
2. Preserved existing configuration handling
- TestID values continue to use the existing WMeterRsltItemSpec serialization.
- No configuration format change was required.
3. Increased revision
- Updated revision to 3.9.3145.104.
Cause:
- Payload archive filenames required values from the generated XML payload.
- Date/time values needed filename-safe formatting.
- XML result values such as Passed and Failed needed configurable conversion to P and F.
Solution:
1. Added XML filename tokens
- Supports any unique non-repeating XML value using {Xml:/path}.
- Resolves filename values directly from the generated payload.
2. Added user-friendly token configuration
- Clicking inside a token opens the XML value chooser.
- Added Time format and Mask transformations.
3. Improved filename generation
- Validates XML paths and rejects ambiguous repeating values.
- Sanitizes resolved values for safe filesystem usage.
- Passes the per-meter payload context from ResultsWriter.
4. Integrated the new dialog
- Added PayloadFileNameXmlTokenDlg and its Designer file.
- Updated the TBF project configuration.
5. Increased revision
- Updated revision to 3.9.3145.103.
Cause:
- Previous Results used fixed column widths, making long procedure and purchase order values difficult to read.
- Result columns could not be resized interactively.
- Window resizing caused unnecessary UI redraws and visible lag.
- The existing result layout lacked clear column headers and visual separation.
Solution:
1. Added resizable result columns
- Added draggable column separators.
- Keeps column widths synchronized across all displayed result rows.
- Added optimized resize preview to reduce UI lag.
2. Improved responsive layout
- Enlarged the default Previous Results window.
- Keeps Purchase Order, OK, NOK and Actions aligned to the right.
- Uses Procedure as the flexible column when resizing the window.
3. Improved result presentation
- Added aligned column headers.
- Added modern column colors and styled action buttons.
- Reduced spacing between result rows and improved separators.
4. Increased revision
- Updated revision to 3.9.3145.103.
Cause:
- The customer XML format requires batch, DUT, group and test-level metadata.
- ResultsWriter did not provide variables for test position, repetition index, batch duration, DUT test duration or aggregated test statuses.
- Missing WaterMeterData could cause a NullReferenceException while evaluating WM Type.
Solution:
1. Added XML mapping variables
- Added TestPositionInBatch and TestRepetitionNr.
- Added BatchTime and TestsTotalTime.
- Added PassedFromAllTests and PassedFromRepeatedTests.
2. Added hierarchical result evaluation
- Evaluates the overall PANEL/DUT status from all tests.
- Evaluates GROUP status from repeated instances of the selected test.
3. Improved meter data handling
- Made WM Type evaluation null-safe when WaterMeterData is unavailable.
4. Increased revision
- Updated revision to 3.9.3145.102.
Cause:
- ResultsWriter evaluated selected test-dependent items without the actual TestID.
- This caused values such as Test passed(), timestamps, flow, pressure, temperature, conductivity and error data to be empty or incorrect.
Solution:
1. Fixed test-aware result evaluation
- Uses published regular meter test results.
- Passes mtr.Name() as TestID to item.Print(wm, testId).
2. Restored correct test result mapping
- Test-dependent values are now resolved from the correct TestRslt / MeterTestRslt.
3. Increased revision
- Updated revision to 3.9.3145.101.
Cause:
- ResultsWriter required a generic way to generate customer-specific XML result data from TBF measurement results.
- The customer reference XML contains example runtime values and repeated result structures, so it cannot be used directly as the generated output.
- TBF result variables must be explicitly mapped to destinations in the customer XML structure.
- The generated XML result data must support two output targets:
- direct creation of an XML file,
- delivery of the XML payload to a Microsoft SQL stored procedure.
- Preview generation must allow the XML structure and configured mappings to be verified without executing the production database write.
- Increase revision to 3.9.3145.100.
Solution:
1. Added XML reference analysis
- Creates a clean base XML structure.
- Extracts the repeating result prototype.
- Prevents sample runtime values from the customer reference XML from leaking into generated results.
2. Added configurable TBF-to-XML result mapping
- Allows explicit mapping of TBF result variables to customer XML destinations.
- Supports one-time and repeating XML destinations.
- Keeps the mapping independent of the semantic meaning of customer XML attribute names.
3. Added XML destination viewer and configurator
- Shows the current mapping.
- Highlights repeating destinations.
- Identifies already used one-time destinations.
4. Added runtime XML result generation
- Uses the configured TBF-to-XML mappings.
- Uses measurement procedure result data.
- Builds the output from the clean base XML and repeating XML prototype.
- Generates repeated result records according to the executed measurement procedure.
5. Added simulation-based Preview request
- Generates a complete XML payload using simulation values.
- Allows XML structure and mapping verification before production execution.
- Does not execute the production stored procedure.
6. Added direct XML file output support to UniDataStorageWriter
- Supports File / .xml as a physical output target.
- Creates the generated XML result file in the configured output directory.
7. Added Microsoft SQL stored-procedure XML output
- Supports Microsoft SQL / StoredProcedure as a physical output target.
- Passes the generated XML payload through the configured stored procedure parameter.
8. Added optional XML payload archiving
- Allows generated XML payloads to be stored in the configured Payload archive.
- Can be used together with the Microsoft SQL stored-procedure output.
9. Kept ResultsWriter independent of the physical output target
- ResultsWriter generates the result payload.
- UniDataStorageWriter decides how and where the payload is physically written.
- The same ResultsWriter XML generation mechanism is therefore used for both XML file and MSSQL outputs.
10. Increased revision
- Updated revision to 3.9.3145.100.
Cause:
1. Background: Restore/ensure testInProgress behavior before the DataEntry sequence and explicitly prevent to reset the pulse.
2. Increase revision to 3.9.3145
Solution:
1. Deleted .AddOperation(testInProgress) calling
2. Increased revision to 3.9.3145
Cause:
1. When the Cycle was stopped during the second or a later test and then resumed using the Start Test button, the resume confirmation was handled incorrectly. After selecting to continue, the sequence restarted from the first test instead of continuing from the interrupted test.
2. Increase revision to 3.9.3134.114
Solution:
1. Corrected the Cycle resume logic so that, after confirming continuation, the sequence resumes from the interrupted test instead of restarting from the first test.
2. Increased revision to 3.9.3134.114
Cause:
1. Background: there was a suspicion that the Bukoven board left RefPulses active across operations; this was investigated and ruled out. The pulse counter is reset by testInProgress when an operation is reused. During the third DataEntry window testInProgress had been temporarily disabled (SLM vs Karlsruhe difference), which allowed RefPulses to appear to persist.
2. Increase revision to 3.9.3134.113
Solution:
1. Restore/ensure testInProgress behavior during the DataEntry sequence and explicitly reset the pulse counter when starting a new operation.
2. Increased revision to 3.9.3134.113
Refactor Flip Mode parameter type in `WMeterRsltItemSpec` to `Quantity.String` for consistency. Add `SetTestModeOpto7Str` alias to improve readability and replace legacy A0 test mode reference in `iPerlCommunicationParams`.
Introduce configurable timeouts for data entry volume reads in `IRegReaderSmart` and its implementations: added optional timeout parameters and updated default values across associated forms and methods. Updated `EntryFormCfg` to support customizable timeout settings.
Add robust handling for form closure in UNI Data Entry: prevent operations on disposed/closing forms, enhance logging, and update logic in serial number and volume updates. Increment version to 3.9.3141.0.
Implement smart meter interface enhancements for AllyReader: Add `ISmartMeterReader` interface, update `RegisterReaderSelection` logic, integrate smart-meter position selection, and expand unit test coverage.
Add debug logging and UI enhancements for data entry processes: Improve register reader handling in sequences and forms, add detailed data entry debug logs, integrate serial number and volume watermarking, and update localized strings in multiple languages.
Add Flip Mode support across iPerl-related test methods and database schema: implement FlipMode property, update MeterTestRslt mappings, integrate schema migration logic, and refine test result handling.
Enhance iPerl dialog layout and error handling: improve `ShuffleTextBoxes` with positional mapping, refine checkbox state tracking, add detailed logging for labels and checkboxes, and handle serial port exceptions. Increment version to 3.9.3139.0.
Add support for Flip Mode configuration in iPerl: Implement `SetFlipMode` functionality in `OptoHeadTest` and `RadioService`, integrate constants, enhance UI, and add unit and integration tests for constant/randomized flip mode settings.