I’m trying to create an IfNode that checks an expression continuously.
In Polyscope this is done by clicking the “check expression continuously” checkbox.
I’ve noticed there is no way of setting this checkbox/setting in the SDK - you can only simply create an IfNode with an expression.
When comparing this to the LoopNode, a LoopNode has a ConfigFactory used to set the configuration of the LoopNode.
The LoopNodeConfigFactory has a method to create a LoopNode with an Expression and a Bool which enables the “check expression continuously” checkbox on the LoopNode in Polyscope.
Is it possible to somehow enable the “check expression continuously” checkbox of an IfNode pragmatically? Or is there a recommended work around for this?
Thanks in advance!
This is how it looks in the URscript code when checking the box in PolyScope.
So basically it starts the if in a thread, and the program loops the check with the
while and checking if it is true as long as the thread is not done and if it is not true meanwhile, kill the thread.
Would be nice to have the same as the LoopNode, but meanwhile I guess you could just set it up the same?
while (True): $ 1 "Robot Program" $ 2 "If True " global thread_flag_2=0 thread Thread_if_2(): # Just a Popup as a holder for whatever the if should do. $ 3 "Popup" popup("Insert your code here", "Warning", True, False, blocking=True) thread_flag_2 = 1 end if ( True ): global thread_handler_2=run Thread_if_2() while (thread_flag_2 == 0): if not( True ): kill thread_handler_2 thread_flag_2 = 2 else: sync() end end else: thread_flag_2 = 2 end end
Thanks for the quick reply Rasmus,
This is perfect and works in the case where all your code/nodes are known at the time of writing, however I’m trying to add child nodes (waypoints) dynamically or at run time to this IfNode’s rootTreeNode.
Essentially, I want to monitor an input for the duration of a group of movements, if the input switches at any point during these movements, the movements will cease. I have got this working with custom scripts and the IfNode’s “check continuously” checkbox/function within Polyscope, however I want to abstract the complicated script code from the user.
I’ve tested this using a custom node, where I’ve written a similar script node to the one you provided into the
ProcessActive node also generates the Move and Waypoint nodes (from my
createSubtree() method) as so:
When running the program, it never actually got to the Move and Waypoint nodes, they were skipped every time. However it did toggle DO0 OFF when DI0 was ON.
I then saved the program and checked the script file, an excerpt of the code is copied below.
Note that there is no move or Waypoint nodes as there was in the program tree above.
$ 3 "Process Active" def Process_Active(): if (get_digital_in(0) == True): set_digital_out(0,False) sleep(0.5) return False end return True end global thread_flag_2=0 thread Thread_if_2(): thread_flag_2 = 1 end if (Process_Active()): global thread_handler_2=run Thread_if_2() while (thread_flag_2 == 0): if not(Process_Active()): kill thread_handler_2 thread_flag_2 = 2 else: sync() end end else: thread_flag_2 = 2 end # end: URCap Program Node
My conclusions from testing this method are that: I still have the problem that my
ProcessActive parent node cannot “continuously check” the
ProcessActive() script function whilst executing its child nodes, as the child nodes in this case have not actually shown up in the script code - which I find odd in itself (They do show up in the “program.txt” file though).
I finally have it working and have figured out what I was doing wrong in the above reply.
Because the script is called in the
GenerateScript method of my ProgramNode (Java) code, I forgot to add the
writer.writeChildren(); call where I wanted my child nodes to actually execute.
Doing this, my program executes all child nodes in the ProcessActive node whilst simultaneously checking the state of DI0 throughout the process. The execution of child nodes is done at run time so that a user can modify the subtree and add any child nodes they like - the program will still monitor whilst executing them.