blob: 310f41f6f5848e8a81e399370f3f6025ddfb2cb5 [file] [log] [blame]
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "aos/actions/actions.h"
#include "aos/init.h"
#include "aos/input/action_joystick_input.h"
#include "aos/input/driver_station_data.h"
#include "aos/input/drivetrain_input.h"
#include "aos/input/joystick_input.h"
#include "aos/logging/logging.h"
#include "aos/logging/logging.h"
#include "aos/util/log_interval.h"
#include "frc971/autonomous/auto.q.h"
#include "frc971/autonomous/base_autonomous_actor.h"
#include "frc971/control_loops/drivetrain/drivetrain.q.h"
#include "y2019/control_loops/drivetrain/drivetrain_base.h"
#include "y2019/control_loops/superstructure/superstructure.q.h"
using ::y2019::control_loops::superstructure::superstructure_queue;
using ::aos::input::driver_station::ButtonLocation;
using ::aos::input::driver_station::ControlBit;
using ::aos::input::driver_station::JoystickAxis;
using ::aos::input::driver_station::POVLocation;
namespace y2019 {
namespace input {
namespace joysticks {
// TODO(sabina): update button locations when the board is done
const ButtonLocation kIntakeOut(3, 3);
const ButtonLocation kElevatorDown(0, 0);
const ButtonLocation kElevatorFront1(4, 1);
const ButtonLocation kElevatorFront2(4, 11);
const ButtonLocation kElevatorFront3(4, 9);
const ButtonLocation kElevatorFront4(4, 7);
const ButtonLocation kElevatorFront5(4, 5);
const ButtonLocation kElevatorBack1(3, 14);
const ButtonLocation kElevatorBack2(4, 12);
const ButtonLocation kElevatorBack3(4, 10);
const ButtonLocation kElevatorBack4(4, 8);
const ButtonLocation kElevatorBack5(4, 6);
const ButtonLocation kElevatorIntaking(3, 4);
const ButtonLocation kElevatorOuttake(3, 6);
const ButtonLocation kRelease(4, 4);
const ButtonLocation kSuctionBall(3, 13);
const ButtonLocation kSuctionHatch(3, 12);
const ButtonLocation kDeployStilt(3, 8);
const ButtonLocation kFallOver(3, 9);
const ButtonLocation kDiskLoad(0, 0);
const ButtonLocation kDiskRocketMiddle(0, 0);
const ButtonLocation kDiskRocketTop(0, 0);
const ButtonLocation kCargoLoad(0, 0);
const ButtonLocation kCargoBay(0, 0);
const ButtonLocation kCargoRocketBase(0, 0);
const ButtonLocation kCargoRocketMiddle(0, 0);
const ButtonLocation kCargoRocketTop(0, 0);
const ButtonLocation kStow(0, 0);
const ButtonLocation kIntakeExtend(0, 0);
const ButtonLocation kIntake(0, 0);
const ButtonLocation kSpit(0, 0);
const ButtonLocation kCargoSuction(0, 0);
const ButtonLocation kDiskSuction(0, 0);
const ButtonLocation kSuctionOut(0, 0);
const ButtonLocation kRetractStilt(0, 0);
const ButtonLocation kBackwards(0, 0);
const ButtonLocation kWristBackwards(3, 10);
const ButtonLocation kWristForwards(3, 7);
class Reader : public ::aos::input::ActionJoystickInput {
public:
Reader(::aos::EventLoop *event_loop)
: ::aos::input::ActionJoystickInput(
event_loop,
::y2019::control_loops::drivetrain::GetDrivetrainConfig()) {}
void HandleTeleop(const ::aos::input::driver_station::Data &data) {
superstructure_queue.position.FetchLatest();
superstructure_queue.status.FetchLatest();
if (!superstructure_queue.status.get() ||
!superstructure_queue.position.get()) {
LOG(ERROR, "Got no superstructure status packet.\n");
return;
}
auto new_superstructure_goal = superstructure_queue.goal.MakeMessage();
/*
if (data.IsPressed(kElevatorUp)) {
elevator_height_ += 0.1;
} else if (data.IsPressed(kElevatorDown)) {
elevator_height_ -= 0.1;
} else if (data.IsPressed(kDiskLoad)) {
elevator_height_ = 0.48;
wrist_angle_ = M_PI;
} else if (data.IsPressed(kDiskRocketMiddle)) {
elevator_height_ = 1.19;
wrist_angle_ = M_PI;
} else if (data.IsPressed(kDiskRocketTop)) {
elevator_height_ = 1.90;
wrist_angle_ = M_PI;
}
// TODO(sabina): do we need an angle here?
else if (data.IsPressed(kCargoLoad)) {
elevator_height_ = 1.12;
wrist_angle_ = M_PI;
} else if (data.IsPressed(kCargoBay)) {
elevator_height_ = 0.0;
wrist_angle_ = M_PI / 3;
} else if (data.IsPressed(kCargoRocketBase)) {
elevator_height_ = 0.7;
wrist_angle_ = M_PI;
} else if (data.IsPressed(kCargoRocketMiddle)) {
elevator_height_ = 1.41;
wrist_angle_ = M_PI;
} else if (data.IsPressed(kCargoRocketTop)) {
elevator_height_ = 2.12;
wrist_angle_ = M_PI;
} else if (data.IsPressed(kStow)) {
elevator_height_ = 0.5;
wrist_angle_ = 0.0;
} else {
}
*/
/*
// TODO(sabina): get accurate angle.
if (data.IsPressed(kIntakeExtend)) {
new_superstructure_goal->intake.unsafe_goal = 0.5;
} else {
new_superstructure_goal->intake.unsafe_goal = 0.0;
}
if (data.IsPressed(kIntake)) {
new_superstructure_goal->suction.bottom = true;
if (superstructure_queue.status->has_piece == false) {
new_superstructure_goal->roller_voltage = 12.0;
} else {
new_superstructure_goal->roller_voltage = 0.0;
}
} else if (data.IsPressed(kSpit)) {
new_superstructure_goal->suction.bottom = false;
if (superstructure_queue.status->has_piece == false) {
new_superstructure_goal->roller_voltage = 12.0;
} else {
new_superstructure_goal->roller_voltage = 0.0;
}
} else {
new_superstructure_goal->roller_voltage = 0.0;
}
*/
// TODO(sabina): decide if we should really have disk suction as its own
// button
/*
if (data.IsPressed(kCargoSuction)) {
new_superstructure_goal->suction.top = false;
new_superstructure_goal->suction.bottom = true;
} else if (data.IsPressed(kDiskSuction)) {
new_superstructure_goal->suction.top = true;
new_superstructure_goal->suction.bottom = true;
} else if (data.IsPressed(kSuctionOut)) {
new_superstructure_goal->suction.top = true;
new_superstructure_goal->suction.bottom = true;
}
*/
if (data.IsPressed(kSuctionBall)) {
top_ = false;
bottom_ = true;
} else if (data.IsPressed(kSuctionHatch)) {
top_ = true;
bottom_ = true;
} else if (data.IsPressed(kRelease) ||
!superstructure_queue.status->has_piece) {
top_ = false;
bottom_ = false;
}
// TODO(sabina): max height please?
if (data.IsPressed(kFallOver)) {
new_superstructure_goal->stilts.unsafe_goal = 0.71;
new_superstructure_goal->stilts.profile_params.max_velocity = 0.45;
new_superstructure_goal->stilts.profile_params.max_acceleration = 0.5;
} else if (data.IsPressed(kDeployStilt)) {
new_superstructure_goal->stilts.unsafe_goal = 0.50;
new_superstructure_goal->stilts.profile_params.max_velocity = 0.45;
new_superstructure_goal->stilts.profile_params.max_acceleration = 0.5;
} else {
new_superstructure_goal->stilts.unsafe_goal = 0.01;
}
if (data.IsPressed(kElevatorFront1)) {
elevator_height_ = 1.5;
} else if (data.IsPressed(kElevatorFront2)) {
elevator_height_ = 1.2;
} else if (data.IsPressed(kElevatorFront3)) {
elevator_height_ = 0.8;
} else if (data.IsPressed(kElevatorFront4)) {
elevator_height_ = 0.3;
} else if (data.IsPressed(kElevatorFront5)) {
elevator_height_ = 0.01;
}
/*
if (data.IsPressed(kWristDown)) {
wrist_angle_ = -M_PI / 3.0;
} else {
wrist_angle_ = M_PI / 3.0;
}
*/
if (data.IsPressed(kWristBackwards)) {
// Hatch pannel back
elevator_height_ = 0.03;
wrist_angle_ = -M_PI / 2.0;
Disc();
} else if (data.IsPressed(kWristForwards)) {
// Hatch pannel front
elevator_height_ = 0.03;
wrist_angle_ = M_PI / 2.0;
Disc();
} else if (data.IsPressed(kElevatorFront5)) {
// Ball front
Ball();
elevator_height_ = 0.52;
wrist_angle_ = 1.1;
} else if (data.IsPressed(kElevatorBack5)) {
// Ball back
elevator_height_ = 0.52;
wrist_angle_ = -1.1;
} else if (data.IsPressed(kElevatorFront2)) {
elevator_height_ = 1.5;
wrist_angle_ = 0.0;
} else {
wrist_angle_ = 0.0;
elevator_height_ = 0.36;
}
if (data.IsPressed(kElevatorOuttake) ||
(data.IsPressed(kIntakeOut) &&
!superstructure_queue.status->has_piece)) {
new_superstructure_goal->intake.unsafe_goal = 0.959327;
}
if (data.IsPressed(kIntakeOut) && !superstructure_queue.status->has_piece) {
elevator_height_ = 0.29;
wrist_angle_ = 2.14;
if (data.IsPressed(kElevatorIntaking)) {
new_superstructure_goal->roller_voltage = 9.0;
} else {
new_superstructure_goal->roller_voltage = 0.0;
}
Ball();
} else {
new_superstructure_goal->intake.unsafe_goal = -1.2;
new_superstructure_goal->roller_voltage = 0.0;
}
if (data.IsPressed(kElevatorOuttake)) {
new_superstructure_goal->roller_voltage = -6.0;
}
if (data.IsPressed(kElevatorBack1)) {
wrist_angle_ = -2.451824;
elevator_height_ = 0.430478;
//new_superstructure_goal->wrist.profile_params.max_velocity = 2.0;
//new_superstructure_goal->wrist.profile_params.max_acceleration = 20.0;
}
if (data.IsPressed(kElevatorBack2)) {
wrist_angle_ = -2.400;
elevator_height_ = 0.364108;
new_superstructure_goal->elevator.profile_params.max_velocity = 2.0;
new_superstructure_goal->elevator.profile_params.max_acceleration = 5.0;
new_superstructure_goal->wrist.profile_params.max_velocity = 0.35;
new_superstructure_goal->wrist.profile_params.max_acceleration = 10.0;
}
if (data.IsPressed(kElevatorBack3)) {
wrist_angle_ = -2.211173;
elevator_height_ = 0.25;
new_superstructure_goal->wrist.profile_params.max_velocity = 2.0;
new_superstructure_goal->wrist.profile_params.max_acceleration = 10.0;
}
if (data.IsPressed(kRelease)) {
top_ = false;
bottom_ = false;
}
new_superstructure_goal->suction.top = top_;
new_superstructure_goal->suction.bottom = bottom_;
new_superstructure_goal->elevator.unsafe_goal = elevator_height_;
new_superstructure_goal->wrist.unsafe_goal = wrist_angle_;
LOG_STRUCT(DEBUG, "sending goal", *new_superstructure_goal);
if (!new_superstructure_goal.Send()) {
LOG(ERROR, "Sending superstructure goal failed.\n");
}
}
void Disc() {
top_ = true;
bottom_ = true;
}
void Ball() {
top_ = false;
bottom_ = true;
}
private:
// Current goals here.
double elevator_height_ = 0.0;
double wrist_angle_ = 0.0;
bool top_ = false;
bool bottom_ = false;
};
} // namespace joysticks
} // namespace input
} // namespace y2019
int main() {
::aos::Init(-1);
::aos::ShmEventLoop event_loop;
::y2019::input::joysticks::Reader reader(&event_loop);
reader.Run();
::aos::Cleanup();
}