1 #include "scd_cont_slave_wrapper.h"
3 #include "scd_logging.h"
4 #include "scd_exception.h"
7 scd_cont_slave_wrapper::scd_cont_slave_wrapper(scd_simulator& sim,
8 const std::string& name):
9 _sim(sim), scd_cont_fsm(name), _name(name), _is_connected(false),
10 _st_init(sim, *this), _st_busy(sim, *this), _st_idle(sim, *this),
11 _st_done(sim, *this), _st_time_req(sim, *this), _st_time_ack(sim, *this),
12 _st_term_req(sim, *this), _st_term_ack(sim, *this),
13 _st_terminate(sim, *this), _st_terminated(sim, *this), _st_fail(sim, *this),
14 _st_failed(sim, *this)
21 scd_cont_slave_wrapper::~scd_cont_slave_wrapper()
28 const std::string& scd_cont_slave_wrapper::get_name() const { return _name; }
31 void scd_cont_slave_wrapper::connect(scd_socket* sock)
36 _writer.set_socket(*_socket);
37 _reader.set_socket(*_socket);
39 scd_info("slave \"" + _name + "\" connected");
40 static_cast<scd_stsw_base*>(_state)->set_connected();
44 scd_warn("slave " + _name + " has already been connected");
50 void scd_cont_slave_wrapper::send_command(scd_command* cmd)
52 // register write event if not registered
53 if (!_writer.is_writing() && _is_connected && _socket->is_valid())
54 _sim.get_poller().set_ev(*this, SOCK_EV_WRITE | SOCK_EV_READ
57 // queue command to be written
58 _writer.queue_command(cmd);
62 bool scd_cont_slave_wrapper::is_sending() const
64 return _writer.is_writing() && _is_connected && _socket->is_valid();
68 void scd_cont_slave_wrapper::close()
75 void scd_cont_slave_wrapper::handle_sock_ev(sock_ev events)
77 scd_stsw_base& state = *static_cast<scd_stsw_base*>(_state);
79 if (events & SOCK_EV_CLOSE)
82 scd_error("connection to slave \"" + _name + "\" lost");
87 if (events & SOCK_EV_READ)
91 if (!_socket->is_valid())
94 scd_error("connection to slave \"" + _name + "\" lost");
99 if (!_reader.is_reading() && !_reader.has_command())
101 // received an illegal command
102 scd_error("received illegal command");
107 if (_reader.has_command())
109 scd_command* cmd = _reader.get_command();
116 if (events & SOCK_EV_WRITE)
120 if (!_writer.is_writing())
122 // done sending commands
123 _sim.get_poller().set_ev(*this, SOCK_EV_READ | SOCK_EV_CLOSE);
126 if (!_socket->is_valid())
128 scd_error("connection to slave \"" + _name + "\" lost");
135 } // handle_sock_ev()
138 const scd_socket& scd_cont_slave_wrapper::get_sock() { return *_socket; }
141 void scd_cont_slave_wrapper::_process_cmd(const scd_command& cmd)
143 if (cmd.get_type() != SCD_CM_CONTROL)
145 scd_warn("received non-control command");
149 scd_stsw_base* state = static_cast<scd_stsw_base*>(_state);
151 switch(cmd.get_subtype())
157 state->set_idle(cmd.get_time());
162 case SCD_CM_TIME_NACK:
163 state->recv_time_nack();
165 case SCD_CM_TIME_ACK:
166 state->recv_time_ack();
168 case SCD_CM_TERM_NACK:
169 state->recv_term_nack();
171 case SCD_CM_TERM_ACK:
172 state->recv_term_ack();
175 scd_error("slave \"" + _name + "\" failed");
179 scd_warn("received unknown command");