Annotation of nono/vm/power.cpp, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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