Skip to content

Commit 2a35c64

Browse files
committed
Implemented BDotDetumble
1 parent b012930 commit 2a35c64

File tree

7 files changed

+49
-23
lines changed

7 files changed

+49
-23
lines changed

FprimeZephyrReference/Components/DetumbleManager/DetumbleManager.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,18 @@ void DetumbleManager ::run_handler(FwIndexType portNum, U32 context) {
3030
// Read from Lis2mdlManager
3131
this->magneticFieldGet_out(0);
3232
}
33+
34+
bool DetumbleManager::executeControlStep() {
35+
Drv::MagneticField mgField = this->magneticFieldGet_out(0);
36+
if (this->prevMgField == this->EMPTY_MG_FIELD) {
37+
this->prevMgField = mgField;
38+
}
39+
40+
Drv::DipoleMoment dpMoment = this->dipoleMomentGet_handler(0, mgField, this->prevMgField);
41+
// Then check if its null/empty whatever here, need to figure that out.
42+
this->prevMgField = mgField;
43+
44+
// Then apply the dipole moment here, gonna have to figure that out.
45+
return true;
46+
}
3347
} // namespace Components

FprimeZephyrReference/Components/DetumbleManager/DetumbleManager.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ class DetumbleManager final : public DetumbleManagerComponentBase {
3131
void run_handler(FwIndexType portNum, //!< The port number
3232
U32 context //!< The call order
3333
) override;
34+
35+
// Variables
36+
Drv::MagneticField EMPTY_MG_FIELD = Drv::MagneticField{0.0, 0.0, 0.0};
37+
Drv::MagneticField prevMgField = Drv::MagneticField{0.0, 0.0, 0.0};
38+
39+
// Functions
40+
bool executeControlStep();
3441
};
3542

3643
} // namespace Components

FprimeZephyrReference/Components/Drv/BDotDetumble/BDotDetumble.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@ BDotDetumble ::BDotDetumble(const char* const compName) : BDotDetumbleComponentB
1818

1919
BDotDetumble ::~BDotDetumble() {}
2020

21-
Drv::DipoleMoment dipoleMomentGet_handler(const FwIndexType portNum,
22-
const Drv::MagneticField currMagField,
23-
const Drv::MagneticField prevMagField) {
24-
F32 magnitude = getMagnitude(currMagField);
21+
Drv::DipoleMoment BDotDetumble::dipoleMomentGet_handler(const FwIndexType portNum,
22+
const Drv::MagneticField& currMagField,
23+
const Drv::MagneticField& prevMagField) {
24+
F64 magnitude = this->getMagnitude(currMagField);
2525
if (magnitude < 1e-6) {
26-
return; // Figure out how I should handle the return here.
26+
return Drv::DipoleMoment();
2727
}
2828

29-
if (currMagField.timestamp <= prevMagField.timestamp) {
30-
return; // Also figure out the return here.
29+
if (currMagField.get_timestamp() <= prevMagField.get_timestamp()) {
30+
return Drv::DipoleMoment();
3131
}
3232

33-
F64* dB_dtArr = dB_dt(currMagField, prevMagField);
33+
F64* dB_dtArr = this->dB_dt(currMagField, prevMagField);
3434
if (dB_dtArr == nullptr) {
35-
return; // Yeah just figure out how to properly raise error/return nothing.
35+
return Drv::DipoleMoment();
3636
}
3737

3838
F64 moment_x = this->gain * dB_dtArr[0] / magnitude;
@@ -44,19 +44,19 @@ Drv::DipoleMoment dipoleMomentGet_handler(const FwIndexType portNum,
4444
return Drv::DipoleMoment(moment_x, moment_y, moment_z);
4545
}
4646

47-
F32 getMagnitude(const Drv::MagneticField magField) {
48-
return sqrt(f64_square(magField.x) + f64_square(magField.y) + f64_square(magField.z));
47+
F64 BDotDetumble::getMagnitude(const Drv::MagneticField magField) {
48+
return sqrt(f64_square(magField.get_x()) + f64_square(magField.get_y()) + f64_square(magField.get_z()));
4949
}
5050

51-
F64* dB_dt(const Drv::MagneticField currMagField, const Drv::MagneticField prevMagField) {
52-
I64 dt = currMagField.timestamp - prevMagField.timestamp;
51+
F64* BDotDetumble::dB_dt(const Drv::MagneticField currMagField, const Drv::MagneticField prevMagField) {
52+
I64 dt = currMagField.get_timestamp() - prevMagField.get_timestamp();
5353
if (dt < 1e-6) {
5454
return nullptr;
5555
}
5656

57-
F64 dBx_dt = (currMagField.x - prevMagField.x) / dt;
58-
F64 dBy_dt = (currMagField.y - prevMagField.y) / dt;
59-
F64 dBz_dt = (currMagField.z - prevMagField.z) / dt;
57+
F64 dBx_dt = (currMagField.get_x() - prevMagField.get_x()) / dt;
58+
F64 dBy_dt = (currMagField.get_y() - prevMagField.get_y()) / dt;
59+
F64 dBz_dt = (currMagField.get_z() - prevMagField.get_z()) / dt;
6060

6161
F64* arr = new F64[3];
6262
arr[0] = dBx_dt;

FprimeZephyrReference/Components/Drv/BDotDetumble/BDotDetumble.fpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
module Drv {
2-
port DipoleMomentGet -> DipoleMoment
2+
port DipoleMomentGet(
3+
currMagField: MagneticField
4+
prevMagField: MagneticField
5+
) -> DipoleMoment
36
}
47

58
module Drv {

FprimeZephyrReference/Components/Drv/BDotDetumble/BDotDetumble.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,18 @@ class BDotDetumble final : public BDotDetumbleComponentBase {
2626
~BDotDetumble();
2727

2828
// Get the current dipole moment
29-
Drv::DipoleMoment dipoleMomentGet_handler(const FwIndexType portNum) override;
29+
Drv::DipoleMoment dipoleMomentGet_handler(const FwIndexType portNum,
30+
const Drv::MagneticField& currMagField,
31+
const Drv::MagneticField& prevMagField) override;
3032

3133
private:
3234
F64 gain = 1.0;
3335

3436
// Get magnitude
35-
F32 getMagnitude(const Drv::MagneticField magField);
37+
F64 getMagnitude(Drv::MagneticField magField);
3638

3739
// Get the time derivative of the magnetic field
38-
F64* dB_dt(const Drv::MagneticField currMagField, const Drv::MagneticField prevMagField);
39-
40+
F64* dB_dt(Drv::MagneticField currMagField, Drv::MagneticField prevMagField);
41+
};
4042
} // namespace Drv
41-
4243
#endif

FprimeZephyrReference/Components/Drv/Lis2mdlManager/Lis2mdlManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Lis2mdlManager ::~Lis2mdlManager() {}
2727
Drv::MagneticField Lis2mdlManager ::magneticFieldGet_handler(FwIndexType portNum) {
2828
if (!device_is_ready(dev)) {
2929
this->log_WARNING_HI_DeviceNotReady();
30-
return Drv::MagneticField(0.0, 0.0, 0.0);
30+
return Drv::MagneticField(0.0, 0.0, 0.0, k_uptime_get());
3131
}
3232
this->log_WARNING_HI_DeviceNotReady_ThrottleClear();
3333

FprimeZephyrReference/Components/Drv/Types/Types.fpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ module Drv {
2222
timestamp: I64 @< Time the magnetic field struct was created. Used for dB_dt calculation.
2323
}
2424

25+
@ Calculated dipole moment from the B-Dot algorithm.
2526
struct DipoleMoment {
2627
x: F64
2728
y: F64

0 commit comments

Comments
 (0)