Listing 3: An executive that uses the timers
#include "timer.h"
TIMER timer;
int done = 0;
void EXECUTIVE::executive_loop(void)
{
enum xmt_rcvr_states {x1_idle, waiting_prelim_type1,
waiting_final_type1};
enum message_ids {none_id=0, prelim_type1_id=1,
final_type1_id=2};
xmt_rcvr_states type1_state = x1_idle;
TIMER_HANDLE type1_timer = timer.open_timer(0.0); //expired timer
TIMER_HANDLE ping_timer = timer.open_timer(1.0);
TIMER_HANDLE ephemeris_record_timer = timer.open_timer(120.0);
while (!done) { // main loop.
// The clock stuff.
(void)timer.executive_tic();
// request ephemeris every 2 minutes.
if (timer.expired(ephemeris_record_timer)) {
timer.close_timer(ephemeris_record_timer);
ephemeris_record_timer = timer.open_timer(120.0);
request_ephemeris();
}
// ping the port1 (send a ping message) once a second.
if (timer.expired(ping_timer)) {
timer.close_timer(ping_timer);
ping_timer = timer.open_timer(1.0);
initiate_ping();
}
// Check message states and timers to make sure we
// are not hanging. If exe_timer is expired and the executive
// is not in idle, then an error condition exists, it is hung
// on some part of a message process.
if (timer.expired(type1_timer)) {
switch (type1_state) {
case x1_idle:
break; // no problem if it's in idle.
case waiting_prelim_type1:
printf("Type1 timeout waiting_for_prelim_type1");
type1_state = x1_idle;
break;
case waiting_final_type1:
printf("Type1 timeout waiting_for_final_type1");
type1_state = x1_idle;
break;
default:
printf("type 1 in an unknown state.");
type1_state = x1_idle;
}
}
// Check to see if the gps receiver is starting a new sec.
// top_of_second() will return true once every sec.
if (top_of_second()){
if (type1_state == x1_idle) {
timer.close_timer(type1_timer);
type1_timer = timer.open_timer(0.3);
type1_state = waiting_for_prelim_type1;
}else {
// A problem has occured. abort the messages, and reset.
printf("New type1 started without finishing previous one.");
send_type1_abort();
type1_state = x1_idle;
timer.close_timer(type1_timer);
type1_timer = timer.open_timer(0.0);
}
}
// Check the port interface to see what message we are getting.
// port1_message_received() will empty the input buffers and
// construct an incoming message. It will return message_id
// when a message is complete and 0 (default) otherwise.
switch (port1_message_received()) {
case prelim_type1_id:
if (type1_state == waiting_for_prelim_type1) {
timer.close_timer(type1_timer);
type1_timer = timer.open_timer(0.3);
process_prelim_type1();
type1_state = waiting_for_final_type1;
}else {
// A problem has occured. abort messages and reset.
printf("Received prelim_type1, but not waiting for it.");
send_type1_abort();
type1_state = x1_idle;
timer.close_timer(type1_timer);
type1_timer = timer.open_timer(0.0);
}
break;
case final_type1_id:
// Type 1 final message.
if (type1_state == waiting_for_final_type1) {
timer.close_timer(type1_timer);
type1_timer = timer.open_timer(0.0);
process_type1_final();
type1_state = x1_idle;
}else {
// A problem has occured. abort messages and reset.
printf("Received final_type1, but not waiting for it.");
send_type1_abort();
type1_state = x1_idle;
timer.close_timer(type1_timer);
type1_timer = timer.open_timer(0.0);
}
break;
default: ;
}// end switch.
}// end main loop.
// Shutdown the timers.
timer.close_timer(type1_timer);
timer.close_timer(ping_timer);
timer.close_timer(ephemeris_record_timer);
}
// The delay function stops any real-time execution.
// It is a real time pause.
void delay(float sec)
{
TIMER_HANDLE sleep = timer.open_timer(sec);
while (!timer.expired(sleep)) timer.executive_tic();
timer.close_timer(sleep);
}
//End of File