Generate device name

This commit is contained in:
Pierre HUBERT 2024-07-27 15:31:17 +02:00
parent 0e32622720
commit 900b436856
10 changed files with 249 additions and 3 deletions

View File

@ -6,5 +6,12 @@
"idf.openOcdConfigs": [ "idf.openOcdConfigs": [
"interface/ftdi/esp32_devkitj_v1.cfg", "interface/ftdi/esp32_devkitj_v1.cfg",
"target/esp32.cfg" "target/esp32.cfg"
] ],
"files.associations": {
"dev_name.h": "c",
"stdio.h": "c",
"storage.h": "c",
"cstdlib": "c",
"cstring": "c"
}
} }

View File

@ -1,2 +1,3 @@
idf_component_register(SRCS "main.c" idf_component_register(SRCS "random.c" "storage.c" "main.c"
"dev_name.c"
INCLUDE_DIRS ".") INCLUDE_DIRS ".")

View File

@ -0,0 +1,6 @@
#pragma once
/**
* Device name len
*/
#define DEV_NAME_LEN 10

View File

@ -0,0 +1,40 @@
#include "stddef.h"
#include "dev_name.h"
#include "storage.h"
#include "stdio.h"
#include "random.h"
#include "constants.h"
#include "string.h"
#define DEV_PREFIX "ESP32 "
bool dev_generate_name_if_required()
{
// Check if a device name has already been defined
if (storage_get_dev_name(NULL) > 0)
return false;
// Generate random device name
char name[DEV_NAME_LEN];
rand_str(DEV_NAME_LEN - 1, name);
storage_set_dev_name(name);
return true;
}
char *dev_name()
{
size_t len = storage_get_dev_name(NULL);
char *dev = malloc(len + strlen(DEV_PREFIX) + 1);
if (dev == NULL)
{
printf("Failed to allocate memory to store dev name!\n");
return NULL;
}
strcpy(dev, DEV_PREFIX);
storage_get_dev_name(dev + strlen(DEV_PREFIX));
return dev;
}

View File

@ -0,0 +1,33 @@
/**
* Device name management
*/
#pragma once
#include <stdbool.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* Generate random device name, if not existent
*/
bool dev_generate_name_if_required();
/**
* Clear device name
*/
void dev_remove_name();
/**
* Get current device name. This value MUST be freed after usage
*
* @return NULL if no name was already defined.
*/
char *dev_name();
#ifdef __cplusplus
}
#endif

View File

@ -1,9 +1,29 @@
#include <stdio.h> #include <stdio.h>
#include "esp_system.h" #include "esp_system.h"
#include "dev_name.h"
#include "storage.h"
void app_main(void) void app_main(void)
{ {
printf("\n\n\nhello world and bye\n\n\n"); printf("\n");
if (storage_init() == false)
{
printf("Failed to init storage!\n");
fflush(stdout);
esp_restart();
}
if (dev_generate_name_if_required())
{
printf("Generated a new device name\n");
}
char *name = dev_name();
printf("Dev name: %s\n", name);
free(name);
fflush(stdout); fflush(stdout);
esp_restart(); esp_restart();
} }

View File

@ -0,0 +1,31 @@
#include "random.h"
#include "esp_random.h"
void rand_str(size_t len, char *dest)
{
for (size_t i = 0; i < len; i++)
{
uint32_t v = esp_random() % (26 * 2 + 10);
// Upper case letter
if (v < 26)
{
dest[i] = 65 + v;
continue;
}
v -= 26;
// Lower case letter
if (v < 26)
{
dest[i] = 97 + v;
continue;
}
v -= 26;
// Digit
dest[i] = 48 + (v % 10);
}
dest[len] = '\0';
}

View File

@ -0,0 +1,21 @@
/**
* Random utilities
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* Generate random string of given size
*/
void rand_str(size_t len, char *dest);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,55 @@
#include "constants.h"
#include "storage.h"
#include "nvs_flash.h"
#include "nvs.h"
#include <string.h>
#define STORAGE_NAMESPACE "storage"
#define DEV_NAME_KEY "dev_name"
bool storage_init()
{
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
printf("Need to reset storage\n");
// NVS partition was truncated and needs to be erased
// Retry nvs_flash_init
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
return err == ESP_OK;
}
void storage_set_dev_name(const char *name)
{
nvs_handle_t my_handle;
ESP_ERROR_CHECK(nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle));
ESP_ERROR_CHECK(nvs_set_blob(my_handle, DEV_NAME_KEY, name, strlen(name)));
nvs_close(my_handle);
}
size_t storage_get_dev_name(char *dest)
{
nvs_handle_t my_handle;
ESP_ERROR_CHECK(nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle));
size_t len = (dest == NULL ? 0 : DEV_NAME_LEN);
esp_err_t res = nvs_get_blob(my_handle, DEV_NAME_KEY, dest, &len);
nvs_close(my_handle);
if (res == ESP_ERR_NVS_NOT_FOUND || len == 0)
return 0;
ESP_ERROR_CHECK(res);
return len;
}

View File

@ -0,0 +1,32 @@
/**
* Storage management
*/
#pragma once
#include <stdbool.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C"
{
#endif
/**
* Initialize storage
*/
bool storage_init();
/**
* Write device name
*/
void storage_set_dev_name(const char *name);
/**
* Get current device name
*/
size_t storage_get_dev_name(char *dest);
#ifdef __cplusplus
}
#endif