#ifndef _H_H
#define _H_H

/**//************************
インクルード
*************************/
#include <Artic.h>
/**//************************
コールバック関数型定義
*************************/
/**//* クラス宣言 */
typedef struct _Hard...{
/**//* 共通プロパティ */
ArticObjectProperty(); 

/**//* スイッチON状態コールバック */
ArticCallback OnArticCallback; 
/**//* スイッチOFF状態コールバック */
ArticCallback OffArticCallback;


/**//* スイッチON状態コールバック要求 */
ArticCallbackRequest HardOnCallbackRequest;
/**//* スイッチOFF状態コールバック要求 */
ArticCallbackRequest HardOffCallbackRequest;
}CHard;

/**//* クラス・コンストラクタ */
/**//*初期化*/
extern void Hard_Initial(CHard*);
/**//*起動*/
extern void Hard_objectStartup(CHard*);
/**//*Setプロパティ*/
extern void Hard_SetProperty(CHard*);

/**//******************************************************************************
Public メソッド宣言
******************************************************************************/
/**//*----------------------------------------------------------------------------
外部の刺激に対して Trigger をセットしない関数 Application Method
----------------------------------------------------------------------------*/
/**//*-------------------------NewCallBack--------------------------------------*/
/**//* スイッチON通知先登録 */
extern void Hard_SetOnArticCallback(CHard*,ArticCallbackRequest*,
CArticObjectCell*,int);
/**//* スイッチON通知先抹消 */
extern void Hard_ResetOnArticCallback(CHard*,ArticCallbackRequest*);


/**//* スイッチOFF通知先登録 */
extern void Hard_SetOffArticCallback(CHard*,ArticCallbackRequest*,
CArticObjectCell*,int);
/**//* スイッチOFF通知先抹消 */
extern void Hard_ResetOffArticCallback(CHard*,ArticCallbackRequest*);

/**//*----------------------------------------------------------------------------
外部の刺激に対して Trigger をセットする関数 Application Method
----------------------------------------------------------------------------*/
extern void On(CHard*);
extern void Off(CHard*);

/**//************************
イベント
*************************/
enum _CHard_Event ...{
Hard_Event_OFF, /**//* スイッチOFF */
Hard_Event_ON, /**//* スイッチON */
CHard_Event_MAX
};

/**//******************************************************************************
Private メソッド宣言
******************************************************************************/
#endif /*Hard_H */

#define artic_version_1_5

/**//************************
インクルード
*************************/
#include "HardSW.h"

/**//************************
状態
*************************/
enum _CHard_STATE 
...{
Hard_STATE_OFF, /**//* スイッチOFF (S0) */
Hard_STATE_ON, /**//* スイッチON (S1) */ 
CHard_STATE_MAX
};

/**//* 応答関数型 */
typedef void (*Hard_STATEProcedure)(CHard*, EvtInfo*);
/**//******************************************************************************
Public メソッド
******************************************************************************/
/**//*----------------------------------------------------------------------------
外部の刺激に対して Trigger をセットしない関数 Application Method
----------------------------------------------------------------------------*/
/**//*----------------------------------------------------------------------------
入退場処理
----------------------------------------------------------------------------*/
/**//*-------------------------NewCallBack--------------------------------------*/
/**//* スイッチON通知先登録 */
void Hard_SetOnArticCallback(CHard* this,ArticCallbackRequest* callBackRequest,
CArticObjectCell* client,int Hard_Event)
...{
ArticCallback_setCallback(&this->OnArticCallback,callBackRequest,client,Hard_Event);
}
/**//* スイッチON通知先抹消 */
void Hard_ResetOnArticCallback(CHard* this,ArticCallbackRequest* callBackRequest)
...{
ArticCallback_resetCallback(&this->OnArticCallback,callBackRequest);
}

/**//* スイッチOFF通知先登録 */
extern void Hard_SetOffArticCallback(CHard* this,ArticCallbackRequest* callBackRequest,
CArticObjectCell* client,int Hard_Event)
...{
ArticCallback_setCallback(&this->OffArticCallback,callBackRequest,client,Hard_Event);
}
/**//* スイッチOFF通知先抹消 */
void Hard_ResetOffArticCallback(CHard* this,ArticCallbackRequest* callBackRequest)
...{
ArticCallback_resetCallback(&this->OffArticCallback,callBackRequest);
}

/**//*----------------------------------------------------------------------------
外部の刺激に対して Trigger をセットする関数 Application Method
----------------------------------------------------------------------------*/
void On(CHard* this)
...{
SetTrig(this,Hard_Event_ON);
}
void Off(CHard* this)
...{
SetTrig(this,Hard_Event_OFF);
}
/**//******************************************************************************
Private メソッド
******************************************************************************/
/**//*----------------------------------------------------------------------------
Hard_STATE - Trigger の応答関数 Hard_STATE Procedure
----------------------------------------------------------------------------*/
/**//*****************************************
イベント:スイッチON
状態:元状態からスイッチONへ(S1)
[f_On]
******************************************/
static void f_On(CHard* this,EvtInfo* pInfo)
...{
SetState(this,Hard_STATE_ON);
ArticCallback_callback(&this->OnArticCallback);
}

/**//*****************************************
イベント:スイッチOFF
状態:元状態からスイッチOFFへ(S0)
[f_Off]
******************************************/
static void f_Off(CHard* this,EvtInfo* pInfo)
...{
SetState(this,Hard_STATE_OFF);
ArticCallback_callback(&this->OffArticCallback);
}
/**//*****************************************
何もしない
[f_NON]
******************************************/
static void f_NON(CHard* this,EvtInfo* pInfo)
...{
}

/**//*----------------------------------------------------------------------------
状態遷移関数テーブル
Triggerと Hard_STATEの値から実行する関数を決定する関数テーブル
----------------------------------------------------------------------------*/

static const Hard_STATEProcedure Hard_STATEMatrix[][CHard_Event_MAX] =
...{
/**//* スイッチOFF(S0) */
...{
/**//*スイッチOFF */ f_NON,
/**//*スイッチON */ f_On,
},
/**//* スイッチON(S1)*/
...{
/**//*スイッチOFF */ f_Off,
/**//*スイッチON */ f_NON,
}
};
static const ArticClass HardProperty =
...{
ARTIC_CLASS_PROPERTY,
0, /**//* Hardクラスのメジャー・バージョン */
0, /**//* Hardクラスのマイナー・バージョン */
&(Hard_STATEMatrix[0][0]),
(char)CHard_STATE_MAX,
(char)CHard_Event_MAX
};

/**//* クラス・コンストラクタ */
/**//*初期化*/
void Hard_Initial(CHard* this)
...{
/**//* オブジェクトのインストール */
InstallObject(this, &HardProperty);
ArticCallback_init(&this->OnArticCallback);
ArticCallback_init(&this->OffArticCallback);
}
/**//*Setプロパティ*/
void Hard_SetProperty(CHard* this)
...{
}
/**//*起動*/
void Hard_objectStartup(CHard* this)
...{
}

/**//* コールバックの設定 */
void ArticCallback_setCallback(ArticCallback *this, ArticCallbackRequest *request,
CArticObjectCell *client, int event)
...{
if ((request->MagicNo) != ArticCallback_MagicNo) ...{
request->category = (char)ArticCallbackRequestCategory_MULTI;
request->client = client;
request->event = event;
request->MagicNo = ArticCallback_MagicNo;
request->ServerObj = (void*)this;

if (*this == ArticCallback_EMPTY) ...{
*this = request;
request->next = request;
request->previous = request;
} else ...{
ArticCallbackRequest *top = *this;

if (top->category != ArticCallbackRequestCategory_SINGLE) ...{
request->next = top;
request->previous = top->previous;
top->previous->next = request;
top->previous = request;
} else ...{
}
}
} else ...{ /**//* このセルは多重登録されました。 */
if ((request->ServerObj) == (void*)this) ...{

} else ...{ /**//* このセルは違うサーバーで使用されています。 */
}
ArticCallback_resetCallback(this,request); /**//* セルが多重登録された場合は、一度削除して再登録 */
ArticCallback_setCallback(this, request,client, event);
}
}

/**//* コールバックの実行 */
void ArticCallback_callback(ArticCallback *this)
...{
ArticCallbackRequest *position = *this;

while (position != ArticCallback_EMPTY) ...{
SetTrig(position->client, position->event);

switch (position->category) ...{
case ArticCallbackRequestCategory_SINGLE:
break;
case ArticCallbackRequestCategory_SINGLESHOT:
if (position == *this) ...{
ArticCallback_resetCallback(this, position);
position = position->next;
continue;
} else ...{
ArticCallback_resetCallback(this, position);
position = position->next;
}
break;
case ArticCallbackRequestCategory_MULTI:
position = position->next;
break;
}

if (position == ArticCallback_SENTRY) ...{
break;
}
}
}
本文介绍了一种基于状态机的设计方案,详细展示了如何通过定义不同的状态、触发事件及响应函数来实现设备的开关控制逻辑。此外,还提供了具体的类结构和方法说明,包括初始化、设置属性、启动等操作。

被折叠的 条评论
为什么被折叠?



