mirror of https://github.com/ArduPilot/ardupilot
AP_PeriodicProcess: queue_process changes to suspend other processes before running queued process
Also restored suspend_timer to void return type
This commit is contained in:
parent
7a0189fb2c
commit
b1b3b806ad
|
@ -8,6 +8,8 @@ void AP_PeriodicProcessStub::register_process(ap_procedure proc) {
|
||||||
}
|
}
|
||||||
void AP_PeriodicProcessStub::set_failsafe(ap_procedure proc) {
|
void AP_PeriodicProcessStub::set_failsafe(ap_procedure proc) {
|
||||||
}
|
}
|
||||||
|
bool AP_PeriodicProcessStub::queue_process(ap_procedure proc) {
|
||||||
|
}
|
||||||
void AP_PeriodicProcessStub::suspend_timer(void) {
|
void AP_PeriodicProcessStub::suspend_timer(void) {
|
||||||
}
|
}
|
||||||
void AP_PeriodicProcessStub::resume_timer(void) {
|
void AP_PeriodicProcessStub::resume_timer(void) {
|
||||||
|
|
|
@ -13,6 +13,7 @@ public:
|
||||||
void init( Arduino_Mega_ISR_Registry * isr_reg );
|
void init( Arduino_Mega_ISR_Registry * isr_reg );
|
||||||
void register_process(ap_procedure proc);
|
void register_process(ap_procedure proc);
|
||||||
void set_failsafe(ap_procedure proc);
|
void set_failsafe(ap_procedure proc);
|
||||||
|
bool queue_process(ap_procedure proc); // queue process to run as soon as possible after any currently running ap_processes complete. returns true if it ran immediately
|
||||||
void suspend_timer(void);
|
void suspend_timer(void);
|
||||||
void resume_timer(void);
|
void resume_timer(void);
|
||||||
static void run(void);
|
static void run(void);
|
||||||
|
@ -20,6 +21,7 @@ protected:
|
||||||
static uint8_t _period;
|
static uint8_t _period;
|
||||||
static void (*_proc)(void);
|
static void (*_proc)(void);
|
||||||
static void (*_failsafe)(void);
|
static void (*_failsafe)(void);
|
||||||
|
static void (*_queued_proc)(void);
|
||||||
static bool _suspended;
|
static bool _suspended;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ extern "C" {
|
||||||
uint8_t AP_TimerProcess::_period;
|
uint8_t AP_TimerProcess::_period;
|
||||||
ap_procedure AP_TimerProcess::_proc[AP_TIMERPROCESS_MAX_PROCS];
|
ap_procedure AP_TimerProcess::_proc[AP_TIMERPROCESS_MAX_PROCS];
|
||||||
ap_procedure AP_TimerProcess::_failsafe;
|
ap_procedure AP_TimerProcess::_failsafe;
|
||||||
|
ap_procedure AP_TimerProcess::_queued_proc = NULL;
|
||||||
bool AP_TimerProcess::_in_timer_call;
|
bool AP_TimerProcess::_in_timer_call;
|
||||||
uint8_t AP_TimerProcess::_pidx = 0;
|
uint8_t AP_TimerProcess::_pidx = 0;
|
||||||
bool AP_TimerProcess::_suspended;
|
bool AP_TimerProcess::_suspended;
|
||||||
|
@ -66,6 +67,25 @@ void AP_TimerProcess::set_failsafe(ap_procedure proc)
|
||||||
_failsafe = proc;
|
_failsafe = proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* queue a process to be run as soon as any currently running ap_processes complete
|
||||||
|
*/
|
||||||
|
bool AP_TimerProcess::queue_process(ap_procedure proc)
|
||||||
|
{
|
||||||
|
// check if we are running any ap_processes
|
||||||
|
if( _in_timer_call || _suspended ) {
|
||||||
|
// queue the process to run after current processes finish
|
||||||
|
_queued_proc = proc;
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
// run process immediately
|
||||||
|
_suspended = true;
|
||||||
|
proc(micros());
|
||||||
|
_suspended = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AP_TimerProcess::suspend_timer(void)
|
void AP_TimerProcess::suspend_timer(void)
|
||||||
{
|
{
|
||||||
_suspended = true;
|
_suspended = true;
|
||||||
|
@ -114,6 +134,17 @@ void AP_TimerProcess::run(void)
|
||||||
_proc[i](tnow);
|
_proc[i](tnow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run any queued processes
|
||||||
|
cli();
|
||||||
|
ap_procedure qp = _queued_proc;
|
||||||
|
_queued_proc = NULL;
|
||||||
|
sei();
|
||||||
|
if( qp != NULL ) {
|
||||||
|
_suspended = true;
|
||||||
|
qp(tnow);
|
||||||
|
_suspended = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// and the failsafe, if one is setup
|
// and the failsafe, if one is setup
|
||||||
|
|
|
@ -16,6 +16,7 @@ public:
|
||||||
AP_TimerProcess(uint8_t period = TIMERPROCESS_PER_DEFAULT);
|
AP_TimerProcess(uint8_t period = TIMERPROCESS_PER_DEFAULT);
|
||||||
void init( Arduino_Mega_ISR_Registry * isr_reg );
|
void init( Arduino_Mega_ISR_Registry * isr_reg );
|
||||||
void register_process(ap_procedure proc);
|
void register_process(ap_procedure proc);
|
||||||
|
bool queue_process(ap_procedure proc); // queue process to run as soon as possible after any currently running ap_processes complete. returns true if it ran immediately
|
||||||
void set_failsafe(ap_procedure proc);
|
void set_failsafe(ap_procedure proc);
|
||||||
void suspend_timer(void);
|
void suspend_timer(void);
|
||||||
void resume_timer(void);
|
void resume_timer(void);
|
||||||
|
@ -24,6 +25,7 @@ protected:
|
||||||
static uint8_t _period;
|
static uint8_t _period;
|
||||||
static ap_procedure _proc[AP_TIMERPROCESS_MAX_PROCS];
|
static ap_procedure _proc[AP_TIMERPROCESS_MAX_PROCS];
|
||||||
static ap_procedure _failsafe;
|
static ap_procedure _failsafe;
|
||||||
|
static ap_procedure _queued_proc;
|
||||||
static uint8_t _pidx;
|
static uint8_t _pidx;
|
||||||
static bool _in_timer_call;
|
static bool _in_timer_call;
|
||||||
static bool _suspended;
|
static bool _suspended;
|
||||||
|
|
|
@ -14,6 +14,7 @@ class AP_PeriodicProcess
|
||||||
public:
|
public:
|
||||||
virtual void register_process(ap_procedure proc) = 0;
|
virtual void register_process(ap_procedure proc) = 0;
|
||||||
virtual void set_failsafe(ap_procedure proc) = 0;
|
virtual void set_failsafe(ap_procedure proc) = 0;
|
||||||
|
virtual bool queue_process(ap_procedure proc) = 0; // queue process to run as soon as possible after any currently running ap_processes complete. returns true if it ran immediately
|
||||||
virtual void suspend_timer(void) = 0;
|
virtual void suspend_timer(void) = 0;
|
||||||
virtual void resume_timer(void) = 0;
|
virtual void resume_timer(void) = 0;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue