19PackMlState pc_packml_command(PackMlState s, PackMlCommand c)
22 if (c == PackMlCommand::ABORT && s != PackMlState::ABORTING && s != PackMlState::ABORTED)
24 return PackMlState::ABORTING;
28 if (c == PackMlCommand::STOP && s != PackMlState::ABORTING && s != PackMlState::ABORTED &&
29 s != PackMlState::STOPPING && s != PackMlState::STOPPED && s != PackMlState::CLEARING)
31 return PackMlState::STOPPING;
36 case PackMlState::STOPPED:
37 if (c == PackMlCommand::RESET)
39 return PackMlState::RESETTING;
42 case PackMlState::IDLE:
43 if (c == PackMlCommand::START)
45 return PackMlState::STARTING;
48 case PackMlState::EXECUTE:
49 if (c == PackMlCommand::HOLD)
51 return PackMlState::HOLDING;
53 if (c == PackMlCommand::SUSPEND)
55 return PackMlState::SUSPENDING;
58 case PackMlState::HELD:
59 if (c == PackMlCommand::UNHOLD)
61 return PackMlState::UNHOLDING;
64 case PackMlState::SUSPENDED:
65 if (c == PackMlCommand::UNSUSPEND)
67 return PackMlState::UNSUSPENDING;
70 case PackMlState::COMPLETE:
71 if (c == PackMlCommand::RESET)
73 return PackMlState::RESETTING;
76 case PackMlState::ABORTED:
77 if (c == PackMlCommand::CLEAR)
79 return PackMlState::CLEARING;
88PackMlState pc_packml_state_complete(PackMlState s)
92 case PackMlState::RESETTING:
93 return PackMlState::IDLE;
94 case PackMlState::STARTING:
95 return PackMlState::EXECUTE;
96 case PackMlState::HOLDING:
97 return PackMlState::HELD;
98 case PackMlState::UNHOLDING:
99 return PackMlState::EXECUTE;
100 case PackMlState::SUSPENDING:
101 return PackMlState::SUSPENDED;
102 case PackMlState::UNSUSPENDING:
103 return PackMlState::EXECUTE;
104 case PackMlState::COMPLETING:
105 return PackMlState::COMPLETE;
106 case PackMlState::STOPPING:
107 return PackMlState::STOPPED;
108 case PackMlState::ABORTING:
109 return PackMlState::ABORTED;
110 case PackMlState::CLEARING:
111 return PackMlState::STOPPED;
117PackMlState pc_packml_execute_complete(PackMlState s)
119 return (s == PackMlState::EXECUTE) ? PackMlState::COMPLETING : s;
122bool pc_packml_is_acting(PackMlState s)
126 case PackMlState::CLEARING:
127 case PackMlState::STARTING:
128 case PackMlState::STOPPING:
129 case PackMlState::ABORTING:
130 case PackMlState::HOLDING:
131 case PackMlState::UNHOLDING:
132 case PackMlState::SUSPENDING:
133 case PackMlState::UNSUSPENDING:
134 case PackMlState::RESETTING:
135 case PackMlState::COMPLETING:
142bool pc_packml_command_valid(PackMlState s, PackMlCommand c)
144 return pc_packml_command(s, c) != s;
147const char *pc_packml_state_name(PackMlState s)
151 case PackMlState::CLEARING:
153 case PackMlState::STOPPED:
155 case PackMlState::STARTING:
157 case PackMlState::IDLE:
159 case PackMlState::SUSPENDED:
161 case PackMlState::EXECUTE:
163 case PackMlState::STOPPING:
165 case PackMlState::ABORTING:
167 case PackMlState::ABORTED:
169 case PackMlState::HOLDING:
171 case PackMlState::HELD:
173 case PackMlState::UNHOLDING:
175 case PackMlState::SUSPENDING:
177 case PackMlState::UNSUSPENDING:
178 return "Unsuspending";
179 case PackMlState::RESETTING:
181 case PackMlState::COMPLETING:
183 case PackMlState::COMPLETE:
190const char *pc_packml_command_name(PackMlCommand c)
194 case PackMlCommand::RESET:
196 case PackMlCommand::START:
198 case PackMlCommand::STOP:
200 case PackMlCommand::HOLD:
202 case PackMlCommand::UNHOLD:
204 case PackMlCommand::SUSPEND:
206 case PackMlCommand::UNSUSPEND:
208 case PackMlCommand::ABORT:
210 case PackMlCommand::CLEAR:
225 PackMlState state = PackMlState::UNDEFINED;
226 PackMlMode mode = PackMlMode::PRODUCING;
227 float mach_speed_cmd = 0.0f;
228 uint32_t prod_processed = 0;
229 uint32_t prod_defective = 0;
230 uint32_t reset_ms = 0;
231 uint32_t state_entry_ms = 0;
233static PackMlSvcCtx s_pml;
235static void enter_state(PackMlState s)
237 if (s == s_pml.state)
245void pc_packml_svc_init(PackMlMode mode)
248 s_pml.mach_speed_cmd = 0.0f;
249 s_pml.prod_processed = 0;
250 s_pml.prod_defective = 0;
252 s_pml.state = PackMlState::UNDEFINED;
253 enter_state(PackMlState::STOPPED);
256bool pc_packml_svc_command(PackMlCommand c)
258 PackMlState next = pc_packml_command(s_pml.state, c);
259 if (next == s_pml.state)
263 if (c == PackMlCommand::RESET)
271PackMlState pc_packml_svc_state_complete(
void)
273 enter_state(pc_packml_state_complete(s_pml.state));
277void pc_packml_svc_count(
bool defective)
279 if (s_pml.state != PackMlState::EXECUTE)
283 s_pml.prod_processed++;
286 s_pml.prod_defective++;
290bool pc_packml_svc_complete_run(
void)
292 PackMlState next = pc_packml_execute_complete(s_pml.state);
293 if (next == s_pml.state)
301bool pc_packml_svc_set_mode(PackMlMode mode)
304 if (s_pml.state != PackMlState::STOPPED && s_pml.state != PackMlState::IDLE && s_pml.state != PackMlState::ABORTED)
312void pc_packml_svc_set_speed(
float mach_speed)
314 s_pml.mach_speed_cmd = mach_speed;
317PackMlState pc_packml_svc_state(
void)
322void pc_packml_svc_status(PackMlStatus *out)
329 out->state_current = s_pml.state;
330 out->unit_mode_current = s_pml.mode;
332 out->mach_speed_actual = (s_pml.state == PackMlState::EXECUTE) ? s_pml.mach_speed_cmd : 0.0f;
333 out->state_current_ms = now - s_pml.state_entry_ms;
334 out->acc_time_since_reset_ms = now - s_pml.reset_ms;
335 out->prod_processed = s_pml.prod_processed;
336 out->prod_defective = s_pml.prod_defective;
Pluggable monotonic clock for all library timing.
uint32_t pc_millis(void)
The library's monotonic time at 1000 Hz (milliseconds).
PackML / OMAC packaging-machine state model (ISA-TR88.00.02) - the state engine + PackTags.