Skip to content
Snippets Groups Projects
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;
}