tracerVerbose.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from sccd.runtime.tracers.tracerBase import BaseTracer
  2. from pypdevs.util import runTraceAtController
  3. import sys
  4. class TracerVerbose(BaseTracer):
  5. """
  6. A tracer for simple verbose output
  7. """
  8. def __init__(self, filename):
  9. """
  10. Constructor
  11. :param uid: the UID of this tracer
  12. :param server: the server to make remote calls on
  13. :param filename: file to save the trace to, can be None for output to stdout
  14. """
  15. super(TracerVerbose, self).__init__()
  16. self.filename = filename
  17. self.prevtime = -1
  18. self.text = ""
  19. def startTracer(self, recover):
  20. """
  21. Starts up the tracer
  22. :param recover: whether or not this is a recovery call (so whether or not the file should be appended to)
  23. """
  24. if self.filename is None:
  25. self.verb_file = sys.stdout
  26. elif recover:
  27. self.verb_file = open(self.filename, 'a+')
  28. else:
  29. self.verb_file = open(self.filename, 'w')
  30. def stopTracer(self):
  31. """
  32. Stop the tracer
  33. """
  34. self.verb_file.flush()
  35. def trace(self, time):
  36. """
  37. Actual tracing function
  38. :param time: time at which this trace happened
  39. :param text: the text that was traced
  40. """
  41. string = ""
  42. if time > self.prevtime:
  43. string = ("__ Current Time: %10.6f " + "_"*42 + " \n") % (time / 1000)
  44. self.prevtime = time
  45. string += self.text + "\n"
  46. try:
  47. self.verb_file.write(string)
  48. except TypeError:
  49. self.verb_file.write(string.encode())
  50. self.text = ""
  51. def traceExitState(self, StateChart, State):
  52. self.text += "\n"
  53. self.text += "EXIT STATE in model <%s>\n" % StateChart
  54. self.text += "\t\tState: %s\n" % str(State)
  55. # TODO: This should be different because can also be written to a file, the DEVS implementation uses a server which i'm not going to do
  56. #print(text)
  57. def traceEnterState(self, StateChart, State):
  58. self.text += "\n"
  59. self.text += "ENTER STATE in model <%s>\n" % StateChart
  60. self.text += "\t\tState: %s\n" % str(State)
  61. #print(text)
  62. def traceOutput(self, listener, event):
  63. self.text += "\n"
  64. self.text += "OUTPUT EVENT to port <%s>\n" % event.port
  65. self.text += "\t\Event: %s\n" % str(event)
  66. #print(text)
  67. def traceInput(self, listener, event):
  68. self.text += "\n"
  69. self.text += "INPUT EVENT from port <%s>\n" % event.port
  70. self.text += "\t\Type: %s\n" % listener.virtual_name
  71. self.text += "\t\Event: %s\n" % str(event)
  72. #print(text)
  73. def traceTransition(self, aStateChart):
  74. """
  75. Tracing done for the internal transition function
  76. :param aDEVS: the model that transitioned
  77. """
  78. pass
  79. def traceExternal(self, aClass):
  80. """
  81. Tracing done for the external transition function
  82. :param aDEVS: the model that transitioned
  83. """
  84. pass
  85. def traceInit(self, aDEVS, t):
  86. """
  87. Tracing done for the initialisation
  88. :param aDEVS: the model that was initialised
  89. :param t: time at which it should be traced
  90. """
  91. pass