-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFlight_ReDock.cpp
128 lines (111 loc) · 3.79 KB
/
Flight_ReDock.cpp
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* Flight_ReDock.cpp
* Author: Alex St. Clair
* Created: October 2019
*/
#include "StratoPIB.h"
enum ReDockStates_t {
ST_ENTRY,
ST_IDLE,
ST_START_MOTION,
ST_VERIFY_MOTION,
ST_MONITOR_MOTION,
ST_CHECK_PU,
ST_WAIT_PU,
};
static ReDockStates_t redock_state = ST_ENTRY;
static bool resend_attempted = false;
bool StratoPIB::Flight_ReDock(bool restart_state)
{
if (restart_state) redock_state = ST_ENTRY;
switch (redock_state) {
case ST_ENTRY:
redock_state = ST_IDLE;
SetAction(ACTION_REEL_OUT);
scheduler.AddAction(ACTION_IN_NO_LW, 30);
scheduler.AddAction(ACTION_CHECK_PU, 60);
break;
case ST_IDLE:
if (CheckAction(ACTION_REEL_OUT)) {
redock_state = ST_START_MOTION;
mcb_motion = MOTION_REEL_OUT;
resend_attempted = false;
} else if (CheckAction(ACTION_IN_NO_LW)) {
redock_state = ST_START_MOTION;
mcb_motion = MOTION_IN_NO_LW;
resend_attempted = false;
} else if (CheckAction(ACTION_CHECK_PU)) {
redock_state = ST_CHECK_PU;
resend_attempted = false;
}
break;
case ST_START_MOTION:
if (mcb_motion_ongoing) {
ZephyrLogWarn("Motion commanded while motion ongoing");
inst_substate = MODE_ERROR; // will force exit of Flight_Profile
}
if (StartMCBMotion()) {
redock_state = ST_VERIFY_MOTION;
scheduler.AddAction(RESEND_MOTION_COMMAND, MCB_RESEND_TIMEOUT);
} else {
ZephyrLogWarn("Motion start error");
inst_substate = MODE_ERROR; // will force exit of Flight_Profile
}
break;
case ST_VERIFY_MOTION:
if (mcb_motion_ongoing) { // set in the Ack handler
log_nominal("MCB commanded motion");
redock_state = ST_MONITOR_MOTION;
}
if (CheckAction(RESEND_MOTION_COMMAND)) {
if (!resend_attempted) {
resend_attempted = true;
redock_state = ST_START_MOTION;
} else {
resend_attempted = false;
ZephyrLogWarn("MCB never confirmed motion");
inst_substate = MODE_ERROR; // will force exit of Flight_Profile
}
}
break;
case ST_MONITOR_MOTION:
if (CheckAction(ACTION_MOTION_STOP)) {
// todo: verification of motion stop
ZephyrLogFine("Commanded motion stop");
return true;
break;
}
if (!mcb_motion_ongoing) {
redock_state = ST_IDLE;
}
break;
case ST_CHECK_PU:
puComm.TX_ASCII(PU_SEND_STATUS);
scheduler.AddAction(RESEND_PU_CHECK, PU_RESEND_TIMEOUT);
redock_state = ST_WAIT_PU;
break;
case ST_WAIT_PU:
if (pibConfigs.pu_docked.Read()) {
snprintf(log_array, LOG_ARRAY_SIZE, "PU status: %lu, %0.2f, %0.2f, %0.2f, %0.2f, %u", pu_status.time, pu_status.v_battery, pu_status.i_charge, pu_status.therm1, pu_status.therm2, pu_status.heater_stat);
ZephyrLogFine(log_array);
mcbComm.TX_ASCII(MCB_ZERO_REEL);
return true;
break;
}
if (CheckAction(RESEND_PU_CHECK)) {
if (!resend_attempted) {
resend_attempted = true;
redock_state = ST_CHECK_PU;
} else {
resend_attempted = false;
ZephyrLogWarn("PU not responding to status request");
return true;
}
}
break;
default:
// unknown state, exit
return true;
}
return false; // assume incomplete
}