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