1 #ifndef LIAISON_JAIABOT_H
2 #define LIAISON_JAIABOT_H
5 #include <Wt/WPushButton>
7 #include <boost/thread/mutex.hpp>
8 #include <boost/units/io.hpp>
11 #include "goby/zeromq/liaison/liaison_container.h"
12 #include <goby/middleware/frontseat/groups.h>
13 #include <goby/middleware/gpsd/groups.h>
14 #include <goby/middleware/protobuf/frontseat_data.pb.h>
15 #include <goby/middleware/protobuf/gpsd.pb.h>
20 #include "jaiabot/messages/sensor/salinity.pb.h"
22 #include "config.pb.h"
23 #include "jaiabot/messages/feather.pb.h"
24 #include "jaiabot/messages/sensor/pressure_temperature.pb.h"
30 class LiaisonJaiabot :
public goby::zeromq::LiaisonContainerWithComms<LiaisonJaiabot, CommsThread>
34 Wt::WContainerWidget* parent = 0);
37 void post_node_status(
const goby::middleware::frontseat::protobuf::NodeStatus& node_status);
38 void post_tpv(
const goby::middleware::protobuf::gpsd::TimePositionVelocity& tpv);
39 void post_pt(
const jaiabot::protobuf::PressureTemperatureData& pt);
46 void focus()
override { timer_.start(); }
47 void unfocus()
override { timer_.stop(); }
49 void vehicle_select(Wt::WString
msg);
50 void check_add_vehicle(
int node_id);
51 void key_press(Wt::WKeyEvent key);
52 void key_release(Wt::WKeyEvent key);
55 Wt::WComboBox* vehicle_combo_;
56 Wt::WStackedWidget* vehicle_stack_;
60 VehicleData(Wt::WStackedWidget*,
const protobuf::JaiabotConfig&);
62 Wt::WContainerWidget* vehicle_div;
66 Controls(Wt::WContainerWidget* vehicle_div,
const protobuf::JaiabotConfig& cfg);
104 text->setText(timeout_text_from_value(value));
109 text->setText(dive_text_from_value(value));
116 text->setText(motor_text_from_value(value));
120 Wt::WSlider* stbd_elevator, Wt::WSlider* rudder)
122 text->setText(fins_text_from_value(value, stbd_elevator->value(), rudder->value()));
126 Wt::WSlider* port_elevator, Wt::WSlider* rudder)
128 text->setText(fins_text_from_value(port_elevator->value(), value, rudder->value()));
131 Wt::WSlider* stbd_elevator)
134 fins_text_from_value(port_elevator->value(), stbd_elevator->value(), value));
180 Controls low_level_control;
182 int index_in_stack{0};
184 static std::string timeout_text_from_value(
int value)
186 return "Timeout (X-/V+): " + std::to_string(value);
189 static std::string dive_text_from_value(
int value)
191 return "Dive (Y-/U+): " + std::to_string(value);
194 static std::string motor_text_from_value(
int value)
196 return "Motor (W-/R+): " + std::to_string(value);
198 static std::string fins_text_from_value(
int port_elevator_value,
int stbd_elevator_value,
201 return "Port Elevator (A-/Q+ or D-/E+ for both): " +
202 std::to_string(port_elevator_value) +
203 "<br/>Starboard Elevator (G-/T+ or D-/E+ for both): " +
204 std::to_string(stbd_elevator_value) +
205 "<br/>Rudder (S-/F+): " + std::to_string(rudder_value);
210 std::map<int, VehicleData> vehicle_data_;
213 Wt::WGroupBox* bot_node_status_box_;
214 Wt::WText* bot_node_status_text_;
215 Wt::WGroupBox* bot_tpv_box_;
216 Wt::WText* bot_tpv_text_;
217 Wt::WGroupBox* bot_pt_box_;
218 Wt::WText* bot_pt_text_;
219 Wt::WGroupBox* bot_salinity_box_;
220 Wt::WText* bot_salinity_text_;
221 Wt::WGroupBox* bot_imu_box_;
222 Wt::WText* bot_imu_text_;
223 Wt::WGroupBox* bot_low_control_box_;
224 Wt::WText* bot_low_control_text_;
227 int current_vehicle_{-1};
229 bool motor_go_{
false};
230 static bool dive_start_;
231 static std::chrono::system_clock::time_point dive_expire_;
235 const protobuf::JaiabotConfig& cfg_;
238 class CommsThread :
public goby::zeromq::LiaisonCommsThread<LiaisonJaiabot>
250 interprocess().subscribe<goby::middleware::frontseat::groups::node_status>(
251 [
this](
const goby::middleware::frontseat::protobuf::NodeStatus& node_status) {
256 interprocess().subscribe<goby::middleware::groups::gpsd::tpv>(
257 [
this](
const goby::middleware::protobuf::gpsd::TimePositionVelocity& tpv) {
258 tab_->post_to_wt([=]() { tab_->
post_tpv(tpv); });
263 [
this](
const jaiabot::protobuf::PressureTemperatureData& pt) {
264 tab_->post_to_wt([=]() { tab_->
post_pt(pt); });
269 [
this](
const jaiabot::protobuf::SalinityData&
salinity) {
274 interprocess().subscribe<
groups::imu>([
this](
const jaiabot::protobuf::IMUData&
imu) {
280 [
this](
const jaiabot::protobuf::LowControl&
low_control) {
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)
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::google::protobuf::MessageOptions, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::jaia::MessageOptions >, 11, false > msg
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
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::goby::acomms::protobuf::DriverConfig, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::jaiabot::udp::protobuf::Config >, 11, false > config
Wt::WContainerWidget * fins_text_box
Wt::WText * rudder_left_text
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)
Wt::WGroupBox * timeout_box
void set_timeout_value(int value)
static void dive_button_clicked(Wt::WMouseEvent)
Wt::WPushButton * dive_button
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
Wt::WContainerWidget * dive_button_box
Wt::WGroupBox * controls_box
void set_rudder_value(int value)
Controls(Wt::WContainerWidget *vehicle_div, const protobuf::JaiabotConfig &cfg)
protobuf::LowControlAck latest_ack
Wt::WContainerWidget * dive_text_box
void set_port_elevator_value(int value)
Wt::WSlider * stbd_elevator_slider
void set_motor_value(int value)
Wt::WText * motor_left_text
Wt::WSlider * motor_slider
Wt::WContainerWidget * timeout_text_box
Wt::WText * rudder_right_text
void set_dive_value(int value)
Wt::WText * motor_right_text
Wt::WGroupBox * motor_box
static void stbd_elevator_slider_moved(int value, Wt::WText *text, Wt::WSlider *port_elevator, Wt::WSlider *rudder)
Wt::WContainerWidget * dive_slider_box
static void port_elevator_slider_moved(int value, Wt::WText *text, Wt::WSlider *stbd_elevator, Wt::WSlider *rudder)
Wt::WContainerWidget * motor_text_box
static void motor_slider_moved(int value, Wt::WText *text)