You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					354 lines
				
				15 KiB
			
		
		
			
		
	
	
					354 lines
				
				15 KiB
			| 
											4 years ago
										 | from struct import unpack_from, calcsize
 | ||
|  | 
 | ||
|  | LOG_GNSS_POSITION_REPORT = 0x1476
 | ||
|  | LOG_GNSS_GPS_MEASUREMENT_REPORT = 0x1477
 | ||
|  | LOG_GNSS_CLOCK_REPORT = 0x1478
 | ||
|  | LOG_GNSS_GLONASS_MEASUREMENT_REPORT = 0x1480
 | ||
|  | LOG_GNSS_BDS_MEASUREMENT_REPORT = 0x1756
 | ||
|  | LOG_GNSS_GAL_MEASUREMENT_REPORT = 0x1886
 | ||
|  | 
 | ||
|  | LOG_GNSS_OEMDRE_MEASUREMENT_REPORT = 0x14DE
 | ||
|  | LOG_GNSS_OEMDRE_SVPOLY_REPORT = 0x14E1
 | ||
|  | 
 | ||
|  | LOG_GNSS_ME_DPO_STATUS = 0x1838
 | ||
|  | LOG_GNSS_CD_DB_REPORT = 0x147B
 | ||
|  | LOG_GNSS_PRX_RF_HW_STATUS_REPORT = 0x147E
 | ||
|  | LOG_CGPS_SLOW_CLOCK_CLIB_REPORT = 0x1488
 | ||
|  | LOG_GNSS_CONFIGURATION_STATE = 0x1516
 | ||
|  | 
 | ||
| 
											4 years ago
										 | oemdre_measurement_report = """
 | ||
|  |   uint8_t version;
 | ||
|  |   uint8_t reason;
 | ||
|  |   uint8_t sv_count;
 | ||
|  |   uint8_t seq_num;
 | ||
|  |   uint8_t seq_max;
 | ||
|  |   uint16_t rf_loss;
 | ||
|  | 
 | ||
|  |   uint8_t system_rtc_valid;
 | ||
|  |   uint32_t f_count;
 | ||
|  |   uint32_t clock_resets;
 | ||
|  |   uint64_t system_rtc_time;
 | ||
|  | 
 | ||
|  |   uint8_t gps_leap_seconds;
 | ||
|  |   uint8_t gps_leap_seconds_uncertainty;
 | ||
|  |   float gps_to_glonass_time_bias_milliseconds;
 | ||
|  |   float gps_to_glonass_time_bias_milliseconds_uncertainty;
 | ||
|  | 
 | ||
|  |   uint16_t gps_week;
 | ||
|  |   uint32_t gps_milliseconds;
 | ||
|  |   uint32_t gps_time_bias;
 | ||
|  |   uint32_t gps_clock_time_uncertainty;
 | ||
|  |   uint8_t gps_clock_source;
 | ||
|  | 
 | ||
|  |   uint8_t glonass_clock_source;
 | ||
|  |   uint8_t glonass_year;
 | ||
|  |   uint16_t glonass_day;
 | ||
|  |   uint32_t glonass_milliseconds;
 | ||
|  |   float glonass_time_bias;
 | ||
|  |   float glonass_clock_time_uncertainty;
 | ||
|  | 
 | ||
|  |   float clock_frequency_bias;
 | ||
|  |   float clock_frequency_uncertainty;
 | ||
|  |   uint8_t frequency_source;
 | ||
|  | 
 | ||
|  |   uint32_t cdma_clock_info[5];
 | ||
|  | 
 | ||
|  |   uint8_t source;
 | ||
|  | """
 | ||
|  | 
 | ||
| 
											3 years ago
										 | oemdre_svpoly_report = """
 | ||
|  |   uint8_t version;
 | ||
|  |   uint16_t sv_id;
 | ||
|  |   int8_t frequency_index;
 | ||
|  |   uint8_t flags;
 | ||
|  |   uint16_t iode;
 | ||
|  |   double t0;
 | ||
|  |   double xyz0[3];
 | ||
|  |   double xyzN[9];
 | ||
|  |   float other[4];
 | ||
|  |   float position_uncertainty;
 | ||
|  |   float iono_delay;
 | ||
|  |   float iono_dot;
 | ||
|  |   float sbas_iono_delay;
 | ||
|  |   float sbas_iono_dot;
 | ||
|  |   float tropo_delay;
 | ||
|  |   float elevation;
 | ||
|  |   float elevation_dot;
 | ||
|  |   float elevation_uncertainty;
 | ||
|  |   double velocity_coeff[12];
 | ||
|  | """
 | ||
|  | 
 | ||
|  | 
 | ||
| 
											4 years ago
										 | oemdre_measurement_report_sv = """
 | ||
|  |   uint8_t sv_id;
 | ||
|  |   uint8_t unkn;
 | ||
|  |   int8_t glonass_frequency_index;
 | ||
|  |   uint32_t observation_state;
 | ||
|  |   uint8_t observations;
 | ||
|  |   uint8_t good_observations;
 | ||
|  |   uint8_t filter_stages;
 | ||
|  |   uint8_t predetect_interval;
 | ||
|  |   uint8_t cycle_slip_count;
 | ||
|  |   uint16_t postdetections;
 | ||
|  | 
 | ||
|  |   uint32_t measurement_status;
 | ||
|  |   uint32_t measurement_status2;
 | ||
|  | 
 | ||
|  |   uint16_t carrier_noise;
 | ||
|  |   uint16_t rf_loss;
 | ||
|  |   int16_t latency;
 | ||
|  | 
 | ||
|  |   float filtered_measurement_fraction;
 | ||
|  |   uint32_t filtered_measurement_integral;
 | ||
|  |   float filtered_time_uncertainty;
 | ||
|  |   float filtered_speed;
 | ||
|  |   float filtered_speed_uncertainty;
 | ||
|  | 
 | ||
|  |   float unfiltered_measurement_fraction;
 | ||
|  |   uint32_t unfiltered_measurement_integral;
 | ||
|  |   float unfiltered_time_uncertainty;
 | ||
|  |   float unfiltered_speed;
 | ||
|  |   float unfiltered_speed_uncertainty;
 | ||
|  | 
 | ||
|  |   uint8_t multipath_estimate_valid;
 | ||
|  |   uint32_t multipath_estimate;
 | ||
|  |   uint8_t direction_valid;
 | ||
|  |   float azimuth;
 | ||
|  |   float elevation;
 | ||
|  |   float doppler_acceleration;
 | ||
|  |   float fine_speed;
 | ||
|  |   float fine_speed_uncertainty;
 | ||
|  | 
 | ||
|  |   uint64_t carrier_phase;
 | ||
|  |   uint32_t f_count;
 | ||
|  | 
 | ||
|  |   uint16_t parity_error_count;
 | ||
|  |   uint8_t good_parity;
 | ||
|  | """
 | ||
|  | 
 | ||
| 
											4 years ago
										 | glonass_measurement_report = """
 | ||
|  |   uint8_t version;
 | ||
|  |   uint32_t f_count;
 | ||
|  |   uint8_t glonass_cycle_number;
 | ||
|  |   uint16_t glonass_number_of_days;
 | ||
|  |   uint32_t milliseconds;
 | ||
|  |   float time_bias;
 | ||
|  |   float clock_time_uncertainty;
 | ||
|  |   float clock_frequency_bias;
 | ||
|  |   float clock_frequency_uncertainty;
 | ||
|  |   uint8_t sv_count;
 | ||
|  | """
 | ||
|  | 
 | ||
|  | glonass_measurement_report_sv = """
 | ||
|  |   uint8_t sv_id;
 | ||
|  |   int8_t frequency_index;
 | ||
|  |   uint8_t observation_state; // SVObservationStates
 | ||
|  |   uint8_t observations;
 | ||
|  |   uint8_t good_observations;
 | ||
|  |   uint8_t hemming_error_count;
 | ||
|  |   uint8_t filter_stages;
 | ||
|  |   uint16_t carrier_noise;
 | ||
|  |   int16_t latency;
 | ||
|  |   uint8_t predetect_interval;
 | ||
|  |   uint16_t postdetections;
 | ||
|  |   uint32_t unfiltered_measurement_integral;
 | ||
|  |   float unfiltered_measurement_fraction;
 | ||
|  |   float unfiltered_time_uncertainty;
 | ||
|  |   float unfiltered_speed;
 | ||
|  |   float unfiltered_speed_uncertainty;
 | ||
|  |   uint32_t measurement_status;
 | ||
|  |   uint8_t misc_status;
 | ||
|  |   uint32_t multipath_estimate;
 | ||
|  |   float azimuth;
 | ||
|  |   float elevation;
 | ||
|  |   int32_t carrier_phase_cycles_integral;
 | ||
|  |   uint16_t carrier_phase_cycles_fraction;
 | ||
|  |   float fine_speed;
 | ||
|  |   float fine_speed_uncertainty;
 | ||
|  |   uint8_t cycle_slip_count;
 | ||
|  |   uint32_t pad;
 | ||
|  | """
 | ||
|  | 
 | ||
|  | gps_measurement_report = """
 | ||
|  |   uint8_t version;
 | ||
|  |   uint32_t f_count;
 | ||
|  |   uint16_t week;
 | ||
|  |   uint32_t milliseconds;
 | ||
|  |   float time_bias;
 | ||
|  |   float clock_time_uncertainty;
 | ||
|  |   float clock_frequency_bias;
 | ||
|  |   float clock_frequency_uncertainty;
 | ||
|  |   uint8_t sv_count;
 | ||
|  | """
 | ||
|  | 
 | ||
|  | gps_measurement_report_sv = """
 | ||
| 
											4 years ago
										 |   uint8_t sv_id;                              // SV PRN
 | ||
|  |   uint8_t observation_state;                  // SV Observation state
 | ||
|  |   uint8_t observations;                       // Count of all observation (both success and failure)
 | ||
|  |   uint8_t good_observations;                  // Count of Good observations
 | ||
|  |   uint16_t parity_error_count;                // Carrier to Code filtering N count
 | ||
|  |   uint8_t filter_stages;                      // Pre-Detection (Coherent) Interval (msecs)
 | ||
|  |   uint16_t carrier_noise;                     // CNo. Units of 0.1 dB
 | ||
|  |   int16_t latency;                            // Age of the measurement in msecs (+ve meas Meas precedes ref time)
 | ||
|  |   uint8_t predetect_interval;                 // Pre-Detection (Coherent) Interval (msecs)
 | ||
|  |   uint16_t postdetections;                    // Num Post-Detections (uints of PreInts
 | ||
|  |   uint32_t unfiltered_measurement_integral;   // Range of 0 thru (WEEK_MSECS-1) [msecs]
 | ||
|  |   float unfiltered_measurement_fraction;      // Range of 0 thru 0.99999 [msecs]
 | ||
|  |   float unfiltered_time_uncertainty;          // Time uncertainty (msec)
 | ||
|  |   float unfiltered_speed;                     // Speed estimate (meters/sec)
 | ||
|  |   float unfiltered_speed_uncertainty;         // Speed uncertainty estimate (meters/sec)
 | ||
| 
											4 years ago
										 |   uint32_t measurement_status;
 | ||
|  |   uint8_t misc_status;
 | ||
|  |   uint32_t multipath_estimate;
 | ||
| 
											4 years ago
										 |   float azimuth;                              // Azimuth (radians)
 | ||
|  |   float elevation;                            // Elevation (radians)
 | ||
| 
											4 years ago
										 |   int32_t carrier_phase_cycles_integral;
 | ||
|  |   uint16_t carrier_phase_cycles_fraction;
 | ||
| 
											4 years ago
										 |   float fine_speed;                           // Carrier phase derived speed
 | ||
|  |   float fine_speed_uncertainty;               // Carrier phase derived speed UNC
 | ||
|  |   uint8_t cycle_slip_count;                   // Increments when a CSlip is detected
 | ||
| 
											4 years ago
										 |   uint32_t pad;
 | ||
|  | """
 | ||
|  | 
 | ||
|  | position_report = """
 | ||
|  |   uint8       u_Version;                /* Version number of DM log */
 | ||
|  |   uint32      q_Fcount;                 /* Local millisecond counter */
 | ||
|  |   uint8       u_PosSource;              /* Source of position information */ /*  0: None 1: Weighted least-squares 2: Kalman filter 3: Externally injected 4: Internal database    */
 | ||
|  |   uint32      q_Reserved1;              /* Reserved memory field */
 | ||
|  |   uint16      w_PosVelFlag;             /* Position velocity bit field: (see DM log 0x1476 documentation) */
 | ||
|  |   uint32      q_PosVelFlag2;            /* Position velocity 2 bit field: (see DM log 0x1476 documentation) */
 | ||
|  |   uint8       u_FailureCode;            /* Failure code: (see DM log 0x1476 documentation) */
 | ||
|  |   uint16      w_FixEvents;              /* Fix events bit field: (see DM log 0x1476 documentation) */
 | ||
|  |   uint32 _fake_align_week_number;
 | ||
|  |   uint16      w_GpsWeekNumber;          /* GPS week number of position */
 | ||
|  |   uint32      q_GpsFixTimeMs;           /* GPS fix time of week of in milliseconds */
 | ||
|  |   uint8       u_GloNumFourYear;         /* Number of Glonass four year cycles */
 | ||
|  |   uint16      w_GloNumDaysInFourYear;   /* Glonass calendar day in four year cycle */
 | ||
|  |   uint32      q_GloFixTimeMs;           /* Glonass fix time of day in milliseconds */
 | ||
|  |   uint32      q_PosCount;               /* Integer count of the number of unique positions reported */
 | ||
|  |   uint64      t_DblFinalPosLatLon[2];   /* Final latitude and longitude of position in radians */
 | ||
|  |   uint32      q_FltFinalPosAlt;         /* Final height-above-ellipsoid altitude of position */
 | ||
|  |   uint32      q_FltHeadingRad;          /* User heading in radians */
 | ||
|  |   uint32      q_FltHeadingUncRad;       /* User heading uncertainty in radians */
 | ||
|  |   uint32      q_FltVelEnuMps[3];        /* User velocity in east, north, up coordinate frame. In meters per second. */
 | ||
|  |   uint32      q_FltVelSigmaMps[3];      /* Gaussian 1-sigma value for east, north, up components of user velocity */
 | ||
|  |   uint32      q_FltClockBiasMeters;     /* Receiver clock bias in meters */
 | ||
|  |   uint32      q_FltClockBiasSigmaMeters;  /* Gaussian 1-sigma value for receiver clock bias in meters */
 | ||
|  |   uint32      q_FltGGTBMeters;          /* GPS to Glonass time bias in meters */
 | ||
|  |   uint32      q_FltGGTBSigmaMeters;     /* Gaussian 1-sigma value for GPS to Glonass time bias uncertainty in meters */
 | ||
|  |   uint32      q_FltGBTBMeters;          /* GPS to BeiDou time bias in meters */
 | ||
|  |   uint32      q_FltGBTBSigmaMeters;     /* Gaussian 1-sigma value for GPS to BeiDou time bias uncertainty in meters */
 | ||
|  |   uint32      q_FltBGTBMeters;          /* BeiDou to Glonass time bias in meters */
 | ||
|  |   uint32      q_FltBGTBSigmaMeters;     /* Gaussian 1-sigma value for BeiDou to Glonass time bias uncertainty in meters */
 | ||
|  |   uint32      q_FltFiltGGTBMeters;      /* Filtered GPS to Glonass time bias in meters */
 | ||
|  |   uint32      q_FltFiltGGTBSigmaMeters; /* Filtered Gaussian 1-sigma value for GPS to Glonass time bias uncertainty in meters */
 | ||
|  |   uint32      q_FltFiltGBTBMeters;      /* Filtered GPS to BeiDou time bias in meters */
 | ||
|  |   uint32      q_FltFiltGBTBSigmaMeters; /* Filtered Gaussian 1-sigma value for GPS to BeiDou time bias uncertainty in meters */
 | ||
|  |   uint32      q_FltFiltBGTBMeters;      /* Filtered BeiDou to Glonass time bias in meters */
 | ||
|  |   uint32      q_FltFiltBGTBSigmaMeters; /* Filtered Gaussian 1-sigma value for BeiDou to Glonass time bias uncertainty in meters */
 | ||
|  |   uint32      q_FltSftOffsetSec;        /* SFT offset as computed by WLS in seconds */
 | ||
|  |   uint32      q_FltSftOffsetSigmaSec;   /* Gaussian 1-sigma value for SFT offset in seconds */
 | ||
|  |   uint32      q_FltClockDriftMps;       /* Clock drift (clock frequency bias) in meters per second */
 | ||
|  |   uint32      q_FltClockDriftSigmaMps;  /* Gaussian 1-sigma value for clock drift in meters per second */
 | ||
|  |   uint32      q_FltFilteredAlt;         /* Filtered height-above-ellipsoid altitude in meters as computed by WLS */
 | ||
|  |   uint32      q_FltFilteredAltSigma;    /* Gaussian 1-sigma value for filtered height-above-ellipsoid altitude in meters */
 | ||
|  |   uint32      q_FltRawAlt;              /* Raw height-above-ellipsoid altitude in meters as computed by WLS */
 | ||
|  |   uint32      q_FltRawAltSigma;         /* Gaussian 1-sigma value for raw height-above-ellipsoid altitude in meters */
 | ||
|  |   uint32   align_Flt[14];
 | ||
| 
											2 years ago
										 |   uint32      q_FltPdop;                /* 3D position dilution of precision as computed from the unweighted
 | ||
| 
											4 years ago
										 |   uint32      q_FltHdop;                /* Horizontal position dilution of precision as computed from the unweighted least-squares covariance matrix */
 | ||
|  |   uint32      q_FltVdop;                /* Vertical position dilution of precision as computed from the unweighted least-squares covariance matrix */
 | ||
|  |   uint8       u_EllipseConfidence;      /* Statistical measure of the confidence (percentage) associated with the uncertainty ellipse values */
 | ||
|  |   uint32      q_FltEllipseAngle;        /* Angle of semimajor axis with respect to true North, with increasing angles moving clockwise from North. In units of degrees. */
 | ||
|  |   uint32      q_FltEllipseSemimajorAxis;  /* Semimajor axis of final horizontal position uncertainty error ellipse.  In units of meters. */
 | ||
|  |   uint32      q_FltEllipseSemiminorAxis;  /* Semiminor axis of final horizontal position uncertainty error ellipse.  In units of meters. */
 | ||
|  |   uint32      q_FltPosSigmaVertical;    /* Gaussian 1-sigma value for final position height-above-ellipsoid altitude in meters */
 | ||
|  |   uint8       u_HorizontalReliability;  /* Horizontal position reliability 0: Not set 1: Very Low 2: Low 3: Medium 4: High    */
 | ||
|  |   uint8       u_VerticalReliability;    /* Vertical position reliability */
 | ||
|  |   uint16      w_Reserved2;              /* Reserved memory field */
 | ||
|  |   uint32      q_FltGnssHeadingRad;      /* User heading in radians derived from GNSS only solution  */
 | ||
|  |   uint32      q_FltGnssHeadingUncRad;   /* User heading uncertainty in radians derived from GNSS only solution  */
 | ||
|  |   uint32      q_SensorDataUsageMask;    /* Denotes which additional sensor data were used to compute this position fix.  BIT[0] 0x00000001 <96> Accelerometer BIT[1] 0x00000002 <96> Gyro 0x0000FFFC - Reserved A bit set to 1 indicates that certain fields as defined by the SENSOR_AIDING_MASK were aided with sensor data*/
 | ||
|  |   uint32      q_SensorAidMask;         /* Denotes which component of the position report was assisted with additional sensors defined in SENSOR_DATA_USAGE_MASK BIT[0] 0x00000001 <96> Heading aided with sensor data BIT[1] 0x00000002 <96> Speed aided with sensor data BIT[2] 0x00000004 <96> Position aided with sensor data BIT[3] 0x00000008 <96> Velocity aided with sensor data 0xFFFFFFF0 <96> Reserved */
 | ||
|  |   uint8       u_NumGpsSvsUsed;          /* The number of GPS SVs used in the fix */
 | ||
|  |   uint8       u_TotalGpsSvs;            /* Total number of GPS SVs detected by searcher, including ones not used in position calculation */
 | ||
|  |   uint8       u_NumGloSvsUsed;          /* The number of Glonass SVs used in the fix */
 | ||
|  |   uint8       u_TotalGloSvs;            /* Total number of Glonass SVs detected by searcher, including ones not used in position calculation */
 | ||
|  |   uint8       u_NumBdsSvsUsed;          /* The number of BeiDou SVs used in the fix */
 | ||
|  |   uint8       u_TotalBdsSvs;            /* Total number of BeiDou SVs detected by searcher, including ones not used in position calculation */
 | ||
| 
											2 years ago
										 | """ # noqa: E501
 | ||
| 
											4 years ago
										 | 
 | ||
|  | def name_to_camelcase(nam):
 | ||
|  |   ret = []
 | ||
|  |   i = 0
 | ||
|  |   while i < len(nam):
 | ||
|  |     if nam[i] == "_":
 | ||
|  |       ret.append(nam[i+1].upper())
 | ||
|  |       i += 2
 | ||
|  |     else:
 | ||
|  |       ret.append(nam[i])
 | ||
|  |       i += 1
 | ||
|  |   return ''.join(ret)
 | ||
|  | 
 | ||
|  | def parse_struct(ss):
 | ||
|  |   st = "<"
 | ||
|  |   nams = []
 | ||
|  |   for l in ss.strip().split("\n"):
 | ||
| 
											4 years ago
										 |     if len(l.strip()) == 0:
 | ||
|  |       continue
 | ||
| 
											4 years ago
										 |     typ, nam = l.split(";")[0].split()
 | ||
|  |     #print(typ, nam)
 | ||
|  |     if typ == "float" or '_Flt' in nam:
 | ||
|  |       st += "f"
 | ||
|  |     elif typ == "double" or '_Dbl' in nam:
 | ||
|  |       st += "d"
 | ||
|  |     elif typ in ["uint8", "uint8_t"]:
 | ||
|  |       st += "B"
 | ||
|  |     elif typ in ["int8", "int8_t"]:
 | ||
|  |       st += "b"
 | ||
|  |     elif typ in ["uint32", "uint32_t"]:
 | ||
|  |       st += "I"
 | ||
|  |     elif typ in ["int32", "int32_t"]:
 | ||
|  |       st += "i"
 | ||
|  |     elif typ in ["uint16", "uint16_t"]:
 | ||
|  |       st += "H"
 | ||
|  |     elif typ in ["int16", "int16_t"]:
 | ||
|  |       st += "h"
 | ||
| 
											4 years ago
										 |     elif typ in ["uint64", "uint64_t"]:
 | ||
| 
											4 years ago
										 |       st += "Q"
 | ||
|  |     else:
 | ||
| 
											2 years ago
										 |       raise RuntimeError(f"unknown type {typ}")
 | ||
| 
											4 years ago
										 |     if '[' in nam:
 | ||
|  |       cnt = int(nam.split("[")[1].split("]")[0])
 | ||
|  |       st += st[-1]*(cnt-1)
 | ||
|  |       for i in range(cnt):
 | ||
|  |         nams.append("%s[%d]" % (nam.split("[")[0], i))
 | ||
|  |     else:
 | ||
|  |       nams.append(nam)
 | ||
|  |   return st, nams
 | ||
|  | 
 | ||
|  | def dict_unpacker(ss, camelcase = False):
 | ||
|  |   st, nams = parse_struct(ss)
 | ||
|  |   if camelcase:
 | ||
|  |     nams = [name_to_camelcase(x) for x in nams]
 | ||
|  |   sz = calcsize(st)
 | ||
| 
											2 years ago
										 |   return lambda x: dict(zip(nams, unpack_from(st, x), strict=True)), sz
 | ||
| 
											3 years ago
										 | 
 | ||
|  | def relist(dat):
 | ||
|  |   list_keys = set()
 | ||
|  |   for key in dat.keys():
 | ||
|  |     if '[' in key:
 | ||
|  |       list_keys.add(key.split('[')[0])
 | ||
|  |   list_dict = {}
 | ||
|  |   for list_key in list_keys:
 | ||
|  |     list_dict[list_key] = []
 | ||
|  |     i = 0
 | ||
|  |     while True:
 | ||
|  |       key = list_key + f'[{i}]'
 | ||
|  |       if key not in dat:
 | ||
|  |         break
 | ||
|  |       list_dict[list_key].append(dat[key])
 | ||
|  |       del dat[key]
 | ||
|  |       i += 1
 | ||
|  |   return {**dat, **list_dict}
 |