高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

spacer image


Technote 1086

Power Management & The Energy Saver API


目次

省エネルギー設定の概要
省エネルギー設定へのアクセス
省エネルギー設定 API
  ESGlobals 構造体
  ESLoadPreferences
  ESGetPreferences
  ESSetPreferences
  ESRefreshSettings
  ESSavePreferences
  ESAddNoteProc
  ESRemoveNoteProc
  省エネルギー設定通知関数 (Energy Saver Notification Function)
  ESRestoreDefaults
  ESGetUnsavedFolder
  ESSetUnsavedFolder
  ESGetINITVersion
要約

Macintosh プラットフォームにインプリメントされているさまざまな省エネルギーハードウェアやソフトウェアを一貫した方法で制御するため、Apple では、統一的な省エネルギー設定システムを導入します。

ディスプレイのスリープ/暗転、ハードディスクの回転停止、アイドル時のシステム終了またはスリープなど、節電を制御するための標準的な方法に加えて、省エネルギー設定 API は、省エネルギー機能へのアクセスを必要とする複数のアプリケーションに対して、ヒューマンインタフェースを同期させるための一貫した方法を提供します。

この TECHNOTE では、省エネルギー設定 API を介して Macintosh の省エネルギー設定機能拡張との間でデータをやり取りする方法について説明します。これは、アプリケーションから Mac OS の節電機能にアクセスしようとするデベロッパの参考になるはずです。

また、この TECHNOTE には、省エネルギー設定 API に対するパブリックインタフェースの解説も含まれています。


省エネルギー設定の概要
省エネルギー設定は、Macintosh プラットフォームにインプリメントされているさまざまな省エネルギーハードウェアやソフトウェアを制御するための一貫した方法を提供します。

実際にサポートされる機能はマシンの性能によって異なりますが、通常、省エネルギー設定では、次のような方法でシステムの電力消費を低減させます。

  • ディスプレイのスリープ/暗転 - ディスプレイモニタに供給する電力を低減させます。
  • ハードディスクの回転停止 - ハードディスクのモーターを停止 (電源をオフにする) することによって消費電力を低減させます。
  • アイドル時のシステム終了 - 作業中のデータを消失することなく、プログラムを使ってコンピュータの電源をオフにします。
  • アイドル時のスリープ - アイドル時に省電力 (スリープ) 状態に入りますが、スリープを解除すると、すばやく元の状態に復帰できます。なお、実際にどのようなスリープ状態に入るかは、コンピュータに搭載されているハードウェアの性能によって異なります。
  • 起動/システム終了の予定 - 起動の予定は、あらかじめ設定した時刻にシステムを再起動するために使います。この機能をシステム終了の予定、書類の自動保存、およびブックマーク機能と組み合わせて使用すると、本質的な意味での省エネルギー機能を提供できるだけなく、システムを再起動したときにも非常に便利です。
  • 書類の自動保存 - この機能により、システム終了時に名称未設定または未保存の書類が自動的に保存されるようになります。このとき、ユーザーの操作または確認は必要ありません。
  • 告知サウンド - システムがスリープモードから復帰するとき、ユーザが指定したサウンドが再生されます。通常、モニタは暗転されているため、告知サウンドによって、ユーザはシステムが現在アクティブになっていることを確認することができます。

動作の大部分は、Mac OS の Power Manager またはさまざまな Macintosh 節電ハードウェアによって処理されますが、省エネルギー設定は、いつまたはどのような方法でそれぞれの動作を実行するかを決定するためのメカニズムをユーザに提供します。

また、省エネルギー設定 API は、省エネルギー機能へのアクセスを必要とする複数のアプリケーションに対して、ヒューマンインタフェースを同期させるための方法を提供します。

省エネルギー設定のコンポーネント
省エネルギー設定は、実際にはシステム機能拡張とコントロールパネルという 2 つの独立したコンポーネントから構成されています。

  • 省エネルギー設定コントロールパネル - このコントロールパネルは、システムメモリと初期設定ファイルに格納されている設定を操作します。
  • 省エネルギー設定機能拡張 - この機能拡張は、初期設定ファイルに格納されている設定を使って、目的の省エネルギー動作の実行を指令します。

図 1 には、省エネルギー設定の各コンポーネントの関係を示します。
Energy Saver
図 1 省エネルギー設定の概要

注意:
省エネルギー設定コントロールパネルは、実際にはコントロールパネル書類ではありません。これは、'APPC' という特殊なシグネチャを持つアプリケーションで、System 7.5.2 以降の Finder では、システムフォルダの上にドロップすると、自動的に“コントロールパネル”フォルダの中に置かれます (オートルートされます)。

このシグネチャを使うと、アプリケーションでありながら、同時に Finder のオートルート機能を利用できるコントロールパネルを開発することができます。

省エネルギー設定へのアクセス
アプリケーションも、省エネルギー設定コントロールパネルと同様のメカニズムを使って、省エネルギー初期設定ファイルを操作することができます。この処理は、省エネルギー設定 API を介して実現されます。この API の目的は、Power Manager によって提供されていない高度な節電機能をAPIを通じてサポートすることと、持続的な PRAM 設定を行わない Power Manager 関数に対して標準化された初期設定ファイルのサポートを提供することにあります。

省エネルギー設定機能拡張は、Egret または Cuda マイクロコントローラを搭載したすべての Macintosh に対して自動電源オン/オフ機能を提供します。また、ディスプレイの暗転、ハードディスクの回転停止、スリープモード、およびこれらすべての機能で使用するオプションの初期設定を管理します。初期設定の取得および設定変更を行うための呼び出しや、渡された初期設定に含まれる設定内容をアクティブにするための呼び出しなどが用意されています。

アプリケーションのデベロッパは、独自の機能を最初から作成するのではなく、できるかぎりこの省エネルギー設定機能を利用するようにしてください (少なくとも初期設定の更新については)。そうすれば、任意のアプリケーションで行ったユーザ設定が他のアプリケーションやコントロールパネルにも反映されるようになります。

省エネルギー設定 API がサポートされているかどうかの判定
特定の Macintosh のモデルで省エネルギー設定 API がサポートされているかどうかを判定するには、ゲシュタルト関数を使って 'wnkl' セレクタをチェックし、戻り値が non-nil であるかどうかを調べます。戻り値が non-nil であれば、省エネルギー設定 API はロードされています。

省エネルギー設定 API の呼び出し
省エネルギー設定マネージャの存在が確認できたら、ゲシュタルトセレクタ 'wnkl' の戻り値を介して、省エネルギー設定 API にアクセスすることができます。この戻り値は、最初のフィールドがメインルーチンへのポインタとなっているデータ構造体へのハンドルです。このルーチンへのインタフェースは次のようになります。
typedef pascal long (*ESRoutineCallPtr)(short selector, long parm1, long parm2);

デベロッパの便宜を考慮して、この TECHNOTE には EnergyServPubLib.c および EnergyServPub.h ファイルが添付されています。これらのファイルを使って、省エネルギー設定 API にアクセスしてください。

省エネルギー設定 API がロードされていて使用可能であるかどうかを判定するには、EnergyServPubLib から ESGetINITVersion 関数を呼び出すことをお勧めします。インタフェースコードは、適切で安全なチェックを実行します。

省エネルギー設定 API

ESGlobals 構造体
省エネルギー設定機能拡張は、一連の初期設定グローバルを管理します。これらのグローバルは、次のような ESGlobals 構造体で定義されています。

typedef struct {
    short version;                    // データ構造体 version (1)
    long EnergySaverFeatures;         // ES 機能 (まだ使用されていない)

    // アイドル時のスリープとシステム終了のタイミング
    unsigned long dimIdleTime;       // ディスプレイのスリープまでの時間 (分単位)
    unsigned long spinDownIdleTime;  // HD 回転停止までの時間 (分単位)
    //デスクトップは 30分以上でなければならない
    unsigned long sleepIdleTime;     // システムスリープまでの時間 (分単位)
    short idleFlags;                 // サポートされているアイドル時の機能
    // 0001 = dimIdleTime を有効に
    // 0002 = spinDownIdleTime を有効に
    // 0008 = スリープの代わりにシステム終了
    // 0010 = HD を回転停止にしない
    // 0020 = 電源をオフにした後で再起動
    short reserved1;
    short reserved2;

    // スリープとシステム終了のスケジュール
    // これらは午前 0 時 (実際には 12:00:01 AM) を起点とする分単位の時間。
    // 次のフィールドは、省エネルギー設定アプリケーション HI によってのみ使用される。
    // アプリケーションは、SDxxxTime および SWUxxxTime フィールドを使って、
    // システム終了とスリープ解除の時刻を処理する必要がある。
    unsigned long mainWUTime; // コンピュータが起動する時刻
    unsigned long mainSDTime; // コンピュータが終了する時刻
    // 起動またはシステム終了が有効になる曜日を指定するビットフィールド
    short WUFields; // 起動
    short SDFields; // 終了
    
    // 月曜日 = 0x0001
    // 火曜日 = 0x0002
    // 水曜日 = 0x0004
    // 木曜日 = 0x0008
    // 金曜日 = 0x0010
    // 土曜日 = 0x0020
    // 日曜日 = 0x0040
    // 毎日 = 0x007F
    // 有効 = 0x0080
    
    // 次のフィールドでは、各曜日について、起動と終了を行う複数の時刻を
    // 指定できる。特定の曜日を対象に複数の予定を設定する必要がない場合は、
    // すべての WU フィールドを mainWUTime に設定し、すべての SD フィールドを
    // mainSDTime に設定する。

    // 終了時刻
    unsigned long SDMonTime;
    unsigned long SDTueTime;
    unsigned long SDWedTime;
    unsigned long SDThuTime;
    unsigned long SDFriTime;
    unsigned long SDSatTime;
    unsigned long SDSunTime;

    // 起動時刻
    unsigned long WUMonTime;
    unsigned long WUTueTime;
    unsigned long WUWedTime;
    unsigned long WUThuTime;
    unsigned long WUFriTime;
    unsigned long WUSatTime;
    unsigned long WUSunTime;

    // スリープ初期設定情報
    short reserved3;
    short WUSoundResID; // スリープを解除するときに再生する 'snd ' の ID
    short reserved4;

    // システム起動初期設定情報
    short reserved5;
    short AppFlags;           // 常に新しい初期設定ファイルに 0 を設定する
    short NonComplianceFlag;  // マシンのスリープ時に 30W 以上が消費される場合にセット
    

    // システム終了初期設定情報
    short SDIdleTime;
    short SDNotifyFlags; // 告知オプション
    // 0020 = システム終了時に告知
    // 0001 = アイコンの点滅
    // 0002 = テキストメッセージを表示
    // 0004 = サウンドの再生
    // 0008 = ファイルの保存
    // 8008 = スリープ時に保存しない
    // 0400 = スリープ解除時に告知サウンドを再生
    // 0800 = 電話の信号検出時にスリープ解除
    // 1000 = 電源ライトの点滅 (ポータブルモデル)
    // 2000 = スリープ時に消音
    
    short SDNotifyDelayTime;
    short SDSoundResID; // システム終了時に再生する 'snd ' の ID
    short reserved6;
    short reserved7;

    // 省エネルギー一般初期設定情報
    long reserved8;
    Boolean reserved9;
} ESGlobals, *ESGlobalsPtr, **ESGlobalsHand;


ESLoadPreferences
ESLoadPreferences は、初期設定ファイルから現在の設定を再ロードし、省エネルギー設定グローバルを更新します。また、アプリケーションで使用するために設定のコピーを返します。

PROTOTYPE

    OSErr ESLoadPreferences(ESGlobalsPtr thePrefs);

    thePrefs    ESGlobals 構造体へのポインタ。
RESULT CODE
    File Read Errors、Memory Errors、ES Errors

注意
これはシステム起動時に省エネルギー設定機能拡張によって呼び出されます。設定値を保存されている初期設定に戻そうとする場合以外は、アプリケーションからこの呼び出しを行わないでください。

ESLoadPreferences はマシンのステータスを更新しません。設定値を有効にするには、この呼び出しを行った後で ESRefreshSettings() を呼び出す必要があります。


ESGetPreferences
ESGetPreferences は、アプリケーションで使用するために現在の設定のコピーを返します。アプリケーションから、すべての省エネルギー設定情報に対する現在のユーザ設定値を取得するには、通常この呼び出しを使います。

PROTOTYPE
    OSErr ESGetPreferences(ESGlobalsPtr thePrefs);

    thePrefs    ESGlobals 構造体へのポインタ。
RESULT CODE
    Memory Errors、ES Errors

ESSetPreferences
ESSetPreferences は、省エネルギー設定グローバルに渡される設定をコピーします。

PROTOTYPE
    OSErr ESSetPreferences(ESGlobalsPtr thePrefs);

    thePrefs    ESGlobals 構造体へのポインタ。
RESULT CODE
    Memory Errors、ES Errors

注意
ESSetPreferences は、Power Manager を呼び出して設定を有効にするわけではありません。また、新しい起動や終了の時刻を設定することもありません。これを呼び出した後で、ESRefreshSettings() を呼び出し、新しい設定を有効にする必要があります。


ESRefreshSettings
ESRefreshSettings は、現在の設定をアクティブにし、そのために必要なすべての Power Manager 呼び出しを実行します。また、現在の告知設定を実行するために起動および終了タスクで必要となるものをすべてインストールします。

PROTOTYPE
    OSErr ESRefreshSettings();
RESULT CODE
    ES Errors

ESSavePreferences
ESSavePreferences は 3 つの処理を実行します。まず、ESSetPreferences() を呼び出して、渡された設定を転送します。さらに、ESRefreshSettings() を呼び出して、それらの設定をアクティブにします。最後に、それらの設定を初期設定ファイルに保存し、ブートを繰り返してもそれらの設定が保持されるようにします。アプリケーションから省エネルギー設定に持続的な更新を加えるには、通常この呼び出しを使います。

PROTOTYPE
    OSErr ESSavePreferences(ESGlobalsPtr thePrefs);

    thePrefs    ESGlobals 構造体へのポインタ。
RESULT CODE
    File Errors、Memory Errors、ES Errors

注意
ESGlobals レコードの WUSoundResID または SDSoundResID フィールドで snd リソースを指定するときは、それらのリソースが現在のリソースチェーン内に存在していることを確認してください。この処理は重要です。なぜなら、ESSavePreferences はこれらのリソースをシステムヒープ内にロード、デタッチ、およびコピーするからです。


ESAddNoteProc
ESAddNoteProc を使うと、省エネルギー設定通知応答プロシージャ (Energy Saver notification response procedure) をインストールすることができます。この Notifier は、省エネルギー初期設定が読み書きされることをアプリケーションに通知するために使えます。

PROTOTYPE
    OSErr ESAddNoteProc(ESNotifyProcPtr theProc, long data);
    
    theProc    通知応答プロシージャへのポインタ。
    data       データプロシージャに渡すためのユーザ定義参照。
RESULT CODE
    ES Errors
関連項目
省エネルギー設定通知関数と ESRemoveNoteProc 関数。

ESRemoveNoteProc
ESRemoveNoteProc を使うと、省エネルギー設定通知応答プロシージャ (Energy Saver notification response procedure) を削除することができます。

PROTOTYPE
    OSErr ESRemoveNoteProc(ESNotifyProcPtr theProc);

    theProc    通知応答プロシージャへのポインタ。
RESULT CODE
    ES Errors
関連項目

省エネルギー設定通知関数と ESAddNoteProc 関数。
省エネルギー設定通知関数 (Energy Saver Notification Function)
ESAddNoteProc 関数によってインストールを行うと、通知プロシージャは、アプリケーションが省エネルギー初期設定にアクセスしようとするたびに呼び出されます。

この Notifier は、省エネルギー初期設定が読み出され、それがアプリケーションに返される前に、xNoteESDataReq セレクタを使って呼び出されます。

また、いずれかのアプリケーションが xNoteNewESData セレクタを使って省エネルギー設定機能拡張に新しい初期設定をコピーするときにも通知が行われます。このとき、グローバルをコピーしたデータを変更することはできますが、それが適用される前に変更を行います。

この関数を使うと、アプリケーションは ESGlobals の表示を動的に更新したり、データ値のフィルタ処理を実行することができます。

PROTOTYPE
    pascal long MyESNotifyProc (short selector, ESGlobalsPtr theData);

    selector    発生した動作のタイプを示す値。
                このフィールドの意味については、次の説明を参照してください。
    thePrefs    ESGlobals 構造体へのポインタ。
説明
次に、有効な動作のタイプを示します。

値名 説明
xNoteNewESData 1 新しい ESGlobals が書き出された。
xNoteESDataReq 2 ESGlobals がリクエストされた。


ESRestoreDefaults
ESRestoreDefaults は、システムの設定を、機能拡張のリソースデータに格納されているマシンに依存したデフォルトの設定に戻すために使います。省エネルギー設定をインストール時のデフォルトの設定に戻したいときには、この呼び出しを使ってください。
また、ESGlobals のコピーを取得して、それらのデフォルトの内容を確認することもできます。ESGlobals の取得は、アプリケーションの HI を更新し、現在のマシンのステータスを反映させるために役立ちます。
この関数は、Apple 純正の“省略値に戻す”コマンドに対応する機能を実現するために使うこともできます。

PROTOTYPE
    OSErr ESRestoreDefaults(ESGlobalsPtr thePrefs);

    thePrefs    ESGlobals 構造体へのポインタ。
RESULT CODE
    Memory Errors、ES Errors

ESGetUnsavedFolder
この呼び出しは、自動保存機能で使用する“名称未設定書類”を保存するフォルダへのパス名を取得するために使います。

PROTOTYPE
    OSErr ESGetUnsavedFolder(Ptr theString);

    theString    名称未設定書類を保存するフォルダの現在のパス名がコピーされる文字列へのポインタ。
RESULT CODE
    Memory Errors、ES Errors

ESSetUnsavedFolder
ESSetUnsavedFolder では、自動保存機能で使用する名称未設定書類を保存するフォルダへのパス名を設定することができます。

PROTOTYPE
    OSErr ESSetUnsavedFolder(Ptr theString);

    theString    使用する名称未設定書類フォルダのパス名を含む文字列へのポインタ。
RESULT CODE
    Memory Errors、ES Errors

ESGetINITVersion
この呼び出しは、インストールされている省エネルギー設定機能拡張ファイルの現在のバージョン番号を取得するために使います。この呼び出しは、適切なバージョンの省エネルギー機能拡張を使用しているかどうか検証するときに使います。

PROTOTYPE
    OSErr ESGetINITVersion(Handle* theVers);

    theVers    バージョン構造体へのポインタ。
RESULT CODE
    ES Errors

要約
進化を続ける Macintosh プラットフォームで、省エネルギー設定 API は節電機能の監視と制御を行うための一貫した方法を提供します。さらに、省エネルギー設定 API は、サードパーティ製のアプリケーションに省エネルギー設定を利用するためのチャンスを与えます。

参考文献
Inside Macintosh: Devices, Chapter 6, Power Manager Reference
Technote 1046: Inside Macintosh: Devices, Power Manager Addenda
Technote 1079: Power Management & Servers: Auto Restart From Power Failure

更新日: 1997 年 3 月 18 日