Skip to content

Instantly share code, notes, and snippets.

@djungelorm
Created April 10, 2018 07:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save djungelorm/a4b9d2e76a7828efc600257f8f4598db to your computer and use it in GitHub Desktop.
Save djungelorm/a4b9d2e76a7828efc600257f8f4598db to your computer and use it in GitHub Desktop.
Sub-orbital flight kRPC demo for Arduino
#include <krpc.h>
#include <krpc/services/krpc.h>
#include <krpc/services/space_center.h>
const int BUTTON = 2;
const int LED = 13;
HardwareSerial * conn;
#ifdef KRPC_ERROR_CHECK_FN
#include <krpc/error.h>
// Error handler function called if an RPC fails
void error_handler(krpc_error_t err) {
while (true) {
for (int i = 0; i < -(int)err; i++) {
digitalWrite(LED, HIGH);
delay(100);
digitalWrite(LED, LOW);
delay(250);
}
delay(1000);
}
}
#endif
void setup() {
pinMode(BUTTON, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
#ifdef KRPC_ERROR_CHECK_FN
krpc_error_handler = &error_handler;
#endif
conn = &Serial;
krpc_open(&conn, NULL);
}
void loop() {
digitalWrite(LED, HIGH);
if (digitalRead(BUTTON)) {
digitalWrite(LED, LOW);
prog();
}
delay(1);
}
void prog() {
krpc_connect(conn, "Sub-orbital flight");
krpc_SpaceCenter_Vessel_t vessel;
krpc_SpaceCenter_ActiveVessel(conn, &vessel);
krpc_SpaceCenter_AutoPilot_t auto_pilot;
krpc_SpaceCenter_Vessel_AutoPilot(conn, &auto_pilot, vessel);
krpc_SpaceCenter_AutoPilot_t control;
krpc_SpaceCenter_Vessel_Control(conn, &control, vessel);
krpc_SpaceCenter_AutoPilot_TargetPitchAndHeading(conn, auto_pilot, 90, 90);
krpc_SpaceCenter_AutoPilot_Engage(conn, auto_pilot);
krpc_SpaceCenter_Control_set_Throttle(conn, control, 1);
delay(1000);
krpc_SpaceCenter_Control_ActivateNextStage(conn, NULL, control);
krpc_SpaceCenter_Resources_t resources;
krpc_SpaceCenter_Vessel_Resources(conn, &resources, vessel);
while (true) {
float solid_fuel;
krpc_SpaceCenter_Resources_Amount(conn, &solid_fuel, resources, "SolidFuel");
if (solid_fuel < 0.1)
break;
}
krpc_SpaceCenter_Control_ActivateNextStage(conn, NULL, control);
krpc_SpaceCenter_Flight_t flight;
krpc_SpaceCenter_Vessel_Flight(conn, &flight, vessel, KRPC_NULL);
while (true) {
double mean_altitude;
krpc_SpaceCenter_Flight_MeanAltitude(conn, &mean_altitude, flight);
if (mean_altitude > 10000)
break;
}
krpc_SpaceCenter_AutoPilot_TargetPitchAndHeading(conn, auto_pilot, 60, 90);
krpc_SpaceCenter_Orbit_t orbit;
krpc_SpaceCenter_Vessel_Orbit(conn, &orbit, vessel);
while (true) {
double apoapsis_altitude;
krpc_SpaceCenter_Orbit_ApoapsisAltitude(conn, &apoapsis_altitude, orbit);
if (apoapsis_altitude > 100000)
break;
}
krpc_SpaceCenter_Control_set_Throttle(conn, control, 0);
delay(1000);
krpc_SpaceCenter_Control_ActivateNextStage(conn, NULL, control);
krpc_SpaceCenter_AutoPilot_Disengage(conn, auto_pilot);
while (true) {
double srf_altitude;
krpc_SpaceCenter_Flight_SurfaceAltitude(conn, &srf_altitude, flight);
if (srf_altitude < 1000)
break;
}
krpc_SpaceCenter_Control_ActivateNextStage(conn, NULL, control);
krpc_SpaceCenter_CelestialBody_t body;
krpc_SpaceCenter_Orbit_Body(conn, &body, orbit);
krpc_SpaceCenter_ReferenceFrame_t body_ref_frame;
krpc_SpaceCenter_CelestialBody_ReferenceFrame(conn, &body_ref_frame, body);
krpc_SpaceCenter_Flight_t body_flight;
krpc_SpaceCenter_Vessel_Flight(conn, &body_flight, vessel, body_ref_frame);
while (true) {
double vertical_speed;
krpc_SpaceCenter_Flight_VerticalSpeed(conn, &vertical_speed, body_flight);
if (vertical_speed > -0.1)
break;
double altitude;
krpc_SpaceCenter_Flight_SurfaceAltitude(conn, &altitude, flight);
delay(1000);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment