Skip to content

Commit 5de7186

Browse files
committed
plugins: TCB adds cycle, next_cycle and reset to msg
- adds to ConveyorBeltCommand proto - reset: set to true to reset the TCB - next_cycle: the expected next cycle - adds to ConveyorBeltStatus proto - cycle: the current cycle - in TriggeredConveyorBeltThread::init - use host_ip_address from config instead of hardcoded "eth0" - setConveyorBeltRunMode to stop & reset - in TriggeredConveyorBeltThread::loop - if send_conveyor_command is set and cycle matches expectation - send conveyor command - else if send_reset_command is still set - send conveyor command ( this is for the case when the one in init was lost ) - in TriggeredConveyorBeltThread::clips start/stop belt - set requested_run_mode and send_conveyor_command flag - in TriggeredConveyorBeltThread::receiveAndBufferConveyorStatusMsg - if cycle in received status matches expecation - increase cycle - reset send_conveyor_command_ flag - reset send_reset_command_ flag - else if TCB is ahead of expectation - set sent_reset_command flag
1 parent 499bda3 commit 5de7186

File tree

4 files changed

+46
-13
lines changed

4 files changed

+46
-13
lines changed

rockin/plugins/msgs/DeviceConveyorBelt.proto

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ enum RunMode
77
message ConveyorBeltCommand
88
{
99
optional RunMode mode = 1;
10+
optional bool reset = 2;
11+
required int32 next_cycle = 3;
1012
}
1113

1214
message ConveyorBeltStatus
1315
{
1416
required bool is_device_connected = 1;
1517
optional RunMode mode = 2;
16-
}
18+
required int32 cycle = 3;
19+
}

rockin/plugins/msgs/DeviceQualityControlCamera.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ message QualityControlCameraStatus
1010

1111
required bool is_device_connected = 1;
1212
optional State state = 2;
13-
}
13+
}

rockin/plugins/triggered_conveyor_belt/triggered_conveyor_belt_thread.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@
3636
TriggeredConveyorBeltThread::TriggeredConveyorBeltThread() :
3737
Thread("TriggeredConveyorBeltThread", Thread::OPMODE_CONTINUOUS),
3838
zmq_context_(NULL), zmq_publisher_(NULL), zmq_camera_subscriber_(NULL),
39-
zmq_conveyor_subscriber_(NULL), cfg_timer_interval_(40),
40-
default_network_interface_("eth0"),
39+
zmq_conveyor_subscriber_(NULL), cfg_timer_interval_(40), cycle_(0),
40+
send_conveyor_command_(false), send_reset_command_(true),
41+
requested_run_mode_(STOP),
4142
last_state_(QualityControlCameraStatus::NO_PLATE)
4243
{
4344
}
@@ -66,7 +67,7 @@ void TriggeredConveyorBeltThread::init()
6667
&& config->exists("/llsfrb/triggered-conveyor-belt/conveyor_status_port"))
6768
{
6869
host_ip_address = config->get_string("/llsfrb/triggered-conveyor-belt/host");
69-
host_command_port = "epgm://" + default_network_interface_ + ":" + boost::lexical_cast<std::string>(config->get_uint("/llsfrb/triggered-conveyor-belt/command_port"));
70+
host_command_port = "epgm://" + host_ip_address + ":" + boost::lexical_cast<std::string>(config->get_uint("/llsfrb/triggered-conveyor-belt/command_port"));
7071
host_camera_status_port = "epgm://" + host_ip_address + ":" + boost::lexical_cast<std::string>(config->get_uint("/llsfrb/triggered-conveyor-belt/camera_status_port"));
7172
host_conveyor_status_port = "epgm://" + host_ip_address + ":" + boost::lexical_cast<std::string>(config->get_uint("/llsfrb/triggered-conveyor-belt/conveyor_status_port"));
7273

@@ -116,6 +117,9 @@ void TriggeredConveyorBeltThread::init()
116117

117118
fawkes::MutexLocker lock(clips_mutex);
118119

120+
logger->log_info("TriggeredConveyorBelt", "Sending reset to Device");
121+
setConveyorBeltRunMode(requested_run_mode_);
122+
119123
clips->add_function("conveyor-belt-start-belt", sigc::slot<void>(sigc::mem_fun(*this, &TriggeredConveyorBeltThread::clips_start_belt)));
120124
clips->add_function("conveyor-belt-stop-belt", sigc::slot<void>(sigc::mem_fun(*this, &TriggeredConveyorBeltThread::clips_stop_belt)));
121125
clips->add_function("conveyor-belt-is-running", sigc::slot<bool>(sigc::mem_fun(*this, &TriggeredConveyorBeltThread::clips_is_belt_running)));
@@ -150,6 +154,18 @@ void TriggeredConveyorBeltThread::loop()
150154
boost::this_thread::sleep(boost::posix_time::milliseconds(cfg_timer_interval_));
151155
receiveAndBufferConveyorStatusMsg();
152156
receiveAndBufferCameraStatusMsg();
157+
158+
fawkes::MutexLocker lock(clips_mutex);
159+
if (send_conveyor_command_)
160+
{
161+
int next_cycle;
162+
next_cycle = cycle_ + 1;
163+
if (next_cycle == last_conveyor_status_msg_.cycle())
164+
return;
165+
setConveyorBeltRunMode(requested_run_mode_);
166+
} else if (send_reset_command_){
167+
setConveyorBeltRunMode(requested_run_mode_);
168+
}
153169
}
154170

155171
bool TriggeredConveyorBeltThread::clips_is_belt_running()
@@ -187,18 +203,20 @@ bool TriggeredConveyorBeltThread::clips_is_camera_connected()
187203

188204
void TriggeredConveyorBeltThread::clips_start_belt()
189205
{
190-
setConveyorBeltRunMode(START);
206+
fawkes::MutexLocker lock(clips_mutex);
207+
requested_run_mode_ = START;
208+
send_conveyor_command_ = true;
191209
}
192210

193211
void TriggeredConveyorBeltThread::clips_stop_belt()
194212
{
195-
setConveyorBeltRunMode(STOP);
213+
fawkes::MutexLocker lock(clips_mutex);
214+
requested_run_mode_ = STOP;
215+
send_conveyor_command_ = true;
196216
}
197217

198218
void TriggeredConveyorBeltThread::setConveyorBeltRunMode(RunMode mode)
199219
{
200-
logger->log_info("TriggeredConveyorBelt", "Set run mode: %d", mode);
201-
202220
boost::posix_time::time_duration time_diff;
203221

204222
// prevent sending to many messages to the device
@@ -210,7 +228,10 @@ void TriggeredConveyorBeltThread::setConveyorBeltRunMode(RunMode mode)
210228
ConveyorBeltCommand command_msg;
211229
std::string serialized_string;
212230

231+
command_msg.set_next_cycle(cycle_+1);
213232
command_msg.set_mode(mode);
233+
if (send_reset_command_)
234+
command_msg.set_reset(true);
214235

215236
zmq::message_t *query = NULL;
216237
try
@@ -222,8 +243,6 @@ void TriggeredConveyorBeltThread::setConveyorBeltRunMode(RunMode mode)
222243

223244
last_sent_command_timestamp_ = boost::posix_time::microsec_clock::local_time();
224245

225-
logger->log_info("TriggeredConveyorBelt", "Set run mode: %d", command_msg.mode());
226-
227246
delete query;
228247
} catch (fawkes::Exception &e)
229248
{
@@ -248,6 +267,15 @@ void TriggeredConveyorBeltThread::receiveAndBufferConveyorStatusMsg()
248267
if (last_conveyor_status_msg_.ParseFromArray(zmq_conveyor_msg_.data(),
249268
zmq_conveyor_msg_.size()))
250269
{
270+
int expected_cycle = cycle_ + 1;
271+
if (last_conveyor_status_msg_.cycle() == expected_cycle){
272+
cycle_++;
273+
send_conveyor_command_ = false;
274+
send_reset_command_ = false;
275+
} else if (last_conveyor_status_msg_.cycle() > expected_cycle)
276+
{
277+
send_reset_command_ = true;
278+
}
251279
prev_conveyor_update_timestamp_ = boost::posix_time::microsec_clock::local_time();
252280
}
253281
} else

rockin/plugins/triggered_conveyor_belt/triggered_conveyor_belt_thread.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,12 @@ class TriggeredConveyorBeltThread : public fawkes::Thread, public fawkes::Loggin
5858
zmq::socket_t *zmq_camera_subscriber_;
5959
zmq::socket_t *zmq_conveyor_subscriber_;
6060
unsigned int cfg_timer_interval_;
61+
unsigned int cycle_;
6162

62-
std::string default_network_interface_;
63-
63+
bool send_conveyor_command_;
64+
bool send_reset_command_;
6465
ConveyorBeltStatus last_conveyor_status_msg_;
66+
RunMode requested_run_mode_;
6567
QualityControlCameraStatus last_camera_status_msg_;
6668
QualityControlCameraStatus::State last_state_;
6769

0 commit comments

Comments
 (0)