1515class NacelleFSM {
1616 public: // MARK: Public
1717 static constexpr const char *TAG = " NFSM" ;
18+ float power = 0 ;
19+ float targetPower = 38 ; // W
1820
1921 /* *
2022 * @brief Construct a new Nacelle FSM object
@@ -146,7 +148,10 @@ class NacelleFSM {
146148 nacelle.isTargetRPMExceeded ()) {
147149 // sRunLoad -> sCurtail
148150 currentState = FSMCommon::States::sCurtail ;
149-
151+
152+ vTaskResume (
153+ nacelle.mainTaskDescriptions [NacelleContainer::TID_PITCH ]
154+ .pxHandle );
150155 // Pitch is already set to adjust (fine), which will detect the new
151156 // state (PI)
152157 nacelle.pitchPIDController .enable (
@@ -157,17 +162,39 @@ class NacelleFSM {
157162
158163 return UPDATE_RESULT ::STATE_CHANGED ;
159164 } else if ((currentState == FSMCommon::States::sCurtail ) &&
160- !nacelle.isTargetRPMExceeded ()) {
165+ nacelle.isTargetRPMExceededHysteresis ()) {
166+
167+ constexpr float POWER_TOLERANCE = 0 .06f ;
168+ constexpr int_fast16_t RPM_STEP = 40 ;
169+
170+ float dPower = power - targetPower;
171+
172+ if ((dPower) > POWER_TOLERANCE * targetPower) {
173+ nacelle.pitchPIDController .setTarget (ENCODER ::TARGET_RPM - RPM_STEP ); // todo adjust decrement amount
174+ ENCODER ::TARGET_RPM = ENCODER ::TARGET_RPM - RPM_STEP ; // todo adjust decrement amount
175+ ESP_LOGI (TAG , " Decreasing target RPM to %u due to overpower condition" , ENCODER ::TARGET_RPM );
176+ }
177+ else if (dPower < -POWER_TOLERANCE * targetPower) {
178+ nacelle.pitchPIDController .setTarget (ENCODER ::TARGET_RPM + RPM_STEP ); // todo adjust increment amount
179+ ENCODER ::TARGET_RPM = ENCODER ::TARGET_RPM + RPM_STEP ; // todo adjust increment amount
180+ ESP_LOGI (TAG , " Increasing target RPM to %u due to underpower condition" , ENCODER ::TARGET_RPM );
181+ }
182+ else {
183+ nacelle.pitchPIDController .disable ();
184+ ESP_LOGI (TAG , " Power within acceptable range, PID disabled" );
185+ }
161186 // sCurtail -> sRunLoad
162- currentState = FSMCommon::States::sRunLoad ;
187+ // currentState = FSMCommon::States::sRunLoad;
163188
164189 // Pitch is already set to adjust (PI), which will detect the new
165190 // state (fine)
166- nacelle.pitchPIDController .disable ();
191+
192+ // nacelle.pitchPIDController.disable();
193+
167194 // DONE: signal load (unset targetRPMExceeded)
168195 // Load will be sent RPM info elsewhere
169-
170- return UPDATE_RESULT ::STATE_CHANGED ;
196+ return UPDATE_RESULT :: NO_CHANGE ;
197+ // return UPDATE_RESULT::STATE_CHANGED;
171198 } else {
172199 return UPDATE_RESULT ::NO_CHANGE ;
173200 }
@@ -176,6 +203,10 @@ class NacelleFSM {
176203 return UPDATE_RESULT ::ERROR ;
177204 }
178205
206+ void setPower (float power) {
207+ this ->power = power;
208+ }
209+
179210 private: // MARK: Private
180211 NacelleContainer &nacelle; // DONE: switch to by reference
181212
0 commit comments