Support

If you have a problem or need to report a bug please email : support@dsprobotics.com

There are 3 sections to this support area:

DOWNLOADS: access to product manuals, support files and drivers

HELP & INFORMATION: tutorials and example files for learning or finding pre-made modules for your projects

USER FORUMS: meet with other users and exchange ideas, you can also get help and assistance here

NEW REGISTRATIONS - please contact us if you wish to register on the forum

Users are reminded of the forum rules they sign up to which prohibits any activity that violates any laws including posting material covered by copyright

Ruby UP/Down Arrows

For general discussion related FlowStone

Re: Ruby UP/Down Arrows

Postby Spogg » Sun Feb 24, 2019 1:32 pm

Interesting stuff you guys.

I would like to see a method to prevent the counter itself going past set minimum and maximum values. I’m real busy at the moment otherwise I’d try to contribute.

Cheers

Spogg
User avatar
Spogg
 
Posts: 3358
Joined: Thu Nov 20, 2014 4:24 pm
Location: Birmingham, England

Re: Ruby UP/Down Arrows

Postby tulamide » Tue Feb 26, 2019 11:29 am

I'm sorry for the delay. I got offered a second PC, and am still in the process of setting everything up. Yes, I accidentally deleted clearEvents. It is needed to not have messages on the queue while this method is waiting for the level meter done drawing. Sorry!

Spogg wrote:I would like to see a method to prevent the counter itself going past set minimum and maximum values.

That's called "clamping", which is a very associative term. There are dozen of ways to do it. For example, in Ruby someone on the internet came up with this brilliant solution
Code: Select all
myvalue = [min_value, myvalue, max_value].sort[1]

Can you figure out, why I think it's brilliant?
"There lies the dog buried" (German saying translated literally)
tulamide
 
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: Ruby UP/Down Arrows

Postby RJHollins » Tue Feb 26, 2019 7:05 pm

ah ... nice.

Interesting regarding the 'Clamp' concept.

I've been using something like this example. Restrict to values: 1 to 12
Code: Select all
s=[[12, x].min, 1].max


where x is Input values.

The SORT concept is something I need to play with/understand.

First question on it. What does the [1] identify ? [.sort[1]]
RJHollins
 
Posts: 1571
Joined: Thu Mar 08, 2012 7:58 pm

Re: Ruby UP/Down Arrows

Postby tulamide » Tue Feb 26, 2019 8:48 pm

RJHollins wrote:ah ... nice.

Interesting regarding the 'Clamp' concept.

I've been using something like this example. Restrict to values: 1 to 12
Code: Select all
s=[[12, x].min, 1].max


where x is Input values.

The SORT concept is something I need to play with/understand.

First question on it. What does the [1] identify ? [.sort[1]]

Yes, using min and max is what I would call the common way. First get the smaller of x and max_value then get the larger of that and min_value. That's also, how I would prefer to do it in green.

Another way would be to work with conditionals.
Code: Select all
def clamp(x, min_value, max_value)
  if x < min_value
    return min_value
  elsif x > max_value
    return max_value
  else
    return x
end

result = clamp(3, 5, 20) #returns 5


The array sorting method however is so elegant and instinctively understandable. Layout is "left boundary, value, right boundary", which is easy to grasp. What happens is that an array is filled with these three values, then sorted and then the middle value from the array is returned [1] <- index starts at 0, so 1 is the second value.
If you use some numbers it becomes apparent:
[1, 5, 12].sort[1] -> after sort it's still [1, 5, 12] -> middle value is returned -> 5
[1, 0, 12].sort[1] -> after sort it's [0, 1, 12] -> middle value is returned -> 1
[1, 13, 12].sort[1] -> after sort it's [1, 12, 13] -> middle value is returned -> 12
"There lies the dog buried" (German saying translated literally)
tulamide
 
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: Ruby UP/Down Arrows

Postby RJHollins » Tue Feb 26, 2019 10:45 pm

tulamide wrote:
RJHollins wrote:ah ... nice.

Interesting regarding the 'Clamp' concept.

I've been using something like this example. Restrict to values: 1 to 12
Code: Select all
s=[[12, x].min, 1].max


where x is Input values.

The SORT concept is something I need to play with/understand.

First question on it. What does the [1] identify ? [.sort[1]]

Yes, using min and max is what I would call the common way. First get the smaller of x and max_value then get the larger of that and min_value. That's also, how I would prefer to do it in green.

Another way would be to work with conditionals.
Code: Select all
def clamp(x, min_value, max_value)
  if x < min_value
    return min_value
  elsif x > max_value
    return max_value
  else
    return x
end

result = clamp(3, 5, 20) #returns 5


The array sorting method however is so elegant and instinctively understandable. Layout is "left boundary, value, right boundary", which is easy to grasp. What happens is that an array is filled with these three values, then sorted and then the middle value from the array is returned [1] <- index starts at 0, so 1 is the second value.
If you use some numbers it becomes apparent:
[1, 5, 12].sort[1] -> after sort it's still [1, 5, 12] -> middle value is returned -> 5
[1, 0, 12].sort[1] -> after sort it's [0, 1, 12] -> middle value is returned -> 1
[1, 13, 12].sort[1] -> after sort it's [1, 12, 13] -> middle value is returned -> 12

Ahhhh .... thanks Tulamide.

Not only for the explanation of the 'common' use ... but also the SORT method.

I find I'm looking toward RUBY solutions more and more. I use various Ruby tut sites to help with the concepts.

One of the difficulties is searching for solutions that work with our FS Ruby version.

The next thing I'm facing is the eventual organizing a library of RUBY routines. I've a very scattered approach at present. But the more I add to and use RUBY, the more important to get some kind of order to all this.

Thanks again !
RJHollins
 
Posts: 1571
Joined: Thu Mar 08, 2012 7:58 pm

Re: Ruby UP/Down Arrows

Postby HughBanton » Wed Feb 27, 2019 5:49 pm

Very nice, so many clever tricks in Ruby. (Unfortunately - because I only use Ruby once in a while - I find it hard to remember any of them, doh!!)

Now, I've discovered that my previous Up/Down auto-repeat offering is defective .. once keyed, input100 continues to cycle ad infinitum, sending out regular triggers. Not good at all, sorry :oops:

So herewith v3, which seems to avoid that. (Also incorporating our latest favourite clamping friend inside the counter) :P
up_down_repeat_3.fsm
(6.3 KiB) Downloaded 867 times

Next .. I wanted to try and revisit DaveyBoy's original purpose for this thread. Going right back to the very start, I can't get his original code to work properly. I get the 'watched' @clock OK - 0,1,0,1 etc, but I can only make isKeyPressed increment @selected if I substitute "shift" or "control" or "alt" keys; nothing at all happens with "up", "down", or for that matter any other key like "q" or "81" etc. (I haven't gone through many more ..)

Does it work OK for everyone else, or if you get what I get, is there an explanation?
User avatar
HughBanton
 
Posts: 265
Joined: Sat Apr 12, 2008 3:10 pm
Location: Evesham, Worcestershire

Re: Ruby UP/Down Arrows

Postby tulamide » Thu Feb 28, 2019 1:59 am

HughBanton wrote:Next .. I wanted to try and revisit DaveyBoy's original purpose for this thread. Going right back to the very start, I can't get his original code to work properly. I get the 'watched' @clock OK - 0,1,0,1 etc, but I can only make isKeyPressed increment @selected if I substitute "shift" or "control" or "alt" keys; nothing at all happens with "up", "down", or for that matter any other key like "q" or "81" etc. (I haven't gone through many more ..)

Does it work OK for everyone else, or if you get what I get, is there an explanation?

That's exactly what his problem was
Only problem so far is that it doesn't respond instantly as nine times out of ten the key will be pressed in between 'ticks'. (I don't want to use a fast clock to keep the CPU load down)


Or did I misunderstand something?

Edit: There are no string shortcuts for the alphabet. So "q" can't work and 81 has to be a number not a string (so, not "81"). Try the numbers (not strings) 38 and 40 for up and down as well.
"There lies the dog buried" (German saying translated literally)
tulamide
 
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: Ruby UP/Down Arrows

Postby HughBanton » Thu Feb 28, 2019 9:44 am

Well, on my PC if I run it like this, substituting "shift" & "alt", it works (sort of) :
Code: Select all
ef init
   @clock = 0
   @selected = 0
      input 100, nil
end

def event i,v,t      
   case i
   when 100
      input 100, nil, t + 0.25   
      @clock += 1
      @clock = 0 if @clock == 2
      if isKeyPressed "shift"
         @selected += 1            
      elsif isKeyPressed "alt"
         @selected -= 1
      end
      @selected = [0,@selected,10].sort[1]
   end
watch "@clock", @clock
watch "@selected", @selected   
end


.. but in its original form, with "up" & "down", I get no response at all. (Nor with their equivalents 38 & 40).

"q" & 81 are specifically quoted in the FS User Guide for isKeyPressed (page 202) but as I say I can only get very few of the keys on their list to work at all here, it's strange.

I expect DaveyBoy has long since moved on to something else, six months is a long time in Flowstone ;)
User avatar
HughBanton
 
Posts: 265
Joined: Sat Apr 12, 2008 3:10 pm
Location: Evesham, Worcestershire

Re: Ruby UP/Down Arrows

Postby tulamide » Thu Feb 28, 2019 1:08 pm

HughBanton wrote:Well, on my PC if I run it like this, substituting "shift" & "alt", it works (sort of) :
Code: Select all
ef init
   @clock = 0
   @selected = 0
      input 100, nil
end

def event i,v,t      
   case i
   when 100
      input 100, nil, t + 0.25   
      @clock += 1
      @clock = 0 if @clock == 2
      if isKeyPressed "shift"
         @selected += 1            
      elsif isKeyPressed "alt"
         @selected -= 1
      end
      @selected = [0,@selected,10].sort[1]
   end
watch "@clock", @clock
watch "@selected", @selected   
end


.. but in its original form, with "up" & "down", I get no response at all. (Nor with their equivalents 38 & 40).

"q" & 81 are specifically quoted in the FS User Guide for isKeyPressed (page 202) but as I say I can only get very few of the keys on their list to work at all here, it's strange.

I expect DaveyBoy has long since moved on to something else, six months is a long time in Flowstone ;)

Fun fact: I also referred to page 202 and it never, never ocurred to me that you can actually use just a string! I always read it as 'strings only for special keys, codes for everything else' :lol:

I copied the above code, pasted it in a RubyEdit, added the "d" from 'def' and changed shift and alt to Up and Down. Worked like a charm. There seems to be something wrong with your setup.
"There lies the dog buried" (German saying translated literally)
tulamide
 
Posts: 2714
Joined: Sat Jun 21, 2014 2:48 pm
Location: Germany

Re: Ruby UP/Down Arrows

Postby DaveyBoy » Thu Feb 28, 2019 2:08 pm

Select Demo - 9.fsm
(10.91 KiB) Downloaded 848 times
I expect DaveyBoy has long since moved on to something else


Yes and no

Still working on the same project of which this is a part of, no marks for guessing what it is :)

I managed to get this working pretty much like it should:

Select Demo - 9.fsm
(10.91 KiB) Downloaded 848 times


Slight pause before it starts to auto_scroll
Scroll bar auto moves when required
Only works when window has focus

I really wanted to do it Ruby only (no particular reason, just a Ruby challenge for myself) but I couldn't get my head round the Windows Proc that Tulamide suggested.

Feel free to use as you wish,

Suggestions for improvement would be most welcome.

Hugh . . I've no idea why it doesn't work on your machine, it works fine on the 3 machines I've tried it on!

Oh and yes . . . Our clamping friend is in there :)
User avatar
DaveyBoy
 
Posts: 131
Joined: Wed May 11, 2016 9:18 pm
Location: Leeds UK

PreviousNext

Return to General

Who is online

Users browsing this forum: Google [Bot] and 58 guests