Generator.jl 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import DEVS2Agents: time_advance, internal_transition!, external_transition!, confluent_transition!, output!, setup_ports!, format_state, format_message
  2. @enum GenState G_Waiting=1 G_Active=2 G_Passive=3
  3. struct Generate <: DEVSMessage
  4. activate::UnitRange{Int}
  5. end
  6. @agent struct Generator(AtomicDEVS)
  7. num_outputs::Int = 1
  8. period::Float64 = 1.0
  9. cycles::Int = 1
  10. current_cycle::Int = 0
  11. state::GenState = G_Waiting
  12. end
  13. format_state(gen::Generator) = "State.$(gen.state)_Cycle.$(gen.current_cycle)"
  14. format_message(msg::Generate) = "$(msg.activate)"
  15. function setup_ports!(gen::Generator)
  16. add_out_port!(gen, :o_out)
  17. end
  18. function time_advance(gen::Generator, model)
  19. if gen.state == G_Active
  20. return 0.0
  21. elseif gen.state == G_Waiting
  22. return gen.period
  23. else
  24. return Inf
  25. end
  26. end
  27. function internal_transition!(gen::Generator, model)
  28. if gen.current_cycle >= gen.cycles
  29. gen.state = G_Passive
  30. elseif gen.state == G_Active
  31. gen.state = G_Waiting
  32. gen.current_cycle += 1
  33. elseif gen.state == G_Waiting
  34. gen.state = G_Active
  35. else
  36. gen.state = Passive
  37. end
  38. end
  39. function output!(gen::Generator, model)
  40. if gen.state == G_Active
  41. return (
  42. (
  43. :o_out, (Generate(0:(gen.num_outputs - 1)),
  44. )),
  45. )
  46. end
  47. return nothing
  48. end