|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #pragma once
8:
9: #include "device.h"
10:
11: struct RTC
12: {
13: // 内部カウンタ
14: //
15: // 1/32秒ごとに増加する内部カウンタ。これが 32 になると1秒ということ。
16: // ただしタイマー停止中でも1秒の繰り上がり1回は記憶できるそうなので、
17: // 実際にはこれを 6ビットのカウンタ (63まで) として使用し、
18: // 32 になったら秒繰り上がりではなく、タイマー動作状態で 32 以上だったら
19: // 32 を引いてから秒繰り上がり処理になると思う。
20: uint cnt;
21:
22: int sec; // 秒(0-59)
23: int min; // 分(0-59)
24: int hour; // 時(0-23)
25: int wday; // 曜日(0-6; 0が日曜)
26: int mday; // 日(1-31)
27: int mon; // 月(1-12)
28: int year; // 年(西暦)
29:
30: bool enable_sec; // 秒へのカウントアップを行うなら true
31: };
32:
33: // 汎用のリアルタイムクロック
34: // RP5C15 と MK48T02 の共通部分。
35: // 本来、これは IODevice である必要はないけど、C++ の制約というか多重継承は
36: // あまりやりたくないので、これを IODevice 派生クラスとしておく。
37: class RTCDevice : public IODevice
38: {
1.1.1.3 root 39: using inherited = IODevice;
1.1 root 40:
41: public:
42: RTCDevice();
1.1.1.4 root 43: virtual ~RTCDevice() override;
1.1 root 44:
1.1.1.5 ! root 45: void ResetHard() override;
1.1 root 46:
47: // 32Hz クロック入力。
48: //
49: // 32Hz ごとに呼ばれて、これが RTC の時計を進める処理をするところ。
50: // RTC を実時間に同期して進めるモードなら実時間を計るスケジューラから、
51: // RTC を仮想時間に同期して進めるモードなら VM スケジューラから呼ばれる。
52: // 派生クラス側で用意。
53: virtual void ClockIn() = 0;
54:
55: protected:
56: // ホストの現在時刻を rtc に取得
57: void LoadHostRTC(bool use_localtime);
58:
59: // どの位が更新されたか(繰り上がったか)を示すフラグ。
60: static const uint32 UPDATE_SEC = (1U << 0);
61: static const uint32 UPDATE_MIN = (1U << 1);
62: static const uint32 UPDATE_HOUR = (1U << 2);
63: static const uint32 UPDATE_DAY = (1U << 3);
64: static const uint32 UPDATE_MON = (1U << 4);
65: static const uint32 UPDATE_YEAR = (1U << 5);
66:
67: static const uint32 UPDATE_ALL = 0xffffffffU;
68:
69: uint32 CountUp(); // 1/32 秒カウンタの更新
70: uint32 CarrySec(uint32); // 秒への繰り上がり
71: uint32 CarryMin(uint32); // 分への繰り上がり
72: uint32 CarryHour(uint32); // 時への繰り上がり
73: uint32 CarryDay(uint32); // 日への繰り上がり
74: uint32 CarryMon(uint32); // 月への繰り上がり
75: uint32 CarryYear(uint32); // 年への繰り上がり
76: bool IsLeapMon() const; // 閏月かどうか
77:
78: RTC rtc {}; // 内部状態
79:
80: static const char * const wdays[7]; // 曜日文字列 (0 = "Sun", ...)
81: };
82:
1.1.1.2 root 83: extern std::unique_ptr<RTCDevice> gRTC;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.