Merge remote-tracking branch 'origin/master' into systime

Implement hourly updates
This commit is contained in:
Ryan Loebs
2016-04-29 02:35:27 -07:00
141 changed files with 4767 additions and 2418 deletions

View File

@@ -4,29 +4,51 @@
#include <cstring>
#include <ctime>
#include <core/core_timing.h>
#include "core/hle/shared_page.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// 3DS Uses 1900 for Epoch instead of 1970
#define _3DS_EPOCH_OFFSET 3155673600L
namespace SharedPage {
SharedPageDef shared_page;
static int update_time_event; ///< Time is updated/swapped every hour
void Init() {
std::memset(&shared_page, 0, sizeof(shared_page));
shared_page.date_time_update_counter = 1;
// Some games wait until this value becomes 0x1, before asking running_hw
shared_page.unknown_value = 0x1;
update_time_event = CoreTiming::RegisterEvent("SharedPage::update_time_event", UpdateTimeCallback);
// update now
CoreTiming::ScheduleEvent(0, update_time_event);
}
static void UpdateTimeCallback(u64 /*userdata*/, int /*cycles_late*/) {
shared_page.date_time_update_counter++;
// 3DS uses 1/1/1900 for Epoch
time_t plat_time = std::time(nullptr);
tm console_epoch = {};
console_epoch.tm_mday = 1;
u64_le console_time = static_cast<u64_le>(std::difftime(plat_time, std::mktime(&console_epoch)) * 1000L);
console_epoch.tm_year = 100; // 2000
u64_le console_time = (static_cast<u64_le>(std::difftime(plat_time, std::mktime(&console_epoch))) + _3DS_EPOCH_OFFSET) * 1000L;
shared_page.running_hw = 0x1; // product
shared_page.date_time_0 = {};
shared_page.date_time_0.date_time = console_time;
shared_page.date_time_1 = {};
shared_page.date_time_1.date_time = console_time;
DateTime* current_time = (shared_page.date_time_update_counter & 1) ? &shared_page.date_time_1 : &shared_page.date_time_0;
current_time->date_time = console_time;
current_time->tick_rate = (u64_le)CoreTiming::GetClockFrequency();
current_time->update_tick = CoreTiming::GetTicks();
// run again in an hour
CoreTiming::ScheduleEvent((u64_le)CoreTiming::GetClockFrequency() * 360ULL, update_time_event);
}
} // namespace