@@ -48,18 +48,26 @@ public class CalibrationManager
4848 public int CollectedPoints => _calibrationPairs . Count ;
4949 public int TotalPoints => ( int ) ( 360.0 / _stepAngle_deg ) ;
5050
51+
52+ private readonly double _stationOvLat ;
53+ private readonly double _stationOvLon ;
54+
55+
5156 private readonly List < CalibrationDataPoint > _rawData = new ( ) ;
5257 private readonly List < ( double EncoderAngle , double MeasuredAzimuth ) > _calibrationPairs = new ( ) ;
5358
5459 public IReadOnlyList < ( double EncoderAngle , double MeasuredAzimuth ) > CalibrationPairs => _calibrationPairs ;
5560
5661 public CalibrationManager ( uAuxRadantPort rotator , AZMManager azmManager ,
57- Action < string > log , string basePath )
62+ Action < string > log , string basePath , double stOvLat = double . NaN , double stOvLon = double . NaN )
5863 {
5964 _rotator = rotator ?? throw new ArgumentNullException ( nameof ( rotator ) ) ;
6065 _azmManager = azmManager ?? throw new ArgumentNullException ( nameof ( azmManager ) ) ;
6166 _log = log ;
6267
68+ _stationOvLat = stOvLat ;
69+ _stationOvLon = stOvLon ;
70+
6371 _azmManager . USBLRawDataHandler += OnUSBLRawData ;
6472 _azmManager . USBLRawDataEventEnabled = true ;
6573 _rotator . WaitingToFinishRotationChanged += OnWaitingChanged ;
@@ -83,6 +91,10 @@ public void Start(double startAngle, double stepAngle, int measurementsPerPoint)
8391 return ;
8492 }
8593
94+ // Останавливаем опрос перед началом калибровки
95+ _azmManager . PauseInterrogation ( ) ;
96+ _log ( "Interrogation paused for calibration" ) ;
97+
8698 _stepAngle_deg = stepAngle ;
8799 _measurementsPerPoint = measurementsPerPoint ;
88100 _rawData . Clear ( ) ;
@@ -101,6 +113,17 @@ public void Stop()
101113 {
102114 _state = CalibrationState . Idle ;
103115 _rotator . RequestStop ( ) ;
116+
117+ // Отключаем LocationOverride
118+ _azmManager . DisableLocationOverride ( ) ;
119+
120+ // Возобновляем опрос
121+ if ( ! _azmManager . InterrogationActive )
122+ {
123+ _azmManager . ResumeInterrogation ( ) ;
124+ _log ( "Interrogation resumed" ) ;
125+ }
126+
104127 _log ( "Calibration stopped" ) ;
105128 }
106129
@@ -141,7 +164,20 @@ private void OnWaitingChanged(object? sender, EventArgs e)
141164 {
142165 _state = CalibrationState . Measuring ;
143166 _currentMeasurementCount = 0 ;
144- _log ( $ "Measuring at { _currentTargetAngle_deg : F1} ° ({ _measurementsPerPoint } samples)") ;
167+
168+ // Устанавливаем LocationOverride: координаты пирса + угол энкодера как heading
169+ _azmManager . OverrideLocation ( _stationOvLat , _stationOvLon , _rotator . CurrentAngle ) ;
170+
171+ // Запускаем опрос для сбора измерений
172+ _azmManager . ResumeInterrogation ( ) ;
173+
174+ string locInfo = ( ! double . IsNaN ( _stationOvLat ) && ! double . IsNaN ( _stationOvLon ) )
175+ ? $ "at { _stationOvLat : F6} °, { _stationOvLon : F6} °"
176+ : "in relative mode" ;
177+
178+ _log ( $ "Measuring at { _currentTargetAngle_deg : F1} ° " +
179+ $ "(encoder: { _rotator . CurrentAngle : F1} °, { locInfo } ) " +
180+ $ "- { _measurementsPerPoint } samples") ;
145181 }
146182 else
147183 {
@@ -171,15 +207,19 @@ private void OnUSBLRawData(object? sender, USBLRawDataEventArgs e)
171207
172208 if ( _currentMeasurementCount >= _measurementsPerPoint )
173209 {
210+ // Останавливаем опрос на время поворота
211+ _azmManager . PauseInterrogation ( ) ;
212+
174213 var pointsForAngle = _rawData
175214 . Where ( p => Math . Abs ( p . TargetAngle_deg - _currentTargetAngle_deg ) < 0.1 )
176215 . ToList ( ) ;
177216
178217 if ( pointsForAngle . Count > 0 )
179218 {
180219 double avgHAngle = pointsForAngle . Average ( p => p . HAngle_deg ) ;
181- _calibrationPairs . Add ( ( _currentTargetAngle_deg , avgHAngle ) ) ;
182- _log ( $ "Angle { _currentTargetAngle_deg : F1} ° → avg azimuth = { avgHAngle : F2} °") ;
220+ // Сохраняем реальный угол энкодера, а не целевой
221+ _calibrationPairs . Add ( ( _rotator . CurrentAngle , avgHAngle ) ) ;
222+ _log ( $ "Encoder { _rotator . CurrentAngle : F1} ° → avg azimuth = { avgHAngle : F2} °") ;
183223 }
184224
185225 double nextAngle = _currentTargetAngle_deg + _stepAngle_deg ;
@@ -197,6 +237,17 @@ private void OnUSBLRawData(object? sender, USBLRawDataEventArgs e)
197237 private void Complete ( )
198238 {
199239 _state = CalibrationState . Completed ;
240+
241+ // Отключаем LocationOverride
242+ _azmManager . DisableLocationOverride ( ) ;
243+
244+ // Возобновляем опрос в обычном режиме
245+ if ( ! _azmManager . InterrogationActive )
246+ {
247+ _azmManager . ResumeInterrogation ( ) ;
248+ _log ( "Interrogation resumed" ) ;
249+ }
250+
200251 _log ( $ "Calibration completed. { _calibrationPairs . Count } points collected.") ;
201252 SaveCalibrationData ( ) ;
202253 }
0 commit comments