Annotation of nono/vm/rtc.h, revision 1.1.1.2

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: 
1.1.1.2 ! root       84: extern std::unique_ptr<RTCDevice> gRTC;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.