1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-12 00:02:21 +01:00

Reduce static RAM usage (#2140)

This commit is contained in:
Oxan van Leeuwen
2021-08-23 10:43:54 +02:00
committed by GitHub
parent 2f33cd2db5
commit d71996e58d
6 changed files with 113 additions and 82 deletions

View File

@@ -366,65 +366,75 @@ const char *get_op_mode_str(uint8_t mode) {
return "UNKNOWN";
}
}
// Note that this method returns PROGMEM strings, so use LOG_STR_ARG() to access them.
const char *get_disconnect_reason_str(uint8_t reason) {
/* If this were one big switch statement, GCC would generate a lookup table for it. However, the values of the
* REASON_* constants aren't continuous, and GCC will fill in the gap with the default value -- wasting 4 bytes of RAM
* per entry. As there's ~175 default entries, this wastes 700 bytes of RAM.
*/
if (reason <= REASON_CIPHER_SUITE_REJECTED) { // This must be the last constant with a value <200
switch (reason) {
case REASON_AUTH_EXPIRE:
return LOG_STR("Auth Expired");
case REASON_AUTH_LEAVE:
return LOG_STR("Auth Leave");
case REASON_ASSOC_EXPIRE:
return LOG_STR("Association Expired");
case REASON_ASSOC_TOOMANY:
return LOG_STR("Too Many Associations");
case REASON_NOT_AUTHED:
return LOG_STR("Not Authenticated");
case REASON_NOT_ASSOCED:
return LOG_STR("Not Associated");
case REASON_ASSOC_LEAVE:
return LOG_STR("Association Leave");
case REASON_ASSOC_NOT_AUTHED:
return LOG_STR("Association not Authenticated");
case REASON_DISASSOC_PWRCAP_BAD:
return LOG_STR("Disassociate Power Cap Bad");
case REASON_DISASSOC_SUPCHAN_BAD:
return LOG_STR("Disassociate Supported Channel Bad");
case REASON_IE_INVALID:
return LOG_STR("IE Invalid");
case REASON_MIC_FAILURE:
return LOG_STR("Mic Failure");
case REASON_4WAY_HANDSHAKE_TIMEOUT:
return LOG_STR("4-Way Handshake Timeout");
case REASON_GROUP_KEY_UPDATE_TIMEOUT:
return LOG_STR("Group Key Update Timeout");
case REASON_IE_IN_4WAY_DIFFERS:
return LOG_STR("IE In 4-Way Handshake Differs");
case REASON_GROUP_CIPHER_INVALID:
return LOG_STR("Group Cipher Invalid");
case REASON_PAIRWISE_CIPHER_INVALID:
return LOG_STR("Pairwise Cipher Invalid");
case REASON_AKMP_INVALID:
return LOG_STR("AKMP Invalid");
case REASON_UNSUPP_RSN_IE_VERSION:
return LOG_STR("Unsupported RSN IE version");
case REASON_INVALID_RSN_IE_CAP:
return LOG_STR("Invalid RSN IE Cap");
case REASON_802_1X_AUTH_FAILED:
return LOG_STR("802.1x Authentication Failed");
case REASON_CIPHER_SUITE_REJECTED:
return LOG_STR("Cipher Suite Rejected");
}
}
switch (reason) {
case REASON_AUTH_EXPIRE:
return "Auth Expired";
case REASON_AUTH_LEAVE:
return "Auth Leave";
case REASON_ASSOC_EXPIRE:
return "Association Expired";
case REASON_ASSOC_TOOMANY:
return "Too Many Associations";
case REASON_NOT_AUTHED:
return "Not Authenticated";
case REASON_NOT_ASSOCED:
return "Not Associated";
case REASON_ASSOC_LEAVE:
return "Association Leave";
case REASON_ASSOC_NOT_AUTHED:
return "Association not Authenticated";
case REASON_DISASSOC_PWRCAP_BAD:
return "Disassociate Power Cap Bad";
case REASON_DISASSOC_SUPCHAN_BAD:
return "Disassociate Supported Channel Bad";
case REASON_IE_INVALID:
return "IE Invalid";
case REASON_MIC_FAILURE:
return "Mic Failure";
case REASON_4WAY_HANDSHAKE_TIMEOUT:
return "4-Way Handshake Timeout";
case REASON_GROUP_KEY_UPDATE_TIMEOUT:
return "Group Key Update Timeout";
case REASON_IE_IN_4WAY_DIFFERS:
return "IE In 4-Way Handshake Differs";
case REASON_GROUP_CIPHER_INVALID:
return "Group Cipher Invalid";
case REASON_PAIRWISE_CIPHER_INVALID:
return "Pairwise Cipher Invalid";
case REASON_AKMP_INVALID:
return "AKMP Invalid";
case REASON_UNSUPP_RSN_IE_VERSION:
return "Unsupported RSN IE version";
case REASON_INVALID_RSN_IE_CAP:
return "Invalid RSN IE Cap";
case REASON_802_1X_AUTH_FAILED:
return "802.1x Authentication Failed";
case REASON_CIPHER_SUITE_REJECTED:
return "Cipher Suite Rejected";
case REASON_BEACON_TIMEOUT:
return "Beacon Timeout";
return LOG_STR("Beacon Timeout");
case REASON_NO_AP_FOUND:
return "AP Not Found";
return LOG_STR("AP Not Found");
case REASON_AUTH_FAIL:
return "Authentication Failed";
return LOG_STR("Authentication Failed");
case REASON_ASSOC_FAIL:
return "Association Failed";
return LOG_STR("Association Failed");
case REASON_HANDSHAKE_TIMEOUT:
return "Handshake Failed";
return LOG_STR("Handshake Failed");
case REASON_UNSPECIFIED:
default:
return "Unspecified";
return LOG_STR("Unspecified");
}
}
@@ -448,7 +458,7 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) {
ESP_LOGW(TAG, "Event: Disconnected ssid='%s' reason='Probe Request Unsuccessful'", buf);
} else {
ESP_LOGW(TAG, "Event: Disconnected ssid='%s' bssid=" LOG_SECRET("%s") " reason='%s'", buf,
format_mac_addr(it.bssid).c_str(), get_disconnect_reason_str(it.reason));
format_mac_addr(it.bssid).c_str(), LOG_STR_ARG(get_disconnect_reason_str(it.reason)));
}
break;
}