diff --git a/ArduCopterMega/events.pde b/ArduCopterMega/events.pde new file mode 100644 index 0000000000..b42c160306 --- /dev/null +++ b/ArduCopterMega/events.pde @@ -0,0 +1,197 @@ +/* + 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) + { + + } + }else{ + reset_I(); + } +} + +void low_battery_event(void) +{ + send_message(SEVERITY_HIGH,"Low Battery!"); + set_mode(RTL); + throttle_cruise = 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) +{ + Serial.print("New Event Loaded "); + Serial.println(cmd->p1,DEC); + + + if(cmd->p1 == STOP_REPEAT){ + Serial.println("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 = rc_5.radio_out; + APM_RC.OutputCh(CH_5, event_value); // send to Servos + undo_event = 2; + break; + case CH_5_TOGGLE: + event_undo_value = rc_6.radio_out; + APM_RC.OutputCh(CH_6, event_value); // send to Servos + undo_event = 2; + break; + case CH_6_TOGGLE: + event_undo_value = rc_7.radio_out; + APM_RC.OutputCh(CH_7, event_value); // send to Servos + undo_event = 2; + break; + case CH_7_TOGGLE: + event_undo_value = rc_8.radio_out; + APM_RC.OutputCh(CH_8, event_value); // send to Servos + undo_event = 2; + event_undo_value = 1; + break; + case RELAY_TOGGLE: + + event_undo_value = PORTL & B00000100 ? 1:0; + if(event_undo_value == 1){ + relay_A(); + }else{ + relay_B(); + } + Serial.print("toggle relay "); + Serial.println(PORTL,BIN); + undo_event = 2; + break; + + } +} + +void relay_A() +{ + PORTL |= B00000100; +} + +void relay_B() +{ + 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(CH_5, event_undo_value); // send to Servos + break; + + case CH_5_TOGGLE: + APM_RC.OutputCh(CH_6, event_undo_value); // send to Servos + break; + + case CH_6_TOGGLE: + APM_RC.OutputCh(CH_7, event_undo_value); // send to Servos + break; + + case CH_7_TOGGLE: + APM_RC.OutputCh(CH_8, event_undo_value); // send to Servos + break; + + case RELAY_TOGGLE: + + if(event_undo_value == 1){ + relay_A(); + }else{ + relay_B(); + } + Serial.print("untoggle relay "); + Serial.println(PORTL,BIN); + break; + } +}