internal mutex

This commit is contained in:
Siwat Sirichai 2024-01-15 16:44:36 +07:00
parent fdf32d8503
commit 0b1ca17351
4 changed files with 125 additions and 69 deletions

View File

@ -8,15 +8,17 @@
bool ESPMegaDisplay::recieveSerialCommand(bool process) bool ESPMegaDisplay::recieveSerialCommand(bool process)
{ {
bool dataRecieved = false; bool dataRecieved = false;
while (displayAdapter->available())
{
// Read the serial buffer if available // Read the serial buffer if available
if (xSemaphoreTake(this->serialMutex, DISPLAY_MUTEX_TAKE_TIMEOUT) == pdFALSE) if (xSemaphoreTake(this->serialMutex, DISPLAY_MUTEX_TAKE_TIMEOUT) == pdFALSE)
{ {
ESP_LOGI("ESPMegaDisplay", "Failed to take serial mutex"); ESP_LOGI("ESPMegaDisplay", "Failed to take serial mutex");
return false; return false;
} }
while (displayAdapter->available())
{
rx_buffer[rx_buffer_index] = displayAdapter->read(); rx_buffer[rx_buffer_index] = displayAdapter->read();
xSemaphoreGive(this->serialMutex);
rx_buffer_index++; rx_buffer_index++;
// Check for overflow // Check for overflow
if (rx_buffer_index >= 256) if (rx_buffer_index >= 256)
@ -27,7 +29,6 @@ bool ESPMegaDisplay::recieveSerialCommand(bool process)
this->processSerialCommand(); this->processSerialCommand();
dataRecieved = true; dataRecieved = true;
} }
xSemaphoreGive(this->serialMutex);
return dataRecieved; return dataRecieved;
} }
@ -605,10 +606,17 @@ void ESPMegaDisplay::unregisterPayloadCallback(uint16_t handle)
/** /**
* @brief Takes the serial mutex. * @brief Takes the serial mutex.
*
* @note only neccessary if you are using the display adapter directly, otherwise the mutex is taken by the helper functions.
*/ */
void ESPMegaDisplay::takeSerialMutex() bool ESPMegaDisplay::takeSerialMutex()
{ {
xSemaphoreTake(this->serialMutex, DISPLAY_MUTEX_TAKE_TIMEOUT); if (xSemaphoreTake(this->serialMutex, DISPLAY_MUTEX_TAKE_TIMEOUT) == pdFALSE)
{
ESP_LOGI("ESPMegaDisplay", "Failed to take serial mutex");
return false;
}
return true;
} }
/** /**
@ -616,6 +624,7 @@ void ESPMegaDisplay::takeSerialMutex()
*/ */
void ESPMegaDisplay::giveSerialMutex() void ESPMegaDisplay::giveSerialMutex()
{ {
ESP_LOGD("ESPMegaDisplay", "Giving serial mutex");
xSemaphoreGive(this->serialMutex); xSemaphoreGive(this->serialMutex);
} }

View File

@ -35,14 +35,14 @@ class ESPMegaDisplay
void unregisterPageChangeCallback(uint16_t handle); void unregisterPageChangeCallback(uint16_t handle);
uint16_t registerPayloadCallback(std::function<void(uint8_t, uint8_t*, uint8_t)> callback); uint16_t registerPayloadCallback(std::function<void(uint8_t, uint8_t*, uint8_t)> callback);
void unregisterPayloadCallback(uint16_t handle); void unregisterPayloadCallback(uint16_t handle);
void takeSerialMutex(); bool takeSerialMutex();
void giveSerialMutex(); void giveSerialMutex();
SemaphoreHandle_t serialMutex;
bool beginUpdate(size_t size); bool beginUpdate(size_t size);
bool writeUpdate(uint8_t* data, size_t size); bool writeUpdate(uint8_t* data, size_t size);
void endUpdate(); void endUpdate();
protected: protected:
size_t otaBytesWritten; size_t otaBytesWritten;
SemaphoreHandle_t serialMutex;
uint8_t currentPage; uint8_t currentPage;
uint8_t rx_buffer_index; uint8_t rx_buffer_index;
char rx_buffer[256]; char rx_buffer[256];

View File

@ -56,19 +56,26 @@ void ESPMegaDisplayOTA::otaUpdateWriteHandler(AsyncWebServerRequest *request, Js
// - size: the size of the update in bytes // - size: the size of the update in bytes
// - data: the data to write // - data: the data to write
Serial.println("OTA Update Write Handler Begin");
Serial.println("Parsing JSON");
//Parse the JSON object //Parse the JSON object
JsonObject content = json.as<JsonObject>(); JsonObject content = json.as<JsonObject>();
// Check if the size and data fields are present // // Check if the size and data fields are present
if(!content.containsKey("size") || !content.containsKey("data")) // Serial.println("Checking if size and data fields are present");
request->send(500, "application/json", "{\"status\": \"error\", \"message\": \"The size or data field is missing\"}"); // if(!content.containsKey("size") || !content.containsKey("data"))
return; // Serial.println("Size or data field is missing");
// request->send(500, "application/json", "{\"status\": \"error\", \"message\": \"The size or data field is missing\"}");
// return;
// Serial.println("Size and data fields are present, getting size");
// Get the size field // Get the size field
size_t size = content["size"].as<size_t>(); size_t size = content["size"].as<size_t>();
Serial.printf("Size: %d\n", size);
if(size>4096) { if(size>4096) {
// If the size is greater than 4096 bytes, return an error // If the size is greater than 4096 bytes, return an error
request->send(500, "application/json", "{\"status\": \"error\", \"message\": \"The size of the update is too big\"}"); request->send(500, "application/json", "{\"status\": \"error\", \"message\": \"The size of the update is too big\"}");
return; return;
} }
Serial.println("Getting data field");
// Get the data field // Get the data field
JsonArray data = content["data"].as<JsonArray>(); JsonArray data = content["data"].as<JsonArray>();
if(this->updateProgress+size>this->updateSize) { if(this->updateProgress+size>this->updateSize) {
@ -76,17 +83,21 @@ void ESPMegaDisplayOTA::otaUpdateWriteHandler(AsyncWebServerRequest *request, Js
request->send(500, "application/json", "{\"status\": \"error\", \"message\": \"The update chunk is too big\"}"); request->send(500, "application/json", "{\"status\": \"error\", \"message\": \"The update chunk is too big\"}");
return; return;
} }
Serial.println("Converting JsonArray to uint8_t*");
// Convert JsonArray to uint8_t* // Convert JsonArray to uint8_t*
uint8_t data_array[4096]; uint8_t data_array[4096];
for(size_t i=0; i<size; i++) { for(size_t i=0; i<size; i++) {
data_array[i] = data[i].as<uint8_t>(); data_array[i] = data[i].as<uint8_t>();
} }
Serial.println("Writing data to display");
// Write the data to the display // Write the data to the display
display->writeUpdate(data_array, size); display->writeUpdate(data_array, size);
request->send(200, "application/json", "{\"status\": \"success\"}");
} }
void ESPMegaDisplayOTA::otaUpdateEndHandler(AsyncWebServerRequest *request, JsonVariant &json) { void ESPMegaDisplayOTA::otaUpdateEndHandler(AsyncWebServerRequest *request, JsonVariant &json) {
this->webServer->checkAuthentication(request); this->webServer->checkAuthentication(request);
display->endUpdate(); display->endUpdate();
request->send(200, "application/json", "{\"status\": \"success\"}");
} }
void ESPMegaDisplayOTA::displayWebPageHandler(AsyncWebServerRequest *request) { void ESPMegaDisplayOTA::displayWebPageHandler(AsyncWebServerRequest *request) {

View File

@ -20,9 +20,11 @@ void InternalDisplay::begin(ESPMegaIoT *iot, std::function<rtctime_t()> getRtcTi
auto bindedTouchCallback = std::bind(&InternalDisplay::handleTouch, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); auto bindedTouchCallback = std::bind(&InternalDisplay::handleTouch, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
this->registerTouchCallback(bindedTouchCallback); this->registerTouchCallback(bindedTouchCallback);
// Initialize the display // Initialize the display
if(!this->takeSerialMutex()) return;
this->displayAdapter->begin(115200); this->displayAdapter->begin(115200);
this->displayAdapter->setTimeout(100); this->displayAdapter->setTimeout(100);
this->displayAdapter->flush(); this->displayAdapter->flush();
this->giveSerialMutex();
this->reset(); this->reset();
delay(500); delay(500);
this->jumpToPage(1); this->jumpToPage(1);
@ -83,7 +85,8 @@ void InternalDisplay::handlePwmStateChange(uint8_t pin, bool state, uint16_t val
// then update the respective output component // then update the respective output component
if (this->outputCard == nullptr) if (this->outputCard == nullptr)
return; return;
if(this->currentPage == INTERNAL_DISPLAY_OUTPUT_PAGE) { if (this->currentPage == INTERNAL_DISPLAY_OUTPUT_PAGE)
{
// Update the output state // Update the output state
this->setOutputBar(pin, value); this->setOutputBar(pin, value);
this->setOutputStateColor(pin, state); this->setOutputStateColor(pin, state);
@ -122,46 +125,51 @@ void InternalDisplay::saveNetworkConfig()
IPAddress ip; IPAddress ip;
// 000.000.000.000, 16 characters, 3 dots, 3 characters per octet, 1 null terminator // 000.000.000.000, 16 characters, 3 dots, 3 characters per octet, 1 null terminator
char ip_buffer[30]; char ip_buffer[30];
if(!this->getStringToBuffer("ip_set.txt", ip_buffer, 30)) if (!this->getStringToBuffer("ip_set.txt", ip_buffer, 30))
{ {
return; return;
} }
// Validate the ip address // Validate the ip address
if (!ip.fromString(ip_buffer)) { if (!ip.fromString(ip_buffer))
{
return; return;
} }
// Save the netmask // Save the netmask
IPAddress netmask; IPAddress netmask;
if (!this->getStringToBuffer("netmask_set.txt", ip_buffer, 30)) { if (!this->getStringToBuffer("netmask_set.txt", ip_buffer, 30))
{
return; return;
} }
// Validate the netmask // Validate the netmask
if (!netmask.fromString(ip_buffer)) { if (!netmask.fromString(ip_buffer))
{
return; return;
} }
// Save the gateway // Save the gateway
IPAddress gateway; IPAddress gateway;
if (!this->getStringToBuffer("gateway_set.txt", ip_buffer, 30)) { if (!this->getStringToBuffer("gateway_set.txt", ip_buffer, 30))
{
return; return;
} }
// Validate the gateway // Validate the gateway
if (!gateway.fromString(ip_buffer)) { if (!gateway.fromString(ip_buffer))
{
return; return;
} }
// Save the dns // Save the dns
IPAddress dns; IPAddress dns;
if(!this->getStringToBuffer("dns_set.txt", ip_buffer, 30)) if (!this->getStringToBuffer("dns_set.txt", ip_buffer, 30))
return; return;
// Validate the dns // Validate the dns
if (!dns.fromString(ip_buffer)) if (!dns.fromString(ip_buffer))
return; return;
// Save the hostname // Save the hostname
if(!this->getStringToBuffer("host_set.txt", this->networkConfig->hostname, 32)) if (!this->getStringToBuffer("host_set.txt", this->networkConfig->hostname, 32))
return; return;
// Write the ip address, netmask and gateway to the network config // Write the ip address, netmask and gateway to the network config
@ -194,22 +202,22 @@ void InternalDisplay::saveMQTTConfig()
this->sendStopBytes(); this->sendStopBytes();
// Save the mqtt server // Save the mqtt server
if(!this->getStringToBuffer("mqttsv_set.txt", this->mqttConfig->mqtt_server, 16)) if (!this->getStringToBuffer("mqttsv_set.txt", this->mqttConfig->mqtt_server, 16))
return; return;
// Save the mqtt port // Save the mqtt port
this->mqttConfig->mqtt_port = this->getNumber("port_set.val"); this->mqttConfig->mqtt_port = this->getNumber("port_set.val");
// Save the mqtt username // Save the mqtt username
if(!this->getStringToBuffer("user_set.txt", this->mqttConfig->mqtt_user, 16)) if (!this->getStringToBuffer("user_set.txt", this->mqttConfig->mqtt_user, 16))
return; return;
// Save the mqtt password // Save the mqtt password
if(!this->getStringToBuffer("password_set.txt", this->mqttConfig->mqtt_password, 16)) if (!this->getStringToBuffer("password_set.txt", this->mqttConfig->mqtt_password, 16))
return; return;
// Save the mqtt base topic // Save the mqtt base topic
if(!this->getStringToBuffer("topic_set.txt", this->mqttConfig->base_topic, 16)) if (!this->getStringToBuffer("topic_set.txt", this->mqttConfig->base_topic, 16))
return; return;
// Save the mqtt use auth // Save the mqtt use auth
@ -237,8 +245,10 @@ void InternalDisplay::updateStatusIcons(bool networkStatus, bool mqttStatus)
void InternalDisplay::updateClock() void InternalDisplay::updateClock()
{ {
rtctime_t time = this->getRtcTime(); rtctime_t time = this->getRtcTime();
if(!this->takeSerialMutex()) return;
this->displayAdapter->printf("time.txt=\"%02d:%02d %s\"", time.hours % 12, time.minutes, time.hours / 12 ? "PM" : "AM"); this->displayAdapter->printf("time.txt=\"%02d:%02d %s\"", time.hours % 12, time.minutes, time.hours / 12 ? "PM" : "AM");
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
@ -317,10 +327,12 @@ void InternalDisplay::refreshDashboard()
sprintf(ip_address, "%d.%d.%d.%d", this->networkConfig->ip[0], this->networkConfig->ip[1], this->networkConfig->ip[2], this->networkConfig->ip[3]); sprintf(ip_address, "%d.%d.%d.%d", this->networkConfig->ip[0], this->networkConfig->ip[1], this->networkConfig->ip[2], this->networkConfig->ip[3]);
this->setString("ip_address.txt", ip_address); this->setString("ip_address.txt", ip_address);
// Send the MQTT server and port // Send the MQTT server and port
if(!this->takeSerialMutex()) return;
this->displayAdapter->print("server_address.txt=\""); this->displayAdapter->print("server_address.txt=\"");
this->displayAdapter->print(this->mqttConfig->mqtt_server); this->displayAdapter->print(this->mqttConfig->mqtt_server);
this->displayAdapter->print("\""); this->displayAdapter->print("\"");
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
// Send the MQTT connection status // Send the MQTT connection status
this->setString("status_txt.txt", this->iot->mqttConnected() ? MSG_MQTT_CONNECTED : MSG_MQTT_DISCONNECTED); this->setString("status_txt.txt", this->iot->mqttConnected() ? MSG_MQTT_CONNECTED : MSG_MQTT_DISCONNECTED);
} }
@ -353,6 +365,7 @@ void InternalDisplay::refreshOutput()
*/ */
void InternalDisplay::refreshAC() void InternalDisplay::refreshAC()
{ {
if(!this->takeSerialMutex()) return;
this->displayAdapter->print("temp.txt=\""); this->displayAdapter->print("temp.txt=\"");
this->displayAdapter->print(this->climateCard->getTemperature()); this->displayAdapter->print(this->climateCard->getTemperature());
this->displayAdapter->print("C\""); this->displayAdapter->print("C\"");
@ -378,8 +391,10 @@ void InternalDisplay::refreshAC()
this->displayAdapter->print("mode_cool.pic="); this->displayAdapter->print("mode_cool.pic=");
this->displayAdapter->print(this->climateCard->getMode() == AC_MODE_COOL ? PIC_AC_MODE_COOL_ACTIVE : PIC_AC_MODE_COOL_INACTIVE); this->displayAdapter->print(this->climateCard->getMode() == AC_MODE_COOL ? PIC_AC_MODE_COOL_ACTIVE : PIC_AC_MODE_COOL_INACTIVE);
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
if (this->climateCard->getSensorType() == AC_SENSOR_TYPE_DHT22) if (this->climateCard->getSensorType() == AC_SENSOR_TYPE_DHT22)
{ {
if(!this->takeSerialMutex()) return;
this->displayAdapter->print("roomtemp.txt=\""); this->displayAdapter->print("roomtemp.txt=\"");
this->displayAdapter->print(this->climateCard->getRoomTemperature()); this->displayAdapter->print(this->climateCard->getRoomTemperature());
this->displayAdapter->print("C\""); this->displayAdapter->print("C\"");
@ -388,13 +403,16 @@ void InternalDisplay::refreshAC()
this->displayAdapter->print(this->climateCard->getHumidity()); this->displayAdapter->print(this->climateCard->getHumidity());
this->displayAdapter->print("%\""); this->displayAdapter->print("%\"");
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
else if (this->climateCard->getSensorType() == AC_SENSOR_TYPE_DS18B20) else if (this->climateCard->getSensorType() == AC_SENSOR_TYPE_DS18B20)
{ {
if(!this->takeSerialMutex()) return;
this->displayAdapter->print("roomtemp.txt=\""); this->displayAdapter->print("roomtemp.txt=\"");
this->displayAdapter->print(this->climateCard->getRoomTemperature()); this->displayAdapter->print(this->climateCard->getRoomTemperature());
this->displayAdapter->print("C\""); this->displayAdapter->print("C\"");
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
this->setString("roomhumid.txt", "N/A"); this->setString("roomhumid.txt", "N/A");
} }
else else
@ -412,12 +430,14 @@ void InternalDisplay::refreshAC()
*/ */
void InternalDisplay::setOutputBar(uint8_t pin, uint16_t value) void InternalDisplay::setOutputBar(uint8_t pin, uint16_t value)
{ {
if(!this->takeSerialMutex()) return;
// Write the value to the output bar // Write the value to the output bar
this->displayAdapter->print("j"); this->displayAdapter->print("j");
this->displayAdapter->print(pin); this->displayAdapter->print(pin);
this->displayAdapter->print(".val="); this->displayAdapter->print(".val=");
this->displayAdapter->print((int)(value * 100 / 4095)); this->displayAdapter->print((int)(value * 100 / 4095));
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
@ -428,11 +448,13 @@ void InternalDisplay::setOutputBar(uint8_t pin, uint16_t value)
*/ */
void InternalDisplay::setOutputStateColor(uint8_t pin, bool state) void InternalDisplay::setOutputStateColor(uint8_t pin, bool state)
{ {
if(!this->takeSerialMutex()) return;
this->displayAdapter->print("j"); this->displayAdapter->print("j");
this->displayAdapter->print(pin); this->displayAdapter->print(pin);
this->displayAdapter->print(".ppic="); this->displayAdapter->print(".ppic=");
this->displayAdapter->print(state ? PIC_PWM_BAR_ON : PIC_PWM_BAR_OFF); this->displayAdapter->print(state ? PIC_PWM_BAR_ON : PIC_PWM_BAR_OFF);
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
@ -443,11 +465,13 @@ void InternalDisplay::setOutputStateColor(uint8_t pin, bool state)
*/ */
void InternalDisplay::setInputMarker(uint8_t pin, bool state) void InternalDisplay::setInputMarker(uint8_t pin, bool state)
{ {
if(!this->takeSerialMutex()) return;
this->displayAdapter->print("I"); this->displayAdapter->print("I");
this->displayAdapter->print(pin); this->displayAdapter->print(pin);
this->displayAdapter->print(".val="); this->displayAdapter->print(".val=");
this->displayAdapter->print(state ? 1 : 0); this->displayAdapter->print(state ? 1 : 0);
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
@ -578,6 +602,7 @@ void InternalDisplay::refreshPWMAdjustment()
*/ */
void InternalDisplay::refreshPWMAdjustmentId() void InternalDisplay::refreshPWMAdjustmentId()
{ {
if(!this->takeSerialMutex()) return;
// Send the PWM pin // Send the PWM pin
this->displayAdapter->print("pwm_id.txt=\"P"); this->displayAdapter->print("pwm_id.txt=\"P");
this->displayAdapter->print(pmwAdjustmentPin); this->displayAdapter->print(pmwAdjustmentPin);
@ -590,10 +615,12 @@ void InternalDisplay::refreshPWMAdjustmentId()
*/ */
void InternalDisplay::refreshPWMAdjustmentSlider() void InternalDisplay::refreshPWMAdjustmentSlider()
{ {
if(!this->takeSerialMutex()) return;
// Send the PWM value // Send the PWM value
this->displayAdapter->print("pwm_value.val="); this->displayAdapter->print("pwm_value.val=");
this->displayAdapter->print(this->outputCard->getValue(this->pmwAdjustmentPin)); this->displayAdapter->print(this->outputCard->getValue(this->pmwAdjustmentPin));
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
@ -601,11 +628,13 @@ void InternalDisplay::refreshPWMAdjustmentSlider()
*/ */
void InternalDisplay::refreshPWMAdjustmentState() void InternalDisplay::refreshPWMAdjustmentState()
{ {
if(!this->takeSerialMutex()) return;
// Send the PWM state // Send the PWM state
this->displayAdapter->print("pwm_state.txt=\""); this->displayAdapter->print("pwm_state.txt=\"");
this->displayAdapter->print(this->outputCard->getState(this->pmwAdjustmentPin) ? MSG_PWM_ADJUSTMENT_STATE_ON : MSG_PWM_ADJUSTMENT_STATE_OFF); this->displayAdapter->print(this->outputCard->getState(this->pmwAdjustmentPin) ? MSG_PWM_ADJUSTMENT_STATE_ON : MSG_PWM_ADJUSTMENT_STATE_OFF);
this->displayAdapter->print("\""); this->displayAdapter->print("\"");
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
@ -757,13 +786,13 @@ void InternalDisplay::handlePWMAdjustmentTouch(uint8_t type, uint8_t component)
*/ */
void InternalDisplay::refreshNetworkConfig() void InternalDisplay::refreshNetworkConfig()
{ {
if(!this->takeSerialMutex()) return;
// The network config page have the following components: // The network config page have the following components:
// ip_set -> a text input to set the ip address // ip_set -> a text input to set the ip address
// netmask_set -> a text input to set the netmask // netmask_set -> a text input to set the netmask
// gateway_set -> a text input to set the gateway // gateway_set -> a text input to set the gateway
// dns_set -> a text input to set the dns // dns_set -> a text input to set the dns
// host_set -> a text input to set the hostname // host_set -> a text input to set the hostname
// Refresh the ip address // Refresh the ip address
this->displayAdapter->print("ip_set.txt=\""); this->displayAdapter->print("ip_set.txt=\"");
this->sendIpToDisplay(this->networkConfig->ip); this->sendIpToDisplay(this->networkConfig->ip);
@ -789,6 +818,7 @@ void InternalDisplay::refreshNetworkConfig()
this->displayAdapter->print(this->networkConfig->hostname); this->displayAdapter->print(this->networkConfig->hostname);
this->displayAdapter->print("\""); this->displayAdapter->print("\"");
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
@ -796,6 +826,7 @@ void InternalDisplay::refreshNetworkConfig()
*/ */
void InternalDisplay::refreshMQTTConfig() void InternalDisplay::refreshMQTTConfig()
{ {
if(!this->takeSerialMutex()) return;
// The MQTT config page have the following components: // The MQTT config page have the following components:
// mqttsv_set -> a text input to set the mqtt server // mqttsv_set -> a text input to set the mqtt server
// port_set -> a text input to set the mqtt port // port_set -> a text input to set the mqtt port
@ -832,12 +863,14 @@ void InternalDisplay::refreshMQTTConfig()
this->displayAdapter->print("use_auth.val="); this->displayAdapter->print("use_auth.val=");
this->displayAdapter->print(this->mqttConfig->mqtt_useauth ? 1 : 0); this->displayAdapter->print(this->mqttConfig->mqtt_useauth ? 1 : 0);
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }
/** /**
* @brief Write an ip address to the display * @brief Write an ip address to the display
* *
* @note This function only writes the ip address to the display, you need to send the prefix and suffix yourself * @note This function only writes the ip address to the display, you need to send the prefix and suffix yourself
* @warning This function does not take the serial mutex, you need to take it yourself
* *
* @param ip The ip address to send * @param ip The ip address to send
*/ */
@ -878,9 +911,12 @@ void InternalDisplay::handleACStateChange(uint8_t mode, uint8_t fan_speed, uint8
* *
* @param text The text to set * @param text The text to set
*/ */
void InternalDisplay::setBootStatus(const char *text) { void InternalDisplay::setBootStatus(const char *text)
{
if(!this->takeSerialMutex()) return;
this->displayAdapter->print("boot_state.txt=\""); this->displayAdapter->print("boot_state.txt=\"");
this->displayAdapter->print(text); this->displayAdapter->print(text);
this->displayAdapter->print("\""); this->displayAdapter->print("\"");
this->sendStopBytes(); this->sendStopBytes();
this->giveSerialMutex();
} }