yy1717
2023-03-31 4bd08f0355b6b2cf3c027202d5ad301b4e182953
lib/src/main/cpp/utils/xconvert.cpp
@@ -22,6 +22,8 @@
#define DAYS_PER_WEEK       7
#define DAYS_PER_YEAR       365
#define DAYS_UP_TO_1970 ((70*365LU) +17)
double ConvertKMh2Ms(int kmh)
{
    return ((double)kmh) * 1000.0 / 3600.0;
@@ -86,9 +88,20 @@
    }
}
static int TimeMonthOffset( int leapStatus, uint8_t mon )
{
    const int monthOffsets[2][12] =
            {
/*   jan  feb  mar  apr  may  jun  jul  aug  sep  oct  nov  dec */
                    {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},    /* regular year */
                    {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}     /* leap year    */
            };
    return monthOffsets[leapStatus][mon] ;
}
const int LibTimeDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static inline bool TimeYearIsLeap(int year)
static bool TimeYearIsLeap(int year)
{
    if ((year % 4) || year == 2100)
        return false;
@@ -113,7 +126,7 @@
    for (i = 0; i<(month - 1); i++)
        daysThisYear += (int)LibTimeDays[i];
    for (i = 2000; i<year; i++) {
    for (i = 1970; i<year; i++) {
        daysThisYear += 365;
        if (TimeYearIsLeap(i))
            daysThisYear += 1;
@@ -127,22 +140,59 @@
    return (hour*SECONDS_PER_HOUR + minute*SECONDS_PER_MINUTE + second) * 1000 + msecond;
}
/*********************************************************
 * TIME1 - TIME2: msecond
 * @param hour1
 * @param minute1
 * @param second1
 * @param msecond1
 * @param hour2
 * @param minute2
 * @param second2
 * @param msecond2
 * @return
 */
uint32_t TimeGetDiff(int hour1, int minute1, int second1, int msecond1, int hour2, int minute2, int second2, int msecond2)
{
    return (TimeMakeComposite(hour1, minute1, second1, msecond1) + SECONDS_PER_DAY * 1000 -
            TimeMakeComposite(hour2, minute2, second2, msecond2)) % (SECONDS_PER_DAY * 1000);
void TimeBreakdown(uint32_t SecondsSince1970 , struct TimeStructure *pTS) {
    uint16_t yearSince1900;
    uint32_t days;
    uint32_t daysTillYearStarted;
    uint32_t secs;
    bool isLeapYear;
    uint16_t leapDaysSince1900;
    secs = SecondsSince1970;
    days = SecondsSince1970 / SECONDS_PER_DAY;
    // 1970.1.1 is Thursday
    pTS->Wday = (days + 4) % DAYS_PER_WEEK;   /* days since Sunday        */
    yearSince1900 = (days / DAYS_PER_YEAR) + 70;
    leapDaysSince1900 = (yearSince1900 - 1) / 4;
    if (yearSince1900 > 200)
        leapDaysSince1900 -= 1;
    daysTillYearStarted = leapDaysSince1900 + (365L * yearSince1900);
    if (days + DAYS_UP_TO_1970 < daysTillYearStarted) {
        yearSince1900--;
        leapDaysSince1900 = (yearSince1900 - 1) / 4;
        if (yearSince1900 > 200)
            leapDaysSince1900 -= 1;
        daysTillYearStarted = leapDaysSince1900 + (365L * yearSince1900);
    }
    days = days - (daysTillYearStarted - DAYS_UP_TO_1970);
    pTS->Year = yearSince1900 + 1900;
    pTS->Yday = days;
    isLeapYear = TimeYearIsLeap(pTS->Year);
    pTS->Month = 12;
    do {
        pTS->Month--;
    } while (days < TimeMonthOffset(isLeapYear? 1 : 0, pTS->Month));
    pTS->Day = days - TimeMonthOffset(isLeapYear? 1: 0, pTS->Month) + 1;
    pTS->Month++;
    secs %= SECONDS_PER_DAY;
    pTS->Hour = secs / SECONDS_PER_HOUR;
    secs %= SECONDS_PER_HOUR;
    pTS->Minute = secs / 60;
    pTS->Second = secs % 60;
}
vector<string> split(string str, string pattern)