-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstateTransition.cpp
More file actions
85 lines (69 loc) · 3.76 KB
/
stateTransition.cpp
File metadata and controls
85 lines (69 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/********************************************************************/
/* Description: オペレータ入力状態に基づく状態遷移の実装 */
/* File: stateTransition.cpp */
/* Date: 2024/07/18 */
/* Author: Takashi YOSHIOKA */
/********************************************************************/
/********************************************************************/
/* ヘッダファイルのインクルード */
/********************************************************************/
#include "stateTransition.h"
#include "motorVar.h"
/********************************************************************/
/* 外部変数宣言 */
/********************************************************************/
extern motorVar_t motorVar;
/********************************************************************/
/* 外部非公開関数のプロトタイプ宣言 */
/********************************************************************/
static oprEvent_t get_event(oprSts_t *oprStsArg);
/********************************************************************/
/* 二次元配列インデックスによる状態遷移表の表現 */
/********************************************************************/
static const invState_t stateMatrix[xStateNum][xEventNum] = {
// current State eventNone eventStop eventRun eventError
[stateStop] = {stateStop, stateStop, stateRun, stateError},
[stateRun] = {stateRun, stateStop, stateRun, stateError},
[stateError] = {stateError, stateError, stateError, stateError},
};
/********************************************************************/
/* Contents: トリガイベントに応じたevent型の値を返す */
/* Function: get_event */
/* Arguments: oprSts_t構造体のポインタ */
/* Return value: oprEvent_t型 (列挙型:トリガイベントのインデックス) */
/********************************************************************/
oprEvent_t get_event(oprSts_t *oprStsArg)
{
oprEvent_t event;
if (( oprStsArg->invErr == 1 ) || ( motorVar.omegaE > ALMLEVEL_OVERSPD ) || ( motorVar.omegaE < -ALMLEVEL_OVERSPD ) ) { // invErrがアクティブ,もしくはオーバースピードならeventErrorを返す
event = eventError;
}
else {
if ( oprStsArg->invOff == 1 ) { // invOffがアクティブならeventStopを返す
event = eventStop;
}
else {
if ( oprStsArg->invOn == 1 ) { // invOnがアクティブならeventRunを返す
event = eventRun;
}
else {
event = eventNone; // トリガイベントが何もない場合はeventNoneを返す
}
}
}
return event;
}
/********************************************************************/
/* Contents: 運転状態・トリガイベントに基づいて現在の状態を更新 */
/* Function: update_state */
/* Arguments: invState_t構造体のポインタ, oprSts_t構造体のポインタ */
/* Return value: invState_t型 (列挙型:状態のインデックス) */
/********************************************************************/
invState_t update_state(invState_t invStateArg, oprSts_t *oprStsArg)
{
oprEvent_t event;
invState_t state;
event = get_event(oprStsArg); // トリガイベントを取得
state = stateMatrix[invStateArg][event]; // 現在の状態とトリガイベントに応じて状態遷移
return state;
}