27 #ifndef _HUMAN_DRIVER_MONITOR_H_
28 #define _HUMAN_DRIVER_MONITOR_H_
38 #include <human_driver_monitor/HumanDriverMonitorStatus.h>
40 #include <diagnostic_updater/diagnostic_updater.h>
41 #include <diagnostic_updater/publisher.h>
42 #include <boost/thread/thread.hpp>
44 #include <tcp_client/AsyncClient.h>
45 #include <boost/format.hpp>
46 #include <boost/thread/thread.hpp>
47 #include <boost/spirit/include/qi.hpp>
48 #include <boost/spirit/include/phoenix_core.hpp>
49 #include <boost/spirit/include/phoenix_operator.hpp>
53 namespace human_driver_monitor
87 status_freq_(
"HumanDriverMonitor",updater_,diagnostic_updater::FrequencyStatusParam(&status_max_frequency_,&status_min_frequency_, 0.1, 10)),
88 status_max_frequency_(50.0),
89 status_min_frequency_(70.0),
90 comm_(io_service_,server_ip_,server_port_)
110 updater_.setHardwareID(
"human driver monitor");
114 comm_.readHandler.connect(boost::bind(&HumanDriverMonitor::newData,
this,_1));
117 comm_.connectHandler.connect(boost::bind(&HumanDriverMonitor::connectHandler,
this));
129 status_pub_ = nh_.advertise<human_driver_monitor::HumanDriverMonitorStatus>(
"status", 1);
144 boost::thread thread(boost::bind(&boost::asio::io_service::run, &io_service_));
178 comm_.write(
"start");
179 }
catch(std::exception& e)
181 std::cout <<
"Exception: " << e.what() <<
"\n";
195 data.erase(data.end()-2,data.end());
200 status_.lights_high=1;
202 status_.lights_high=0;
205 status_.lights_medium=1;
207 status_.lights_medium=0;
220 status_.lights_left=1;
222 status_.lights_left=0;
225 status_.lights_right=1;
227 status_.lights_right=0;
229 if(status_.lights_left && status_.lights_right)
230 status_.lights_danger=1;
232 status_.lights_danger=0;
237 namespace qi = boost::spirit::qi;
241 using qi::ascii::space;
243 using boost::phoenix::ref;
245 qi::phrase_parse(data.begin(),data.end(),
246 omit[char_] >> int_[ref(status_.throttle_pressure) = _1] >>
247 omit[char_] >> int_[ref(status_.brake_pressure) = _1] >>
248 omit[char_] >> int_[ref(status_.clutch_pressure) = _1]
251 status_.header.stamp = ros::Time::now();
252 status_.header.frame_id =
"";
253 status_pub_.publish(status_);
263 void diagnostics(diagnostic_updater::DiagnosticStatusWrapper& stat)
265 if(!comm_.isConnected())
267 stat.summary(diagnostic_msgs::DiagnosticStatus::ERROR,
"No connection to hardware.");
268 stat.add(
"Status",comm_.error_.message());
269 stat.add(
"Connecting to",server_ip_);
270 stat.add(
"Port number",server_port_);
273 stat.summary(diagnostic_msgs::DiagnosticStatus::OK,
"No problems.");
274 stat.add(
"Connected with",server_ip_);
275 stat.add(
"Port number",server_port_);
277 boost::format fmt(
"%.2f");
278 fmt % (ros::Time::now()-status_.header.stamp).toSec();
280 stat.add(
"Last message sent", fmt.str()+
" seconds ago" );
296 human_driver_monitor::HumanDriverMonitorStatus
status_;
ros::NodeHandle nh_
Ros node handler.
double status_max_frequency_
Maximum admissible frequency.
AsyncClient comm_
Asynchronous tcp/ip communication object.
void diagnostics(diagnostic_updater::DiagnosticStatusWrapper &stat)
Diagnostics function handler.
diagnostic_updater::Updater updater_
Diagnostics class.
void connectHandler(void)
This function will be called (asynchronously) on a successful connection.
HumanDriverMonitor(const ros::NodeHandle &nh, std::string ip, std::string port)
Class constructor.
void newData(string data)
This function will be called (asynchronously) upon arrival of new data.
void loop()
Start main control loop.
void init()
Initialize the class.
boost::asio::io_service io_service_
Input/Output communication service.
human_driver_monitor::HumanDriverMonitorStatus status_
Status message.
std::string server_port_
Port of the Arduino server.
Human driver monitor class.
ros::Publisher status_pub_
Ros status publisher.
~HumanDriverMonitor()
Class destructor.
void setupMessaging()
Start ros message subscribing and advertising.
std::string server_ip_
Ip of the Arduino server.
double status_min_frequency_
Minimum admissible frequency.
diagnostic_updater::HeaderlessTopicDiagnostic status_freq_
Frequency diagnostics tool.