dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / fsm / scd_sts_done.cpp
diff --git a/dol/src/dol/visitor/hdsd/scd/fsm/scd_sts_done.cpp b/dol/src/dol/visitor/hdsd/scd/fsm/scd_sts_done.cpp
new file mode 100644 (file)
index 0000000..ddd8203
--- /dev/null
@@ -0,0 +1,58 @@
+#include "fsm/scd_sts_done.h"
+
+#include "scd_logging.h"
+#include "scd_exception.h"
+#include "scd_cont_man_slave.h"
+#include "scd_cont_man.h"
+
+
+void scd_sts_done::recv_time_req()
+{
+    if (_sim.get_poller().wait(SCD_CONT_DELAY))
+    {
+        // had activity on sockets => we might be receiving data
+        scd_command* cmd = new scd_command(SCD_CM_CONTROL, SCD_CM_TIME_NACK);
+        _fsm.send_command(cmd);
+    }
+    else
+    {
+        scd_command* cmd = new scd_command(SCD_CM_CONTROL, SCD_CM_TIME_ACK);
+        _fsm.send_command(cmd);
+        _fsm.save_state();
+        _fsm.set_state(_st_time_ack);
+    }
+}
+
+
+void scd_sts_done::recv_term_req()
+{
+    if (_sim.get_poller().wait(SCD_CONT_DELAY))
+    {
+        // had activity on sockets => we might be receiving data
+        scd_command* cmd = new scd_command(SCD_CM_CONTROL, SCD_CM_TERM_NACK);
+        _fsm.send_command(cmd);
+    }
+    else
+    {
+        scd_command* cmd = new scd_command(SCD_CM_CONTROL, SCD_CM_TERM_ACK);
+        _fsm.send_command(cmd);
+        _fsm.save_state();
+        _fsm.set_state(_st_term_ack);
+    }
+}
+
+
+void scd_sts_done::set_idle(const sc_core::sc_time& time)
+{
+    scd_command* cmd = new scd_command(SCD_CM_CONTROL, SCD_CM_IDLE, time);
+    _fsm.send_command(cmd);
+    _fsm.set_state(_st_idle);
+}
+
+
+void scd_sts_done::set_busy()
+{
+    scd_command* cmd = new scd_command(SCD_CM_CONTROL, SCD_CM_BUSY);
+    _fsm.send_command(cmd);
+    _fsm.set_state(_st_busy);
+}