1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "avctp_st.h"
16
17 /*****************************************************************************
18 * Globle Data Define
19 ****************************************************************************/
20 /* state table for idle state */
21 const uint8_t C_AVCT_ST_IDLE[AVCT_MAX_EVT][AVCT_NUM_COLUMNS] = {
22 /* Action Next state Event */
23 {AVCT_CHANNEL_CONN, AVCT_OPENING_ST}, /* AVCT_BIND_EVT */
24 {AVCT_CHANNEL_UNBIND, AVCT_IDLE_ST}, /* AVCT_UNBIND_EVT */
25 {AVCT_DISCARD_MSG, AVCT_IDLE_ST}, /* AVCT_SED_MSG_EVT */
26 {AVCT_IGNORE, AVCT_IDLE_ST}, /* AVCT_DISCONN_EVT */
27 {AVCT_CONN_IND, AVCT_OPENED_ST}, /* AVCT_REV_CONN_EVT */
28 {AVCT_DISCONN_IND, AVCT_IDLE_ST}, /* AVCT_REV_DISCONN_EVT */
29 {AVCT_DISCARD_REV_MSG, AVCT_IDLE_ST}, /* AVCT_REV_MSG_EVT */
30 {AVCT_IGNORE, AVCT_IDLE_ST} /* AVCT_REV_BUSY_EVT */
31 };
32
33 const uint8_t C_AVCT_ST_OPENING[AVCT_MAX_EVT][AVCT_NUM_COLUMNS] = {
34 /* Action Next state Event */
35 {AVCT_IGNORE, AVCT_OPENING_ST}, /* AVCT_BIND_EVT */
36 {AVCT_CHANNEL_UNBIND, AVCT_OPENING_ST}, /* AVCT_UNBIND_EVT */
37 {AVCT_DISCARD_MSG, AVCT_OPENING_ST}, /* AVCT_SED_MSG_EVT */
38 {AVCT_CHANNEL_DISCONNECT, AVCT_CLOSING_ST}, /* AVCT_DISCONN_EVT */
39 {AVCT_CONN_IND, AVCT_OPENED_ST}, /* AVCT_REV_CONN_EVT */
40 {AVCT_CONN_FAIL, AVCT_IDLE_ST}, /* AVCT_REV_DISCONN_EVT */
41 {AVCT_DISCARD_REV_MSG, AVCT_OPENING_ST}, /* AVCT_REV_MSG_EVT */
42 {AVCT_IGNORE, AVCT_OPENING_ST}, /* AVCT_REV_BUSY_EVT */
43 };
44
45 const uint8_t C_AVCT_ST_OPENED[AVCT_MAX_EVT][AVCT_NUM_COLUMNS] = {
46 /* Action Next state Event */
47 {AVCT_CHANNEL_BIND, AVCT_OPENED_ST}, /* AVCT_BIND_EVT */
48 {AVCT_CHANNEL_CHECK_DISCONNECT, AVCT_OPENED_ST}, /* AVCT_UNBIND_EVT */
49 {AVCT_SEND_MSG, AVCT_OPENED_ST}, /* AVCT_SED_MSG_EVT */
50 {AVCT_CHANNEL_DISCONNECT, AVCT_CLOSING_ST}, /* AVCT_DISCONN_EVT */
51 {AVCT_IGNORE, AVCT_OPENED_ST}, /* AVCT_REV_CONN_EVT */
52 {AVCT_DISCONN_IND, AVCT_IDLE_ST}, /* AVCT_REV_DISCONN_EVT */
53 {AVCT_REV_MSG, AVCT_OPENED_ST}, /* AVCT_REV_MSG_EVT */
54 {AVCT_BUSY_IND, AVCT_BUSY_ST}, /* AVCT_REV_BUSY_EVT */
55 };
56
57 const uint8_t C_AVCT_ST_CLOSING[AVCT_MAX_EVT][AVCT_NUM_COLUMNS] = {
58 /* Action Next state Event */
59 {AVCT_CHANNEL_BIND_FAIL, AVCT_CLOSING_ST}, /* AVCT_BIND_EVT */
60 {AVCT_IGNORE, AVCT_CLOSING_ST}, /* AVCT_UNBIND_EVT */
61 {AVCT_DISCARD_MSG, AVCT_CLOSING_ST}, /* AVCT_SED_MSG_EVT */
62 {AVCT_IGNORE, AVCT_CLOSING_ST}, /* AVCT_DISCONN_EVT */
63 {AVCT_IGNORE, AVCT_CLOSING_ST}, /* AVCT_REV_CONN_EVT */
64 {AVCT_DISCONN_CFM, AVCT_IDLE_ST}, /* AVCT_REV_DISCONN_EVT */
65 {AVCT_DISCARD_REV_MSG, AVCT_CLOSING_ST}, /* AVCT_REV_MSG_EVT */
66 {AVCT_IGNORE, AVCT_CLOSING_ST}, /* AVCT_REV_BUSY_EVT */
67 };
68
69 const uint8_t C_AVCT_ST_BUSY[AVCT_MAX_EVT][AVCT_NUM_COLUMNS] = {
70 /* Action Next state Event */
71 {AVCT_CHANNEL_BIND, AVCT_BUSY_ST}, /* AVCT_BIND_EVT */
72 {AVCT_CHANNEL_CHECK_DISCONNECT, AVCT_BUSY_ST}, /* AVCT_UNBIND_EVT */
73 {AVCT_DISCARD_MSG, AVCT_BUSY_ST}, /* AVCT_SED_MSG_EVT */
74 {AVCT_CHANNEL_DISCONNECT, AVCT_CLOSING_ST}, /* AVCT_DISCONN_EVT */
75 {AVCT_IGNORE, AVCT_BUSY_ST}, /* AVCT_REV_CONN_EVT */
76 {AVCT_DISCONN_IND, AVCT_IDLE_ST}, /* AVCT_REV_DISCONN_EVT */
77 {AVCT_REV_MSG, AVCT_BUSY_ST}, /* AVCT_REV_MSG_EVT */
78 {AVCT_BUSY_IND, AVCT_BUSY_ST}, /* AVCT_REV_BUSY_EVT */
79 };
80
81 /* state table */
82 const AvctStateTable C_AVCT_ST_TBL[AVCT_MAX_ST] = {
83 C_AVCT_ST_IDLE, /* Idle */
84 C_AVCT_ST_OPENING, /* Opening */
85 C_AVCT_ST_OPENED, /* Opend */
86 C_AVCT_ST_CLOSING, /* Closing */
87 C_AVCT_ST_BUSY /* Busy */
88 };
89
90 /*****************************************************************************
91 * Function
92 ****************************************************************************/
93 /*
94 * Function AvctGetNextStation
95 * Description Get next staton.
96 * Param[in] curState Current station.
97 * Param[in] event Input event.
98 * Return uint8_t Next station.
99 */
AvctGetNextStation(uint8_t curState,uint8_t event)100 uint8_t AvctGetNextStation(uint8_t curState, uint8_t event)
101 {
102 AvctStateTable sTbl = C_AVCT_ST_TBL[curState];
103 return sTbl[event][AVCT_NEXT_STATE];
104 }
105
106 /*
107 * Function AvctGetEvtAction
108 * Description Get the action index of the event.
109 * Param[in] curState Current station.
110 * Param[in] event Input event.
111 * Return uint8_t Action index.
112 */
AvctGetEvtAction(uint8_t curState,uint8_t event)113 uint8_t AvctGetEvtAction(uint8_t curState, uint8_t event)
114 {
115 AvctStateTable sTbl = C_AVCT_ST_TBL[curState];
116 uint8_t action = sTbl[event][AVCT_ACTION];
117 return action;
118 }
119