Skip to content

Commit ec2d53e

Browse files
committed
Update FSM, Core: Update state name
1 parent c16963a commit ec2d53e

6 files changed

Lines changed: 45 additions & 29 deletions

File tree

include/LoadConfig.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,15 @@ namespace LED {
8989
namespace RUN {
9090
// Task Execution Intervals
9191
enum TASK_INTERVALS : uint32_t {
92-
TI_FSM_mS = 100, // CONFIG - 100 ms (10 Hz)
93-
TI_POLL_SENSORS_mS = 2, // CONFIG - 2 ms (500 Hz)
94-
TI_ADJUST_LOAD_mS = 10, // CONFIG - 10 ms (100 Hz)
95-
TI_RECV_ms = 100, // CONFIG - 100 ms (10 Hz)
96-
TI_SEND_ms = 100, // CONFIG - 10 ms (100 Hz) // FIXME
97-
TI_CFG_ms = 1000, // CONFIG - 1000 ms (1 Hz)
98-
TI_TELNET_ms = 500, // CONFIG - 500 ms (2 Hz)
99-
TI_OTA_ms = 1000, // CONFIG - 1000 ms (1 Hz)
100-
TI_LOG_DATA_ms = 4000, // CONFIG - 4000 ms (0.25 Hz)
92+
TI_FSM_mS = 100, // CONFIG - 100 ms (10 Hz)
93+
TI_POLL_SENSORS_mS = 2, // CONFIG - 2 ms (500 Hz)
94+
TI_ADJUST_LOAD_mS = 100, // CONFIG - 100 ms (10 Hz)
95+
TI_RECV_ms = 100, // CONFIG - 100 ms (10 Hz)
96+
TI_SEND_ms = 100, // CONFIG - 10 ms (100 Hz) // FIXME
97+
TI_CFG_ms = 1000, // CONFIG - 1000 ms (1 Hz)
98+
TI_TELNET_ms = 500, // CONFIG - 500 ms (2 Hz)
99+
TI_OTA_ms = 1000, // CONFIG - 1000 ms (1 Hz)
100+
TI_LOG_DATA_ms = 4000, // CONFIG - 4000 ms (0.25 Hz)
101101
FAIL_BACKOFF_BASE_FACTOR =
102102
10, // CONFIG - Multiplier for task delay on failure
103103
FAIL_BACKOFF_MULTIPLIER =

include/LoadContainer.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class LoadContainer {
4848
inline ESTOP_TYPE_FAST getSafetyFlag() const { return (safetyFlag); }
4949
inline bool isPowerPositive() const { return (INA260::current_mA > 0); }
5050
inline bool isSteadyRPM() const {
51-
return false;
51+
return (angularAccell_RPMPS < 20);
5252
} // todo - steady power is actually more important
5353
inline bool isTargetRPMExceeded() const { return false; } // todo
5454

@@ -67,13 +67,21 @@ class LoadContainer {
6767
loadDevice.setGPIO((uint32_t)value);
6868
}
6969
inline void setRPM(int_fast16_t rpm) { this->currentRPM = rpm; }
70+
inline int_fast16_t getRPM() const { return this->currentRPM; }
71+
inline void setAngularAccell_RPMPS(int_fast16_t angularAccell_RPMPS) {
72+
this->angularAccell_RPMPS = angularAccell_RPMPS;
73+
}
74+
inline int_fast16_t getAngularAccell_RPMPS() const {
75+
return this->angularAccell_RPMPS;
76+
}
7077

7178
private:
7279
MCP23008T &loadDevice;
7380
ESTOP_TYPE_FAST safetyFlag = ESTOP_TYPE_FAST::NONE; // todo - make atomic?
7481
LoadComms &loadComms;
7582
// bool powerPositive = false;
76-
int_fast16_t currentRPM = 0; // todo
83+
int_fast16_t currentRPM = 0; // todo
84+
int_fast16_t angularAccell_RPMPS = 0; // todo
7785

7886
/**
7987
* @brief Check for C++17 support, which allows us to verify if std::atomic

include/LoadFSM.hpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,46 +63,50 @@ class LoadFSM {
6363
// * -> sESTOP
6464
currentState = FSMCommon::States::sESTOP;
6565

66-
// TODO: Signal nacelle to ESTOP (setSafetyFlag)
66+
// DONE: Signal nacelle to ESTOP (setSafetyFlag)
6767
vTaskSuspend(load.tAdjustLoad.pxHandle);
68-
load.setLoadGPIO(0b0000'0000); // todo: one inverted?
68+
// Don't adjust load
6969

7070
return UPDATE_RESULT::STATE_CHANGED;
7171
} else if ((currentState == FSMCommon::States::sESTOP) &&
7272
(load.getSafetyFlag() != ESTOP_TYPE_FAST::NONE)) {
73-
// Nothing to do
73+
// sESTOP -> sESTOP: Nothing to do
7474
return UPDATE_RESULT::NO_CHANGE;
7575
} // else: ~safetyTask
7676

7777
// Check reset conditions
78-
if ((currentState != FSMCommon::States::sRST) &&
79-
!load.isPowerPositive()) {
78+
constexpr uint_fast16_t START_RUN_2_RPM = 500; // todo
79+
if ((currentState != FSMCommon::States::sRST)) {
8080
// * -> sRST
8181
currentState = FSMCommon::States::sRST;
8282

8383
// Signal Nacelle (unset safetyFlag)
8484
vTaskSuspend(load.tAdjustLoad.pxHandle);
85-
load.setLoadGPIO(0b0000'0000); // todo: one inverted?
85+
/**
86+
* @details None inverted, set to max for easiest cut in
87+
*/
88+
load.setLoadGPIO(LOAD::PINS_Msk);
8689

8790
return UPDATE_RESULT::STATE_CHANGED;
8891
} else if ((currentState == FSMCommon::States::sRST) &&
89-
!load.isPowerPositive()) {
90-
// Nothing to do
92+
load.getRPM() <= START_RUN_2_RPM) {
93+
// sRST -> sRST: Nothing to do
9194
return UPDATE_RESULT::NO_CHANGE;
92-
} // else: producingPositivePower
95+
} // else: producingPositivePower or maybe just still starting up
9396

9497
// Check other transition conditions
95-
if (currentState == FSMCommon::States::sRST) {
96-
// sRST -> sStartLoad
97-
currentState = FSMCommon::States::sStartLoad;
98+
if ((currentState == FSMCommon::States::sRST) &&
99+
load.getRPM() > START_RUN_2_RPM) {
100+
// sRST -> sStartRun
101+
currentState = FSMCommon::States::sStartRun;
98102

99103
// Signal nacelle (set producingPositivePower)
100104
// Load is already off
101105

102106
return UPDATE_RESULT::STATE_CHANGED;
103-
} else if ((currentState == FSMCommon::States::sStartLoad) &&
107+
} else if ((currentState == FSMCommon::States::sStartRun) &&
104108
load.isSteadyRPM()) {
105-
// sStartLoad -> sRunLoad
109+
// sStartRun -> sRunLoad
106110
// Note: The producing positive power condition is handled by the
107111
// reset logic
108112
currentState = FSMCommon::States::sRunLoad;
@@ -119,7 +123,7 @@ class LoadFSM {
119123
currentState = FSMCommon::States::sCurtail;
120124

121125
// Nacelle can detect this on it's own
122-
// Load is already on
126+
vTaskSuspend(load.tAdjustLoad.pxHandle);
123127

124128
return UPDATE_RESULT::STATE_CHANGED;
125129
} else if ((currentState == FSMCommon::States::sCurtail) &&
@@ -128,7 +132,7 @@ class LoadFSM {
128132
currentState = FSMCommon::States::sRunLoad;
129133

130134
// Nacelle can detect this on it's own
131-
// Load is already on
135+
vTaskResume(load.tAdjustLoad.pxHandle);
132136

133137
return UPDATE_RESULT::STATE_CHANGED;
134138
} else {

lib/2026-Controls_Core

lib/LoadComms/LoadComms.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ std::atomic<uint_fast32_t> LoadComms::bytesReceived = 0;
2323
/**
2424
* @brief MAC address of the nacelle controller.
2525
*/
26-
const uint8_t NACELLE_MAC[] = {0x30, 0xED, 0xA0, 0xE0, 0x6B, 0x78};
26+
// const uint8_t NACELLE_MAC[] = {0x30, 0xED, 0xA0, 0xE0, 0x6B, 0x78}; //
27+
// Slightly questionable controller
28+
const uint8_t NACELLE_MAC[] = {0xD0, 0xCF, 0x13,
29+
0xEA, 0x4A, 0x08}; // N's personal C5
2730

2831
/**
2932
* @brief Pointer to instance for static callbacks.

src/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ vTaskRecvData([[maybe_unused]] void *pvParameters) { // NOSONAR
392392
if (xQueueReceive(LoadComms::priorityDataQueue, &packet, 0) == pdPASS) {
393393
ESP_LOGV(TAG, "Received packet: rpm=%u", packet.rpm);
394394
load.setRPM(packet.rpm);
395+
load.setAngularAccell_RPMPS(packet.angularAccell_RPMPS);
395396
}
396397

397398
BaseType_t xWasDelayed = xTaskDelayUntil(

0 commit comments

Comments
 (0)