2015-10-29 17:36:42 +01:00
|
|
|
require "browser/delay"
|
|
|
|
|
2015-08-20 20:03:00 +02:00
|
|
|
class StatusView < ElementView
|
|
|
|
|
2015-08-22 01:06:48 +02:00
|
|
|
def initialize interpreter
|
|
|
|
@interpreter = interpreter
|
2015-10-29 17:36:42 +01:00
|
|
|
@running = false
|
2015-08-22 01:06:48 +02:00
|
|
|
end
|
2015-08-20 20:03:00 +02:00
|
|
|
|
2015-08-22 01:06:48 +02:00
|
|
|
def draw
|
2018-04-17 17:49:00 +02:00
|
|
|
header = div("h4" , "Interpreter" )
|
|
|
|
header << div("span.header_state" , state_text)
|
2015-08-22 01:37:15 +02:00
|
|
|
@element = div(".status_view") <<
|
2018-04-17 17:49:00 +02:00
|
|
|
header <<
|
2018-04-16 20:23:29 +02:00
|
|
|
div("button.next" , "Next") <<
|
2015-10-29 17:36:42 +01:00
|
|
|
div("button.run" , "Run") <<
|
2015-11-01 17:11:00 +01:00
|
|
|
div("button.wizz" , "Wizz") <<
|
2015-08-22 01:06:48 +02:00
|
|
|
div( "br") <<
|
2015-08-24 01:44:50 +02:00
|
|
|
div("span.clock" , clock_text) <<
|
|
|
|
div( "br") <<
|
2015-11-04 15:45:33 +01:00
|
|
|
div("span.flags" , flags_text) <<
|
2018-06-22 18:44:50 +02:00
|
|
|
div( "br") <<
|
|
|
|
div( "span.stdout" , "Stdout") <<
|
|
|
|
div( "br") <<
|
|
|
|
div( "span.status" , "Status")
|
2015-08-22 01:06:48 +02:00
|
|
|
# set up event handler
|
2018-04-16 20:23:29 +02:00
|
|
|
@element.at_css(".next").on("click") { self.update }
|
2015-11-01 17:11:00 +01:00
|
|
|
@element.at_css(".run").on("mousedown") { self.start( 0.1 ) }
|
2015-11-10 18:46:21 +01:00
|
|
|
@element.at_css(".wizz").on("mousedown") { self.start( 0.0 ) }
|
2015-10-29 17:36:42 +01:00
|
|
|
@element.at_css(".run").on("mouseup") { self.stop }
|
2015-11-01 17:11:00 +01:00
|
|
|
@element.at_css(".wizz").on("mouseup") { self.stop }
|
2015-08-22 01:06:48 +02:00
|
|
|
return @element
|
|
|
|
end
|
2015-08-20 20:03:00 +02:00
|
|
|
|
2015-10-29 17:36:42 +01:00
|
|
|
|
2015-11-01 17:11:00 +01:00
|
|
|
def start(speed)
|
|
|
|
@running = speed
|
2015-10-29 17:36:42 +01:00
|
|
|
run
|
|
|
|
end
|
|
|
|
def stop
|
|
|
|
@running = false
|
|
|
|
end
|
|
|
|
def run
|
|
|
|
return unless @running
|
2015-11-05 10:43:23 +01:00
|
|
|
proc = Proc.new do
|
|
|
|
self.update
|
|
|
|
self.run
|
2015-10-29 17:36:42 +01:00
|
|
|
end
|
2015-11-05 10:43:23 +01:00
|
|
|
proc.after( @running )
|
2015-10-29 17:36:42 +01:00
|
|
|
end
|
2015-08-22 01:06:48 +02:00
|
|
|
def update
|
2015-11-05 10:43:23 +01:00
|
|
|
@interpreter.tick
|
2015-08-22 01:59:29 +02:00
|
|
|
@element.at_css(".clock").text = clock_text
|
2018-04-17 18:20:31 +02:00
|
|
|
@element.at_css(".header_state").text = state_text
|
2015-11-04 15:45:33 +01:00
|
|
|
@element.at_css(".flags").text = flags_text
|
2015-08-22 01:59:29 +02:00
|
|
|
@element.at_css(".stdout").text = @interpreter.stdout
|
2018-06-22 18:44:50 +02:00
|
|
|
@element.at_css(".status").text = status_text
|
2015-08-22 01:06:48 +02:00
|
|
|
end
|
|
|
|
|
2018-06-22 18:44:50 +02:00
|
|
|
def status_text
|
2019-02-09 12:14:01 +01:00
|
|
|
return unless @interpreter.instruction
|
2018-06-22 18:44:50 +02:00
|
|
|
return "#{@interpreter.instruction.to_s}" unless @interpreter.instruction.source
|
|
|
|
source = @interpreter.instruction.source
|
|
|
|
s = "#{source.to_s}"
|
|
|
|
if( source.respond_to?(:source) and source.source )
|
|
|
|
s += @interpreter.instruction.source.source.to_s
|
|
|
|
end
|
|
|
|
s
|
|
|
|
end
|
2015-08-22 01:06:48 +02:00
|
|
|
def state_text
|
2018-04-17 17:49:00 +02:00
|
|
|
" (#{@interpreter.state})"
|
2015-08-22 01:06:48 +02:00
|
|
|
end
|
|
|
|
|
2015-11-04 15:45:33 +01:00
|
|
|
def flags_text
|
|
|
|
flags = []
|
|
|
|
@interpreter.flags.each do |name,value|
|
|
|
|
flags << name if value
|
|
|
|
end
|
|
|
|
"Flags #{flags.join(':')}"
|
|
|
|
end
|
|
|
|
|
2015-08-22 01:59:29 +02:00
|
|
|
def clock_text
|
2018-06-22 18:44:50 +02:00
|
|
|
"Instruction #{@interpreter.clock}-0x#{@interpreter.pc.to_s(16)}"
|
2015-08-22 01:06:48 +02:00
|
|
|
end
|
|
|
|
end
|