class

Sleep::Usecase

Inherits Notify::SleepGate < Reference < Object

睡眠中かを決める(issue #54)。

入力を合わせて 1 つの理由を返す。入力は、トレイから始める手動、スケジュール、OyasumiVR の 3 つである。 notify からは SleepGate として見え、中継を止めるかだけを問われる。

手動の状態と起きている間の上書きは設定ファイルに書かず、再起動で消える。 睡眠中に再起動が起きるのは更新の適用くらいで、適用は手動の操作か次の起動に限られる。

Constructors

new(config : Config::SleepSection = ::Config::SleepSection.new, clock : Proc(Time) = -> do Time.local end, oyasumivr : Signal | Nil = nil)

時計は差し替えられるようにしておく。 スケジュールも手動の期限も壁時計の時刻で決まり、テストで時刻を固定しないと境界を確かめられない。

Source

Instance methods

awake_oyasumivr?

OyasumiVR が睡眠モードを示していても中継するか。 睡眠モードのまま「おやすみモードを終了」を押したときに立ち、睡眠モードが切れたら下りる。 OyasumiVR には終わる時刻が無いため、スケジュールと違って状態の変化で期限を決める。

Source
awake_until

スケジュールの時間帯でも中継する期限。 寝ている途中で起きて「おやすみモードを終了」を押したときに立つ。 その時間帯が終わる時刻を入れるので、次の晩の時間帯ではまた止まる。

Source
config

設定スナップショットの sleep セクション。差し替えは代入 1 回で済む。

Source
config=(config : Config::SleepSection)

設定スナップショットの sleep セクション。差し替えは代入 1 回で済む。

Source
manual_until

手動のおやすみモードが終わる時刻。始めていなければ nil である。

Source
reason

止めている理由。複数が成り立つときは Reason の並びで先のものを返す。

Source
sleeping?

true の間は中継しない。主ループの 1 拍ごとに呼ぶため、待ちを伴う処理を入れない。

Source
start_manual

おやすみモードを始める。

期限は、スケジュールが有効なら次の終了時刻、無効なら設定した時間の後とする。 起きるつもりの時刻がスケジュールに書いてあるなら、それに揃えるほうが利用者の意図に近い。 起きている間の上書きは消す。寝ると決めた操作のほうを優先する。

Source
stop

おやすみモードを終える。トレイの「おやすみモードを終了」から呼ぶ。

手動の状態を消したうえで、スケジュールの時間帯にいれば、その時間帯が終わるまで中継する。 OyasumiVR が睡眠モードを示していれば、睡眠モードが切れるまで中継する。 手動だけを消すと、時間帯や睡眠モードの中では止まったままになり、押しても何も変わらない。

Source