状态机

//header

typedef struct {
    POWERMODING_STATE_TYPE stateId;//状态名
    void (*onStateEnter)();//进入状态
    void (*stateSigProc)(POWERMODING_SIGNAL pmSignal);//状态处理
    void (*onStateExit)();//退出状态
} PMStateType;


/*不同状态*/
typedef struct {
    PMStateType pmSleepState;
    PMStateType pmActiveState;
    PMStateType pmSlientState;
	PMStateType pmNullState;
    PMStateType *pCurPmState;

} PMStateMachineType;


typedef enum {
    PWR_STATE_NO_PRESS = 0,
    PWR_STATE_SHORTPRESS_ON,
    PWR_STATE_LONGPRESS_ON,

} PWR_STATE_TYPE;

//initalize and process

void onEnterPMSleepState();
void onExitPMSleepOffState();
void sigProcPMSleepOffState(POWERMODING_SIGNAL sig);

//
void onEnterPMActiveState();
void onExitPMActiveState();
void sigProcPMActiveState(POWERMODING_SIGNAL sig);

//
void onEnterPMSlientState();
void onExitPMSlientState();
void sigProcPMSlientState(POWERMODING_SIGNAL sig);

void onEnterPMNULLState();
void onExitPMNULLState();
void sigProcPMNULLState(POWERMODING_SIGNAL sig);
void Initialize_StateMachine(void);
<span style="font-family: Arial, Helvetica, sans-serif;">void Initialize_StateMachine(void)//</span>
{
    PMStateMachineType *pStm = &pmStateMachine;


    pStm->pmSleepState.stateId = PM_SLEEP_STATE;
    pStm->pmSleepState.onStateEnter = onEnterPMSleepState;
    pStm->pmSleepState.onStateExit = onExitPMSleepState;
    pStm->pmSleepState.stateSigProc = sigProcPMSleepState;


    pStm->pmActiveState.stateId = PM_ACTIVE_STATE;
    pStm->pmActiveState.onStateEnter = onEnterPMActiveState;
    pStm->pmActiveState.onStateExit = onExitPMActiveState;
    pStm->pmActiveState.stateSigProc = sigProcPMActiveState;


    pStm->pmSlientState.stateId = PM_SLIENT_STATE;
    pStm->pmSlientState.onStateEnter = onEnterPMSlientState;
    pStm->pmSlientState.onStateExit = onExitPMSlientState;
    pStm->pmSlientState.stateSigProc = sigProcPMSlientState;
}<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">//receive event and jump</span>


static void powerModingMainLoop()//arguement

{
    TaskSignal tSignals;
    static uint32_t test = 0;
    //PMStateMachineType *pStm = &pmStateMachine;

    //ServiceSignalRegister(TESTSERVICE_SIGNAL_TEST1);

    while(1) {

        /* wait for events indefinitely and clear after end of function */
        tSignals = TaskWaitEventWithTimeout(&powerModingStubInstance, (
                                                EVENT_PM_TIMER_TICK_10MS            |
                                                EVENT_PM_ACC_ON                     |
                                                EVENT_PM_ACC_OFF                    |
                                                EVENT_PM_LOW                        |//6v<=power voltage<=9v
                                                EVENT_PM_ULTRA_LOW                  |//9v<power voltage<=17
                                                EVENT_PM_TEMP_INVLIAD               |
                                                EVENT_PM_PWK_SHORT_PRESSED          |
                                                EVENT_PM_PWK_LONG_PRESSED           |
                                                EVENT_PM_CAN_SLEEP_REQ               //no message tx/rx on CAN Bus
                                            ),
                                            (uint16_t) OS_WAITFOREVER);



        //Signal Handling
        test = tSignals;
        if (tSignals & EVENT_PM_TIMER_TICK_10MS) {
			//TracePrintf(MOD_TRACE, TRACE_INFO, "EVENT_PM_TIMER_TICK_10MS\n\r");
            VehicleSignalAccScan();
            VehicleSignalVoltageScan();
            VehicleSignalTempScan();
            //2 TODO:temperature??
            Process_StateMachine(PM_SIG_TIMER_TICK_10MS);
        } else if (tSignals & EVENT_PM_ACC_ON) {
            Process_StateMachine(PM_SIG_ACC_ON);
        } else if (tSignals & EVENT_PM_ACC_OFF) {
            Process_StateMachine(PM_SIG_ACC_OFF);
        } else if (tSignals & EVENT_PM_LOW) {
            Process_StateMachine(PM_SIG_LOW);
        } else if (tSignals & EVENT_PM_ULTRA_LOW) {
            Process_StateMachine(PM_SIG_ULTRA_LOW);
        }  else if (tSignals & EVENT_PM_TEMP_INVLIAD) {
            Process_StateMachine(PM_SIG_TEMP_INVLIAD);
        } else if (tSignals & EVENT_PM_PWK_SHORT_PRESSED) {
            Process_StateMachine(PM_SIG_PWK_SHORT_PRESSED);
        } else if (tSignals & EVENT_PM_PWK_LONG_PRESSED) {
            Process_StateMachine(PM_SIG_PWK_LONG_PRESSED);
        } else if(tSignals & EVENT_PM_CAN_SLEEP_REQ) {
            Process_StateMachine(PM_SIG_CAN_SLEEP);//
        }
    }

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值