10-13-2016 04:13 PM
Hey, I have button with switch (not latch) action that sits inside a JKI State Machine, precisely in the Event strucutre. Pressing it (to on) will trigger a procedure which I want to repeat until the same button is switched to off again. I am aware that this can be done using queues, however I want to implement this in a state machine. My idea was to check the state of the button ("Is it still on?") after each repetiiton of the procedure and if it is on, repeat the procedure. If it is off, stop the procedure. My question is, can I use the Event Structure Timeout for this? My ideas was to go to the event case that holds the button (with a small timeout of, say, 10 ms), check its value, and based on its value proceed to the next state. Would this work?
Cheers
Doug
10-13-2016 04:32 PM
That sounds like you could probably make it work, yes. However, if you are going to poll the boolean on every timeout, what is the point of putting it in an event structure to begin with? Also, if timing is of importance I wouldn't do it this way. Theoretically, if you have enough events being processed by your structure, the timeout might not ever happen. I understand that is not likely, and the timeout will usually occur on a regular basis.
I still think that polling a boolean in a timeout to take an action repeatedly is not the right way to do this. There are a few structures which stand out to me. One would be to call your procedure with an asynchronous node when boolean is clicked "true" and employ some method to stop your procedure when it is clicked "false". This is probably more complicated than it has to be though for your situation.
A more simple way though could be to just put your procedure in it's own loop if you want to stick with polling your boolean if its timing is at all critical.
Corey
10-13-2016 04:33 PM
Im not terribly familiar with the JKI state machine, i have used it before but briefly. But you can create an event for value change of your button, inside that event you can check new value of the button, if false proceed to false case, if true proceed to true case.
10-13-2016 04:39 PM
The problem I see is that while the procedure is running, I am not in the Event Structure state. So I thought that my button press would get lossed if I do not check the event structure...
10-13-2016 04:42 PM
That there is an entirely different probelm. You may try a different architecture or force an abort of the current task if that matters. If you dont need to abort the current case and you want to just queue the event then you could use a QMH.
10-13-2016 04:53 PM
Oh yea, didnt think about that. However, if you fire an event for the boolean then check the value in the event case and stay in some true state until its clicked back off then the event structure wont be able to process anything else until the boolean is turned off. This works, but the behavior might not be acceptable. Ussually an event structure is used to continually monitor events. If any event has a lot of work to do, the work is passed off to another loop so the event structure can keep listening for new events.
10-13-2016 05:03 PM
Thats very true so you have either the choice to put it in a queue and wait until later to process it, abort the current task and process it, or just process both depending on what it is? I dont know the task at hand. What i was saying about checking the state of the button though is that the event case will process every time the button value is changed.
For example button is pushed, event registers, button is true and the application proceeds to true process( outside the event structure loop). Then the case structure is in idle mode again, you can then capture the button push again and decide how you want to handle it.
10-13-2016 05:11 PM - edited 10-13-2016 05:13 PM
Put an IDLE state in your procedure so that after it runs one iteration, you force it to check the event loop. You'll also want to add a call to the state that is running your procedure so that execution comes back if the event loop times out. If it doesn't time out and the boolean goes false, clear out the states so execution doesn't go back to your procedure.
Edit: make sure your timeout is small so that execution of your procedure isn't slowed down.
10-13-2016 05:50 PM - edited 10-13-2016 05:58 PM
@aputman This seems like what I wanted. So lets say one iteration of the procedure is done and I enqueue the message "Idle". This goes to the event strucutre that I've wired a timeout of 10ms to. There I put a case strucuture that, depending on the value of the button enqueues a message that goes to the appropiate state, yes?
What will happen if I press the button during the procedure? Will the new value be recognised?
10-13-2016 06:07 PM
Yes that correct, idle then procedure if you want to go back to the procedure case after checking the button. I just took a look at the JKI state machine. Then in that event case you can use the boolean logic i presented in message 3.