1#ifndef LIAISON_JAIABOT_H
2#define LIAISON_JAIABOT_H
4#include <Wt/WAbstractItemModel.h>
6#include <Wt/WPushButton.h>
8#include <boost/thread/mutex.hpp>
9#include <boost/units/io.hpp>
12#include "goby/zeromq/liaison/liaison_container.h"
13#include <goby/middleware/frontseat/groups.h>
14#include <goby/middleware/gpsd/groups.h>
15#include <goby/middleware/protobuf/frontseat_data.pb.h>
16#include <goby/middleware/protobuf/gpsd.pb.h>
21#include "jaiabot/messages/sensor/salinity.pb.h"
24#include "jaiabot/messages/feather.pb.h"
25#include "jaiabot/messages/sensor/pressure_temperature.pb.h"
31class LiaisonJaiabot :
public goby::zeromq::LiaisonContainerWithComms<LiaisonJaiabot, CommsThread>
35 Wt::WContainerWidget* parent = 0);
38 void post_node_status(
const goby::middleware::frontseat::protobuf::NodeStatus& node_status);
39 void post_tpv(
const goby::middleware::protobuf::gpsd::TimePositionVelocity& tpv);
47 void focus()
override { timer_.start(); }
48 void unfocus()
override { timer_.stop(); }
50 void vehicle_select(Wt::WString msg);
51 void check_add_vehicle(
int node_id);
52 void key_press(Wt::WKeyEvent key);
53 void key_release(Wt::WKeyEvent key);
56 Wt::WComboBox* vehicle_combo_;
57 Wt::WStackedWidget* vehicle_stack_;
61 VehicleData(Wt::WStackedWidget*,
const protobuf::JaiabotConfig&);
62 VehicleData(
const VehicleData&) =
delete;
63 VehicleData& operator=(
const VehicleData&) =
delete;
65 std::unique_ptr<Wt::WContainerWidget> vehicle_div;
69 Controls(Wt::WContainerWidget* vehicle_div,
const protobuf::JaiabotConfig& cfg);
91 std::cout <<
"slider moved: " << text << std::endl;
93 text->setText(timeout_text_from_value(value));
98 text->setText(dive_text_from_value(value));
105 text->setText(motor_text_from_value(value));
109 Wt::WSlider* stbd_elevator, Wt::WSlider* rudder)
111 text->setText(fins_text_from_value(value, stbd_elevator->value(), rudder->value()));
115 Wt::WSlider* port_elevator, Wt::WSlider* rudder)
117 text->setText(fins_text_from_value(port_elevator->value(), value, rudder->value()));
120 Wt::WSlider* stbd_elevator)
123 fins_text_from_value(port_elevator->value(), stbd_elevator->value(), value));
169 Controls low_level_control;
171 int index_in_stack{0};
173 static std::string timeout_text_from_value(
int value)
175 return "Timeout (X-/V+): " + std::to_string(value);
178 static std::string dive_text_from_value(
int value)
180 return "Dive (Y-/U+): " + std::to_string(value);
183 static std::string motor_text_from_value(
int value)
185 return "Motor (W-/R+): " + std::to_string(value);
187 static std::string fins_text_from_value(
int port_elevator_value,
int stbd_elevator_value,
190 return "Port Elevator (A-/Q+ or D-/E+ for both): " +
191 std::to_string(port_elevator_value) +
192 "<br/>Starboard Elevator (G-/T+ or D-/E+ for both): " +
193 std::to_string(stbd_elevator_value) +
194 "<br/>Rudder (S-/F+): " + std::to_string(rudder_value);
199 std::map<int, std::unique_ptr<VehicleData>> vehicle_data_;
202 Wt::WText* bot_node_status_text_;
203 Wt::WText* bot_tpv_text_;
204 Wt::WText* bot_pt_text_;
205 Wt::WText* bot_salinity_text_;
206 Wt::WText* bot_imu_text_;
207 Wt::WText* bot_low_control_text_;
210 int current_vehicle_{-1};
212 bool motor_go_{
false};
213 static bool dive_start_;
214 static std::chrono::system_clock::time_point dive_expire_;
218 const protobuf::JaiabotConfig& cfg_;
221class CommsThread :
public goby::zeromq::LiaisonCommsThread<LiaisonJaiabot>
226 : LiaisonCommsThread<
LiaisonJaiabot>(tab, config, index), tab_(tab)
233 interprocess().subscribe<goby::middleware::frontseat::groups::node_status>(
234 [
this](
const goby::middleware::frontseat::protobuf::NodeStatus& node_status)
238 interprocess().subscribe<goby::middleware::groups::gpsd::tpv>(
239 [
this](
const goby::middleware::protobuf::gpsd::TimePositionVelocity& tpv)
240 { tab_->post_to_wt([=]() { tab_->
post_tpv(tpv); }); });
245 { tab_->post_to_wt([=]() { tab_->
post_pt(pt); }); });
250 { tab_->post_to_wt([=]() { tab_->
post_salinity(salinity); }); });
255 { tab_->post_to_wt([=]() { tab_->
post_imu(imu); }); });
CommsThread(LiaisonJaiabot *tab, const goby::apps::zeromq::protobuf::LiaisonConfig &config, int index)
void post_imu(const jaiabot::protobuf::IMUData &imu)
void post_control_ack(const protobuf::LowControlAck &ack)
void post_tpv(const goby::middleware::protobuf::gpsd::TimePositionVelocity &tpv)
void post_low_control(const jaiabot::protobuf::LowControl &low_control)
LiaisonJaiabot(const goby::apps::zeromq::protobuf::LiaisonConfig &cfg, Wt::WContainerWidget *parent=0)
void post_pt(const jaiabot::protobuf::PressureTemperatureData &pt)
void post_node_status(const goby::middleware::frontseat::protobuf::NodeStatus &node_status)
void post_salinity(const jaiabot::protobuf::SalinityData &salinity)
constexpr goby::middleware::Group imu
constexpr goby::middleware::Group pressure_temperature
constexpr goby::middleware::Group low_control
constexpr goby::middleware::Group salinity
constexpr goby::middleware::Group control_ack
static void dive_slider_moved(int value, Wt::WText *text)
Wt::WSlider * timeout_slider
static void timeout_slider_moved(int value, Wt::WText *text)
Wt::WSlider * dive_slider
void set_stbd_elevator_value(int value)
Controls(const Controls &)=delete
void set_timeout_value(int value)
static void rudder_slider_moved(int value, Wt::WText *text, Wt::WSlider *port_elevator, Wt::WSlider *stbd_elevator)
Wt::WSlider * port_elevator_slider
Wt::WSlider * rudder_slider
Controls & operator=(const Controls &)=delete
void set_rudder_value(int value)
Controls(Wt::WContainerWidget *vehicle_div, const protobuf::JaiabotConfig &cfg)
protobuf::LowControlAck latest_ack
void set_port_elevator_value(int value)
Wt::WSlider * stbd_elevator_slider
void set_motor_value(int value)
Wt::WSlider * motor_slider
void set_dive_value(int value)
static void dive_button_clicked()
static void stbd_elevator_slider_moved(int value, Wt::WText *text, Wt::WSlider *port_elevator, Wt::WSlider *rudder)
static void port_elevator_slider_moved(int value, Wt::WText *text, Wt::WSlider *stbd_elevator, Wt::WSlider *rudder)
static void motor_slider_moved(int value, Wt::WText *text)