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 を設定します。
アラーム・ハンドラを登録するには以下のサービスコールを使用します。
ER def_alm( HNO almno, const T_DALM *pk_dalm )
引数 | 説明 |
---|---|
almno | アラーム・ハンドラ番号。 |
pk_dalm | アラーム・ハンドラ定義情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のアラーム・ハンドラ番号。 |
E_PAR | パラメータエラー。 |
アラーム・ハンドラ定義情報構造体(T_DALM)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
almatr |
アラーム・ハンドラ属性。 アラーム・ハンドラの起動方法を指定します。
|
almhdr | アラーム・ハンドラのアドレス。 |
tmmode |
起動時刻指定モード。
|
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 |
アラーム・ハンドラ属性。 アラーム・ハンドラの起動方法を指定します。
|
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;
}
アラーム・ハンドラ削除関数は以下のような処理を行います。
- 引数で指定されたアラーム・ハンドラ番号に該当するアラーム・ハンドラ・オブジェクトを取り出します。
- アラーム・ハンドラ・オブジェクトのリストから削除するオブジェクトを外します。
- アラーム・ハンドラ・オブジェクトのために確保したメモリを解放して処理を終了します。