# PM_[Append|Prepend|Insert]*SleepCallback

## 構文

      #include <nitro/spi.h>

      void PM_AppendPreSleepCallback( PMSleepCallbackInfo* info );
      void PM_PrependPreSleepCallback( PMSleepCallbackInfo* info );
      void PM_InsertPreSleepCallback( PMSleepCallbackInfo* info, int priority );

      void PM_AppendPostSleepCallback( PMSleepCallbackInfo* info );
      void PM_PrependPostSleepCallback( PMSleepCallbackInfo* info );
      void PM_InsertPostSleepCallback( PMSleepCallbackInfo* info, int priority );

      typedef void (*PMSleepCallback)( void* );

## 引数

info | 追加するコールバックの情報を含んだ構造体へのポインタ
priority | 優先度。コールバックリストの登録順序を決定するのに使用します。0〜255 の値を取ります。

## 返り値

なし。

## 説明

スリープモード時のコールバックを登録します。

`〜PreSleepCallback()` はスリープモードに入る直前のコールバックを登録します。`〜PostSleepCallback()` はスリープモードから復帰した後のコールバックを登録します。

コールバックは `void*` 型引数を1つ取る `void` 型関数です。

コールバックはリストで接続され、複数登録することが可能です。コールバックリストはスリープモードに入る直前に呼び出されるものと、スリープモードから復帰した後のものの2つに分けることが出来ます。それぞれのコールバックには優先度が設定されており、リスト中で昇順に並べられており、コールバックの実行順序もそれに従います。これらのコールバック関数は `PM_GoSleepMode()` の中から呼び出されます。

info はコールバックの情報構造体へのポインタで、この構造体に `PM_SetSleepCallbackInfo()` でコールバックとコールバック引数を登録します。本関数では、info をコールバックリストに登録します。すでに info がリストに結合されている場合は、本関数では何も行わずに戻ります。priority はコールバック優先度でコールバックリストに登録する際のリストの中の順序を決定するのに用いられます。priority は -255 (`PM_CALLBACK_PRIORITY_MIN`) 〜 255 (`PM_CALLBACK_PRIORITY_MAX`) の値を取ります。

`PM_AppendPreSleepCallback()` は優先度を 255 としてスリープ直前コールバックリストの末尾にコールバックを登録します。

`PM_PrependPreSleepCallback()` は優先度を -255 としてスリープ直前コールバックリストの先頭にコールバックを登録します。

`PM_InsertPreSleepCallback()` は指定の優先度でスリープ直前コールバックリストにコールバックを登録します。

`PM_AppendPostSleepCallback()` は優先度を 255 としてスリープ復帰後コールバックリストの末尾にコールバックを登録します。

`PM_PrependPostSleepCallback()` は優先度を -255 としてスリープ復帰後コールバックリストの先頭にコールバックを登録します。

`PM_InsertPostSleepCallback()` は指定の優先度でスリープ復帰後コールバックリストにコールバックを登録します。

Append 関数で登録される場合、同じ優先度255のコールバックが存在した場合にはその末尾に登録されます。Prepend 関数で登録される場合、同じ優先度0 のコールバックが存在した場合にはその先頭に登録されます。Insert 関数で登録される場合、同じ優先度のコールバックが存在した場合にはその末尾に登録されます。つまり、Insert 関数で優先度を255と指定する場合と Append 関数は同じですが、Insert 関数で 優先度を -255 と指定する場合と Prepend 関数は異なります。

コールバックの削除

リストからコールバックを削除するには `PM_DeletePreSleepCallback()` または `PM_DeletePostSleepCallback()` を呼んでください。

例

> `//---- sleep callback info
> PMSleepCallbackinfo c1info;
> PMSleepCallbackinfo c2info;
> //---- Callback before sleep mode
> void myCallback1( void* )
> {
> OS_Printf( "go to sleep mode.\n" );
> }
> //---- Callback after sleep mode
> void myCallback2( void* )
> {
> OS_Printf( "now return from sleep mode.\n" );
> }
> //---- Main
> void NitroMain( void )
> {
> ：
> //---- set callback to callback info
> PM_SetSleepCallbackInfo( &c1info, myCallback1, NULL );
> PM_SetSleepCallbackInfo( &c2info, myCallback2, NULL );
> //---- set pre-callback for sleep mode
> PM_AppendPreSleepCallback( &c1info );
> //---- set post-callback for sleep mode
> PM_AppendPostSleepCallback( &c2info );
> //---- go to sleep mode
> PM_GoSleepMode(...);
> ：
> }`

## 参照

`PM_Init, PM_GoSleepMode,
PM_DeletePreSleepCallback, PM_DeletePostSleepCallback,`
`PM_SetSleepCallbackInfo`

## 履歴

2008/07/15 ユーザ開放分の優先度の最低値を 0 から -255 へ変更
2008/06/12 優先度設定を追加
2005/09/14 `PM_SetSleepCallback` → `PM_SetSleepCallbackInfo
` 2005/06/02 コールバックの呼び元を明記した
2004/10/06 初版