Cyber-时间相关API

发布时间 2023-09-18 13:46:17作者: WTSRUVF

 

/*
    时间相关API
        Time是一个用来管理时间的类;可用于当前时间的获取、耗时计算、时间转换等
        Duration相关接口,用于表示时间间隔,可以按照指定的纳秒或者秒进行初始化
        Rate接口一般用于休眠操作(会自动将频率换算成休眠时间)
        Timer可用于创建定时任务以周期性的运行,或者只运行一次
*/
#include "cyber/cyber.h" 
// #include "cyber/time/time.h"  因为cyber中已经include了time.h,所以直接写cyber.h也是可以

using apollo::cyber::Time;
using apollo::cyber::Duration;
using apollo::cyber::Rate;
using apollo::cyber::Timer;

int main(int argv, char* argv[])
{
    /////////////////////////////////////Time/////////////////////////////////////////
    // 创建时间对象(构造函数)
    Time t1; // 1970-01-01 08:00:00 原点时间
    Time t2 = Time(100); // 以纳秒为单位(可以查看Time中封装的函数重载,参数为整数时,为纳秒)
    Time t3 = Time(100.0); // 以秒为单位
    Time right_now = Time::Now(); //获取当前时刻
    Time mono_time = Time::MonoTime(); //获取系统启动到当前的时间

    // 操作时间
    AINFO << "t1 = " << t1;
    AINFO << "t2 = " << t2;
    AINFO << "t3 = " << t3;    
    AINFO << "right_now = " << right_now;
    AINFO << "mono_time = " << mono_time;

    // 时间转换
    AINFO << "t3(s): " << t3.ToSecond();
    AINFO << "t3(ms): " << t3.ToMicrosecond();
    AINFO << "t3(ns): " << t3.ToNanosecond();
    AINFO << "t3(str): " << t3.ToString();
    AINFO << "t3 is zero: " << t3.IsZero(); // 是否是原点时间
    AINFO << "t1 is zero: " << t1.IsZero();


    // 静态字段  静态函数
    AINFO  << "时间可用最小值:" << Time::MIN.toNanosecond();
    AINFO  << "时间可用最大值:" << Time::MAX.toNanosecond();

    // 通过SleepUntil休眠10s
    // 先获取当前时间
    Time rn = Time::Now();
    // 再创建10s之后的时间对象
    Time fu = Time(rn.ToSecond() + 10);
    // 再调用休眠函数
    AINFO << "休眠前:"  << rn;
    Time::SleepUntil(fu);
    AINFO << "休眠后:" << Time::Now();
    //////////////////////////////////////////////////////////////////////////////////


    /////////////////////////////////////Duration////////////////////////////////////
    
    Duration du1(100); // 100ns
    Duration du2(5.0); // 5s
    Duration du3(3, 1000000); // 3.0001s
    Duration d4;
    AINFO << "du2(s): " << du2.ToSecond();
    AINFO << "du2(ns): " << du2.ToNanosecond();
    AINFO << "is zero: " << du2.IsZero();

    // 休眠5s
    du2.Sleep(); 
    ///////////////////////////运算符重载///////////////////////////////////////////
    /*
        重载了- + += -= == != > < >= <=等运算符   //具体请实际查看类中的定义
            - + += -= 用于Time与Duration的运算
            == != > < >= <= 用于Time之间的比较
    */

   ////////////////////////////////Rate休眠//////////////////////////////////////////////
    Rate r1(0.5); // 浮点:设置频率
    Rate r2(100); // 整型:设置休眠时间,单位是ns
    Duration du(2.0);
    Rate r3(du); // 也可以以持续时间为单位


    // 调用函数,休眠
    r1.Sleep();

   ////////////////////////////////Timer定时器///////////////////////////////////////////////////

    /*
        Timer(param1, param2, param3);
        param1:设置时间间隔(循环频率),单位ns
        param2:回调函数,无参数 无返回值
        param3:是否只运行一次
            true->一次
            flase->循环执行
    */
    // 定义定时器
    Timer timer(100, cb, false);
    // 启动定时器
    time.Start();

    // 关闭定时器
    time.Stop();


    return 0;
}