support platformGetTick for Time()

This commit is contained in:
pikastech 2022-06-04 16:28:36 +08:00
parent 37df6563ee
commit 905c33e131
8 changed files with 82 additions and 57 deletions

View File

@ -81,6 +81,10 @@ class Time(TinyObj):
def sleep_ms(self, ms: int):
pass
# need override
def platformGetTick():
pass
def time(self) -> float:
pass

View File

@ -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.");
}

View File

@ -81,6 +81,10 @@ class Time(TinyObj):
def sleep_ms(self, ms: int):
pass
# need override
def platformGetTick():
pass
def time(self) -> float:
pass

View File

@ -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):

View File

@ -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);

View File

@ -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.");
}

View File

@ -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);
}

View File

@ -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);
}