1515class NacelleFSM {
1616 public: // MARK: Public
1717 static constexpr const char *TAG = " NFSM" ;
18- float power = 0 ;
19- float targetPower = 38 ; // W
18+ uint32_t targetPower_mW = 27000 ; // mW
19+ constexpr static int_fast16_t CURTAIL_EXIT_RPM_TOLERANCE = 400 ; // RPM tolerance for exiting curtailment, prevents oscillation
2020
2121 /* *
2222 * @brief Construct a new Nacelle FSM object
@@ -145,7 +145,7 @@ class NacelleFSM {
145145
146146 return UPDATE_RESULT ::STATE_CHANGED ;
147147 } else if ((currentState == FSMCommon::States::sRunLoad ) &&
148- nacelle.isTargetRPMExceeded ( )) {
148+ nacelle.isTargetPowerExceeded (targetPower_mW )) { // todo
149149 // sRunLoad -> sCurtail
150150 currentState = FSMCommon::States::sCurtail ;
151151
@@ -164,17 +164,17 @@ class NacelleFSM {
164164 } else if ((currentState == FSMCommon::States::sCurtail ) &&
165165 nacelle.isTargetRPMExceededHysteresis ()) {
166166
167- constexpr float POWER_TOLERANCE = 0 .06f ;
167+ constexpr float POWER_TOLERANCE = 0 .05f ;
168168 constexpr int_fast16_t RPM_STEP = 40 ;
169169
170- float dPower = power - targetPower;
170+ float powerError = nacelle. power_mW - targetPower_mW; // only checks once, noise could mess this up
171171
172- if ((dPower ) > POWER_TOLERANCE * targetPower ) {
172+ if ((powerError ) >= POWER_TOLERANCE * targetPower_mW ) {
173173 nacelle.pitchPIDController .setTarget (ENCODER ::TARGET_RPM - RPM_STEP ); // todo adjust decrement amount
174174 ENCODER ::TARGET_RPM = ENCODER ::TARGET_RPM - RPM_STEP ; // todo adjust decrement amount
175175 ESP_LOGI (TAG , " Decreasing target RPM to %u due to overpower condition" , ENCODER ::TARGET_RPM );
176176 }
177- else if (dPower < - POWER_TOLERANCE * targetPower ) {
177+ else if (powerError <= (- 1 ) * POWER_TOLERANCE * targetPower_mW ) {
178178 nacelle.pitchPIDController .setTarget (ENCODER ::TARGET_RPM + RPM_STEP ); // todo adjust increment amount
179179 ENCODER ::TARGET_RPM = ENCODER ::TARGET_RPM + RPM_STEP ; // todo adjust increment amount
180180 ESP_LOGI (TAG , " Increasing target RPM to %u due to underpower condition" , ENCODER ::TARGET_RPM );
@@ -183,6 +183,12 @@ class NacelleFSM {
183183 nacelle.pitchPIDController .disable ();
184184 ESP_LOGI (TAG , " Power within acceptable range, PID disabled" );
185185 }
186+
187+ if (nacelle.currentRPM < ENCODER ::TARGET_RPM - CURTAIL_EXIT_RPM_TOLERANCE ) {
188+ currentState = FSMCommon::States::sRunLoad ;
189+ ESP_LOGI (TAG , " Current RPM below target RPM, transitioning back to sRunLoad" );
190+ }
191+
186192 // sCurtail -> sRunLoad
187193 // currentState = FSMCommon::States::sRunLoad;
188194
@@ -203,8 +209,8 @@ class NacelleFSM {
203209 return UPDATE_RESULT ::ERROR ;
204210 }
205211
206- void setPower (float power ) {
207- this ->power = power ;
212+ void setTargetPower (float targetPower_mW ) {
213+ this ->targetPower_mW = targetPower_mW ;
208214 }
209215
210216 private: // MARK: Private
0 commit comments