Finish led manager rewrite

This commit is contained in:
Lorow
2025-04-20 21:08:14 +02:00
parent a580d0f097
commit f1cf3baf46
4 changed files with 137 additions and 95 deletions

View File

@@ -2,44 +2,69 @@
const char *LED_MANAGER_TAG = "[LED_MANAGER]";
// todo rethink the patterns
ledStateMap_t LEDManager::ledStateMap = {
{LEDStates_e::_LedStateNone, {{LED_OFF, 500}}},
{LEDStates_e::_LedStateStreaming, {{LED_ON, 500}}},
{LEDStates_e::_LedStateStoppedStreaming, {{LED_OFF, 500}}},
{LEDStates_e::_WebServerState_Error,
{{LED_ON, 200}, {LED_OFF, 100}, {LED_ON, 200}, {LED_OFF, 100}, {LED_ON, 200}}},
{LEDStates_e::_WiFiState_Error,
{{LED_ON, 200}, {LED_OFF, 100}, {LED_ON, 500}, {LED_OFF, 100}, {LED_ON, 200}}},
{LEDStates_e::_MDNSState_Error,
{{LED_ON, 200},
{0, 100},
{LED_ON, 200},
{0, 100},
{LED_ON, 500},
{0, 100},
{LED_ON, 200},
{0, 100},
{LED_ON, 200}}},
{
LEDStates_e::_LedStateNone,
{
false,
true,
{{LED_OFF, 1000}},
},
},
{
LEDStates_e::_LedStateStreaming,
{
false,
true,
{{LED_ON, 1000}},
},
},
{
LEDStates_e::_LedStateStoppedStreaming,
{
false,
true,
{{LED_OFF, 1000}},
},
},
{
LEDStates_e::_Camera_Error,
{
true,
true,
{{{LED_ON, 300}, {LED_OFF, 300}, {LED_ON, 300}, {LED_OFF, 300}}},
},
},
{
LEDStates_e::_WiFiState_Connecting,
{
false,
true,
{{LED_ON, 400}, {LED_OFF, 400}},
},
},
{
LEDStates_e::_WiFiState_Connected,
{
false,
false,
{{LED_ON, 200}, {LED_OFF, 200}, {LED_ON, 200}, {LED_OFF, 200}, {LED_ON, 200}, {LED_OFF, 200}, {LED_ON, 200}, {LED_OFF, 200}, {LED_ON, 200}, {LED_OFF, 200}},
},
},
{
LEDStates_e::_WiFiState_Error,
{
true,
true,
{{LED_ON, 200}, {LED_OFF, 100}, {LED_ON, 500}, {LED_OFF, 100}, {LED_ON, 200}},
},
},
};
// lmao no, rethink this
{LEDStates_e::_Camera_Error,
{{LED_ON, 5000}}}, // this also works as a more general error - something went
// critically wrong? We go here
{LEDStates_e::_WiFiState_Connecting, {{1, 100}, {0, 100}}},
{LEDStates_e::_WiFiState_Connected,
{{LED_ON, 100},
{0, 100},
{LED_ON, 100},
{0, 100},
{LED_ON, 100},
{0, 100},
{LED_ON, 100},
{0, 100},
{LED_ON, 100},
{0, 100}}}};
LEDManager::LEDManager(gpio_num_t pin, gpio_num_t illumninator_led_pin, QueueHandle_t ledStateQueue) : blink_led_pin(pin), illumninator_led_pin(illumninator_led_pin), ledStateQueue(ledStateQueue) {}
LEDManager::LEDManager(gpio_num_t pin, gpio_num_t illumninator_led_pin, QueueHandle_t ledStateQueue) : blink_led_pin(pin),
illumninator_led_pin(illumninator_led_pin), ledStateQueue(ledStateQueue), currentState(LEDStates_e::_LedStateNone)
{
}
void LEDManager::setup()
{
@@ -78,62 +103,66 @@ void LEDManager::setup()
ESP_LOGD(LED_MANAGER_TAG, "Done.");
}
// todo - rethink how it should work with a queue and vtaskdelay
void LEDManager::handleLED()
{
// if (Helpers::getTimeInMillis() <= this->nextStateChangeMillis)
// {
// return;
// }
if (!this->finishedPattern)
{
displayCurrentPattern();
return;
}
// // !TODO what if we want a looping state? Or a state that needs to stay
// // bright? Am overthinking this, aren't I? I was not.
// // we've reached the timeout on that state, check if we can grab next one and
// // start displaying it, or if we need to keep displaying the current one
// if (this->currentPatternIndex >
// this->ledStateMap[this->currentState].size() - 1)
// {
// auto nextState = ledStateManager.getCurrentState();
// // we want to keep displaying the same state only if its an keepAlive one,
// // but we should change if the incoming one is also an errours state, maybe
// // more serious one this time <- this may be a bad idea
// if ((std::find(this->keepAliveStates.begin(), this->keepAliveStates.end(),
// this->currentState) != this->keepAliveStates.end() ||
// std::find(this->keepAliveStates.begin(), this->keepAliveStates.end(),
// nextState) != this->keepAliveStates.end()) ||
// (this->currentState != nextState &&
// this->ledStateMap.find(nextState) != this->ledStateMap.end()))
// {
// ESP_LOGD(LED_MANAGER_TAG, "Updating the state and reseting");
// this->toggleLED(false);
// this->currentState = nextState;
// this->currentPatternIndex = 0;
// BlinkPatterns_t pattern =
// this->ledStateMap[this->currentState][this->currentPatternIndex];
// this->nextStateChangeMillis = Helpers::getTimeInMillis() + pattern.delayTime;
// return;
// }
// // it wasn't a keepAlive state, nor did we have another one ready,
// // we're done for now
// this->toggleLED(false);
// return;
// }
// // we can safely advance it and display the next stage
// BlinkPatterns_t pattern =
// this->ledStateMap[this->currentState][this->currentPatternIndex];
// this->toggleLED(pattern.state);
// this->nextStateChangeMillis = Helpers::getTimeInMillis() + pattern.delayTime;
// ESP_LOGD(LED_MANAGER_TAG, "before updating stage %d", this->currentPatternIndex);
// this->currentPatternIndex++;
// ESP_LOGD(LED_MANAGER_TAG, "updated stage %d", this->currentPatternIndex);
if (xQueueReceive(this->ledStateQueue, &buffer, 10))
{
this->updateState(buffer);
}
else
{
// we've finished displaying the pattern, so let's check if it's repeatable and if so - reset it
if (this->ledStateMap[this->currentState].isRepeatable || this->ledStateMap[this->currentState].isError)
{
this->currentPatternIndex = 0;
this->finishedPattern = false;
}
}
}
void LEDManager::displayCurrentPattern()
{
BlinkPatterns_t ledState = this->ledStateMap[this->currentState].patterns[this->currentPatternIndex];
this->toggleLED(ledState.state);
this->timeToDelayFor = ledState.delayTime;
if (!(this->currentPatternIndex >= this->ledStateMap[this->currentState].patterns.size() - 1))
this->currentPatternIndex++;
else
{
this->finishedPattern = true;
this->toggleLED(LED_OFF);
}
}
void LEDManager::updateState(LEDStates_e newState)
{
// we should change the displayed state
// only if we finished displaying the current one - which is handled by the task
// if the new state is not the same as the current one
// and if can actually display the state
// if we've got an error state - that's it, we'll just keep repeating it indefinitely
if (this->ledStateMap[this->currentState].isError)
return;
if (newState == this->currentState)
return;
if (this->ledStateMap.contains(newState))
{
this->currentState = newState;
this->currentPatternIndex = 0;
this->finishedPattern = false;
}
}
/**
* @brief Turn the LED on or off
*
* @param state
*/
void LEDManager::toggleLED(bool state) const
{
gpio_set_level(blink_led_pin, state);
@@ -145,8 +174,7 @@ void HandleLEDDisplayTask(void *pvParameter)
while (1)
{
printf("Hello from a task \n");
printf("The led manager is %d \n", bool(ledManager));
vTaskDelay(100);
ledManager->handleLED();
vTaskDelay(ledManager->getTimeToDelayFor());
}
}

View File

@@ -28,7 +28,15 @@ struct BlinkPatterns_t
int delayTime;
};
typedef std::unordered_map<LEDStates_e, std::vector<BlinkPatterns_t>> ledStateMap_t;
struct LEDStage
{
bool isError;
bool isRepeatable;
std::vector<BlinkPatterns_t> patterns;
};
typedef std::unordered_map<LEDStates_e, LEDStage>
ledStateMap_t;
class LEDManager
{
@@ -37,16 +45,25 @@ public:
void setup();
void handleLED();
size_t getTimeToDelayFor() const { return timeToDelayFor; }
private:
void toggleLED(bool state) const;
void displayCurrentPattern();
void updateState(LEDStates_e newState);
gpio_num_t blink_led_pin;
gpio_num_t illumninator_led_pin;
QueueHandle_t ledStateQueue;
static ledStateMap_t ledStateMap;
LEDStates_e buffer;
LEDStates_e currentState;
void toggleLED(bool state) const;
size_t currentPatternIndex = 0;
size_t timeToDelayFor = 100;
bool finishedPattern = false;
};
void HandleLEDDisplayTask(void *pvParameter);

View File

@@ -126,7 +126,6 @@ void ProjectConfig::setWifiConfig(const std::string &networkName,
{
size_t size = this->config.networks.size();
// rewrite it to std::find
auto it = std::find_if(
this->config.networks.begin(),
this->config.networks.end(),

View File

@@ -12,9 +12,7 @@ struct DeviceStates
_LedStateNone,
_LedStateStreaming,
_LedStateStoppedStreaming,
_WebServerState_Error,
_WiFiState_Error,
_MDNSState_Error,
_Camera_Error,
_WiFiState_Connecting,
_WiFiState_Connected