触发器模式是在条件满足或不满足时,触发特定动作的模式。
用于周期性处理过程中,根据事件触发时机,进行事件响应处理。
定义触发器结构:
typedef enum
{
tFalse = 0,
tTrue = 1,
} bool_t;
typedef struct
{
int state;
} trigger_t;
void init_trigger(trigger_t *t, int initState)
{
t->state = initState;
}
bool_t touch_trigger(trigger_t *t, int newState)
{
bool_t changed = (t->state != newState) ? tTrue : tFalse;
t->state = newState;
return (changed);
}
通过在周期性处理中,模拟数据输入和响应行为:
例如,在特定条件满足/不满足时、触发特定动作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i, state;
const int speeds[] = { 0, 10, 22, 30, 23, 10, 15, -1 };
trigger_t t;
init_trigger(&t, 0);
for(i = 0; speeds[i] != -1; i++)
{
printf("SIGNAL[%d] = %2d", i, speeds[i]);
state = (speeds[i] > 20) ? tTrue : tFalse;
printf(" --> CONDITION:%s", state ? "TRUE " : "FALSE");
if(touch_trigger(&t, state))
{
if(state)
{
printf(" --> ACTION:BEEP ON");
}
else
{
printf(" --> ACTION:BEEP OFF");
}
}
printf("\n");
}
return 0;
}
程序运行结果,可以看到在车速高于20km/h时触发报警,低于20时关闭报警。
SIGNAL[0] = 0 --> CONDITION:FALSE
SIGNAL[1] = 10 --> CONDITION:FALSE
SIGNAL[2] = 22 --> CONDITION:TRUE --> ACTION:BEEP ON
SIGNAL[3] = 30 --> CONDITION:TRUE
SIGNAL[4] = 23 --> CONDITION:TRUE
SIGNAL[5] = 10 --> CONDITION:FALSE --> ACTION:BEEP OFF
SIGNAL[6] = 15 --> CONDITION:FALSE
例如,在特定状态改变时、触发特定动作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i, state;
const char gears[] = { 'P', 'P', 'R', 'N', 'N', 'N', 'D', 'D', 0 };
trigger_t t;
init_trigger(&t, 'P');
for(i = 0; gears[i] != 0; i++)
{
printf("SIGNAL[%d] = %c", i, gears[i]);
state = gears[i];
printf(" --> STATE:%c", state);
if(touch_trigger(&t, state))
{
printf(" --> ACTION:gear changed");
}
printf("\n");
}
return 0;
}
程序运行结果,可以看到状态改变时触发提示。
SIGNAL[0] = P --> STATE:P
SIGNAL[1] = P --> STATE:P
SIGNAL[2] = R --> STATE:R --> ACTION:gear changed
SIGNAL[3] = N --> STATE:N --> ACTION:gear changed
SIGNAL[4] = N --> STATE:N
SIGNAL[5] = N --> STATE:N
SIGNAL[6] = D --> STATE:D --> ACTION:gear changed
SIGNAL[7] = D --> STATE:D