mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
support platformGetTick for Time()
This commit is contained in:
parent
37df6563ee
commit
905c33e131
@ -81,6 +81,10 @@ class Time(TinyObj):
|
||||
def sleep_ms(self, ms: int):
|
||||
pass
|
||||
|
||||
# need override
|
||||
def platformGetTick():
|
||||
pass
|
||||
|
||||
def time(self) -> float:
|
||||
pass
|
||||
|
||||
|
@ -89,29 +89,29 @@ void status_deal(status s) {
|
||||
}
|
||||
|
||||
//获取硬件平台的Unix时间戳,时间精度为1s级别,
|
||||
status time_get_unix_time(_timespec* this_timespec) {
|
||||
this_timespec->tv_sec = (int64_t)(obj_getInt((void*)0, "tick") / 1000);
|
||||
status time_get_unix_time(PikaObj* self, _timespec* this_timespec) {
|
||||
this_timespec->tv_sec = (int64_t)(obj_getInt(self, "tick") / 1000);
|
||||
return TIME_OK;
|
||||
}
|
||||
|
||||
//获取硬件平台的Tick时间,时间精度为1s级别以下
|
||||
//即1s的小数部分
|
||||
status time_get_tick_ns(_timespec* this_timespec) {
|
||||
this_timespec->tv_nsec = (obj_getInt((void*)0, "tick") % 1000) * 1000000;
|
||||
status time_get_tick_ns(PikaObj* self, _timespec* this_timespec) {
|
||||
this_timespec->tv_nsec = (obj_getInt(self, "tick") % 1000) * 1000000;
|
||||
return TIME_OK;
|
||||
}
|
||||
|
||||
//标准time()方法,返回以浮点数表示的从 epoch 开始的秒数的时间值。
|
||||
// epoch 是 1970 年 1 月 1 日 00:00:00 (UTC),
|
||||
double time_time(void) {
|
||||
double time_time(PikaObj* self) {
|
||||
status res = 0; //状态响应
|
||||
_timespec temp_timespec = {0};
|
||||
//调用硬件平台函数,获取当前时间
|
||||
res = time_get_unix_time(&temp_timespec);
|
||||
res = time_get_unix_time(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
res = time_get_tick_ns(&temp_timespec);
|
||||
res = time_get_tick_ns(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
@ -121,15 +121,15 @@ double time_time(void) {
|
||||
|
||||
//标准time_ns()方法,返回以整数表示的从 epoch 开始的纳秒数的时间值。
|
||||
// epoch 是 1970 年 1 月 1 日 00:00:00 (UTC),
|
||||
int64_t time_time_ns(void) {
|
||||
int64_t time_time_ns(PikaObj* self) {
|
||||
status res = 0; //状态响应
|
||||
_timespec temp_timespec = {0};
|
||||
//调用硬件平台函数,获取当前时间
|
||||
res = time_get_unix_time(&temp_timespec);
|
||||
res = time_get_unix_time(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
res = time_get_tick_ns(&temp_timespec);
|
||||
res = time_get_tick_ns(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
@ -530,10 +530,26 @@ void time_asctime(const _tm* this_tm) {
|
||||
}
|
||||
|
||||
float PikaStdDevice_Time_time(PikaObj* self) {
|
||||
return time_time();
|
||||
/* run platformGetTick() */
|
||||
PIKA_PYTHON_BEGIN
|
||||
/* clang-format off */
|
||||
PIKA_PYTHON(
|
||||
platformGetTick()
|
||||
)
|
||||
/* clang-format on */
|
||||
const uint8_t bytes[] = {
|
||||
0x04, 0x00, /* instruct array size */
|
||||
0x00, 0x82, 0x01, 0x00, /* instruct array */
|
||||
0x11, 0x00, /* const pool size */
|
||||
0x00, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
|
||||
0x47, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x00, /* const pool */
|
||||
};
|
||||
PIKA_PYTHON_END
|
||||
pikaVM_runByteCode(self, (uint8_t*)bytes);
|
||||
return time_time(self);
|
||||
}
|
||||
int PikaStdDevice_Time_time_ns(PikaObj* self) {
|
||||
return time_time_ns();
|
||||
return time_time_ns(self);
|
||||
}
|
||||
|
||||
void time_set_tm_value(PikaObj* self, const _tm* this_tm) {
|
||||
@ -595,3 +611,8 @@ void PikaStdDevice_Time___init__(PikaObj* self) {
|
||||
obj_setInt(self, "locale", 8);
|
||||
PikaStdDevice_Time_localtime(self, 0.0);
|
||||
}
|
||||
|
||||
void PikaStdDevice_Time_platformGetTick(PikaObj* self) {
|
||||
obj_setErrorCode(self, 1);
|
||||
obj_setSysOut(self, "[error] platformGetTick() need to be override.");
|
||||
}
|
||||
|
@ -81,6 +81,10 @@ class Time(TinyObj):
|
||||
def sleep_ms(self, ms: int):
|
||||
pass
|
||||
|
||||
# need override
|
||||
def platformGetTick():
|
||||
pass
|
||||
|
||||
def time(self) -> float:
|
||||
pass
|
||||
|
||||
|
@ -15,6 +15,7 @@ class Time(PikaStdDevice.Time):
|
||||
# override
|
||||
def sleep_s(self, s: int): ...
|
||||
def sleep_ms(self, ms: int): ...
|
||||
def platformGetTick(): ...
|
||||
|
||||
|
||||
class ADC(PikaStdDevice.ADC):
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "GTestTask_Task.h"
|
||||
|
||||
volatile uint64_t tick_ms = 0;
|
||||
static volatile uint64_t tick_ms = 0;
|
||||
void GTestTask_Task_platformGetTick(PikaObj* self) {
|
||||
tick_ms += 50;
|
||||
obj_setInt(self, "tick", tick_ms);
|
||||
|
@ -89,29 +89,29 @@ void status_deal(status s) {
|
||||
}
|
||||
|
||||
//获取硬件平台的Unix时间戳,时间精度为1s级别,
|
||||
status time_get_unix_time(_timespec* this_timespec) {
|
||||
this_timespec->tv_sec = (int64_t)(obj_getInt((void*)0, "tick") / 1000);
|
||||
status time_get_unix_time(PikaObj* self, _timespec* this_timespec) {
|
||||
this_timespec->tv_sec = (int64_t)(obj_getInt(self, "tick") / 1000);
|
||||
return TIME_OK;
|
||||
}
|
||||
|
||||
//获取硬件平台的Tick时间,时间精度为1s级别以下
|
||||
//即1s的小数部分
|
||||
status time_get_tick_ns(_timespec* this_timespec) {
|
||||
this_timespec->tv_nsec = (obj_getInt((void*)0, "tick") % 1000) * 1000000;
|
||||
status time_get_tick_ns(PikaObj* self, _timespec* this_timespec) {
|
||||
this_timespec->tv_nsec = (obj_getInt(self, "tick") % 1000) * 1000000;
|
||||
return TIME_OK;
|
||||
}
|
||||
|
||||
//标准time()方法,返回以浮点数表示的从 epoch 开始的秒数的时间值。
|
||||
// epoch 是 1970 年 1 月 1 日 00:00:00 (UTC),
|
||||
double time_time(void) {
|
||||
double time_time(PikaObj* self) {
|
||||
status res = 0; //状态响应
|
||||
_timespec temp_timespec = {0};
|
||||
//调用硬件平台函数,获取当前时间
|
||||
res = time_get_unix_time(&temp_timespec);
|
||||
res = time_get_unix_time(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
res = time_get_tick_ns(&temp_timespec);
|
||||
res = time_get_tick_ns(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
@ -121,15 +121,15 @@ double time_time(void) {
|
||||
|
||||
//标准time_ns()方法,返回以整数表示的从 epoch 开始的纳秒数的时间值。
|
||||
// epoch 是 1970 年 1 月 1 日 00:00:00 (UTC),
|
||||
int64_t time_time_ns(void) {
|
||||
int64_t time_time_ns(PikaObj* self) {
|
||||
status res = 0; //状态响应
|
||||
_timespec temp_timespec = {0};
|
||||
//调用硬件平台函数,获取当前时间
|
||||
res = time_get_unix_time(&temp_timespec);
|
||||
res = time_get_unix_time(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
res = time_get_tick_ns(&temp_timespec);
|
||||
res = time_get_tick_ns(self, &temp_timespec);
|
||||
if (res) {
|
||||
status_deal(res);
|
||||
} //异常处理
|
||||
@ -530,10 +530,26 @@ void time_asctime(const _tm* this_tm) {
|
||||
}
|
||||
|
||||
float PikaStdDevice_Time_time(PikaObj* self) {
|
||||
return time_time();
|
||||
/* run platformGetTick() */
|
||||
PIKA_PYTHON_BEGIN
|
||||
/* clang-format off */
|
||||
PIKA_PYTHON(
|
||||
platformGetTick()
|
||||
)
|
||||
/* clang-format on */
|
||||
const uint8_t bytes[] = {
|
||||
0x04, 0x00, /* instruct array size */
|
||||
0x00, 0x82, 0x01, 0x00, /* instruct array */
|
||||
0x11, 0x00, /* const pool size */
|
||||
0x00, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
|
||||
0x47, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x00, /* const pool */
|
||||
};
|
||||
PIKA_PYTHON_END
|
||||
pikaVM_runByteCode(self, (uint8_t*)bytes);
|
||||
return time_time(self);
|
||||
}
|
||||
int PikaStdDevice_Time_time_ns(PikaObj* self) {
|
||||
return time_time_ns();
|
||||
return time_time_ns(self);
|
||||
}
|
||||
|
||||
void time_set_tm_value(PikaObj* self, const _tm* this_tm) {
|
||||
@ -595,3 +611,8 @@ void PikaStdDevice_Time___init__(PikaObj* self) {
|
||||
obj_setInt(self, "locale", 8);
|
||||
PikaStdDevice_Time_localtime(self, 0.0);
|
||||
}
|
||||
|
||||
void PikaStdDevice_Time_platformGetTick(PikaObj* self) {
|
||||
obj_setErrorCode(self, 1);
|
||||
obj_setSysOut(self, "[error] platformGetTick() need to be override.");
|
||||
}
|
||||
|
@ -6,3 +6,9 @@ void TemplateDevice_Time_sleep_ms(PikaObj *self, int ms){
|
||||
void TemplateDevice_Time_sleep_s(PikaObj *self, int s){
|
||||
|
||||
}
|
||||
|
||||
static volatile uint64_t tick_ms = 0;
|
||||
void TemplateDevice_Time_platformGetTick(PikaObj *self){
|
||||
tick_ms += 50;
|
||||
obj_setInt(self, "tick", tick_ms);
|
||||
}
|
||||
|
@ -2380,35 +2380,3 @@ TEST(pikaMain, string_isspace) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(pikaMain, unix_time) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
/* run */
|
||||
PikaObj* self = newRootObj("pikaMain", New_PikaMain);
|
||||
obj_run(self, "mytime = PikaStdDevice.Time()\n"
|
||||
"mytime.localtime(0.0)\n"
|
||||
);
|
||||
/* 获取数据比对 */
|
||||
int tm_sec=obj_getInt(self,"mytime.tm_sec");
|
||||
int tm_min=obj_getInt(self,"mytime.tm_min");
|
||||
int tm_hour=obj_getInt(self,"mytime.tm_hour");
|
||||
int tm_mday=obj_getInt(self,"mytime.tm_mday");
|
||||
int tm_mon=obj_getInt(self,"mytime.tm_mon");
|
||||
int tm_year=obj_getInt(self,"mytime.tm_year");
|
||||
int tm_wday=obj_getInt(self,"mytime.tm_wday");
|
||||
int tm_yday=obj_getInt(self,"mytime.tm_yday");
|
||||
int tm_isdst=obj_getInt(self,"mytime.tm_isdst");
|
||||
/* assert */
|
||||
EXPECT_EQ(tm_sec, 0);
|
||||
EXPECT_EQ(tm_min, 0);
|
||||
EXPECT_EQ(tm_hour, 8);
|
||||
EXPECT_EQ(tm_mday, 1);
|
||||
EXPECT_EQ(tm_mon, 0);//1月
|
||||
EXPECT_EQ(tm_year, 1970);
|
||||
EXPECT_EQ(tm_wday, 4);//周四
|
||||
EXPECT_EQ(tm_yday, 1);
|
||||
EXPECT_EQ(tm_isdst, -1);
|
||||
/* deinit */
|
||||
obj_deinit(self);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user