@neilberkman/sidereon 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -284,6 +284,541 @@ export interface PropagateStateRequest {
284
284
  muKm3S2?: number;
285
285
  }
286
286
 
287
+ // --- Covariance propagation -------------------------------------------------
288
+ //
289
+ // `propagateCovariance(request)` and `transportCovariance(covariance, segments,
290
+ // options)` deserialize through serde. These interfaces document the accepted
291
+ // JS objects and plain object fields returned by the related table APIs.
292
+
293
+ /** Covariance reference frame label. */
294
+ export type CovarianceFrameLabel = "inertial" | "rtn";
295
+
296
+ /** RTN acceleration process-noise power spectral densities. */
297
+ export interface CovarianceProcessNoise {
298
+ qRadialKm2S3?: number;
299
+ qTransverseKm2S3?: number;
300
+ qNormalKm2S3?: number;
301
+ }
302
+
303
+ /** Space-weather constants embedded in a covariance drag request. */
304
+ export interface CovarianceDragSpaceWeather {
305
+ f107?: number;
306
+ f107a?: number;
307
+ ap?: number;
308
+ }
309
+
310
+ /** Drag parameterization for covariance propagation. */
311
+ export interface CovarianceDragConfig {
312
+ bcFactorM2Kg?: number;
313
+ ballisticCoefficientKgM2?: number;
314
+ cd?: number;
315
+ areaM2?: number;
316
+ massKg?: number;
317
+ cutoffAltitudeKm?: number;
318
+ spaceWeather?: CovarianceDragSpaceWeather;
319
+ }
320
+
321
+ /** The object passed to `propagateCovariance`. */
322
+ export interface CovariancePropagationRequest {
323
+ epochS: number;
324
+ positionKm: [number, number, number];
325
+ velocityKmS: [number, number, number];
326
+ covariance: number[] | Float64Array;
327
+ timesS: number[];
328
+ covarianceFrame?: CovarianceFrameLabel;
329
+ outputFrame?: CovarianceFrameLabel;
330
+ processNoise?: CovarianceProcessNoise;
331
+ forceModel?: ForceModel;
332
+ integrator?: Integrator;
333
+ absTol?: number;
334
+ relTol?: number;
335
+ initialStepS?: number;
336
+ minStepS?: number;
337
+ maxStepS?: number;
338
+ maxSteps?: number;
339
+ muKm3S2?: number;
340
+ drag?: CovarianceDragConfig;
341
+ }
342
+
343
+ /** One STM segment passed to `transportCovariance`. */
344
+ export interface CovarianceTransportSegment {
345
+ stateTransitionMatrix: number[] | Float64Array;
346
+ dtS: number;
347
+ qRotationEpochS: number;
348
+ qRotationPositionKm: [number, number, number];
349
+ qRotationVelocityKmS: [number, number, number];
350
+ }
351
+
352
+ /** Options passed as the third argument to `transportCovariance`. */
353
+ export interface CovarianceTransportOptions {
354
+ processNoise?: CovarianceProcessNoise;
355
+ }
356
+
357
+ // --- SGP4 fitting -----------------------------------------------------------
358
+ //
359
+ // `fitTle(samples, config)` accepts TEME state samples plus solver controls and
360
+ // returns `TleFit.elements` / `TleFit.stats` as serde plain objects.
361
+
362
+ /** One TEME state sample for `fitTle`. */
363
+ export interface TleFitSample {
364
+ epoch: [number, number];
365
+ positionTemeKm: [number, number, number];
366
+ velocityTemeKmS?: [number, number, number];
367
+ }
368
+
369
+ /** Metadata copied into the fitted TLE and OMM encodings. */
370
+ export interface TleFitMetadata {
371
+ catalogNumber?: number;
372
+ classification?: "U" | "C" | "S";
373
+ internationalDesignator?: string;
374
+ elementSetNumber?: number;
375
+ revAtEpoch?: number;
376
+ objectName?: string;
377
+ }
378
+
379
+ /** Solver controls for `fitTle`. */
380
+ export interface TleFitConfig {
381
+ epoch?: "midpoint" | "first" | "last";
382
+ epochSampleIndex?: number;
383
+ epochJd?: [number, number];
384
+ fitBstar?: boolean;
385
+ bstarSeed?: number;
386
+ useVelocity?: boolean;
387
+ velocityWeightS?: number;
388
+ weights?: number[];
389
+ opsMode?: "improved" | "afspc";
390
+ ftol?: number;
391
+ xtol?: number;
392
+ gtol?: number;
393
+ maxNfev?: number;
394
+ xScale?: "unit" | "jac" | number[];
395
+ loss?: "linear" | "softL1" | "soft_l1" | "huber" | "cauchy" | "arctan";
396
+ fScale?: number;
397
+ metadata?: TleFitMetadata;
398
+ }
399
+
400
+ /** `TleFit.stats` plain object. */
401
+ export interface TleFitStatistics {
402
+ rms_position_km: number;
403
+ max_position_km: number;
404
+ rms_position_axes_km: [number, number, number];
405
+ rms_velocity_km_s?: number;
406
+ tle_rms_position_km: number;
407
+ status: number;
408
+ nfev: number;
409
+ njev: number;
410
+ cost: number;
411
+ optimality: number;
412
+ bstar_observable: boolean;
413
+ seed_refine_passes: number;
414
+ }
415
+
416
+ /** `TleFit.elements` plain object. */
417
+ export interface TleFitElements {
418
+ epoch: [number, number];
419
+ bstar: number;
420
+ mean_motion_dot: number;
421
+ mean_motion_double_dot: number;
422
+ eccentricity: number;
423
+ argument_of_perigee_deg: number;
424
+ inclination_deg: number;
425
+ mean_anomaly_deg: number;
426
+ mean_motion_rev_per_day: number;
427
+ right_ascension_deg: number;
428
+ catalog_number: number;
429
+ }
430
+
431
+ // --- NMEA -------------------------------------------------------------------
432
+ //
433
+ // `parseNmea`, `NmeaAccumulator.push/finish`, and `nmeaWriteGga` use serde
434
+ // plain objects for sentence bodies, diagnostics, epochs, and writer requests.
435
+
436
+ /** Calendar date used by NMEA epoch recovery. */
437
+ export interface NmeaDate {
438
+ year: number;
439
+ month: number;
440
+ day: number;
441
+ }
442
+
443
+ /** NMEA time of day. */
444
+ export interface NmeaTimeOfDay {
445
+ hour: number;
446
+ minute: number;
447
+ second: number;
448
+ nanos: number;
449
+ decimals: number;
450
+ }
451
+
452
+ /** NMEA latitude, longitude, and ellipsoidal height. */
453
+ export interface NmeaPosition {
454
+ latDeg: number;
455
+ lonDeg: number;
456
+ heightM: number;
457
+ }
458
+
459
+ /** Shared NMEA parser diagnostics. */
460
+ export interface NmeaDiagnostics {
461
+ skipCount: number;
462
+ warningCount: number;
463
+ skips: unknown[];
464
+ warnings: unknown[];
465
+ }
466
+
467
+ /** One satellite ID used by an NMEA GSA epoch. */
468
+ export interface NmeaUsedSatellite {
469
+ raw: number;
470
+ resolved?: string;
471
+ }
472
+
473
+ /** One parsed or accumulated NMEA epoch. */
474
+ export interface NmeaEpoch {
475
+ timeOfDay: NmeaTimeOfDay;
476
+ date?: NmeaDate;
477
+ position: NmeaPosition;
478
+ instantUtcJ2000S?: number;
479
+ pdop?: number;
480
+ hdop?: number;
481
+ vdop?: number;
482
+ usedSatellites: NmeaUsedSatellite[];
483
+ satellitesInView: number;
484
+ sentenceCount: number;
485
+ diagnostics: NmeaDiagnostics;
486
+ gga?: Record<string, unknown>;
487
+ rmc?: Record<string, unknown>;
488
+ gll?: Record<string, unknown>;
489
+ gst?: Record<string, unknown>;
490
+ vtg?: Record<string, unknown>;
491
+ zda?: Record<string, unknown>;
492
+ gsa: Record<string, unknown>[];
493
+ gsv: Record<string, unknown>[];
494
+ }
495
+
496
+ /** Plain object returned by `NmeaAccumulator.push/finish`. */
497
+ export interface NmeaAccumulatorResult {
498
+ sentences: Record<string, unknown>[];
499
+ epochs: NmeaEpoch[];
500
+ diagnostics: NmeaDiagnostics;
501
+ retainedLength: number;
502
+ }
503
+
504
+ /** Constructor options for `NmeaAccumulator`. */
505
+ export interface NmeaAccumulatorOptions {
506
+ date?: NmeaDate;
507
+ maxSentencesPerEpoch?: number;
508
+ }
509
+
510
+ /** The object passed to `nmeaWriteGga`. */
511
+ export interface NmeaGgaRequest {
512
+ talker?: string;
513
+ timeSecondsOfDay: number;
514
+ latDeg: number;
515
+ lonDeg: number;
516
+ coordinateDecimals?: number;
517
+ quality?: number;
518
+ satellitesUsed?: number;
519
+ hdop?: number;
520
+ altitudeMslM?: number;
521
+ geoidSeparationM?: number;
522
+ differentialAgeS?: number;
523
+ differentialStationId?: string;
524
+ }
525
+
526
+ // --- NTRIP sans-IO ----------------------------------------------------------
527
+
528
+ /** Basic authentication credentials for NTRIP request construction. */
529
+ export interface NtripCredentials {
530
+ username: string;
531
+ password: string;
532
+ }
533
+
534
+ /** NTRIP revision label accepted by request and state-machine configs. */
535
+ export type NtripVersionLabel = "rev1" | "rev2";
536
+
537
+ /** Config object for `ntripRequestBytes` and `new NtripClientMachine(config)`. */
538
+ export interface NtripRequestConfig {
539
+ host: string;
540
+ port?: number;
541
+ mountpoint?: string;
542
+ version?: NtripVersionLabel;
543
+ credentials?: NtripCredentials;
544
+ userAgentProduct?: string;
545
+ ggaIntervalS?: number;
546
+ }
547
+
548
+ /** Header row surfaced on NTRIP connection events. */
549
+ export interface NtripHeader {
550
+ name: string;
551
+ value: string;
552
+ }
553
+
554
+ /** Event emitted by `NtripClientMachine.push/finish`. */
555
+ export type NtripClientEvent =
556
+ | {
557
+ kind: "connected";
558
+ version?: NtripVersionLabel;
559
+ chunked?: boolean;
560
+ headers?: NtripHeader[];
561
+ payload?: undefined;
562
+ sourcetable?: undefined;
563
+ rejection?: undefined;
564
+ detail?: undefined;
565
+ }
566
+ | {
567
+ kind: "payload";
568
+ payload: number[];
569
+ version?: undefined;
570
+ chunked?: undefined;
571
+ headers?: undefined;
572
+ sourcetable?: undefined;
573
+ rejection?: undefined;
574
+ detail?: undefined;
575
+ }
576
+ | {
577
+ kind: "sourcetable";
578
+ sourcetable: NtripSourcetable;
579
+ version?: undefined;
580
+ chunked?: undefined;
581
+ headers?: undefined;
582
+ payload?: undefined;
583
+ rejection?: undefined;
584
+ detail?: undefined;
585
+ }
586
+ | {
587
+ kind: "rejected" | "streamCorrupted" | "streamEnded";
588
+ detail?: string;
589
+ rejection?: unknown;
590
+ version?: undefined;
591
+ chunked?: undefined;
592
+ headers?: undefined;
593
+ payload?: undefined;
594
+ sourcetable?: undefined;
595
+ };
596
+
597
+ /** Parsed scalar wrapper used by NTRIP sourcetable fields. */
598
+ export type NtripParsed<T> =
599
+ { kind: "parsed"; value: T } | { kind: "missing" } | { kind: "invalid"; raw: string };
600
+
601
+ /** One STR row in an NTRIP sourcetable. */
602
+ export interface NtripStreamRecord {
603
+ typeTag: "STR";
604
+ mountpoint: string;
605
+ identifier: string;
606
+ format: string;
607
+ formatDetails: string;
608
+ carrier: NtripParsed<number>;
609
+ navSystem: string;
610
+ network: string;
611
+ country: string;
612
+ latDeg: NtripParsed<number>;
613
+ lonDeg: NtripParsed<number>;
614
+ nmeaRequired: NtripParsed<boolean>;
615
+ networkSolution: NtripParsed<boolean>;
616
+ generator: string;
617
+ compression: string;
618
+ authentication: string;
619
+ fee: NtripParsed<boolean>;
620
+ bitrate: NtripParsed<number>;
621
+ misc: string;
622
+ }
623
+
624
+ /** Parsed NTRIP sourcetable. */
625
+ export interface NtripSourcetable {
626
+ recordCount: number;
627
+ streamCount: number;
628
+ streams: NtripStreamRecord[];
629
+ records: Record<string, unknown>[];
630
+ diagnostics: unknown[];
631
+ }
632
+
633
+ // --- Space weather ----------------------------------------------------------
634
+
635
+ /** CelesTrak CSSI table coverage. */
636
+ export interface SpaceWeatherCoverage {
637
+ firstJ2000S: number;
638
+ lastObservedJ2000S: number;
639
+ lastDailyPredictedJ2000S: number;
640
+ endJ2000S: number;
641
+ }
642
+
643
+ /** One daily CSSI space-weather row. */
644
+ export interface SpaceWeatherDay {
645
+ year: number;
646
+ month: number;
647
+ day: number;
648
+ class: "observed" | "dailyPredicted";
649
+ bsrn: number;
650
+ nd: number;
651
+ kp: number[];
652
+ kpSum: number;
653
+ ap: number[];
654
+ apAvg: number;
655
+ cp: number;
656
+ c9: number;
657
+ isn: number;
658
+ fluxQualifier?: string;
659
+ f107Obs: number;
660
+ f107Adj: number;
661
+ f107ObsCenter81: number;
662
+ f107ObsLast81: number;
663
+ f107AdjCenter81: number;
664
+ f107AdjLast81: number;
665
+ }
666
+
667
+ /** One monthly predicted CSSI row. */
668
+ export interface SpaceWeatherMonthly {
669
+ year: number;
670
+ month: number;
671
+ f107: number;
672
+ f107a: number;
673
+ ap?: number;
674
+ }
675
+
676
+ /** Sample returned by `SpaceWeatherTable.sampleAt`. */
677
+ export interface SpaceWeatherSample {
678
+ f107: number;
679
+ f107a: number;
680
+ ap: number;
681
+ class: "observed" | "dailyPredicted" | "monthlyPredicted";
682
+ apDefaulted: boolean;
683
+ }
684
+
685
+ /** Optional table sampling policy. */
686
+ export interface SpaceWeatherSamplePolicy {
687
+ defaultMonthlyAp?: number;
688
+ }
689
+
690
+ /** Decay request passed to `estimateDecayWithSpaceWeather`. */
691
+ export interface SpaceWeatherDecayRequest {
692
+ epochS: number;
693
+ positionKm: [number, number, number];
694
+ velocityKmS: [number, number, number];
695
+ scanStepS?: number;
696
+ maxDurationS?: number;
697
+ maxScanSamples?: number;
698
+ reentryAltitudeKm?: number;
699
+ crossingToleranceS?: number;
700
+ }
701
+
702
+ /** Decay result returned by `estimateDecayWithSpaceWeather`. */
703
+ export interface SpaceWeatherDecayResult {
704
+ timeToDecayS: number;
705
+ reentryEpochS: number;
706
+ reentryPositionKm: [number, number, number];
707
+ reentryVelocityKmS: [number, number, number];
708
+ reentryAltitudeKm: number;
709
+ }
710
+
711
+ // --- RINEX QC and repair ----------------------------------------------------
712
+
713
+ /** Location attached to a RINEX lint finding. */
714
+ export interface RinexFindingRef {
715
+ epochIndex?: number;
716
+ satellite?: string;
717
+ field?: string;
718
+ }
719
+
720
+ /** One lint finding from `lintRinexObs` or `lintRinexNav`. */
721
+ export interface RinexFinding {
722
+ code: string;
723
+ severity: "fatal" | "error" | "warning" | "info";
724
+ specRef: string;
725
+ repairable: boolean;
726
+ at: RinexFindingRef;
727
+ detail: string;
728
+ }
729
+
730
+ /** Shared RINEX lint report. */
731
+ export interface RinexLintReport {
732
+ clean: boolean;
733
+ decodedFromCrinex: boolean;
734
+ findingCount: number;
735
+ counts: { fatal: number; error: number; warning: number; info: number };
736
+ findings: RinexFinding[];
737
+ }
738
+
739
+ /** Options accepted by `repairRinexObs`. */
740
+ export interface RinexObsRepairOptions {
741
+ fileStamp?: string;
742
+ setInterval?: boolean;
743
+ setTimeOfLastObs?: boolean;
744
+ setObsCounts?: boolean;
745
+ dropEmptyRecords?: boolean;
746
+ sortRecords?: boolean;
747
+ }
748
+
749
+ /** Options accepted by `repairRinexNav`. */
750
+ export interface RinexNavRepairOptions {
751
+ fileStamp?: string;
752
+ dropUnsupported?: boolean;
753
+ sortRecords?: boolean;
754
+ }
755
+
756
+ /** Options accepted by `observationQc`. */
757
+ export interface ObservationQcOptions {
758
+ minSatellitesPerEpoch?: number;
759
+ expectedIntervalS?: number;
760
+ checkCycleSlips?: boolean;
761
+ geometryFreeThresholdM?: number;
762
+ melbourneWubbenaThresholdCycles?: number;
763
+ gapThresholdS?: number;
764
+ }
765
+
766
+ /** One satellite summary in an observation QC report. */
767
+ export interface ObservationQcSatellite {
768
+ satellite: string;
769
+ epochsWithObservations: number;
770
+ valueObservations: number;
771
+ }
772
+
773
+ /** Signal-strength indicator histogram. */
774
+ export interface ObservationQcSsi {
775
+ counts: number[];
776
+ }
777
+
778
+ /** SNR summary for one signal. */
779
+ export interface ObservationQcSnr {
780
+ n: number;
781
+ mean: number;
782
+ min: number;
783
+ max: number;
784
+ std: number;
785
+ }
786
+
787
+ /** One satellite/signal summary in an observation QC report. */
788
+ export interface ObservationQcSatelliteSignal {
789
+ satellite: string;
790
+ code: string;
791
+ valueObservations: number;
792
+ ssi: ObservationQcSsi;
793
+ snr?: ObservationQcSnr;
794
+ }
795
+
796
+ /** One system/signal summary in an observation QC report. */
797
+ export interface ObservationQcSystemSignal {
798
+ system: string;
799
+ code: string;
800
+ valueObservations: number;
801
+ ssi: ObservationQcSsi;
802
+ snr?: ObservationQcSnr;
803
+ }
804
+
805
+ /** Plain object returned by `observationQc`. */
806
+ export interface ObservationQcReport {
807
+ totalEpochRecords: number;
808
+ observationEpochs: number;
809
+ eventRecords: number;
810
+ powerFailureEpochs: number;
811
+ skippedRecords: number;
812
+ intervalS?: number;
813
+ intervalSource?: string;
814
+ missingEpochs: number;
815
+ dataGaps: unknown[];
816
+ satellites: ObservationQcSatellite[];
817
+ satelliteSignals: ObservationQcSatelliteSignal[];
818
+ systemSignals: ObservationQcSystemSignal[];
819
+ notes: string[];
820
+ }
821
+
287
822
  // --- RTK baseline solving ---------------------------------------------------
288
823
  //
289
824
  // `solveRtkFloat(config)` / `solveRtkFixed(config)` deserialize through serde.
@@ -890,13 +1425,7 @@ export interface BroadcastCompareReport {
890
1425
 
891
1426
  /** Lower-case constellation label, e.g. "gps". GPS is supported today. */
892
1427
  export type ConstellationSystem =
893
- | "gps"
894
- | "glonass"
895
- | "galileo"
896
- | "beidou"
897
- | "qzss"
898
- | "navic"
899
- | "sbas";
1428
+ "gps" | "glonass" | "galileo" | "beidou" | "qzss" | "navic" | "sbas";
900
1429
 
901
1430
  /** CelesTrak `gps-ops` provenance preserved on a record. */
902
1431
  export interface CelestrakSource {
@@ -1403,10 +1932,7 @@ export interface LnavOptions {
1403
1932
 
1404
1933
  /** Geometric classification of a two-body orbit. */
1405
1934
  export type OrbitType =
1406
- | "ellipticalInclined"
1407
- | "ellipticalEquatorial"
1408
- | "circularInclined"
1409
- | "circularEquatorial";
1935
+ "ellipticalInclined" | "ellipticalEquatorial" | "circularInclined" | "circularEquatorial";
1410
1936
 
1411
1937
  /**
1412
1938
  * Classical (Keplerian) orbital elements in the Vallado convention. Returned by
@@ -1530,6 +2056,21 @@ export interface RtcmMsmSignal {
1530
2056
  finePhaseRangeRate?: number;
1531
2057
  }
1532
2058
 
2059
+ /** Derived RINEX LLI for one MSM signal cell. */
2060
+ export interface RtcmCellLli {
2061
+ satelliteId: number;
2062
+ signalId: number;
2063
+ /** RINEX LLI value; bit 0 is loss of lock, bit 1 is half-cycle ambiguity. */
2064
+ lli: number;
2065
+ minLockTimeMs?: number;
2066
+ }
2067
+
2068
+ /** Previous lock-state input for `rtcmDeriveLli`. */
2069
+ export interface RtcmPreviousLock {
2070
+ minLockTimeMs?: number;
2071
+ elapsedMs: number;
2072
+ }
2073
+
1533
2074
  /** An MSM4 / MSM7 multi-signal observation message. */
1534
2075
  export interface RtcmMsm {
1535
2076
  type: "msm";
@@ -1652,6 +2193,32 @@ export interface RtcmScannedFrame {
1652
2193
  frameLen: number;
1653
2194
  }
1654
2195
 
2196
+ /** One CRC-valid frame skipped by `decodeRtcmStream`. */
2197
+ export interface RtcmFrameSkip {
2198
+ offset: number;
2199
+ messageNumber?: number;
2200
+ reason: "truncated" | "malformed";
2201
+ message?: string;
2202
+ }
2203
+
2204
+ /** Stream diagnostics returned by `decodeRtcmStream`. */
2205
+ export interface RtcmStreamDiagnostics {
2206
+ resyncBytes: number;
2207
+ skippedFrames: RtcmFrameSkip[];
2208
+ }
2209
+
2210
+ /** RTCM stream decode result returned by `decodeRtcmStream`. */
2211
+ export interface RtcmStream {
2212
+ messages: RtcmMessage[];
2213
+ diagnostics: RtcmStreamDiagnostics;
2214
+ }
2215
+
2216
+ /** RINEX LLI bit constants used by RTCM MSM helpers. */
2217
+ export interface RtcmLliBits {
2218
+ lossOfLock: number;
2219
+ halfCycle: number;
2220
+ }
2221
+
1655
2222
  // ---------------------------------------------------------------------------
1656
2223
  // Moving-baseline RTK
1657
2224
  // ---------------------------------------------------------------------------