mirror of https://github.com/ArduPilot/ardupilot
226 lines
4.5 KiB
Plaintext
226 lines
4.5 KiB
Plaintext
|
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: t -*-
|
||
|
|
||
|
/*
|
||
|
This event will be called when the failsafe changes
|
||
|
boolean failsafe reflects the current state
|
||
|
*/
|
||
|
void failsafe_event()
|
||
|
{
|
||
|
if (failsafe == true){
|
||
|
|
||
|
// This is how to handle a failsafe.
|
||
|
switch(control_mode)
|
||
|
{
|
||
|
case MANUAL: // First position
|
||
|
set_mode(STABILIZE);
|
||
|
break;
|
||
|
|
||
|
case STABILIZE:
|
||
|
case FLY_BY_WIRE_A: // middle position
|
||
|
case FLY_BY_WIRE_B: // middle position
|
||
|
set_mode(RTL);
|
||
|
set(PARAM_TRIM_THROTTLE,THROTTLE_CRUISE);
|
||
|
|
||
|
case CIRCLE: // middle position
|
||
|
break;
|
||
|
|
||
|
case AUTO: // middle position
|
||
|
case LOITER: // middle position
|
||
|
if (get(PARAM_THR_FS_ACTION)== 1){
|
||
|
set_mode(RTL);
|
||
|
set(PARAM_TRIM_THROTTLE,THROTTLE_CRUISE);
|
||
|
}
|
||
|
// 2 = Stay in AUTO and ignore failsafe
|
||
|
break;
|
||
|
|
||
|
case RTL: // middle position
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
set_mode(RTL);
|
||
|
set(PARAM_TRIM_THROTTLE,THROTTLE_CRUISE);
|
||
|
break;
|
||
|
}
|
||
|
}else{
|
||
|
reset_I();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void low_battery_event(void)
|
||
|
{
|
||
|
gcs.send_text(SEVERITY_HIGH,"Low Battery!");
|
||
|
set_mode(RTL);
|
||
|
set(PARAM_TRIM_THROTTLE,THROTTLE_CRUISE);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
4 simultaneous events
|
||
|
int event_original - original time in seconds
|
||
|
int event_countdown - count down to zero
|
||
|
byte event_countdown - ID for what to do
|
||
|
byte event_countdown - how many times to loop, 0 = indefinite
|
||
|
byte event_value - specific information for an event like PWM value
|
||
|
byte counterEvent - undo the event if nescessary
|
||
|
|
||
|
count down each one
|
||
|
|
||
|
|
||
|
new event
|
||
|
undo_event
|
||
|
*/
|
||
|
|
||
|
void new_event(struct Location *cmd)
|
||
|
{
|
||
|
SendDebug("New Event Loaded ");
|
||
|
SendDebugln(cmd->p1,DEC);
|
||
|
|
||
|
|
||
|
if(cmd->p1 == STOP_REPEAT){
|
||
|
SendDebugln("STOP repeat ");
|
||
|
event_id = NO_REPEAT;
|
||
|
event_timer = -1;
|
||
|
undo_event = 0;
|
||
|
event_value = 0;
|
||
|
event_delay = 0;
|
||
|
event_repeat = 0; // convert seconds to millis
|
||
|
event_undo_value = 0;
|
||
|
repeat_forever = 0;
|
||
|
}else{
|
||
|
// reset the event timer
|
||
|
event_timer = millis();
|
||
|
event_id = cmd->p1;
|
||
|
event_value = cmd->alt;
|
||
|
event_delay = cmd->lat;
|
||
|
event_repeat = cmd->lng; // convert seconds to millis
|
||
|
event_undo_value = 0;
|
||
|
repeat_forever = (event_repeat == 0) ? 1:0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
Serial.print("event_id: ");
|
||
|
Serial.println(event_id,DEC);
|
||
|
Serial.print("event_value: ");
|
||
|
Serial.println(event_value,DEC);
|
||
|
Serial.print("event_delay: ");
|
||
|
Serial.println(event_delay,DEC);
|
||
|
Serial.print("event_repeat: ");
|
||
|
Serial.println(event_repeat,DEC);
|
||
|
Serial.print("event_undo_value: ");
|
||
|
Serial.println(event_undo_value,DEC);
|
||
|
Serial.print("repeat_forever: ");
|
||
|
Serial.println(repeat_forever,DEC);
|
||
|
Serial.print("Event_timer: ");
|
||
|
Serial.println(event_timer,DEC);
|
||
|
*/
|
||
|
perform_event();
|
||
|
}
|
||
|
|
||
|
void perform_event()
|
||
|
{
|
||
|
if (event_repeat > 0){
|
||
|
event_repeat --;
|
||
|
}
|
||
|
switch(event_id) {
|
||
|
case CH_4_TOGGLE:
|
||
|
event_undo_value = readOutputCh(4);
|
||
|
|
||
|
APM_RC.OutputCh(4, event_value); // send to Servos
|
||
|
undo_event = 2;
|
||
|
break;
|
||
|
case CH_5_TOGGLE:
|
||
|
event_undo_value = readOutputCh(5);
|
||
|
APM_RC.OutputCh(5, event_value); // send to Servos
|
||
|
undo_event = 2;
|
||
|
break;
|
||
|
case CH_6_TOGGLE:
|
||
|
event_undo_value = readOutputCh(6);
|
||
|
APM_RC.OutputCh(6, event_value); // send to Servos
|
||
|
undo_event = 2;
|
||
|
break;
|
||
|
case CH_7_TOGGLE:
|
||
|
event_undo_value = readOutputCh(7);
|
||
|
APM_RC.OutputCh(7, event_value); // send to Servos
|
||
|
undo_event = 2;
|
||
|
event_undo_value = 1;
|
||
|
break;
|
||
|
case RELAY_TOGGLE:
|
||
|
|
||
|
event_undo_value = PORTL & B00000100 ? 1:0;
|
||
|
relay_toggle();
|
||
|
SendDebug("toggle relay ");
|
||
|
SendDebugln(PORTL,BIN);
|
||
|
undo_event = 2;
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void relay_on()
|
||
|
{
|
||
|
PORTL |= B00000100;
|
||
|
}
|
||
|
|
||
|
void relay_off()
|
||
|
{
|
||
|
PORTL &= ~B00000100;
|
||
|
}
|
||
|
|
||
|
void relay_toggle()
|
||
|
{
|
||
|
PORTL ^= B00000100;
|
||
|
}
|
||
|
|
||
|
void update_events()
|
||
|
{
|
||
|
// repeating events
|
||
|
if(undo_event == 1){
|
||
|
perform_event_undo();
|
||
|
undo_event = 0;
|
||
|
}else if(undo_event > 1){
|
||
|
undo_event --;
|
||
|
}
|
||
|
|
||
|
if(event_timer == -1)
|
||
|
return;
|
||
|
|
||
|
if((millis() - event_timer) > event_delay){
|
||
|
perform_event();
|
||
|
|
||
|
if(event_repeat > 0 || repeat_forever == 1){
|
||
|
event_repeat--;
|
||
|
event_timer = millis();
|
||
|
}else{
|
||
|
event_timer = -1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void perform_event_undo()
|
||
|
{
|
||
|
switch(event_id) {
|
||
|
case CH_4_TOGGLE:
|
||
|
APM_RC.OutputCh(4, event_undo_value); // send to Servos
|
||
|
break;
|
||
|
|
||
|
case CH_5_TOGGLE:
|
||
|
APM_RC.OutputCh(5, event_undo_value); // send to Servos
|
||
|
break;
|
||
|
|
||
|
case CH_6_TOGGLE:
|
||
|
APM_RC.OutputCh(6, event_undo_value); // send to Servos
|
||
|
break;
|
||
|
|
||
|
case CH_7_TOGGLE:
|
||
|
APM_RC.OutputCh(7, event_undo_value); // send to Servos
|
||
|
break;
|
||
|
|
||
|
case RELAY_TOGGLE:
|
||
|
|
||
|
relay_toggle();
|
||
|
SendDebug("untoggle relay ");
|
||
|
SendDebugln(PORTL,BIN);
|
||
|
break;
|
||
|
}
|
||
|
}
|