|
|
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.