summaryrefslogtreecommitdiff
path: root/libgpsd_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgpsd_core.c')
-rw-r--r--libgpsd_core.c94
1 files changed, 2 insertions, 92 deletions
diff --git a/libgpsd_core.c b/libgpsd_core.c
index 7b679174..c35d98f7 100644
--- a/libgpsd_core.c
+++ b/libgpsd_core.c
@@ -32,6 +32,7 @@
#endif /* S_SPLINT_S */
#include "gpsd.h"
+#include "matrix.h"
#if defined(NMEA2000_ENABLE)
#include "driver_nmea2000.h"
#endif /* defined(NMEA2000_ENABLE) */
@@ -653,97 +654,6 @@ driver.
******************************************************************************/
-/*@ -fixedformalarray -mustdefine @*/
-static bool invert(double mat[4][4], /*@out@*/ double inverse[4][4])
-{
- // Find all NECESSARY 2x2 subdeterminants
- double Det2_12_01 = mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0];
- double Det2_12_02 = mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0];
- //double Det2_12_03 = mat[1][0]*mat[2][3] - mat[1][3]*mat[2][0];
- double Det2_12_12 = mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1];
- //double Det2_12_13 = mat[1][1]*mat[2][3] - mat[1][3]*mat[2][1];
- //double Det2_12_23 = mat[1][2]*mat[2][3] - mat[1][3]*mat[2][2];
- double Det2_13_01 = mat[1][0] * mat[3][1] - mat[1][1] * mat[3][0];
- //double Det2_13_02 = mat[1][0]*mat[3][2] - mat[1][2]*mat[3][0];
- double Det2_13_03 = mat[1][0] * mat[3][3] - mat[1][3] * mat[3][0];
- //double Det2_13_12 = mat[1][1]*mat[3][2] - mat[1][2]*mat[3][1];
- double Det2_13_13 = mat[1][1] * mat[3][3] - mat[1][3] * mat[3][1];
- //double Det2_13_23 = mat[1][2]*mat[3][3] - mat[1][3]*mat[3][2];
- double Det2_23_01 = mat[2][0] * mat[3][1] - mat[2][1] * mat[3][0];
- double Det2_23_02 = mat[2][0] * mat[3][2] - mat[2][2] * mat[3][0];
- double Det2_23_03 = mat[2][0] * mat[3][3] - mat[2][3] * mat[3][0];
- double Det2_23_12 = mat[2][1] * mat[3][2] - mat[2][2] * mat[3][1];
- double Det2_23_13 = mat[2][1] * mat[3][3] - mat[2][3] * mat[3][1];
- double Det2_23_23 = mat[2][2] * mat[3][3] - mat[2][3] * mat[3][2];
-
- // Find all NECESSARY 3x3 subdeterminants
- double Det3_012_012 = mat[0][0] * Det2_12_12 - mat[0][1] * Det2_12_02
- + mat[0][2] * Det2_12_01;
- //double Det3_012_013 = mat[0][0]*Det2_12_13 - mat[0][1]*Det2_12_03
- // + mat[0][3]*Det2_12_01;
- //double Det3_012_023 = mat[0][0]*Det2_12_23 - mat[0][2]*Det2_12_03
- // + mat[0][3]*Det2_12_02;
- //double Det3_012_123 = mat[0][1]*Det2_12_23 - mat[0][2]*Det2_12_13
- // + mat[0][3]*Det2_12_12;
- //double Det3_013_012 = mat[0][0]*Det2_13_12 - mat[0][1]*Det2_13_02
- // + mat[0][2]*Det2_13_01;
- double Det3_013_013 = mat[0][0] * Det2_13_13 - mat[0][1] * Det2_13_03
- + mat[0][3] * Det2_13_01;
- //double Det3_013_023 = mat[0][0]*Det2_13_23 - mat[0][2]*Det2_13_03
- // + mat[0][3]*Det2_13_02;
- //double Det3_013_123 = mat[0][1]*Det2_13_23 - mat[0][2]*Det2_13_13
- // + mat[0][3]*Det2_13_12;
- //double Det3_023_012 = mat[0][0]*Det2_23_12 - mat[0][1]*Det2_23_02
- // + mat[0][2]*Det2_23_01;
- //double Det3_023_013 = mat[0][0]*Det2_23_13 - mat[0][1]*Det2_23_03
- // + mat[0][3]*Det2_23_01;
- double Det3_023_023 = mat[0][0] * Det2_23_23 - mat[0][2] * Det2_23_03
- + mat[0][3] * Det2_23_02;
- //double Det3_023_123 = mat[0][1]*Det2_23_23 - mat[0][2]*Det2_23_13
- // + mat[0][3]*Det2_23_12;
- double Det3_123_012 = mat[1][0] * Det2_23_12 - mat[1][1] * Det2_23_02
- + mat[1][2] * Det2_23_01;
- double Det3_123_013 = mat[1][0] * Det2_23_13 - mat[1][1] * Det2_23_03
- + mat[1][3] * Det2_23_01;
- double Det3_123_023 = mat[1][0] * Det2_23_23 - mat[1][2] * Det2_23_03
- + mat[1][3] * Det2_23_02;
- double Det3_123_123 = mat[1][1] * Det2_23_23 - mat[1][2] * Det2_23_13
- + mat[1][3] * Det2_23_12;
-
- // Find the 4x4 determinant
- static double det;
- det = mat[0][0] * Det3_123_123
- - mat[0][1] * Det3_123_023
- + mat[0][2] * Det3_123_013 - mat[0][3] * Det3_123_012;
-
- // Very small determinants probably reflect floating-point fuzz near zero
- if (fabs(det) < 0.0001)
- return false;
-
- inverse[0][0] = Det3_123_123 / det;
- //inverse[0][1] = -Det3_023_123 / det;
- //inverse[0][2] = Det3_013_123 / det;
- //inverse[0][3] = -Det3_012_123 / det;
-
- //inverse[1][0] = -Det3_123_023 / det;
- inverse[1][1] = Det3_023_023 / det;
- //inverse[1][2] = -Det3_013_023 / det;
- //inverse[1][3] = Det3_012_023 / det;
-
- //inverse[2][0] = Det3_123_013 / det;
- //inverse[2][1] = -Det3_023_013 / det;
- inverse[2][2] = Det3_013_013 / det;
- //inverse[2][3] = -Det3_012_013 / det;
-
- //inverse[3][0] = -Det3_123_012 / det;
- //inverse[3][1] = Det3_023_012 / det;
- //inverse[3][2] = -Det3_013_012 / det;
- inverse[3][3] = Det3_012_012 / det;
-
- return true;
-}
-
-/*@ +fixedformalarray +mustdefine @*/
static gps_mask_t fill_dop(const struct gpsd_errout_t *errout,
const struct gps_data_t * gpsdata,
@@ -814,7 +724,7 @@ static gps_mask_t fill_dop(const struct gpsd_errout_t *errout,
}
#endif /* __UNUSED__ */
- if (invert(prod, inv)) {
+ if (matrix_invert(prod, inv)) {
#ifdef __UNUSED__
/*
* Note: this will print garbage unless all the subdeterminants