eDosStation/EpdBase/TimeFunctions.cpp

129 lines
3.5 KiB
C++
Raw Permalink Normal View History

2025-01-09 12:47:42 +01:00
#include "stdafx.h"
#include "TimeFunctions.h"
#pragma unmanaged
TimeFunctions::TimeFunctions()
{
lu.LL = 0;
}
time_t FileTime_to_POSIX_DST(FILETIME ft)
{
FILETIME localFileTime;
FileTimeToLocalFileTime(&ft, &localFileTime);
SYSTEMTIME sysTime;
FileTimeToSystemTime(&localFileTime, &sysTime);
struct tm tmtime = { 0 };
tmtime.tm_year = sysTime.wYear - 1900;
tmtime.tm_mon = sysTime.wMonth - 1;
tmtime.tm_mday = sysTime.wDay;
tmtime.tm_hour = sysTime.wHour;
tmtime.tm_min = sysTime.wMinute;
tmtime.tm_sec = sysTime.wSecond;
tmtime.tm_wday = 0;
tmtime.tm_yday = 0;
tmtime.tm_isdst = -1;
time_t ret = mktime(&tmtime);
return ret;
}
UINT32 FileTime_to_POSIX(FILETIME ft)
{
// takes the last modified date
LARGE_INTEGER date, adjust;
date.HighPart = ft.dwHighDateTime;
date.LowPart = ft.dwLowDateTime;
// 100-nanoseconds = milliseconds * 10000
adjust.QuadPart = 11644473600000 * 10000;
// removes the diff between 1970 and 1601
date.QuadPart -= adjust.QuadPart;
// converts back from 100-nanoseconds to seconds
return (UINT32)(date.QuadPart / 10000000);
}
UINT32 UnixTimeNow() {
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
return FileTime_to_POSIX(ft);
}
void TimeFunctions::UnixTimeToFileTime(time_t t, LPFILETIME pft)
{
// Note that LONGLONG is a 64-bit value
LONGLONG ll;
ll = Int32x32To64(t, 10000000) + 116444736000000000;
pft->dwLowDateTime = (DWORD)ll;
pft->dwHighDateTime = ll >> 32;
}
void TimeFunctions::UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst)
{
FILETIME ft;
UnixTimeToFileTime(t, &ft);
FileTimeToSystemTime(&ft, pst);
}
void TimeFunctions::Epd2TimeToFileTime(INT32 t, LPFILETIME pft) //MK3
{
LONGLONG offset = 116444736000000000;
LONGLONG ll;
ll = Int32x32To64(t, 10000000) + offset; //1601-1-1 -> 2000
pft->dwLowDateTime = (DWORD)ll;
pft->dwHighDateTime = ll >> 32;
}
//void TimeFunctions::EpdTimeToFileTime(INT32 t, LPFILETIME pft, bool isMK2) //MK3
//{
// LONGLONG offset;
// if (isMK2) offset = 116444736000000000; else offset = 125911584000000000;;
// LONGLONG ll;
// ll = Int32x32To64(t, 10000000) + offset; //1601-1-1 -> 2000
// pft->dwLowDateTime = (DWORD)ll;
// pft->dwHighDateTime = ll >> 32;
//}
//void TimeFunctions::FileTimeToEpdTime(FILETIME pft, INT32* t, bool isMK2)
//{
// LONGLONG offset;
// if (isMK2) offset = 116444736000000000; else offset = 125911584000000000;
// LONGLONG ll = ((((LONGLONG)pft.dwHighDateTime << 32) + pft.dwLowDateTime) - offset) / 10000000;
// *t = (DWORD)ll;
//}
void TimeFunctions::FileTimeToEpd2Time(FILETIME pft, INT32* t)
{
LONGLONG offset= 116444736000000000;
LONGLONG ll = ((((LONGLONG)pft.dwHighDateTime << 32) + pft.dwLowDateTime) - offset) / 10000000;
*t = (DWORD)ll;
}
UINT32 TimeFunctions::NowToEpdTime(bool isMK2)
{
LONGLONG offset;
if (isMK2) offset = 116444736000000000; else offset = 125911584000000000;
SYSTEMTIME t;
GetSystemTime(&t);
FILETIME ft;
SystemTimeToFileTime((const SYSTEMTIME*)&t, &ft);
LONGLONG ll = ((((LONGLONG)ft.dwHighDateTime << 32U) + ft.dwLowDateTime) - offset) / 10000000;
return (DWORD)ll;
}
void TimeFunctions::EPD2PeakTimeToFiletime(DWORD EpdClock, DWORD EpdPeakTime, FILETIME *PeakFileTime ) {
if (EpdPeakTime != 0xCDCDCDCD) {
UINT32 tm = EpdClock - EpdPeakTime; //seconden geleden
GetSystemTimeAsFileTime(&lu.FT);
lu.LL -= UInt32x32To64(tm, 10000000UL);
*PeakFileTime = lu.FT;
}
else {
(*PeakFileTime).dwLowDateTime = (*PeakFileTime).dwHighDateTime = 0;
}
}
2021-05-31 15:20:16 +02:00