|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2022 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // 電源周り
9: //
10:
11: #include "power.h"
12: #include "mainapp.h"
13: #include "scheduler.h"
14: #include "sync.h"
15: #include "uimessage.h"
16:
17: // グローバル参照用
18: PowerDevice *gPower;
19:
20: // コンストラクタ
21: PowerDevice::PowerDevice()
22: : inherited("Power")
23: {
24: gScheduler->ConnectMessage(MessageID::POWERON, this,
25: ToMessageCallback(&PowerDevice::PowerOnCallback));
26: gScheduler->ConnectMessage(MessageID::RESET, this,
27: ToMessageCallback(&PowerDevice::ResetCallback));
28: gScheduler->ConnectMessage(MessageID::POWEROFF_EXIT, this,
29: ToMessageCallback(&PowerDevice::PowerOffCallback));
30: gScheduler->ConnectMessage(MessageID::POWEROFF_RESTART, this,
31: ToMessageCallback(&PowerDevice::PowerOffCallback));
32: }
33:
34: // デストラクタ
35: PowerDevice::~PowerDevice()
36: {
37: gPower = NULL;
38: }
39:
40: // 初期化
41: bool
42: PowerDevice::Init()
43: {
44: // 初期状態は電源オフ
45: ispower = false;
46: return true;
47: }
48:
49: // 電源オンをスケジューラに指示する。(外部から呼ばれる用)
50: void
51: PowerDevice::MakePowerOn()
52: {
53: gScheduler->SendMessage(MessageID::POWERON);
54: }
55:
56: // リセットをスケジューラに指示する。(外部から呼ばれる用)
57: void
58: PowerDevice::MakeResetHard()
59: {
60: gScheduler->SendMessage(MessageID::RESET);
61: }
62:
63: // 電源オフ後終了をスケジューラに指示する。(外部から呼ばれる用)
64: void
65: PowerDevice::MakePowerOffExit()
66: {
67: gScheduler->SendMessage(MessageID::POWEROFF_EXIT);
68: }
69:
70: // リスタートをスケジューラに指示する。(外部から呼ばれる用)
71: void
72: PowerDevice::MakeRestart()
73: {
74: gScheduler->SendMessage(MessageID::POWEROFF_RESTART);
75: }
76:
77: // 電源オンのメッセージコールバック
78: void
79: PowerDevice::PowerOnCallback(MessageID msgid, uint32 arg)
80: {
81: DoPowerOn();
82: }
83:
84: // リセットのメッセージコールバック
85: void
86: PowerDevice::ResetCallback(MessageID msgid, uint32 arg)
87: {
88: DoResetHard();
89: }
90:
91: // 電源オフのメッセージコールバック
92: void
93: PowerDevice::PowerOffCallback(MessageID msgid, uint32 arg)
94: {
95: DoPowerOff(msgid);
96: }
97:
98: // 電源オン操作 (Device::ResetHard ではない)
99: void
100: PowerDevice::DoPowerOn()
101: {
102: putlog(1, "PowerOn");
103:
104: if (ispower == false) {
105: // 全デバイス電源オン
106: ispower = true;
107: for (auto obj : gMainApp.GetObjects()) {
108: auto dev = dynamic_cast<Device *>(obj);
109: if (dev) {
110: dev->ResetHard(true);
111: }
112: }
113:
114: // 動作モード変更
115: gSync->RequestPowerOffMode(false);
116: }
117: }
118:
119: // リセット操作 (Device::ResetHard ではない)
120: void
121: PowerDevice::DoResetHard()
122: {
123: putlog(1, "Reset");
124:
125: if (ispower) {
126: // 全デバイスをリセット
127: for (auto obj : gMainApp.GetObjects()) {
128: auto dev = dynamic_cast<Device *>(obj);
129: if (dev) {
130: dev->ResetHard(false);
131: }
132: }
133: }
134: }
135:
136: // 電源オフ操作 (Device::PowerOff ではない)
137: void
138: PowerDevice::DoPowerOff(MessageID msgid)
139: {
140: putlog(1, "PowerOff");
141:
142: assertmsg(msgid == MessageID::POWEROFF_EXIT ||
143: msgid == MessageID::POWEROFF_RESTART,
144: "msgid=%d", (int)msgid);
145:
146: if (ispower) {
147: // 全デバイス電源オフ
148: for (auto obj : gMainApp.GetObjects()) {
149: auto dev = dynamic_cast<Device *>(obj);
150: if (dev) {
151: dev->PowerOff();
152: }
153: }
154: ispower = false;
155:
156: // 動作モード変更
157: gSync->RequestPowerOffMode(true);
158: }
159:
160: // 電源オフ後の動作は引数によって異なる
161: if (msgid == MessageID::POWEROFF_RESTART) {
162: // 時間を始め直す
163: gScheduler->StartTime();
164: // 再び電源オンにする (リスタート)
165: DoPowerOn();
166: } else {
167: // そうでなければ、GUI に終了を通知
168: UIMessage::Post(UIMessage::APPEXIT);
169: }
170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.