Fix NVS key bug and optimize for single mode
- Fixed a critical NVS key generation bug that would cause overwriting the values for all channels. - Optimized the code for single channel mode since no formatting required. - Improved multi-channel test coverage to cover that each value for each channel stored correctly. Refs #1096, #1098 and fixes #1100
This commit is contained in:
@@ -5,15 +5,25 @@
|
||||
*/
|
||||
|
||||
#include "esp_check.h"
|
||||
#include "nvs.h"
|
||||
#include "relay_chn_nvs.h"
|
||||
|
||||
#define RELAY_CHN_KEY_DIR "dir" /*!< Direction key */
|
||||
#if CONFIG_RELAY_CHN_ENABLE_RUN_LIMIT
|
||||
#define RELAY_CHN_KEY_RLIM(ch) "rlim_%d" /*!< Run limit key */
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
#define RELAY_CHN_KEY_RLIM_FMT "rlim_%d" /*!< Run limit key format for multi-channel */
|
||||
#else
|
||||
#define RELAY_CHN_KEY_RLIM "rlim_0" /*!< Run limit key for single-channel */
|
||||
#endif
|
||||
#endif
|
||||
#if CONFIG_RELAY_CHN_ENABLE_TILTING
|
||||
#define RELAY_CHN_KEY_TSENS(ch) "tsens_%d" /*!< Tilt sensitivity key */
|
||||
#define RELAY_CHN_KEY_TCNT(ch) "tcnt_%d" /*!< Tilt count key */
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
#define RELAY_CHN_KEY_TSENS_FMT "tsens_%d" /*!< Tilt sensitivity key format for multi-channel */
|
||||
#define RELAY_CHN_KEY_TCNT_FMT "tcnt_%d" /*!< Tilt count key format for multi-channel */
|
||||
#else
|
||||
#define RELAY_CHN_KEY_TSENS "tsens_0" /*!< Tilt sensitivity key for single-channel */
|
||||
#define RELAY_CHN_KEY_TCNT "tcnt_0" /*!< Tilt count key for single-channel */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static const char *TAG = "RELAY_CHN_NVS";
|
||||
@@ -44,12 +54,9 @@ esp_err_t relay_chn_nvs_init()
|
||||
|
||||
esp_err_t relay_chn_nvs_set_direction(uint8_t ch, relay_chn_direction_t direction)
|
||||
{
|
||||
uint8_t direction_val;
|
||||
uint8_t direction_val = 0;
|
||||
esp_err_t ret = nvs_get_u8(relay_chn_nvs, RELAY_CHN_KEY_DIR, &direction_val);
|
||||
if (ret == ESP_ERR_NVS_NOT_FOUND) {
|
||||
// The key does not exist yet, set it to zero which is the default direction
|
||||
direction_val = RELAY_CHN_DIRECTION_DEFAULT;
|
||||
} else if (ret != ESP_OK) {
|
||||
if (ret != ESP_OK && ret != ESP_ERR_NVS_NOT_FOUND) {
|
||||
ESP_RETURN_ON_ERROR(ret, TAG, "Failed to get direction from NVS with error: %s", esp_err_to_name(ret));
|
||||
}
|
||||
direction_val &= ~(1 << ch); // Clear the bit for the channel
|
||||
@@ -75,7 +82,14 @@ esp_err_t relay_chn_nvs_get_direction(uint8_t ch, relay_chn_direction_t *directi
|
||||
#if CONFIG_RELAY_CHN_ENABLE_RUN_LIMIT
|
||||
esp_err_t relay_chn_nvs_set_run_limit(uint8_t ch, uint16_t limit_sec)
|
||||
{
|
||||
esp_err_t ret = nvs_set_u16(relay_chn_nvs, RELAY_CHN_KEY_RLIM(ch), limit_sec);
|
||||
esp_err_t ret;
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
char key[NVS_KEY_NAME_MAX_SIZE];
|
||||
snprintf(key, sizeof(key), RELAY_CHN_KEY_RLIM_FMT, ch);
|
||||
ret = nvs_set_u16(relay_chn_nvs, key, limit_sec);
|
||||
#else
|
||||
ret = nvs_set_u16(relay_chn_nvs, RELAY_CHN_KEY_RLIM, limit_sec);
|
||||
#endif
|
||||
ESP_RETURN_ON_ERROR(ret, TAG, "Failed to set run limit for channel %d", ch);
|
||||
return nvs_commit(relay_chn_nvs);
|
||||
}
|
||||
@@ -84,14 +98,27 @@ esp_err_t relay_chn_nvs_get_run_limit(uint8_t ch, uint16_t *limit_sec)
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(limit_sec != NULL, ESP_ERR_INVALID_ARG, TAG, "Run limit value pointer is NULL");
|
||||
|
||||
return nvs_get_u16(relay_chn_nvs, RELAY_CHN_KEY_RLIM(ch), limit_sec);
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
char key[NVS_KEY_NAME_MAX_SIZE];
|
||||
snprintf(key, sizeof(key), RELAY_CHN_KEY_RLIM_FMT, ch);
|
||||
return nvs_get_u16(relay_chn_nvs, key, limit_sec);
|
||||
#else
|
||||
return nvs_get_u16(relay_chn_nvs, RELAY_CHN_KEY_RLIM, limit_sec);
|
||||
#endif
|
||||
}
|
||||
#endif // CONFIG_RELAY_CHN_ENABLE_RUN_LIMIT == 1
|
||||
|
||||
#if CONFIG_RELAY_CHN_ENABLE_TILTING
|
||||
esp_err_t relay_chn_nvs_set_tilt_sensitivity(uint8_t ch, uint8_t sensitivity)
|
||||
{
|
||||
esp_err_t ret = nvs_set_u8(relay_chn_nvs, RELAY_CHN_KEY_TSENS(ch), sensitivity);
|
||||
esp_err_t ret;
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
char key[NVS_KEY_NAME_MAX_SIZE];
|
||||
snprintf(key, sizeof(key), RELAY_CHN_KEY_TSENS_FMT, ch);
|
||||
ret = nvs_set_u8(relay_chn_nvs, key, sensitivity);
|
||||
#else
|
||||
ret = nvs_set_u8(relay_chn_nvs, RELAY_CHN_KEY_TSENS, sensitivity);
|
||||
#endif
|
||||
ESP_RETURN_ON_ERROR(ret, TAG, "Failed to set tilt sensitivity for channel %d", ch);
|
||||
return nvs_commit(relay_chn_nvs);
|
||||
}
|
||||
@@ -100,22 +127,40 @@ esp_err_t relay_chn_nvs_get_tilt_sensitivity(uint8_t ch, uint8_t *sensitivity)
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(sensitivity != NULL, ESP_ERR_INVALID_ARG, TAG, "Sensitivity pointer is NULL");
|
||||
|
||||
return nvs_get_u8(relay_chn_nvs, RELAY_CHN_KEY_TSENS(ch), sensitivity);
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
char key[NVS_KEY_NAME_MAX_SIZE];
|
||||
snprintf(key, sizeof(key), RELAY_CHN_KEY_TSENS_FMT, ch);
|
||||
return nvs_get_u8(relay_chn_nvs, key, sensitivity);
|
||||
#else
|
||||
return nvs_get_u8(relay_chn_nvs, RELAY_CHN_KEY_TSENS, sensitivity);
|
||||
#endif
|
||||
}
|
||||
|
||||
esp_err_t relay_chn_nvs_set_tilt_count(uint8_t ch, uint16_t tilt_count)
|
||||
{
|
||||
esp_err_t ret;
|
||||
ret = nvs_set_u16(relay_chn_nvs, RELAY_CHN_KEY_TCNT(ch), tilt_count);
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
char key[NVS_KEY_NAME_MAX_SIZE];
|
||||
snprintf(key, sizeof(key), RELAY_CHN_KEY_TCNT_FMT, ch);
|
||||
ret = nvs_set_u16(relay_chn_nvs, key, tilt_count);
|
||||
#else
|
||||
ret = nvs_set_u16(relay_chn_nvs, RELAY_CHN_KEY_TCNT, tilt_count);
|
||||
#endif
|
||||
ESP_RETURN_ON_ERROR(ret, TAG, "Failed to save tilt_count tilt counter");
|
||||
return nvs_commit(relay_chn_nvs);
|
||||
}
|
||||
|
||||
esp_err_t relay_chn_nvs_get_tilt_count(uint8_t ch, uint16_t *tilt_count)
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(tilt_count != NULL,
|
||||
ESP_ERR_INVALID_ARG, TAG, "Counter pointers are NULL");
|
||||
return nvs_get_u16(relay_chn_nvs, RELAY_CHN_KEY_TCNT(ch), tilt_count);
|
||||
ESP_RETURN_ON_FALSE(tilt_count != NULL, ESP_ERR_INVALID_ARG, TAG, "Counter pointers are NULL");
|
||||
|
||||
#if CONFIG_RELAY_CHN_COUNT > 1
|
||||
char key[NVS_KEY_NAME_MAX_SIZE];
|
||||
snprintf(key, sizeof(key), RELAY_CHN_KEY_TCNT_FMT, ch);
|
||||
return nvs_get_u16(relay_chn_nvs, key, tilt_count);
|
||||
#else
|
||||
return nvs_get_u16(relay_chn_nvs, RELAY_CHN_KEY_TCNT, tilt_count);
|
||||
#endif
|
||||
}
|
||||
#endif // CONFIG_RELAY_CHN_ENABLE_TILTING
|
||||
|
||||
|
||||
Reference in New Issue
Block a user