Hallo
Ich befasse mich gerade damit, die Doku einer Statemachine zu studieren.
Folgende Frage ist aufgetauch:
Die Statemachine hat einen Main State: pwrup, run, stop
Der Machinestate run hat: runcw, runccw, stop
Die states von run sind eigentlich Substates vom Main State?? Und wird
in einem separaten Zustandsdiagramm dokumentiert?
Und es handelt sich um eine Transduktoren SM? Moore oder Mealy, ich
hoffe der Codeausschnitt reicht? Immer am Ende der Funktion wird der
Status übergeben. Das Ganze läuft in einem Task.
Ich vermute es ist eine Mischung!
1 | typedef enum { eSMUImain_pwrup, // enum State Machine User Interface Main Power Up
|
2 | eSMUImain_stop, // enum State Machine User Interface Main Stop
|
3 | eSMUImain_run, // enum State Machine User Interface Main Run
|
4 | eSMUImain_cal // enum State Machine User Interface Main Calibration
|
5 | }
|
6 | tSM_UI_main;
|
7 |
|
8 |
|
9 | typedef enum { eSMUIrun_stop, // enum State Machine User Interface Run Stop
|
10 | eSMUIrun_runCW, // enum State Machine User Interface Run Run Clockwise
|
11 | eSMUIrun_runCCW, // enum State Machine User Interface Run Run counter Clockwise
|
12 | eSMUIrun_runCDtoCW, // enum State Machine User Interface Run Run change Direction Clockwise
|
13 | eSMUIrun_runCDtoCCW,// enum State Machine User Interface Run Run change Direction counter Clockwise
|
14 | }
|
15 | tSM_UI_run;
|
16 |
|
17 |
|
18 | typedef struct{
|
19 | tSM_UI_main main; // Struct variable main from Type tSM_UI_main
|
20 | tSM_UI_run run; // Struct variable run from Type tSM_UI_run
|
21 | }
|
22 | tSM_functions; // Struct Identifier
|
23 |
|
24 |
|
25 | // ---- private prototypes
|
26 |
|
27 | tSM_functions SM_UI_exe(tSM_functions ms);
|
1 | tSM_functions ms_main = {eSMUImain_pwrup,
|
2 | eSMUIrun_stop};
|
3 |
|
4 | void functions_exe(BOOL pwrup)
|
5 | {
|
6 | if(pwrup)
|
7 | {
|
8 | ms_main.main = eSMUImain_pwrup;
|
9 | }
|
10 |
|
11 | ms_main = SM_UI_exe(ms_main);
|
1 | tSM_functions SM_UI_exe(tSM_functions ms)
|
2 | {
|
3 |
|
4 | tSM_functions res = ms;
|
5 | switch(ms.main)
|
6 | {
|
7 | case eSMUImain_pwrup: {
|
8 | BOOL cal_OK = true; //ToDo// get calibration status
|
9 |
|
10 | if(cal_OK)
|
11 | {
|
12 | iMotDist_ppSave = 59685;
|
13 | res.main = eSMUImain_run;
|
14 | }
|
15 | else
|
16 | {
|
17 | res.main = eSMUImain_cal;
|
18 | cal_OK = true;
|
19 | }
|
20 | }
|
21 | break;
|
22 |
|
23 | case eSMUImain_stop: // maybe redundant check later
|
24 | res = res;
|
25 | break;
|
26 |
|
27 | case eSMUImain_run:
|
28 |
|
29 | res = SM_UIrun_exe(ms);
|
30 | break;
|
31 |
|
32 | case eSMUImain_cal:
|
33 |
|
34 | res = SM_UIcal_exe(ms);
|
35 |
|
36 | break;
|
37 | default:
|
38 | res.main = eSMUImain_stop;
|
39 | break;
|
40 |
|
41 | }
|
42 | return(res);
|
43 | }
|
danke und gruss