This example shows how to create an interface between a Stateflow® chart that uses C as the action language and a MATLAB® app created in App Designer. For more information on connecting a Stateflow chart that uses MATLAB as the action language to a MATLAB app, see Model a Power Window Controller.
In this example, a MATLAB app models the front end of a media player. During simulation, you can choose between the AM radio, FM radio, and CD player components of the media player. When the CD player is on, you can also select the playback mode.
The Stateflow chart App Interface
provides a bidirectional connection between the MATLAB app and the control and plant systems in the Simulink® model. When you interact with the widgets in the app, the chart sends a corresponding command to the other charts in the model. These charts use strings to control the behavior of the media player and to provide natural language output messages that indicate its status. When the status of the media player changes, the chart changes the color of the buttons and updates the text field at the bottom of the app.
Open the Simulink model and click Run. The Media Player Helper app opens. The text field at the bottom of the app shows the status of the media player, Standby (OFF)
.
In the Radio Request section, click CD. The media player status changes to CD Player: Empty
.
Click Insert Disc. The media player status briefly says Reading: Handel's Greatest Hits
before changing to CD Player: Stopped
.
In the CD Request section, click PLAY. The media player status changes to Playing: Handel's Greatest Hits
and music begins to play.
In the CD Request section, click FF. The music stops and chirping sounds begin. The media status changes to Forward >> Handel's Greatest Hits
. The album name in this message scrolls forward across the display.
Use the Media Player Helper app to select other operating modes or to enter a different album name. For example, try playing to the albums Training Deep Networks
or Fun With State Machines
. To stop the simulation, close the Media Player Helper app.
The chart App Interface
is already configured to communicate with the MATLAB app sf_mediaplayer_app
. To create a bidirectional connection between your MATLAB app and a Stateflow chart that uses C as the action language, follow these steps. In the MATLAB app:
Create a custom property to interface with the chart during simulation. The app uses this property to access chart inputs, chart outputs, and local data. For more information, see Share Data Within App Designer Apps.
Modify the startupFcn
callback for the app by adding a new input argument and storing its value as the property that you created in the previous step. For more information, see Write Callbacks in App Designer.
In the Stateflow chart:
Create a local data object to interface with the app. The chart uses this local data object as an argument when it calls helper functions in the app.
Set the type of the local data object you created in the previous step to ml
. For more information, see Specify Type of Stateflow Data.
Run the app using the ml
namespace operator to indicate that the app is extrinsic MATLAB code. Pass the keyword this
as an argument to give the app access to the chart during simulation. Store the value returned by the function call to the app as the local data object that you created to interface with the app. For more information, see Access MATLAB Functions and Workspace Data in C Charts.
In this example, the Media Player Helper app uses a property called chart
to interface with the chart App Interface
. The app callbacks use this property to write to the chart outputs:
When you insert or eject a disc, the EjectButtonPushed
callback sets the values of insert
, eject
, and Album
.
When you click a button in the Radio Request section of the app, the corresponding callbacks set the value of RadioReq
.
When you click a button in the CD Request section of the app, the corresponding callbacks set the value of CDReq
.
When you close the app, the UIFigureCloseRequest
callback sets the value of Stop
to true
.
Conversely, in the chart, the entry actions in the InterfaceWithApp
state run the app sf_mediaplayer_app
and store the returned value as the local data object app
. The chart uses this local data object when it calls the helper functions updateButtons
and updateStatus
. In the app, these helper functions change the color of the buttons and update the text field at the bottom of the app based on the value of the chart inputs RadioMode
, CDMode
, and CDStatus
.
The Mode Manager
chart activates the appropriate subcomponent of the media player (AM radio, FM radio, or CD player) depending on the inputs received from the App Interface
chart. The chart inputs RadioReq
and CDReq
contain string data that control the behavior of the chart. To evaluate the string data, the chart uses the string operator strcmp
and its equivalent shorthand form ==
. The chart output CurrentRadioMode
provides natural language output to the app, while MechCmd
controls the behavior of the CD player subcomponent. To assign values to these outputs, the chart uses the string operator strcpy
and its equivalent shorthand form =
.
At the start of simulation, the NormalOperation
state becomes active. If the Boolean data DiscEject
is true
, a transition to the Eject
state occurs, followed by a transition back to the NormalOperation
state.
When NormalOperation
is active, the previously active substate (Standby
or ON
) recorded by the history junction becomes active. Subsequent transitions between the Standby
and ON
substates depend on the value of the expression strcmp(RadioReq,"OFF")
:
If strcmp
returns a value of zero, then RadioReq
is "OFF"
and the Standby
substate is activated.
If strcmp
returns a nonzero value, then RadioReq
is not "|OFF|" and the ON
substate is activated.
In the ON
substate, three substates represent the operating modes of the media player: CD player, AM radio, and FM radio. Each substate corresponds to a different value of the input RadioReq
. The inner transition inside the ON
state uses the operator hasChanged
to continually scan for changes in the value of RadioReq
.
If the value of RadioReq
is "CD"
, then the substate CDMode
becomes active and the media player switches to CD player mode. The Mode Manager
chart outputs "PLAY"
, "REW"
, "FF"
, and "STOP"
commands to the CD Player
chart through the string data MechCmd
.
If the value of RadioReq
is "AM"
, then the substate AMMode
becomes active and the media player switches to AM radio mode. The Mode Manager
chart outputs a "STOP"
command to the CD Player
chart through the string data MechCmd
.
If the value of RadioReq
is "FM"
, then the substate FMMode
becomes active and the media player switches to FM radio mode. The Mode Manager
chart outputs a "STOP"
command to the CD Player
chart through the string data MechCmd
.
The CD Player
chart activates the appropriate operating mode for the CD player depending on the input received from the App Interface
and Mode Manager
charts. The chart inputs Cmd
and Album
contain string data that control the behavior of the chart. The chart output AlbumName
provides natural language output to the app. To assign and compare the values of string data, the chart uses the shorthand operations =
(see strcpy) and ==
(see strcmp). To produce text in the output string CDStatus
, the chart uses the string operators strcat
, strlen
, and substr
.
At the start of simulation, the Empty
state is activated.
If the Boolean data DiscInsert
is true
, a transition to the Inserting
state occurs. After a short time delay, a transition to the DiscPresent
state occurs. The DiscPresent
state remains active until the data Cmd
becomes "EJECT"
. At that point, a transition to the Ejecting
state occurs. After a short time delay, a transition to the Empty
state occurs. The temporal logic operator after
controls the timing of the transitions during disc insertion and ejection.
When a state transition occurs, the entry action in the new state changes the value of CDStatus
to reflect the status of the CD player. In the FF
or REW
substates, the during actions continually change the value of CDStatus
to produce a scrolling motion effect.
When the active state is Empty
, the value of CDStatus
is "CD Player: Empty"
.
When the active state is Inserting
, the value of CDStatus
is "Reading: AlbumName"
.
When the active state is Ejecting
, the value of CDStatus
is "Ejecting: AlbumName"
.
When the active state is DiscPresent.STOP
, the value of CDStatus
is "CD Player: Stopped"
.
When the active state is DiscPresent.PLAY
, the value of CDStatus
is "Playing: AlbumName"
.
When the active state is DiscPresent.REW
, the value of CDStatus
is "Reverse << AlbumName"
, where AlbumName
scrolls backward across the display.
When the active state is DiscPresent.FF
, the value of CDStatus
is "Forward >> AlbumName"
, where AlbumName
scrolls forward across the display.
after | hasChanged | strcat | strcmp | strcpy | strlen | substr