I am trying to set up a simple ruby program with a two additional threads.
One thread is to check the serial port for data and populate a variable if anything is found.
The second thread is is a call to 'gets', which when returned will stop the program.
My problem is that the second thread starts ok, as you can see from the "Press Enter..." note in the output.
D:\Documents and Settings\JMEDDING\My Documents\Ruby scripts>c-scope.rb -t
"Press 'Enter' to end process"
511, 511, 485 | | | | | + | | | | | 536
511, 511, 485 | | | | | + | | | | | 536
512, 511, 485 | | | | | XO | | | | | 536
512, 512, 485 | | | | | |+ | | | | | 536
but any data returned from
input = gets
does not make it into the program. Instead, it can be seen on the console command line after the program is killed with ctrl-c.
I am running this in the ruby console on windows. This used to work properly before, but I re-arranged the code at one point and now it is not cooperating. I have copied the entire program below. I guess this is something very simple, but I'm totally stuck, so thanks for taking a look.
Jon
require 'serialport'
TEST = true if ARGV[0] == '--test' || ARGV[0] == '-t'
# Edit the two settings below
port = "COM6" #"/dev/tty.usbserial-A600b1Q6"
baud = 9600
begin
if RUBY_PLATFORM =~ /win32/ || RUBY_PLATFORM == "i386-mingw32"
require 'Win32/Console/ANSI'
end
rescue LoadError
raise "You must 'gem install win32console' to use color on Windows"
end
if TEST
sp = nil
else
sp = SerialPort.new port, baud, 8, 1, SerialPort::NONE
end
symbols = ["X", "O", "@", "#"]
vals = [] #max four values to plot
input = nil
len = 50
max = 0
min = 1200
if TEST
vals = [511, 511]
end
def colorize(text, color_code)
"\033[1;#{color_code}m#{text}\033[0m"
end
def red(text); colorize(text, "31"); end
def green(text); colorize(text, "32"); end
def blue(text); colorize(text, "34"); end
def color_the_symbols(text, symbols)
color = 31 # "+" = red, then green, yellow, blue, pink
chars = ["+"] + symbols
chars.each_with_index do |s,i|
text.gsub!(s, colorize(s, "#{color + i}"))
end
text
end
def base_string (len, min, max, vals, symbols)
s = ""
(0..len).each {|i| s += i%5 == 0 ? "|" : " "}
vals.each_with_index do |val, i|
pos = len * (val - min)/ (max - min)
char = symbols.include?(s[pos] ) ? "+" : symbols[i]
s[pos] = char
end
color_the_symbols s, symbols
end
#listen to STDIN for stop signal
Thread.new do
p "Press 'Enter' to end process"
input = gets #pressing enter will stop the other loops
end
sleep(1)
#listening thread
Thread.new do
while !input
if TEST
(0...vals.count).each {|i| vals[i] += rand(3) - 1}
else
c = ""
word = ""
until c == "\n"
c = sp.getc
word << c.to_s
#p "Flushing buffer #{c}"
end
#p word.chomp
vals[0] = Integer(word.chomp)
end
sleep(0.5)
end
end
while !input #will be true until enter key is pressed
while vals.count == 0
#wait for firs data to show up
sleep (0.1)
end
for i in (0...vals.count) do
#validate min and max
max = (vals[i] * 1.05).to_i if vals[i] > max
min = (vals[i] * 0.95).to_i if vals[i] < min
end
output = base_string(len, min, max, vals, symbols)
output = " #{red(min.to_s)} " + output + " #{red(max.to_s)}"
color = 32
vals.each_with_index do |val,i|
output = " #{colorize("%4d," % val, "#{color + i}")}" + output
end
puts output
sleep(1)
end
I think there was a error somewhere, but the notification was being obscured by the threading behavior. I made some unrelated changes and after some debugging, it started working again. Sorry I can't be more specific.