A_r_t_i_c的简单应用

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

    }

}

 

 

你可能感兴趣的:(C语言,c,callback,struct,class)