Windows版 iTRONサービスコールの作成 (時間管理機能)
(その7)
	アラーム・ハンドラを起動または停止するサービスコールは以下のとおりです。
| サービスコール名 | 説明 | 
|---|---|
| sta_alm | アラーム・ハンドラを起動します。 | 
| stp_alm | アラーム・ハンドラを停止します。 | 
※ アラーム・ハンドラの起動および停止はVer4.0でのみサポートされます。
アラーム・ハンドラを起動するには以下のサービスコールを使用します。
    ER sta_alm( ID almid, RELTIM almtim )
	| 引数 | 説明 | 
|---|---|
| almid | アラーム・ハンドラID番号。 | 
| almtim | アラーム・ハンドラの起動時刻。 | 
| 戻り値 | 説明 | 
|---|---|
| E_OK | 正常終了。 | 
| E_ID | 範囲外のアラーム・ハンドラID番号。 | 
| E_NOEXS | 指定したアラーム・ハンドラID番号は登録されていない。 | 
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの起動.
 *
 *  @param  [in]    almid   アラーム・ハンドラID番号.
 *
 *  @retval エラーコード.
 */
ER      sta_alm( ID almid, RELTIM almtim )
{
    ER ercd;
    wi_CommonLock();
    //! アラーム・ハンドラを起動する.
    ercd = wi_StartAlarmHadler( almid, ((DWORDLONG)(almtim.utime) << 32) + (DWORDLONG)(almtim.ltime) );
    wi_CommonUnlock();
    return ercd;
}
    アラーム・ハンドラの起動関数
アラーム・ハンドラの起動関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの起動.
 *
 *  @param  [in]    no      アラーム・ハンドラ番号.
 *  @param  [in]    almtim  起動時刻.
 *
 *  @retval エラーコード.
 */
ER      wi_StartAlarmHadler( INT no, DWORDLONG almtim )
{
    ER          ercd;
    WIALMOBJ    *p;
    //! アラーム・ハンドラ番号のオブジェクトを取得する.
    p = (WIALMOBJ *)wi_FindObject( no, TMAX_MAXALM, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! アラーム・ハンドラの起動時刻を現在時刻からの相対時刻でセットする.
    p->AlmTime = wi_GetSystemTime() + almtim;
    //! アラーム・ハンドラの動作状態を「起動中」にする.
    p->Active  = TRUE;
    return E_OK;
}
	アラーム・ハンドラの起動関数は以下のような処理を行います。
- 引数で指定されたアラーム・ハンドラ番号に該当するアラーム・ハンドラ・オブジェクトを取り出します。
- 現在時刻を取得してアラーム・ハンドラの起動時刻を現在時刻からの相対時刻で計算します。
- アラーム・ハンドラの動作状態を「起動中」にして処理を終了します。
アラーム・ハンドラを停止するには以下のサービスコールを使用します。
    ER stp_alm( ID almid )
	| 引数 | 説明 | 
|---|---|
| almid | アラーム・ハンドラID番号。 | 
| 戻り値 | 説明 | 
|---|---|
| E_OK | 正常終了。 | 
| E_ID | 範囲外のアラーム・ハンドラID番号。 | 
| E_NOEXS | 指定したアラーム・ハンドラID番号は登録されていない。 | 
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの停止.
 *
 *  @param  [in]    almid   アラーム・ハンドラID番号.
 *
 *  @retval エラーコード.
 */
ER      stp_alm( ID almid )
{
    ER ercd;
    wi_CommonLock();
    //! アラーム・ハンドラを停止する.
    ercd = wi_StopAlarmHadler( almid );
    wi_CommonUnlock();
    return ercd;
}
	アラーム・ハンドラの停止関数
アラーム・ハンドラの停止関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの停止.
 *
 *  @param  [in]    no      アラーム・ハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      wi_StopAlarmHadler( INT no )
{
    ER          ercd;
    WIALMOBJ    *p;
    //! アラーム・ハンドラ番号のオブジェクトを取得する.
    p = (WIALMOBJ *)wi_FindObject( no, TMAX_MAXALM, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! アラーム・ハンドラの動作状態を「停止中」にする.
    p->Active = FALSE;
    return E_OK;
}
	アラーム・ハンドラの停止関数は以下のような処理を行います。
- 引数で指定されたアラーム・ハンドラ番号に該当するアラーム・ハンドラ・オブジェクトを取り出します。
- アラーム・ハンドラの動作状態を「停止中」にして処理を終了します。