Windows版 iTRONサービスコールの作成 (イベントフラグ)
(その6)
	イベントフラグの状態を参照するサービスコールは以下のとおりです。
| サービスコール名 | 説明 | 
|---|---|
| ref_flg | イベントフラグの状態を取得します。  | 
※ Ver3.0と4.0では関数名は同じですが、引数の順番が逆になりますので注意してください。
Ver3.0でイベントフラグの状態を取得するには以下のサービスコールを使用します。
    ER ref_flg( T_RFLG *pk_rflg, ID flgid )
	
	| 引数 | 説明 | 
|---|---|
| pk_rflg | イベントフラグ状態を格納する構造体のポインタ。  | 
| flgid | イベントフラグID番号。  | 
| 戻り値 | 説明 | 
|---|---|
| E_OK | 正常終了。  | 
| E_ID | 範囲外のイベントフラグID番号。  | 
| E_NOEXS | 指定したイベントフラグID番号は登録されていない。  | 
| E_PAR | パラメータエラー。  | 
イベントフラグ状態を格納する構造体(T_RFLG)は以下のとおりです。
| メンバ名 | 説明 | 
|---|---|
| exinf | 拡張情報。 | 
| wtsk | 待ちタスクの有無。 | 
| flgptn | イベントフラグのビットパターン。 | 
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
 *  @brief  イベントフラグ状態の参照.
 *
 *  @param  [out]   pk_rflg イベントフラグ状態を格納する構造体のポインタ.
 *  @param  [in]    flgid   イベントフラグID番号.
 *
 *  @retval エラーコード.
 */
ER      ref_flg( T_RFLG *pk_rflg, ID flgid )
{
    ER          ercd;
    WIFLGSTAT   sts;
    //! 引数が不正な場合はエラーにする.
    if( !pk_rflg ){
        return E_PAR;
    }
    wi_CommonLock();
    //! イベントフラグの状態を取得する.
    ercd = wi_RefarenceEvFlag( flgid, &sts );
    if( ercd == E_OK ){
        pk_rflg->exinf  = sts.ExtInfo;
        pk_rflg->wtsk   = (BOOL_ID)sts.WaitId;
        pk_rflg->flgptn = sts.FlgVal;
    }
    wi_CommonUnlock();
    return ercd;
}
	
	イベントフラグ状態を格納する構造体のポインタがNULLの場合エラーにします。
イベントフラグ状態を取得する関数を呼び出して現在のイベントフラグの状態を取得し引数の構造体に格納します。
イベントフラグの状態を取得する (Ver4.0)
Ver4.0でイベントフラグの状態を取得するには以下のサービスコールを使用します。
    ER ref_flg( ID flgid, T_RFLG *pk_rflg )
	
	| 引数 | 説明 | 
|---|---|
| flgid | イベントフラグID番号。  | 
| pk_rflg | イベントフラグ状態を格納する構造体のポインタ。  | 
| 戻り値 | 説明 | 
|---|---|
| E_OK | 正常終了。  | 
| E_ID | 範囲外のイベントフラグID番号。  | 
| E_NOEXS | 指定したイベントフラグID番号は登録されていない。  | 
| E_PAR | パラメータエラー。  | 
イベントフラグ状態を格納する構造体(T_RFLG)は以下のとおりです。
| メンバ名 | 説明 | 
|---|---|
| wtskid | イベント待ち行列の先頭のタスクのID番号。 | 
| flgptn | イベントフラグのビットパターン。 | 
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
 *  @brief  イベントフラグ状態の参照.
 *
 *  @param  [in]    flgid   イベントフラグID番号.
 *  @param  [out]   pk_rflg イベントフラグ状態を格納する構造体のポインタ.
 *
 *  @retval エラーコード.
 */
ER      ref_flg( ID flgid, T_RFLG *pk_rflg )
{
    ER          ercd;
    WIFLGSTAT   sts;
    //! 引数が不正な場合はエラーにする.
    if( !pk_rflg ){
        return E_PAR;
    }
    wi_CommonLock();
    //! イベントフラグの状態を取得する.
    ercd = wi_RefarenceEvFlag( flgid, &sts );
    if( ercd == E_OK ){
        pk_rflg->wtskid = sts.WaitId;
        pk_rflg->flgptn = (FLGPTN)sts.FlgVal;
    }
    wi_CommonUnlock();
    return ercd;
}
	
	イベントフラグ状態を格納する構造体のポインタがNULLの場合エラーにします。
イベントフラグ状態を取得する関数を呼び出して現在のイベントフラグの状態を取得し引数の構造体に格納します。
イベントフラグ状態取得関数
イベントフラグの状態を取得する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
 *  @brief  イベントフラグ状態の参照.
 *
 *  @param  [in]    id      イベントフラグID番号.
 *  @param  [in]    sts     イベントフラグ状態を格納する領域のポインタ.
 *
 *  @retval エラーコード.
 */
ER      wi_RefarenceEvFlag( INT id, WIFLGSTAT *sts )
{
    ER          ercd;
    WIFLGOBJ    *p;
    //! イベントフラグIDのオブジェクトを取得する.
    p = (WIFLGOBJ *)wi_FindObject( id, TMAX_MAXFLG, ObjList, &ercd );
    if( !p ){
        return ercd;
    }
    //! イベントフラグの状態を構造体にセットする.
    sts->WaitId  = wi_GetWaitTaskListFirstId( p->WaitQue );
    sts->FlgVal  = p->FlgVal;
    sts->ExtInfo = p->ExtInfo;
    return E_OK;
}
	
	イベントフラグの状態を取得する関数は以下のような処理を行います。
- 引数で指定されたイベントフラグID番号に該当するイベントフラグ・オブジェクトを取り出します。
 - フラグセット待ちをしている待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
 - 現在のイベントフラグのビットパターンを引数の構造体にセットします。
 - cre_flg()でイベントフラグを生成するときに渡された拡張情報を引数の構造体にセットします。(Ver4.0の場合は常に0を返します。)