Skip to main content

Author Messages with Flex

The previous tutorials leveraged messages from existing packages in Tangram Pro™. But, if a component software interface needs messages that are currently not included in existing packages, you can define your own messages with Flex – our specification language.

Flex Language Documentation is available at Flex Docs. For this tutorial, example Flex code is provided.

You'll learn how to:

  • Add support for your own messages using the Flex Code Editor

Step 1: Create Your Own Message Set

Before getting started, create a Team if you haven't already.

  1. Go to FlexLang

  2. Create a new Flex package by clicking the New button in the upper left. Choose a name and ensure you select your team from the dropdown menu

  3. Click Create Package Create Package

  4. Create a new file by hovering over your package in the left side file viewer, clicking the ... icon, and then New File

  5. Enter the name "Messages.flex" and click Create File

  6. Paste the following code below the module name:

    flex
    struct LocationLLA {
    latitude : float64;
    longitude : float64;
    altitude : float64;
    }
    message struct WhereAmINow {
    location: LocationLLA;
    }
    message struct WhereShouldIGo {
    waypoint: LocationLLA;
    }
  7. Save the file by clicking the gear button in the upper-right and selecting Save File or alternatively pressing the hot-key Ctrl + S / Cmd + S Create File

  8. Publish your new package by selecting the ... button next to your package name in the left panel and then choosing Publish Package Publish Package

Step 2: Build a Component-Based Design Using the New Messages

For a refresher on building a component-based design, go to Visualize a Project Design.

  1. Go to Projects and create a new Project
  2. Add three components and update their names to be:
    • LocationReporter
    • Autonomy
    • Controller
  3. Connect LocationReporter to Controller. Select your published Flex package, and message WhereAmINow.
  4. Connect Autonomy to Controller. Select your published Flex package, and message WhereShouldIGo.

Connect Component

Step 3: Generate a CSI

For a refresher in generating a Component Software Interface go to Generate Code with Workflows

  1. Open the workspace to the LocationReporter component's implementation. There will not be any subcomponents on this view.
  2. Create a new workflow. Call it Code Gen.
  3. Add the Code Gen 3.0 plugin as the only step to run in the workflow. Ensure that its output language is cpp and its transport library is ZeroMQ.
  4. Run the workflow to generate a CSI from your Flex module.
  5. Download the generated code. Extract and open the package.
  6. Navigate to the code-gen-3/include folder. You should see a file called WhereAmINow.hpp. This file was generated as a result of your defining it as a message in your .flex file and including that message in the interface for LocationReporter. Note that WhereShouldIGo is NOT included because even though you defined it in your .flex file, it was not in the interface specification of the LocationReporter component.
  7. Open WhereAmINow.hpp. Take a look at the file and see that there are C++ functions in there to getLocation() and setLocation() that use the type LocationLLA. Note that these were defined from your the WhereAmINow message struct in your Flex file.
  8. Open LocationLLA.hpp. Take a look at the file and see that there are private class variables for latitude, longitude, and altitude. Note that these were defined in your LocationLLA struct in your Flex file.

Further Exploration

  • Enter a syntactic error in the Flex editor, and see that it identifies the error.
  • Make a change to your Flex file, such as adding a field to a message. Publish the changed Flex specification, update a component interface to use the new version, and generate a CSI. See how the changes you made to Flex affect the resulting interface code.

Cheers!

By completing this tutorial you learned how to:

  • Use Tangram Pro™ to define and use custom message definitions to build component-based systems.
  • Generate code with these user-defined Flex packages.
note

Check out Discuss, our Tangram Flex community and find out more about Flex Authorship in Tangram Pro™.