You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
4.5 KiB
225 lines
4.5 KiB
// -*- 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; |
|
} |
|
}
|
|
|