mirror of
https://github.com/espressif/ESP8266_RTOS_SDK.git
synced 2025-10-23 01:47:33 +08:00
feat(lwip): Move lwip to components
This commit is contained in:
112
components/lwip/source/apps/time.c
Normal file
112
components/lwip/source/apps/time.c
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
time.c - implementation of Time API for esp8266
|
||||
|
||||
Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
|
||||
This file is part of the esp8266 core for Arduino environment.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include "c_types.h"
|
||||
#include "esp_timer.h"
|
||||
|
||||
#include "lwip/apps/sntp.h"
|
||||
#include "lwip/apps/time.h"
|
||||
#include "lwip/apps/sntp_time.h"
|
||||
|
||||
static os_timer_t micros_overflow_timer;
|
||||
static uint32 micros_at_last_overflow_tick = 0;
|
||||
static uint32 micros_overflow_count = 0;
|
||||
|
||||
static void micros_overflow_tick(void * arg)
|
||||
{
|
||||
uint32 m = system_get_time();
|
||||
if (m < micros_at_last_overflow_tick)
|
||||
micros_overflow_count ++;
|
||||
|
||||
micros_at_last_overflow_tick = m;
|
||||
}
|
||||
|
||||
static void micros_set_default_time(void)
|
||||
{
|
||||
os_timer_disarm(µs_overflow_timer);
|
||||
os_timer_setfn(µs_overflow_timer, (os_timer_func_t *)micros_overflow_tick, 0);
|
||||
os_timer_arm(µs_overflow_timer, 60 * 1000, 1);
|
||||
}
|
||||
|
||||
unsigned long millis(void)
|
||||
{
|
||||
uint32 m = system_get_time();
|
||||
uint32 c = micros_overflow_count + ((m < micros_at_last_overflow_tick) ? 1 : 0);
|
||||
return c * 4294967 + m / 1000000;
|
||||
}
|
||||
|
||||
unsigned long micros(void)
|
||||
{
|
||||
return system_get_time();
|
||||
}
|
||||
|
||||
void updateTime(uint32 ms)
|
||||
{
|
||||
sntp_set_update_delay(ms);
|
||||
}
|
||||
|
||||
static void setServer(int id, const char* name_or_ip)
|
||||
{
|
||||
if (name_or_ip){
|
||||
sntp_setservername(id, (char*)name_or_ip);
|
||||
}
|
||||
}
|
||||
|
||||
bool configTime(int timezone, int daylightOffset, char *server1, char *server2, char *server3, bool enable)
|
||||
{
|
||||
if (server1 == NULL && server2 == NULL && server3 == NULL)
|
||||
return false;
|
||||
|
||||
sntp_stop();
|
||||
|
||||
setServer(0, server1);
|
||||
setServer(1, server2);
|
||||
setServer(2, server3);
|
||||
|
||||
sntp_set_timezone(timezone);
|
||||
|
||||
sntp_init();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int __attribute__((weak))
|
||||
_gettimeofday_r(void *ptr, struct timeval *ptimeval, void *ptimezone)
|
||||
{
|
||||
if (ptimeval){
|
||||
time_t seconds = sntp_get_current_timestamp();
|
||||
if (seconds == 0){
|
||||
micros_set_default_time();
|
||||
seconds = millis();
|
||||
}
|
||||
ptimeval->tv_sec = seconds;
|
||||
|
||||
ptimeval->tv_usec = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* getrealtimeofday(void)
|
||||
{
|
||||
struct timeval t;
|
||||
gettimeofday(&t, NULL);
|
||||
return sntp_get_real_time(t.tv_sec);
|
||||
}
|
Reference in New Issue
Block a user