66 for (i = 0; i < (MAGBUFFSIZEX - 1); i++)
67 pthisMagBuffer->
tanarray[i] = (
int16) (100.0F * tanf(
PI * (-0.5F + (
float) (i + 1) / MAGBUFFSIZEX)));
74 if (*((
uint32 *) pFlash++) == 0x12345678)
78 for (i =
CHX; i <=
CHZ; i++) pthisMagCal->
fV[i] = *(pFlash++);
79 for (i =
CHX; i <=
CHZ; i++)
80 for (j =
CHX; j <=
CHZ; j++)
81 pthisMagCal->
finvW[i][j] = *(pFlash++);
82 pthisMagCal->
fB = *(pFlash++);
83 pthisMagCal->
fBSq = *(pFlash++);
92 pthisMagCal->
fV[
CHX] = pthisMagCal->
fV[
CHY] = pthisMagCal->
fV[
CHZ] = 0.0F;
132 if (pthisMag->
iBc[
CHZ] == 0)
return;
149 (pthisMagBuffer->
index[j][k] != -1))
152 for (i =
CHX; i <=
CHZ; i++)
154 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
157 pthisMagBuffer->
index[j][k] = loopcounter;
164 (pthisMagBuffer->
index[j][k] == -1))
167 for (i =
CHX; i <=
CHZ; i++)
169 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
172 pthisMagBuffer->
index[j][k] = loopcounter;
182 if (pthisMagBuffer->
index[j][k] < i)
185 if (pthisMagBuffer->
index[j][k] != -1)
192 i = pthisMagBuffer->
index[l][m];
199 pthisMagBuffer->
index[l][m] = -1;
205 (pthisMagBuffer->
index[j][k] == -1))
208 for (i =
CHX; i <=
CHZ; i++)
210 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
213 pthisMagBuffer->
index[j][k] = loopcounter;
221 (pthisMagBuffer->
index[j][k] != -1))
225 for (i =
CHX; i <=
CHZ; i++)
227 idelta += abs((
int32) pthisMag->
iBs[i] -
228 (
int32) pthisMagBuffer->
iBs[i][j][k]);
235 for (i =
CHX; i <=
CHZ; i++)
237 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
240 pthisMagBuffer->
index[j][k] = loopcounter;
259 if (pthisMagBuffer->
index[j][k] != -1)
263 for (i =
CHX; i <=
CHZ; i++)
265 idelta += abs((
int32) pthisMag->
iBs[i] -
266 (
int32) pthisMagBuffer->
iBs[i][j][k]);
293 for (i =
CHX; i <=
CHZ; i++)
295 pthisMagBuffer->
iBs[i][l][m] = pthisMag->
iBs[i];
298 pthisMagBuffer->
index[l][m] = loopcounter;
318 for (i =
CHX; i <=
CHZ; i++)
320 ftmp[i] = pthisMag->
fBs[i] - pthisMagCal->
fV[i];
324 for (i =
CHX; i <=
CHZ; i++)
434 pthisMagCal->
fB = pthisMagCal->
ftrB;
435 pthisMagCal->
fBSq = pthisMagCal->
fB * pthisMagCal->
fB;
436 for (i =
CHX; i <=
CHZ; i++)
438 pthisMagCal->
fV[i] = pthisMagCal->
ftrV[i];
439 for (j =
CHX; j <=
CHZ; j++)
450 pthisMagBuffer->
index[i][j] = -1;
498 pthisMagCal->
fYTY = 0.0F;
499 for (i = 0; i < 4; i++)
501 pthisMagCal->
fvecA[i] = 0.0F;
502 for (j = i; j < 4; j++) pthisMagCal->
fmatA[i][j] = 0.0F;
507 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
514 if (pthisMagBuffer->
index[i][j] != -1)
517 for (k = 0; k < 3; k++)
524 for (i = 0; i < 3; i++)
526 if (pthisMagCal->
iSumBs[i] >= 0)
555 int32 iBsZeroMean[3];
561 if (pthisMagBuffer->
index[i][j] != -1)
564 for (k = 0; k < 3; k++)
568 pthisMagCal->
fmatA[0][0] += (
float) (iBsZeroMean[0] * iBsZeroMean[0]);
569 pthisMagCal->
fmatA[0][1] += (float) (iBsZeroMean[0] * iBsZeroMean[1]);
570 pthisMagCal->
fmatA[0][2] += (float) (iBsZeroMean[0] * iBsZeroMean[2]);
571 pthisMagCal->
fmatA[1][1] += (float) (iBsZeroMean[1] * iBsZeroMean[1]);
572 pthisMagCal->
fmatA[1][2] += (float) (iBsZeroMean[1] * iBsZeroMean[2]);
573 pthisMagCal->
fmatA[2][2] += (float) (iBsZeroMean[2] * iBsZeroMean[2]);
576 fBsZeroMeanSq = (float)
585 for (k = 0; k < 3; k++)
586 pthisMagCal->
fvecA[k] += (
float) iBsZeroMean[k] * fBsZeroMeanSq;
587 pthisMagCal->
fvecA[3] += fBsZeroMeanSq;
590 pthisMagCal->
fYTY += fBsZeroMeanSq * fBsZeroMeanSq;
611 for (i = 0; i < 4; i++)
613 for (j = 0; j <= i; j++)
614 pthisMagCal->
fmatB[i][j] = pthisMagCal->
fmatB[j][i] = pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
618 for (i = 0; i < 4; i++) pfRows[i] = pthisMagCal->
fmatB[i];
636 for (i = 0; i < 4; i++)
638 pthisMagCal->
fvecB[i] = pthisMagCal->
fmatB[i][0] * pthisMagCal->
fvecA[0];
639 for (j = 1; j < 4; j++)
640 pthisMagCal->
fvecB[i] += pthisMagCal->
fmatB[i][j] * pthisMagCal->
fvecA[j];
645 for (i =
CHX; i <=
CHZ; i++)
646 pthisMagCal->
ftrV[i] = ftmp * pthisMagCal->
fvecB[i];
649 pthisMagCal->
ftrB = pthisMagCal->
fvecB[3] *
652 for (i =
CHX; i <=
CHZ; i++)
653 pthisMagCal->
ftrB += pthisMagCal->
ftrV[i] * pthisMagCal->
ftrV[i];
654 pthisMagCal->
ftrB = sqrtf(fabs(pthisMagCal->
ftrB));
658 for (i =
CHX; i <=
CHZ; i++)
659 pthisMagCal->
ftrV[i] += (
float) pthisMagCal->
iSumBs[i] * ftmp;
663 fE = pthisMagCal->
fvecB[0] * pthisMagCal->
fvecA[0];
664 for (i = 1; i < 4; i++)
665 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
668 fE = pthisMagCal->
fYTY - 2.0F * fE;
671 for (i = 0; i < 4; i++)
673 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][0] * pthisMagCal->
fvecB[0];
674 for (j = 1; j < 4; j++)
675 pthisMagCal->
fvecA[i] += pthisMagCal->
fmatA[i][j] * pthisMagCal->
fvecB[j];
679 for (i = 0; i < 4; i++)
680 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
710 #define MATRIX_7_SIZE 7 728 pthisMagCal->
fmatA[i][j] = 0.0F;
732 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
737 if (pthisMagBuffer->
index[i][j] != -1)
740 for (k = 0; k < 3; k++)
747 for (i = 0; i < 3; i++)
749 if (pthisMagCal->
iSumBs[i] >= 0)
779 if (pthisMagBuffer->
index[i][j] != -1)
782 for (k = 0; k < 3; k++)
784 pthisMagCal->
fvecA[k + 3] = (float)
786 (
int32) pthisMagBuffer->
iBs[k][i][j] -
789 pthisMagCal->
fvecA[k] = pthisMagCal->
fvecA[k + 3] * pthisMagCal->
fvecA[k + 3];
794 for (k = 0; k < 3; k++)
795 pthisMagCal->
fmatA[k][6] += pthisMagCal->
fvecA[k];
801 pthisMagCal->
fmatA[k][l] += pthisMagCal->
fvecA[k] * pthisMagCal->
fvecA[l];
821 for (j = 0; j < i; j++)
822 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
828 pthisMagCal->
fmatB[i][j] = 0.0F;
829 pthisMagCal->
fmatB[i][i] = 1.0F;
830 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
878 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
894 fresidue += fabsf(pthisMagCal->
fmatA[i][j]);
915 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[imin]) imin = i;
920 fdetA = pthisMagCal->
fmatB[
CHX][imin] *
927 pthisMagCal->
fmatB[i][imin] = -pthisMagCal->
fmatB[i][imin];
933 for (i =
CHX; i <=
CHZ; i++)
934 pthisMagCal->
ftrV[i] = -0.5F *
935 pthisMagCal->
fmatB[i + 3][imin] /
936 pthisMagCal->
fmatB[i][imin];
939 ftmp = -pthisMagCal->
fmatB[6][imin];
940 for (i =
CHX; i <=
CHZ; i++)
941 ftmp += pthisMagCal->
fmatB[i][imin] *
942 pthisMagCal->
ftrV[i] *
943 pthisMagCal->
ftrV[i];
953 ftmp = powf(fabs(fdetA), -(
ONETHIRD));
954 for (i =
CHX; i <=
CHZ; i++)
956 pthisMagCal->
fA[i][i] = pthisMagCal->
fmatB[i][imin] * ftmp;
957 pthisMagCal->
ftrinvW[i][i] = sqrtf(fabsf(pthisMagCal->
fA[i][i]));
966 pthisMagCal->
ftrB *= sqrt(fabs(ftmp));
969 for (i =
CHX; i <=
CHZ; i++)
970 pthisMagCal->
ftrV[i] =
972 pthisMagCal->
ftrV[i] +
973 (
float) pthisMagCal->
iMeanBs[i]
997 #define MATRIX_10_SIZE 10 1015 pthisMagCal->
fmatA[i][j] = 0.0F;
1019 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
1024 if (pthisMagBuffer->
index[i][j] != -1)
1027 for (k = 0; k < 3; k++)
1034 for (i = 0; i < 3; i++)
1036 if (pthisMagCal->
iSumBs[i] >= 0)
1067 if (pthisMagBuffer->
index[i][j] != -1)
1070 for (k = 0; k < 3; k++)
1071 pthisMagCal->
fvecA[k + 6] = (
float)
1073 (
int32) pthisMagBuffer->
iBs[k][i][j] -
1078 pthisMagCal->
fvecA[0] = pthisMagCal->
fvecA[6] * pthisMagCal->
fvecA[6];
1079 pthisMagCal->
fvecA[1] = 2.0F *
1080 pthisMagCal->
fvecA[6] *
1081 pthisMagCal->
fvecA[7];
1082 pthisMagCal->
fvecA[2] = 2.0F *
1083 pthisMagCal->
fvecA[6] *
1084 pthisMagCal->
fvecA[8];
1085 pthisMagCal->
fvecA[3] = pthisMagCal->
fvecA[7] * pthisMagCal->
fvecA[7];
1086 pthisMagCal->
fvecA[4] = 2.0F *
1087 pthisMagCal->
fvecA[7] *
1088 pthisMagCal->
fvecA[8];
1089 pthisMagCal->
fvecA[5] = pthisMagCal->
fvecA[8] * pthisMagCal->
fvecA[8];
1093 for (k = 0; k < 6; k++)
1094 pthisMagCal->
fmatA[k][9] += pthisMagCal->
fvecA[k];
1100 pthisMagCal->
fmatA[k][l] += pthisMagCal->
fvecA[k] * pthisMagCal->
fvecA[l];
1120 for (j = 0; j < i; j++)
1121 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
1127 pthisMagCal->
fmatB[i][j] = 0.0F;
1128 pthisMagCal->
fmatB[i][i] = 1.0F;
1129 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1192 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1208 fresidue += fabsf(pthisMagCal->
fmatA[i][j]);
1211 if (fresidue > 0.0F)
1229 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[imin]) imin = i;
1244 fdetA = fabs(fdetA);
1246 pthisMagCal->
fmatB[i][imin] = -pthisMagCal->
fmatB[i][imin];
1253 for (i =
CHX; i <=
CHZ; i++)
1255 pthisMagCal->
ftrV[i] = pthisMagCal->
finvA[i][0] *
1256 pthisMagCal->
fmatB[6][imin] +
1257 pthisMagCal->
finvA[i][1] *
1258 pthisMagCal->
fmatB[7][imin] +
1259 pthisMagCal->
finvA[i][2] *
1260 pthisMagCal->
fmatB[8][imin];
1261 pthisMagCal->
ftrV[i] *= -0.5F;
1275 ftmp -= pthisMagCal->
fmatB[9][imin];
1276 ftmp += pthisMagCal->
fA[
CHX][
CHX] *
1279 ftmp += pthisMagCal->
fA[
CHY][
CHY] *
1282 ftmp += pthisMagCal->
fA[
CHZ][
CHZ] *
1285 pthisMagCal->
ftrB = sqrtf(fabsf(ftmp));
1289 pthisMagCal->
fvecA[imin] /
1291 )) / (pthisMagCal->
ftrB * pthisMagCal->
ftrB);
1297 for (i =
CHX; i <=
CHZ; i++)
1298 pthisMagCal->
ftrV[i] =
1300 pthisMagCal->
ftrV[i] +
1301 (
float) pthisMagCal->
iMeanBs[i]
1306 ftmp = powf(fabs(fdetA), -(
ONETHIRD));
1312 pthisMagCal->
ftrB *= sqrt(fabs(ftmp));
1317 for (i = 0; i < 3; i++)
1319 for (j = 0; j < 3; j++)
1321 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fA[i][j];
1322 pthisMagCal->
fmatB[i][j] = 0.0F;
1325 pthisMagCal->
fmatB[i][i] = 1.0F;
1326 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1358 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1360 pthisMagCal->
fvecA, i, j, 3);
1372 fresidue = fabsf(pthisMagCal->
fmatA[0][1]) + fabsf(pthisMagCal->
fmatA[0][2]) + fabsf(pthisMagCal->
fmatA[1][2]);
1373 if (fresidue > 0.0F)
1386 for (j = 0; j < 3; j++)
1388 ftmp = sqrtf(sqrtf(fabsf(pthisMagCal->
fvecA[j])));
1389 for (i = 0; i < 3; i++)
1390 pthisMagCal->
fmatB[i][j] *= ftmp;
1396 for (i = 0; i < 3; i++)
1398 for (j = i; j < 3; j++)
1401 pthisMagCal->
fmatB[i][0] *
1402 pthisMagCal->
fmatB[j][0] +
1403 pthisMagCal->
fmatB[i][1] *
1404 pthisMagCal->
fmatB[j][1] +
1405 pthisMagCal->
fmatB[i][2] *
1406 pthisMagCal->
fmatB[j][2];
1450 for (i = 0; i < 4; i++)
1452 pthisMagCal->
fvecB[i] = 0.0F;
1453 for (j = i; j < 4; j++)
1455 pthisMagCal->
fmatA[i][j] = 0.0F;
1460 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1468 if (pthisMagBuffer->
index[j][k] != -1)
1473 for (l =
CHX; l <=
CHZ; l++)
1475 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1480 for (l =
CHX; l <=
CHZ; l++)
1482 pthisMagCal->
fvecA[l] = (float)
1484 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1487 pthisMagCal->
fvecA[l + 3] = pthisMagCal->
fvecA[l] * pthisMagCal->
fvecA[l];
1491 fBs2 = pthisMagCal->
fvecA[3] +
1492 pthisMagCal->
fvecA[4] +
1493 pthisMagCal->
fvecA[5];
1496 fSumBs4 += fBs2 * fBs2;
1499 for (l =
CHX; l <=
CHZ; l++)
1501 pthisMagCal->
fvecB[l] += pthisMagCal->
fvecA[l] * fBs2;
1505 pthisMagCal->
fvecB[3] += fBs2;
1525 pthisMagCal->
fmatA[3][3] = (float) iCount;
1531 for (i = 0; i < 4; i++)
1533 for (j = i; j < 4; j++)
1535 pthisMagCal->
fmatB[i][j] = pthisMagCal->
fmatB[j][i] = pthisMagCal->
fmatA[j][i] = pthisMagCal->
fmatA[i][j];
1540 for (i = 0; i < 4; i++)
1542 pfRows[i] = pthisMagCal->
fmatB[i];
1548 for (i = 0; i < 4; i++)
1550 pthisMagCal->
fvecA[i] = 0.0F;
1551 for (k = 0; k < 4; k++)
1553 pthisMagCal->
fvecA[i] += pthisMagCal->
fmatB[i][k] * pthisMagCal->
fvecB[k];
1561 for (i = 0; i < 4; i++)
1563 fE += pthisMagCal->
fvecA[i] * pthisMagCal->
fvecB[i];
1566 fE = fSumBs4 - 2.0F * fE;
1569 for (i = 0; i < 4; i++)
1571 pthisMagCal->
fvecB[i] = 0.0F;
1572 for (k = 0; k < 4; k++)
1574 pthisMagCal->
fvecB[i] += pthisMagCal->
fmatA[i][k] * pthisMagCal->
fvecA[k];
1579 for (i = 0; i < 4; i++)
1581 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
1585 for (l =
CHX; l <=
CHZ; l++)
1587 pthisMagCal->
ftrV[l] = 0.5F * pthisMagCal->
fvecA[l];
1600 for (l =
CHX; l <=
CHZ; l++)
1602 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1604 (float) iOffset[l] *
1635 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1638 for (m = 0; m < 7; m++)
1640 for (n = m; n < 7; n++)
1642 pthisMagCal->
fmatA[m][n] = 0.0F;
1652 if (pthisMagBuffer->
index[j][k] != -1)
1657 for (l =
CHX; l <=
CHZ; l++)
1659 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1664 for (l =
CHX; l <=
CHZ; l++)
1666 pthisMagCal->
fvecA[l + 3] = (float)
1668 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1671 pthisMagCal->
fvecA[l] = pthisMagCal->
fvecA[l + 3] * pthisMagCal->
fvecA[l + 3];
1678 for (m = 0; m < 6; m++)
1680 pthisMagCal->
fmatA[m][6] += pthisMagCal->
fvecA[m];
1684 for (m = 0; m < 6; m++)
1686 for (n = m; n < 6; n++)
1688 pthisMagCal->
fmatA[m][n] += pthisMagCal->
fvecA[m] * pthisMagCal->
fvecA[n];
1699 pthisMagCal->
fmatA[6][6] = (float) iCount;
1705 for (m = 1; m < 7; m++)
1707 for (n = 0; n < m; n++)
1709 pthisMagCal->
fmatA[m][n] = pthisMagCal->
fmatA[n][m];
1719 for (i = 1; i < 7; i++)
1721 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[j])
1731 for (l =
CHX; l <=
CHZ; l++)
1733 pthisMagCal->
fA[l][l] = pthisMagCal->
fmatB[l][j];
1734 det *= pthisMagCal->
fA[l][l];
1735 pthisMagCal->
ftrV[l] = -0.5F *
1736 pthisMagCal->
fmatB[l + 3][j] /
1737 pthisMagCal->
fA[l][l];
1744 pthisMagCal->
fmatB[6][j] = -pthisMagCal->
fmatB[6][j];
1749 ftmp = -pthisMagCal->
fmatB[6][j];
1750 for (l =
CHX; l <=
CHZ; l++)
1752 ftmp += pthisMagCal->
fA[l][l] *
1753 pthisMagCal->
ftrV[l] *
1754 pthisMagCal->
ftrV[l];
1765 for (l =
CHX; l <=
CHZ; l++)
1767 pthisMagCal->
ftrinvW[l][l] = sqrtf(fabsf(pthisMagCal->
fA[l][l]));
1768 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1770 (float) iOffset[l] *
1798 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1801 for (m = 0; m < 10; m++)
1803 for (n = m; n < 10; n++)
1805 pthisMagCal->
fmatA[m][n] = 0.0F;
1815 if (pthisMagBuffer->
index[j][k] != -1)
1820 for (l =
CHX; l <=
CHZ; l++)
1822 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1827 for (l =
CHX; l <=
CHZ; l++)
1829 pthisMagCal->
fvecA[l + 6] = (float)
1831 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1837 pthisMagCal->
fvecA[0] = pthisMagCal->
fvecA[6] * pthisMagCal->
fvecA[6];
1838 pthisMagCal->
fvecA[1] = 2.0F *
1839 pthisMagCal->
fvecA[6] *
1840 pthisMagCal->
fvecA[7];
1841 pthisMagCal->
fvecA[2] = 2.0F *
1842 pthisMagCal->
fvecA[6] *
1843 pthisMagCal->
fvecA[8];
1844 pthisMagCal->
fvecA[3] = pthisMagCal->
fvecA[7] * pthisMagCal->
fvecA[7];
1845 pthisMagCal->
fvecA[4] = 2.0F *
1846 pthisMagCal->
fvecA[7] *
1847 pthisMagCal->
fvecA[8];
1848 pthisMagCal->
fvecA[5] = pthisMagCal->
fvecA[8] * pthisMagCal->
fvecA[8];
1853 for (m = 0; m < 9; m++)
1855 pthisMagCal->
fmatA[m][9] += pthisMagCal->
fvecA[m];
1859 for (m = 0; m < 9; m++)
1861 for (n = m; n < 9; n++)
1863 pthisMagCal->
fmatA[m][n] += pthisMagCal->
fvecA[m] * pthisMagCal->
fvecA[n];
1874 pthisMagCal->
fmatA[9][9] = (float) iCount;
1880 for (m = 1; m < 10; m++)
1882 for (n = 0; n < m; n++)
1884 pthisMagCal->
fmatA[m][n] = pthisMagCal->
fmatA[n][m];
1894 for (i = 1; i < 10; i++)
1896 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[j])
1902 pthisMagCal->
fA[0][0] = pthisMagCal->
fmatB[0][j];
1903 pthisMagCal->
fA[0][1] = pthisMagCal->
fA[1][0] = pthisMagCal->
fmatB[1][j];
1904 pthisMagCal->
fA[0][2] = pthisMagCal->
fA[2][0] = pthisMagCal->
fmatB[2][j];
1905 pthisMagCal->
fA[1][1] = pthisMagCal->
fmatB[3][j];
1906 pthisMagCal->
fA[1][2] = pthisMagCal->
fA[2][1] = pthisMagCal->
fmatB[4][j];
1907 pthisMagCal->
fA[2][2] = pthisMagCal->
fmatB[5][j];
1914 pthisMagCal->
fmatB[6][j] = -pthisMagCal->
fmatB[6][j];
1915 pthisMagCal->
fmatB[7][j] = -pthisMagCal->
fmatB[7][j];
1916 pthisMagCal->
fmatB[8][j] = -pthisMagCal->
fmatB[8][j];
1917 pthisMagCal->
fmatB[9][j] = -pthisMagCal->
fmatB[9][j];
1925 for (l =
CHX; l <=
CHZ; l++)
1927 pthisMagCal->
ftrV[l] = 0.0F;
1928 for (m =
CHX; m <=
CHZ; m++)
1930 pthisMagCal->
ftrV[l] += pthisMagCal->
finvA[l][m] * pthisMagCal->
fmatB[m + 6][j];
1933 pthisMagCal->
ftrV[l] *= -0.5F;
1937 pthisMagCal->
ftrB = sqrtf(fabsf(pthisMagCal->
fA[0][0] *
1939 2.0F * pthisMagCal->
fA[0][1] *
1941 2.0F * pthisMagCal->
fA[0][2] *
1943 pthisMagCal->
fA[1][1] * pthisMagCal->
ftrV[
CHY] *
1944 pthisMagCal->
ftrV[
CHY] + 2.0F *
1945 pthisMagCal->
fA[1][2] * pthisMagCal->
ftrV[
CHY] *
1946 pthisMagCal->
ftrV[
CHZ] + pthisMagCal->
fA[2][2] *
1948 pthisMagCal->
fmatB[9][j]));
1955 for (l =
CHX; l <=
CHZ; l++)
1957 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1959 (float) iOffset[l] *
1973 for (i = 0; i < 3; i++)
1975 for (j = 0; j < 3; j++)
1977 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fA[i][j];
1985 for (j = 0; j < 3; j++)
1987 ftmp = sqrtf(sqrtf(fabsf(pthisMagCal->
fvecA[j])));
1988 for (i = 0; i < 3; i++)
1990 pthisMagCal->
fmatB[i][j] *= ftmp;
1997 for (i = 0; i < 3; i++)
2000 for (j = i; j < 3; j++)
2002 pthisMagCal->
ftrinvW[i][j] = 0.0F;
2005 for (k = 0; k < 3; k++)
2007 pthisMagCal->
ftrinvW[i][j] += pthisMagCal->
fmatB[i][k] * pthisMagCal->
fmatB[j][k];
int8_t iMagBufferReadOnly
flag to denote that the magnetic measurement buffer is temporarily read only
int32_t iValidMagCal
solver used: 0 (no calibration) or 4, 7, 10 element
float fvecA[10]
scratch 10x1 vector used by calibration algorithms
void fmatrixAeqInvA(float *A[], int8 iColInd[], int8 iRowInd[], int8 iPivot[], int8 isize, int8 *pierror)
int8_t iNewCalibrationAvailable
flag denoting that a new calibration has been computed
float fYTY
Y^T.Y for 4 element calibration = (iB^2)^2.
#define MAGBUFFSIZEX
x dimension in magnetometer buffer (12x24 equals 288 elements)
void fComputeMagCalibration10(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
#define CHY
Used to access Y-channel entries in various data data structures.
void fUpdateMagCalibration7Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
#define CALIBRATION_NVM_ADDR
start of final 4K (sector size) of 1M flash
float fV[3]
current hard iron offset x, y, z, (uT)
#define DEFAULTB
default geomagnetic field (uT)
#define MINMEASUREMENTS7CAL
minimum number of measurements for 7 element calibration
void iUpdateMagBuffer(struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag, int32 loopcounter)
void fComputeMagCalibration4(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
int8_t iCalInProgress
flag denoting that a calibration is in progress
int16_t iBs[3]
averaged uncalibrated measurement (counts)
float ftrinvW[3][3]
trial inverse soft iron matrix size
int8_t i10ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
#define FITERRORAGINGSECS
24 hours: time (s) for fit error to increase (age) by e=2.718
void f3x3matrixAeqMinusA(float A[][3])
function negates all elements of 3x3 matrix A
void f3x3matrixAeqAxScalar(float A[][3], float Scalar)
function multiplies all elements of 3x3 matrix A by the specified scalar
float fmatA[10][10]
scratch 10x10 float matrix used by calibration algorithms
float fuTPerCount
uT per count
int16_t iBc[3]
averaged calibrated measurement (counts)
float f3x3matrixDetA(float A[][3])
function calculates the determinant of a 3x3 matrix
void fRunMagCalibration(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag, int32 loopcounter)
int32_t iMeanBs[3]
average magnetic measurement (counts)
void fUpdateMagCalibration10Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
The MagSensor structure stores raw and processed measurements for a 3-axis magnetic sensor...
float fA[3][3]
ellipsoid matrix A
#define MAXMEASUREMENTS
maximum number of measurements used for calibration
void fInitializeMagCalibration(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer)
float fBs[3]
averaged un-calibrated measurement (uT)
float ftrV[3]
trial value of hard iron offset z, y, z (uT)
float ftrFitErrorpc
trial value of fit error %
void fEigenCompute10(float A[][10], float eigval[], float eigvec[][10], int8 n)
int8_t i7ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
#define ONESIXTH
one sixth
#define MINMEASUREMENTS10CAL
minimum number of measurements for 10 element calibration
float fFitErrorpc
current fit error %
The sensor_fusion.h file implements the top level programming interface.
#define CAL_INTERVAL_SECS
300s or 5min interval for regular calibration checks
#define ONETHIRD
one third
#define CHZ
Used to access Z-channel entries in various data data structures.
void f3x3matrixAeqInvSymB(float A[][3], float B[][3])
float fvecB[4]
scratch 4x1 vector used by calibration algorithms
int16_t iBs[3][MAGBUFFSIZEX][MAGBUFFSIZEY]
uncalibrated magnetometer readings
float finvA[3][3]
inverse of ellipsoid matrix A
void fComputeEigSlice(float fmatA[10][10], float fmatB[10][10], float fvecA[10], int8 i, int8 j, int8 iMatrixSize)
int16_t tanarray[MAGBUFFSIZEX - 1]
array of tangents of (100 * angle)
float fB
current geomagnetic field magnitude (uT)
int16_t iMagBufferCount
number of magnetometer readings
void fUpdateMagCalibration4Slice(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)
#define CHX
Used to access X-channel entries in various data data structures.
void f3x3matrixAeqI(float A[][3])
function sets the 3x3 matrix A to the identity matrix
float fBc[3]
averaged calibrated measurement (uT)
#define MESHDELTACOUNTS
magnetic buffer mesh spacing in counts (here 5uT)
Magnetic Calibration Structure.
int32_t iSumBs[3]
sum of measurements in buffer (counts)
void fInvertMagCal(struct MagSensor *pthisMag, struct MagCalibration *pthisMagCal)
int32_t itimeslice
counter for tine slicing magnetic calibration calculations
int8_t i4ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
float fmatB[10][10]
scratch 10x10 float matrix used by calibration algorithms
#define FUSION_HZ
(int) actual rate of fusion algorithm execution and sensor FIFO reads
float fBSq
square of fB (uT^2)
float ftrB
trial value of geomagnetic field magnitude in uT
#define MAXBFITUT
maximum acceptable geomagnetic field B (uT) for valid calibration
#define MINMEASUREMENTS4CAL
minimum number of measurements for 4 element calibration
void f3x3matrixAeqScalar(float A[][3], float Scalar)
function sets every entry in the 3x3 matrix A to a constant scalar
float fCountsPeruT
counts per uT
#define MAGBUFFSIZEY
y dimension in magnetometer buffer (12x24 equals 288 elements)
int8_t iInitiateMagCal
flag to start a new magnetic calibration
int32_t index[MAGBUFFSIZEX][MAGBUFFSIZEY]
array of time indices
float finvW[3][3]
current inverse soft iron matrix
#define MINBFITUT
minimum acceptable geomagnetic field B (uT) for valid calibration
void fComputeMagCalibration7(struct MagCalibration *pthisMagCal, struct MagBuffer *pthisMagBuffer, struct MagSensor *pthisMag)