|
|
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:
1.1.1.9 ! root 7: //
! 8: // RTC の共通部分
! 9: //
! 10:
1.1 root 11: #pragma once
12:
13: #include "device.h"
1.1.1.9 ! root 14: #include "event.h"
! 15: #include <sys/time.h>
1.1 root 16:
1.1.1.7 root 17: // これ自体が IODevice である必要はないが派生側が IODevice を必要とするため。
1.1 root 18: class RTCDevice : public IODevice
19: {
1.1.1.3 root 20: using inherited = IODevice;
1.1 root 21:
22: public:
1.1.1.6 root 23: RTCDevice(const std::string& objname_);
1.1.1.4 root 24: virtual ~RTCDevice() override;
1.1 root 25:
1.1.1.7 root 26: bool Init() override;
1.1 root 27:
1.1.1.9 ! root 28: virtual void StartTime();
! 29:
! 30: // clock-sync が実時間同期なら true を返す
! 31: bool GetSyncRealtime() const { return sync_rt; }
! 32:
! 33: // 電源 OFF 時の実時間でのクロック入力。
! 34: // 次回のクロック発生までの時間間隔を返す。
! 35: uint64 ClockIn_PowerOff();
1.1.1.7 root 36:
37: // 現在の日付時刻を返す。
38: // ここで取得できる値は機種によらず共通のフォーマットだが、
39: // 値は範囲外の状態になる可能性が常にあることに注意。
40: //
41: // RP5C15 の場合、1つのレジスタが10進数一桁ごとを扱っているため、特に
42: // ゲストプログラムが月の更新するしようとするときに一時的に範囲外の
43: // 状態になることが避けられない。
44: // 例えば、もともと12月31日だったものを9月30日に変更する場合、
45: // 上の桁から更新したら(M10,M1,D10,D1)
46: // 12/31 -> 02/31 -> 09/31 -> 09/31 -> 09/30
47: // 下の桁から更新したら(D1,D10,M1,M10)
48: // 12/31 -> 12/30 -> 12/30 -> 19/30 -> 09/30
49: // このように、2/31, 9/31, 19/30 などが中間状態として発生する。
50: virtual uint GetSec() const = 0; // 秒(0-59)
51: virtual uint GetMin() const = 0; // 分(0-59)
52: virtual uint GetHour() const = 0; // 時(0-23)
53: virtual uint GetWday() const = 0; // 曜日(0-6、0が日曜)
54: virtual uint GetMday() const = 0; // 日(1-31)
55: virtual uint GetMon() const = 0; // 月(1-12)
56: virtual uint GetYear() const = 0; // 年(西暦)
57: virtual uint GetLeap() const = 0; // うるう年カウンタ(0-3、0がうるう年)
1.1 root 58:
59: protected:
1.1.1.9 ! root 60: // 32Hz クロック入力。
! 61: // clock-sync の設定に応じて、実時間または仮想時間で
! 62: // 32Hz ごとに呼ばれて、これが RTC の時計を進める処理をするところ。
! 63: void ClockIn();
! 64:
1.1.1.7 root 65: // 仮想 RTC のクロック出力
1.1 root 66:
1.1.1.7 root 67: // 継承クラス向けに 32Hz で呼び出される。
1.1.1.9 ! root 68: virtual void Tick32Hz();
1.1 root 69:
1.1.1.7 root 70: // 継承クラス向けに 2Hz で呼び出される。
71: // タイミングは、0/32秒目と 16/32秒目。
1.1.1.9 ! root 72: virtual void Tick2Hz();
1.1.1.7 root 73:
74: // 継承クラス向けに 1Hz で呼び出される。
75: // タイミングは、0/32秒目。
76: // この関数から秒カウンタ更新をすること。
1.1.1.9 ! root 77: virtual void Tick1Hz();
1.1.1.7 root 78:
79: // 秒をカウントアップし、秒以上の繰り上がりを処理する。
80: void CountUpSec();
81: // 分をカウントアップし、分以上の繰り上がりを処理する。
82: // RP5C15 の ADJUST 機能を実現するために秒と分離。
83: void CountUpMin();
84:
85: virtual void SetSec(uint v) = 0;
86: virtual void SetMin(uint v) = 0;
87: virtual void SetHour(uint v) = 0;
88: virtual void SetWday(uint v) = 0;
89: virtual void SetMday(uint v) = 0;
90: virtual void SetMon(uint v) = 0;
91: virtual void SetYear(uint v) = 0;
92: virtual void SetLeap(uint v) = 0;
93:
94: // 32Hz でカウントアップする内部カウンタ
95: uint64 cnt {};
96:
97: // 年エポック。システムに依存。
98: uint year_epoch {};
99:
100: // 時刻設定時に localtime を使う場合は true
101: bool use_localtime {};
102:
103: // レジスタとして読める値を定数にすることで、仮想マシン状態を
104: // 常に同じ状態にするためのパフォーマンス測定用フラグ。
105: // なお NVRAM 部分は影響されない。
106: bool force_fixed {};
107:
1.1.1.9 ! root 108: // RTC の入力クロックが実時間の場合は true
! 109: // 仮想時間の場合は false
! 110: bool sync_rt {};
! 111:
! 112: // 設定で指定された日付時刻
! 113: struct tm rtc_tm {};
! 114:
1.1.1.7 root 115: // 曜日文字列 (0 = "Sun", ...)
116: // MK48T02 の誤運用にも対応するため 0..7 の範囲をとる。
117: static const char * const wdays[8];
118:
119: private:
120: // デバッグオプションの日付時刻文字列を解析する。
121: bool ParseDate(const std::string& str, int *y, int *m, int *d, int *w);
122: bool ParseTime(const std::string& str, int *h, int *m, int *s);
1.1 root 123:
1.1.1.7 root 124: // 現在の月の最終日を返す (月の繰り上がり処理用)
125: int GetLastMday() const;
1.1.1.9 ! root 126:
! 127: // イベントコールバック
! 128: void Callback(Event& ev);
! 129:
! 130: // イベント間隔
! 131: const uint period = 31.25_msec;
! 132:
! 133: // システムクロックが刻んでいる時刻
! 134: uint64 stime {};
! 135:
! 136: // RTC クロック入力
! 137: Event event { this };
1.1 root 138: };
139:
1.1.1.9 ! root 140: extern RTCDevice *gRTC;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.