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