- From: Stefan Maton <maton@sidema.be>
- Date: Tue, 27 May 2008 14:52:27 +0200
- To: <www-voice@w3.org>
Hi,
I was taking a look at the In() predicate today because it’s not been
implemented into SSCML yet. I didn’t implement it yet since the old draft
(2007) didn’t describe it very well.
Unfortunately, the new draft omits examples of this function. The examples
that I have found on the web which use In() (or the older In ) rise a
problem that might be encountered within a state machine which includes
multiple times the same source into a state machine.
Consider this state machine (please don’t look at the “sense” or the old
semantics of this, it’s just to give an example):
TLBase.xml:
<?xml version="1.0"?>
<scxml initialstate="Red">
<state id="Green">
<onentry>
<send target="Self" event="goYellow" delay="5s"/>
</onentry>
<transition event="goYellow" target="Yellow"/>
</state>
<state id="Yellow">
<onentry>
<send target="Self" event="goRed" delay="3s"/>
</onentry>
<transition event="goRed" target="Red"/>
</state>
<state id="Red">
<transition event="goGreen" target="Green"/>
</state>
</scxml>
TrafficLight.xml:
<?xml version="1.0"?>
<scxml initialstate="TrafficLight1">
<parallel id="TrafficLight1">
<state id="TL1" src="TLBase.xml">
<initial id="init">
<transition target="Green"/>
</initial>
<transition cond="In(Red) && In(Red)" target="TrafficLight2"/>
</state>
<state id="TL2" src="TLBase.xml">
<initial id="init">
<transition target="Green"/>
</initial> </state>
</parallel>
<parallel id="TrafficLight2">
<state id="TL3" src="TLBase.xml">
<transition cond="In(Red) && In(Red)" target="TrafficLight1"/>
</state>
<state id="TL4" src="TLBase.xml">
</state>
</parallel>
</scxml>
As you can see, the In()-predicate, as I have encountered it in some web
examples, would not work in the above state machine.
So, my understanding is that the In()-predicate should take either the
complete "path" to the state or a "path" relative to a parent State.
Thus these two In() predicate usages would be right:
1. <transition cond="In(TrafficLight1.TL1.Red) && In(TrafficLight1.TL2.Red)"
target="TrafficLight2"/>
2. <transition cond="In(TL1.Red) && In(TL2.Red)" target="TrafficLight2"/>
I know that the draft states that the IDs must be unique within the
document. But I suppose that you can see the problem that this statement
creates: You would not be able to include multiple times the same source
within your document (the above mentioned traffic light example is a valid
example of why it should work). Altering the name of the "substate" while
loading would not work since you could not address the state in a rightful
manner anymore. Therefore I think it's not the state ID that should be
unique but the "path" to the state.
Perhaps there's another way to realize what I wrote above? Using the In()
without altering the definition of an id?
Thanks,
Stefan
---------------------------------------------------
Sidéma
Rue Lefin 4, 4860 Pepinster, Belgique
Web: http://www.sidema.be
Email: maton@sidema.be
GSM: ++32 (0)494 / 11.53.65
TVA BE 0713.367.395
Received on Tuesday, 27 May 2008 12:53:22 UTC