A_r_t_i_c的简单应用

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
        }

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值