Windows版 iTRONサービスコールの作成 (時間管理機能)
(その6)

アラーム・ハンドラを登録・生成する

アラーム・ハンドラを登録または生成するサービスコールは以下のとおりです。


サービスコール名説明
def_alm

アラーム・ハンドラを登録します。(Ver3.0のみ)

cre_alm

アラーム・ハンドラID番号を指定してアラーム・ハンドラを生成します。(Ver4.0のみ)

acre_alm

アラーム・ハンドラID番号を自動割付けでアラーム・ハンドラを生成します。(Ver4.0のみ)

del_alm

アラーム・ハンドラを削除します。(Ver4.0のみ)

※ Ver4.0ではアラーム・ハンドラを生成しただけでは、アラーム・ハンドラは起動しませんので、アラーム・ハンドラの生成後にアラーム・ハンドラの起動を行わないといけません。

※ Ver3.0ではアラーム・ハンドラの削除はありませんので、削除する場合はアラーム・ハンドラの再登録でアラーム・ハンドラの起動アドレスに NULL を設定します。

アラーム・ハンドラを登録する (Ver3.0のみ)

アラーム・ハンドラを登録するには以下のサービスコールを使用します。



    ER 	def_alm( HNO almno, const T_DALM *pk_dalm )
	

引数説明
almno

アラーム・ハンドラ番号。

pk_dalm

アラーム・ハンドラ定義情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のアラーム・ハンドラ番号。

E_PAR

パラメータエラー。


アラーム・ハンドラ定義情報構造体(T_DALM)は以下のとおりです。

メンバ名説明
exinf

拡張情報。

almatr

アラーム・ハンドラ属性。

アラーム・ハンドラの起動方法を指定します。

  • TA_ASMの場合、アセンブリ言語用インターフェースで起動します。
  • TA_HLNGの場合、高級言語用インターフェースで起動します。
almhdr

アラーム・ハンドラのアドレス。

tmmode

起動時刻指定モード。

  • TTM_ABSの場合、絶対時刻で起動時刻を指定します。
  • TTM_RELの場合、相対時刻で起動時刻を指定します。
almtim

アラーム・ハンドラの起動時刻。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラ定義.
 *
 *  @param  [in]    almno   アラーム・ハンドラ番号.
 *  @param  [in]    pk_dalm アラーム・ハンドラ定義情報.
 *
 *  @retval エラーコード.
 */
ER      def_alm( HNO almno, const T_DALM *pk_dalm )
{
    ER          ercd;
    WIALMOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_dalm ){
        return E_PAR;
    }
    //! アラーム・ハンドラ登録情報をコピーする.
    memset( &obj, 0, sizeof(WIALMOBJ) );
    obj.Attribute = pk_dalm->almatr;
    obj.AlmAdr    = pk_dalm->almhdr;
    obj.TimeMode  = pk_dalm->tmmode;
    obj.AlmTime   = ((DWORDLONG)(pk_dalm->almtim.utime) << 32) + (DWORDLONG)(pk_dalm->almtim.ltime);
    obj.ExtInfo   = pk_dalm->exinf;
    obj.Active    = pk_dalm->almhdr ? TRUE : FALSE;

    //! アラーム・ハンドラの起動時刻を現在時刻からの相対時刻にする.
    if( (obj.TimeMode & TTM_REL) != 0 ){
        obj.AlmTime += wi_GetSystemTime();
    }
    wi_CommonLock();

    //! アラーム・ハンドラを登録する.
    ercd = wi_DefineAlarmHadler( almno, &obj, TRUE );

    wi_CommonUnlock();
    return ercd;
}
	

起動時刻指定モードが相対時刻の場合、現在時刻を取得して現在時刻に起動時刻を加算しアラーム・ハンドラの起動時刻を絶対時刻に変換します。

アラーム・ハンドラの定義情報をコピーして、登録済みIDの場合の上書きを許可してアラーム・ハンドラの登録関数を呼び出します。

アラーム・ハンドラID番号を指定してアラーム・ハンドラを生成する (Ver4.0のみ)

アラーム・ハンドラID番号を指定してアラーム・ハンドラを生成するには以下のサービスコールを使用します。



    ER cre_alm( ID almid, const T_CALM *pk_calm )
	

引数説明
almid

アラーム・ハンドラID番号。

pk_calm

アラーム・ハンドラ生成情報構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のアラーム・ハンドラID番号。

E_PAR

パラメータエラー。

E_OBJ

指定したアラーム・ハンドラID番号は登録済み。


アラーム・ハンドラ生成情報構造体(T_CALM)は以下のとおりです。

メンバ名説明
almatr

アラーム・ハンドラ属性。

アラーム・ハンドラの起動方法を指定します。

  • TA_ASMの場合、アセンブリ言語用インターフェースで起動します。
  • TA_HLNGの場合、高級言語用インターフェースで起動します。
exinf

拡張情報。

almhdr

アラーム・ハンドラのアドレス。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの生成.
 *
 *  @param  [in]    almid   アラーム・ハンドラID番号.
 *  @param  [in]    pk_calm アラーム・ハンドラ生成情報構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      cre_alm( ID almid, const T_CALM *pk_calm )
{
    ER          ercd;
    WIALMOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_calm ){
        return E_PAR;
    }
    //! アラーム・ハンドラ登録情報をコピーする.
    memset( &obj, 0, sizeof(WIALMOBJ) );
    obj.Attribute = pk_calm->almatr;
    obj.ExtInfo   = pk_calm->exinf;
    obj.AlmAdr    = pk_calm->almhdr;

    wi_CommonLock();

    //! アラーム・ハンドラを登録する.
    ercd = wi_DefineAlarmHadler( almid, &obj, FALSE );

    wi_CommonUnlock();
    return ercd;
}
	

アラーム・ハンドラの生成情報をコピーして、登録済みIDの場合の上書きを禁止してアラーム・ハンドラの登録関数を呼び出します。

アラーム・ハンドラID番号を自動割付けでアラーム・ハンドラを生成する (Ver4.0のみ)

アラーム・ハンドラID番号を自動割付けでアラーム・ハンドラを生成するには以下のサービスコールを使用します。



    ER acre_alm( const T_CALM *pk_calm )
	

引数説明
pk_calm

アラーム・ハンドラ生成情報構造体のポインタ。

戻り値説明
E_PAR

パラメータエラー。

E_NOID

ID番号不足。

上記以外の正数

生成したアラーム・ハンドラ番号。(正常終了)


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの生成 (ID番号自動割り付け).
 *
 *  @param  [in]    pk_calm アラーム・ハンドラ生成情報構造体のポインタ.
 *
 *  @retval 生成したアラーム・ハンドラのハンドラIDまたはエラーコード.
 */
ER_ID   acre_alm( const T_CALM *pk_calm )
{
    ER_ID       ercd;
    ID          almid;
    WIALMOBJ    obj;

    //! 引数が不正な場合はエラーにする.
    if( !pk_calm ){
        return E_PAR;
    }
    //! アラーム・ハンドラ登録情報をコピーする.
    memset( &obj, 0, sizeof(WIALMOBJ) );
    obj.Attribute = pk_calm->almatr;
    obj.ExtInfo   = pk_calm->exinf;
    obj.AlmAdr    = pk_calm->almhdr;

    wi_CommonLock();

    for( almid = 1; almid < TMAX_MAXALM; almid++ ){

        //! アラーム・ハンドラを登録する.
        ercd = wi_DefineAlarmHadler( almid, &obj, FALSE );
        if( ercd == E_OK ){
            ercd  = almid;
            break;
        }
    }
    if( ercd == E_OBJ ){
        ercd  = E_NOID;
    }
    wi_CommonUnlock();
    return ercd;
}
	

アラーム・ハンドラID番号を自動割付けでアラーム・ハンドラを生成する関数は以下のような処理を行います。

  • cre_alm()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、登録済みIDの場合の上書きを禁止してアラーム・ハンドラ登録関数を呼び出します。
  • 生成するアラーム・ハンドラのID番号を1~TMAX_MAXALMに+1づつカウントアップして、空いているID番号を探してアラーム・ハンドラを生成します。
  • アラーム・ハンドラが生成できた場合、戻り値を生成したアラーム・ハンドラのID番号にして処理を終了します。
  • 1~TMAX_MAXALMの全てのID番号が使用中の場合、エラーコードが「E_OBJ(アラーム・ハンドラ登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。

アラーム・ハンドラ登録関数

アラーム・ハンドラ登録関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラ定義.
 *
 *  @param  [in]    no      アラーム・ハンドラ番号.
 *  @param  [in]    obj     アラーム・ハンドラ.オブジェクト構造体のポインタ.
 *  @param  [in]    ovr     TRUE = 登録済みIDに上書き.
 *
 *  @retval エラーコード.
 */
ER      wi_DefineAlarmHadler( INT no, const WIALMOBJ *obj, BOOL ovr )
{
    ER          ercd;
    WIALMOBJ    *p;

    p = (WIALMOBJ *)wi_GetObject( no, ObjList );
    if( p ){
        //! 登録済みハンドラに上書き禁止の場合はエラー終了にする.
        if( !ovr ){
            return E_OBJ;
        }
        //! 既に登録しているハンドラ番号の場合は登録を上書きする.
        p->Attribute = obj->Attribute;
        p->AlmAdr    = obj->AlmAdr;
        p->TimeMode  = obj->TimeMode;
        p->AlmTime   = obj->AlmTime;
        p->ExtInfo   = obj->ExtInfo;
        p->Active    = obj->Active;
        return E_OK;
    }
    //! アラーム・ハンドラ・オブジェクトを作成する.
    p = (WIALMOBJ *)wi_CreateObject( no, TMAX_MAXALM, sizeof(WIALMOBJ), obj, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! リストにアラーム・ハンドラを追加する.
    wi_AddObject( (WIHDR *)p, &ObjList );
    return E_OK;
}
	

アラーム・ハンドラ登録関数は以下のような処理を行います。

  • 既に生成されているアラーム・ハンドラ番号の場合、上書きが許可されていれば、既存のアラーム・ハンドラ・オブジェクト構造体に、新たに登録するアラーム・ハンドラ・オブジェクト構造体を上書きします。上書きが許可されていない場合はエラーで終了します。
  • 生成されていないアラーム・ハンドラ番号の場合、新しいアラーム・ハンドラ・オブジェクトを生成します。
  • アラーム・ハンドラ・リストに生成したアラーム・ハンドラ・オブジェクトをリンクして処理を終了します。

アラーム・ハンドラを削除する

アラーム・ハンドラを削除するには以下のサービスコールを使用します。



    ER del_alm( ID almid )
	

引数説明
almid

アラーム・ハンドラID番号。

戻り値説明
E_OK

正常終了。

E_ID

範囲外のアラーム・ハンドラID番号。

E_NOEXS

指定したアラーム・ハンドラID番号は登録されていない。


・サービスコールのソースコードは以下のようになります。


/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの削除.
 *
 *  @param  [in]    almid   アラーム・ハンドラID番号.
 *
 *  @retval エラーコード.
 */
ER      del_alm( ID almid )
{
    ER ercd;

    wi_CommonLock();

    //! アラーム・ハンドラを削除する.
    ercd = wi_DeleteAlarmHadler( almid );

    wi_CommonUnlock();
    return ercd;
}
	

削除するアラーム・ハンドラのID番号を引数としてアラーム・ハンドラ削除関数を呼び出します。

アラーム・ハンドラ削除関数

アラーム・ハンドラ削除関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  アラーム・ハンドラの削除.
 *
 *  @param  [in]    no      アラーム・ハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      wi_DeleteAlarmHadler( INT no )
{
    ER          ercd;
    WIALMOBJ    *p;

    //! アラーム・ハンドラ番号のオブジェクトを取得する.
    p = (WIALMOBJ *)wi_FindObject( no, TMAX_MAXALM, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! リストから該当するアラーム・ハンドラを取り除く.
    wi_DelObject( (WIHDR *)p, &ObjList );

    //! アラーム・ハンドラ・オブジェクト構造体を解放する.
    SAFE_RELEASE( p );
    return E_OK;
}
	

アラーム・ハンドラ削除関数は以下のような処理を行います。

  • 引数で指定されたアラーム・ハンドラ番号に該当するアラーム・ハンドラ・オブジェクトを取り出します。
  • アラーム・ハンドラ・オブジェクトのリストから削除するオブジェクトを外します。
  • アラーム・ハンドラ・オブジェクトのために確保したメモリを解放して処理を終了します。


Windowsは米国Microsoft Corporationの登録商標です。