Значение метки времени может понадобиться для принятия решения о необходимости обновления текущей прошивки устройства. Описание даты и времени прошивки в текстовом формате можно получить вызовами функций esp_ota_get_running_partition и esp_ota_get_partition_description [4].
Ниже приведен фрагмент кода, который позволяет получить 64-битную метку времени в формате метки времени Unix [3] (unix timestamp, абсолютное системное время в миллисекундах).
// В ESP-IDF v4.4.1 тип time_t 32-разрядный, а в v5.0.1 64-разрядный [1].
// Поэтому пришлось добавить новый тип как замену для time_t:
#if (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(4, 4, 1))
typedef int64_t ttime;
#elif (ESP_IDF_VERSION == ESP_IDF_VERSION_VAL(5, 0, 1))
typedef time_t ttime;
#endif
// Функция преобразует текстовые значения времени и даты
// в числовое значение с помощью функции strptime [2].
// Здесь strtime это строка в формате "hh:mm:ss",
// а strdate это строка в формате "Месяц число год".
static ttime gettimedata (char *strtime, char *strdate)
{
struct tm ota_tm;
memset(&ota_tm, 0, sizeof(ota_tm));
strptime(strtime, "%T",&ota_tm);
strptime(strdate, "%b %d %Y",&ota_tm);
// Преобразование количества секунд в количество миллисекунд:
return 1000 * (ttime)mktime(&ota_tm);
}
// Извлечение текстовых значений времени и даты, и преобразование
// их в 64-битную метку времени Unix:
static ttime current_version_time (void)
{
esp_app_desc_t running_app_info;
const esp_partition_t *running = esp_ota_get_running_partition();
esp_ota_get_partition_description(running, &running_app_info);
return gettimedata(running_app_info.time, running_app_info.date);
}