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

周期起動ハンドラの状態を参照する

周期起動ハンドラの状態を参照するサービスコールは以下のとおりです。


サービスコール名説明
ref_cyc

周期起動ハンドラの状態を取得します。

Ver3.0と4.0では関数名は同じですが、引数の順番が逆になりますので注意してください。

周期起動ハンドラの状態を取得する (Ver3.0)

Ver3.0で周期起動ハンドラの状態を取得するには以下のサービスコールを使用します。



    ER ref_cyc( T_RCYC *pk_rcyc, HNO cycno )
	

引数説明
pk_rcyc

周期起動ハンドラ状態を格納する構造体のポインタ。

cycno

周期ハンドラ番号。

戻り値説明
E_OK

正常終了。

E_ID

範囲外の周期ハンドラ番号。

E_NOEXS

指定した周期ハンドラ番号は登録されていない。

E_PAR

パラメータエラー。


周期起動ハンドラ状態を格納する構造体(T_RCYC)は以下のとおりです。

メンバ名説明
exinf拡張情報。
lfttim次の起動周期までの時間。
cycact

周期ハンドラの活性状態。

  • TCY_OFFの場合、周期ハンドラは停止中です。
  • TCY_ONの場合、周期ハンドラは起動中です。


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


/****************************************************************************/
/*!
 *  @brief  周期ハンドラの状態参照.
 *
 *  @param  [out]   pk_rcyc 周期ハンドラ状態を格納する構造体のポインタ.
 *  @param  [in]    cycno   周期ハンドラ番号.
 *
 *  @retval エラーコード.
 */
ER      ref_cyc( T_RCYC *pk_rcyc, HNO cycno )
{
    ER          ercd;
    WICYCSTAT   sts;

    //! 引数が不正な場合はエラーにする.
    if( !pk_rcyc ){
        return E_PAR;
    }
    wi_CommonLock();

    //! 周期ハンドラの状態を取得する.
    ercd = wi_RefarenceCycleHadler( cycno, &sts );
    if( ercd == E_OK ){
        pk_rcyc->exinf        = sts.ExtInfo;
        pk_rcyc->lfttim.utime = (short)(sts.LeftTime >> 32 & 0x0000FFFF);
        pk_rcyc->lfttim.ltime = (long )(sts.LeftTime       & 0xFFFFFFFF);
        pk_rcyc->cycact       = (sts.Active ? TCY_ON : TCY_OFF);
    }
    wi_CommonUnlock();
    return ercd;
}
	

周期起動ハンドラ状態を格納する構造体のポインタがNULLの場合エラーにします。

周期起動ハンドラ状態を取得する関数を呼び出して現在の周期起動ハンドラの状態を取得し引数の構造体に格納します。

周期起動ハンドラの状態を取得する (Ver4.0)

Ver4.0で周期起動ハンドラの状態を取得するには以下のサービスコールを使用します。



    ER ref_cyc( ID cycid, T_RCYC *pk_rcyc )
	

引数説明
cycid

周期ハンドラID番号。

pk_rcyc

周期起動ハンドラ状態を格納する構造体のポインタ。

戻り値説明
E_OK

正常終了。

E_ID

範囲外の周期ハンドラID番号。

E_NOEXS

指定した周期ハンドラID番号は登録されていない。

E_PAR

パラメータエラー。


周期起動ハンドラ状態を格納する構造体(T_RCYC)は以下のとおりです。

メンバ名説明
cycstat

周期ハンドラの動作状態。

  • TCYC_STPの場合、周期ハンドラは停止中です。
  • TCYC_STAの場合、周期ハンドラは起動中です。
lefttim次の起動周期までの時間。


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


/****************************************************************************/
/*!
 *  @brief  周期ハンドラの状態参照.
 *
 *  @param  [in]    cycid   周期ハンドラID番号.
 *  @param  [out]   pk_rcyc 周期ハンドラ状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      ref_cyc( ID cycid, T_RCYC *pk_rcyc )
{
    ER          ercd;
    WICYCSTAT   sts;

    //! 引数が不正な場合はエラーにする.
    if( !pk_rcyc ){
        return E_PAR;
    }
    wi_CommonLock();

    //! 周期ハンドラの状態を取得する.
    ercd = wi_RefarenceCycleHadler( cycid, &sts );
    if( ercd == E_OK ){
        pk_rcyc->cycstat       = sts.Active ? TCYC_STA : TCYC_STP;
        pk_rcyc->lefttim.utime = (short)(sts.LeftTime >> 32 & 0x0000FFFF);
        pk_rcyc->lefttim.ltime = (long )(sts.LeftTime       & 0xFFFFFFFF);
    }
    wi_CommonUnlock();
    return ercd;
}
	

周期起動ハンドラ状態を格納する構造体のポインタがNULLの場合エラーにします。

周期起動ハンドラ状態を取得する関数を呼び出して現在の周期起動ハンドラの状態を取得し引数の構造体に格納します。

周期起動ハンドラの状態取得関数

周期起動ハンドラの状態を取得する関数のソースコードは以下のとおりです。



/****************************************************************************/
/*!
 *  @brief  周期ハンドラの状態参照.
 *
 *  @param  [in]    no      周期ハンドラ番号.
 *  @param  [out]   sts     周期ハンドラ状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceCycleHadler( INT no, WICYCSTAT *sts )
{
    ER          ercd;
    WICYCOBJ    *p;
    DWORDLONG   now_time;

    //! 周期ハンドラ番号のオブジェクトを取得する.
    p = (WICYCOBJ *)wi_FindObject( no, TMAX_MAXCYC, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! 現在時刻を取得する.
    now_time = wi_GetSystemTime();

    //! 起動時刻までの時間を計算する.
    if( (now_time - p->StartTime) >= p->CycleTime ){
        sts->LeftTime = 0;
    }else{
        sts->LeftTime = p->CycleTime - (now_time - p->StartTime);
    }
    //! 周期ハンドラの状態を構造体にセットする.
    sts->Active  = p->Active;
    sts->ExtInfo = p->ExtInfo;

    return E_OK;
}
	

周期起動ハンドラの状態を取得する関数は以下のような処理を行います。

  • 引数で指定された周期ハンドラのID番号に該当する周期ハンドラ・オブジェクトを取り出します。
  • 現在時刻を取得して、次に周期起動ハンドラが起動されるまでの時間を計算して、引数の構造体にセットします。
  • 周期起動ハンドラの状態を取り出して、引数の構造体にセットします。
  • def_cyc()で周期起動ハンドラを登録するときに渡された拡張情報を引数の構造体にセットします。


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