Windows版 iTRONサービスコールの作成 (ランデブポート)
(その8)
ランデブポートの状態を参照するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
ref_por | ランデブポートの状態を取得します。 |
ref_rdv | ランデブの状態を取得します。 |
※ Ver3.0と4.0では関数名は同じですが、引数の順番が逆になりますので注意してください。
※ ref_rdv() は Ver4.0のみサポートします。
Ver3.0でランデブポートの状態を取得するには以下のサービスコールを使用します。
ER ref_por( T_RPOR *pk_rpor, ID porid )
引数 | 説明 |
---|---|
pk_rpor | ランデブポート状態を格納する構造体のポインタ。 |
porid | ランデブポートID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のランデブポートID番号。 |
E_NOEXS | 指定したランデブポートID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
ランデブポート状態を格納する構造体(T_RPOR)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
wtsk | 呼出待ちタスクの有無。 |
atsk | 受付待ちタスクの有無。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ランデブポートの状態参照.
*
* @param [out] pk_rpor ランデブポート状態を格納する構造体のポインタ.
* @param [in] porid ランデブポートID番号.
*
* @retval エラーコード.
*/
ER ref_por( T_RPOR *pk_rpor, ID porid )
{
ER ercd;
WIPORSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rpor ){
return E_PAR;
}
wi_CommonLock();
//! ランデブポートの状態を取得する.
ercd = wi_RefarenceRendPort( porid, &sts );
if( ercd == E_OK ){
pk_rpor->exinf = sts.ExtInfo;
pk_rpor->wtsk = (BOOL_ID)sts.CalWaitId;
pk_rpor->atsk = (BOOL_ID)sts.AcpWaitId;
}
wi_CommonUnlock();
return ercd;
}
ランデブポート状態を格納する構造体のポインタがNULLの場合エラーにします。
ランデブポート状態を取得する関数を呼び出して現在のランデブポートの状態を取得し引数の構造体に格納します。
ランデブポートの状態を取得する (Ver4.0)
Ver4.0でランデブポートの状態を取得するには以下のサービスコールを使用します。
ER ref_por( ID porid, T_RPOR *pk_rpor )
引数 | 説明 |
---|---|
porid | ランデブポートID番号。 |
pk_rpor | ランデブポート状態を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のランデブポートID番号。 |
E_NOEXS | 指定したランデブポートID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
ランデブポート状態を格納する構造体(T_RPOR)は以下のとおりです。
メンバ名 | 説明 |
---|---|
ctskid | ランデブポートの呼出待ち行列の先頭のタスクのID番号。 |
atskid | ランデブポートの受付待ち行列の先頭のタスクのID番号。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ランデブポートの状態参照.
*
* @param [in] porid ランデブ・ポートID番号.
* @param [out] pk_rpor ランデブポート状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER ref_por( ID porid, T_RPOR *pk_rpor )
{
ER ercd;
WIPORSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rpor ){
return E_PAR;
}
wi_CommonLock();
//! ランデブポートの状態を取得する.
ercd = wi_RefarenceRendPort( porid, &sts );
if( ercd == E_OK ){
pk_rpor->ctskid = sts.CalWaitId;
pk_rpor->atskid = sts.AcpWaitId;
}
wi_CommonUnlock();
return ercd;
}
ランデブポート状態を格納する構造体のポインタがNULLの場合エラーにします。
ランデブポート状態を取得する関数を呼び出して現在のランデブポートの状態を取得し引数の構造体に格納します。
ランデブポートの状態取得関数
ランデブポートの状態取得関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief ランデブポートの状態参照.
*
* @param [in] id ランデブポートID番号.
* @param [out] sts ランデブポート状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_RefarenceRendPort( INT id, WIPORSTAT *sts )
{
ER ercd;
WIPOROBJ *p;
//! ランデブポートIDのオブジェクトを取得する.
p = (WIPOROBJ *)wi_FindObject( id, TMAX_MAXPOR, PortList, &ercd );
if( !p ){
return ercd;
}
//! ランデブポートの状態を構造体にセットする.
sts->CalWaitId = wi_GetWaitTaskListFirstId( p->CalWaitQue );
sts->AcpWaitId = wi_GetWaitTaskListFirstId( p->AcpWaitQue );
sts->ExtInfo = p->ExtInfo;
return E_OK;
}
ランデブポートの状態取得関数は以下のような処理を行います。
- 引数で指定されたランデブポートID番号に該当するランデブポート・オブジェクトを取り出します。
- ランデブ呼び出し待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
- ランデブ受け付け待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。
ランデブの状態を取得するには以下のサービスコールを使用します。
ER ref_rdv( RDVNO rdvno, T_RRDV *pk_rrdv )
引数 | 説明 |
---|---|
rdvno | ランデブ番号。 |
pk_rrdv | ランデブ状態を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_NOEXS | 指定したランデブ番号は登録されていない。 |
E_PAR | パラメータエラー。 |
ランデブ状態を格納する構造体(T_RRDV)は以下のとおりです。
メンバ名 | 説明 |
---|---|
wtskid | ランデブ終了待ち状態のタスクのID番号。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ランデブ状態の参照.
*
* @param [in] rdvno ランデブ番号.
* @param [out] pk_rrdv ランデブ状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER ref_rdv( RDVNO rdvno, T_RRDV *pk_rrdv )
{
ER ercd;
WIRDVSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rrdv ){
return E_PAR;
}
wi_CommonLock();
//! ランデブ状態を取得する.
ercd = wi_RefarenceRendStat( rdvno, &sts );
if( ercd == E_OK ){
pk_rrdv->wtskid = sts.WaitId;
}
wi_CommonUnlock();
return ercd;
}
ランデブ状態を格納する構造体のポインタがNULLの場合エラーにします。
ランデブ状態を取得する関数を呼び出して現在のランデブ状態を取得し引数の構造体に格納します。
ランデブ状態取得関数
ランデブ状態を取得する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief ランデブ状態の参照.
*
* @param [in] no ランデブ番号.
* @param [out] sts ランデブ状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_RefarenceRendStat( INT no, WIRDVSTAT *sts )
{
ER ercd;
WIRDVOBJ *p;
//! ランデブ番号のオブジェクトを取得する.
p = (WIRDVOBJ *)wi_FindObject( no, TMAX_MAXRDV, RdvList, &ercd );
if( !p ){
return ercd;
}
//! ランデブの状態を構造体にセットする.
sts->WaitId = p->TaskId;
return E_OK;
}
ランデブ状態を取得する関数は以下のような処理を行います。
- 該当するランデブ番号のランデブ・オブジェクトをランデブ・リストから取り出します。
- ランデブ終了待ちのタスクのID番号を取り出して、引数の構造体にセットします。