-
Amber-Sophia Schröck authoredAmber-Sophia Schröck authored
mn-sleep.cpp 1.34 KiB
#include "mn-sleep.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_log.h"
#include "esp_err.h"
#include "nvs_flash.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "sdkconfig.h"
#include "esp_attr.h"
#include "esp_partition.h"
#include <sys/time.h>
unsigned mn_sleep(unsigned int secs) {
vTaskDelay( (secs * 1000) / ((TickType_t) 1000 / configTICK_RATE_HZ));
return 0;
}
int mn_usleep(useconds_t usec) {
vTaskDelay(usec / ((TickType_t) 1000000 / configTICK_RATE_HZ));
return 0;
}
int IRAM_ATTR mn_nsleep(const struct timespec *req, struct timespec *rem) {
struct timeval start, end;
if ((req->tv_nsec < 0) || (req->tv_nsec > 999999999)) {
errno = EINVAL;
return -1;
}
// Get time in msecs
uint32_t msecs;
msecs = req->tv_sec * 1000;
msecs += (req->tv_nsec + 999999) / 1000000;
if (rem != NULL) {
gettimeofday(&start, NULL);
}
vTaskDelay(msecs / portTICK_PERIOD_MS);
if (rem != NULL) {
rem->tv_sec = 0;
rem->tv_nsec = 0;
gettimeofday(&end, NULL);
uint32_t elapsed = (end.tv_sec - start.tv_sec) * 1000
+ ((end.tv_usec - start.tv_usec) / 1000000);
if (elapsed < msecs) {
if (elapsed > 1000) {
rem->tv_sec = elapsed / 1000;
elapsed -= rem->tv_sec * 1000;
rem->tv_nsec = elapsed * 1000000;
}
}
}
errno = EINTR;
return 0;
}