From d2b042e8a80efcab00e23807c84309cdcce4b234 Mon Sep 17 00:00:00 2001 From: acolleux Date: Fri, 25 Oct 2024 18:27:58 +0200 Subject: [PATCH 01/10] Add Multi-Sanbdox Getting Started for STM32F7508 --- SDK6UserGuide/gettingStarted.rst | 17 + .../gettingStartedSTM32F7508MultiSandbox.rst | 419 ++++++++++++++++++ ...started-stm32f7508dk-myapplication-sim.png | Bin 0 -> 600992 bytes ...d-stm32f7508dk-termite-green-fw-output.png | Bin 0 -> 194559 bytes ...32f7508dk-termite-myapplication-output.png | Bin 0 -> 344940 bytes ...ed-demo-sandboxed-applications-project.png | Bin 0 -> 57253 bytes .../getting-started-localdeploy-task.png | Bin 0 -> 53557 bytes .../getting-started-reload-gradle-project.png | Bin 0 -> 28726 bytes 8 files changed, 436 insertions(+) create mode 100644 SDK6UserGuide/gettingStartedSTM32F7508MultiSandbox.rst create mode 100644 SDK6UserGuide/images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-myapplication-sim.png create mode 100644 SDK6UserGuide/images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-termite-green-fw-output.png create mode 100644 SDK6UserGuide/images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-termite-myapplication-output.png create mode 100644 SDK6UserGuide/images/gettingStarted/multiSandbox/getting-started-demo-sandboxed-applications-project.png create mode 100644 SDK6UserGuide/images/gettingStarted/multiSandbox/getting-started-localdeploy-task.png create mode 100644 SDK6UserGuide/images/gettingStarted/multiSandbox/getting-started-reload-gradle-project.png diff --git a/SDK6UserGuide/gettingStarted.rst b/SDK6UserGuide/gettingStarted.rst index 230ecf7d0..2094b0946 100644 --- a/SDK6UserGuide/gettingStarted.rst +++ b/SDK6UserGuide/gettingStarted.rst @@ -61,6 +61,23 @@ In case you cannot get hands on your desired starter kit, please contact us, we gettingStartedIMXRT1170 gettingStartedSTM32F7508 + +Multi-Sandbox Evaluation +------------------------ + +.. list-table:: + :widths: 50 50 + :header-rows: 0 + + * - |logo_st| + - |image_stm32f7508| + :ref:`STM32F7508-DK Evaluation Kit ` + +.. toctree:: + :hidden: + + gettingStartedSTM32F7508MultiSandbox + VEE Port Examples ----------------- diff --git a/SDK6UserGuide/gettingStartedSTM32F7508MultiSandbox.rst b/SDK6UserGuide/gettingStartedSTM32F7508MultiSandbox.rst new file mode 100644 index 000000000..a600aa2f0 --- /dev/null +++ b/SDK6UserGuide/gettingStartedSTM32F7508MultiSandbox.rst @@ -0,0 +1,419 @@ +.. _sdk_6_getting_started_stm32f7508_multisandbox: + +Multi-Sandbox STM32F7508-DK Discovery Kit +========================================= + +This Getting Started will show you how to run Sandboxed Applications +on-top of a pre-built Multi-Sandbox Firmware for the STM32F7508-DK Discovery Kit. + +During this Getting Started, you will learn to: + +* create a Sandboxed Application, +* run a `Sandboxed Application `__ on the Virtual Device, +* run the same Sandboxed Application on your STM32F7508-DK Discovery kit, +* run the `Demo Sandboxed Applications `__. + +In case you are not familiar with MicroEJ, please visit `Discover MicroEJ `__ to understand the principles of our technology. + +Prerequisites +------------- + +.. note:: + + This Getting Started has been tested on Windows 10. + Also note that examples used in this Getting Started could depend on older tools and libraries. + Most notably our dependency manager plugin (using `Gradle `__) could be an older version. + +TODO This Getting Started is separated in two main parts. + +TODO The first part consists of running the Multi-Sandbox Firmware on the STM32F7508-DK Discovery Kit. All you need is: + +For this Getting Started, all you need is: + +* An Internet connection to access Github repositories & :ref:`Module Repositories `. +* MICROEJ SDK 6 (installed during :ref:`Environment Setup `). +* STM32F7508-DK Evaluation Kit, available `here `__. +* A microSD card formatted as FAT32. +* An RS232 Terminal (e.g. `Termite `__). +* `STM32CubeProgrammer `__ installed to flash a firmware on your board. + + +TODO The second part consists of running the same demo application on your device. For that you will need: + + +.. _sdk_6_getting_started_stm32f7508dk_environment_setup: + +Environment Setup +----------------- + +To follow this Getting Started, you need to: + +* Install MICROEJ SDK 6. +* `Download the Virtual Device `__ ``GREEN-STM32F7508-DK-2.0.0.zip``. + * Unzip ``GREEN-STM32F7508-DK-2.0.0.zip``. +* `Download the Multi-Sandbox Firmware `__ ``GREEN-STM32F7508-DK-2.0.0.out``. + +If you want more informations about this Multi-Sandbox Firmware, the Javadoc and the Release notes are available in this `directory `__. + + +Hardware Setup +"""""""""""""" + +* Check the jumpers configuration on JP1, you only want the :guilabel:`5V link` jumper to be bridged. +* Connect the micro-USB cable to CN14 to power the board. + +The USB connection is used as a serial link, as a ST-Link probe and as a power input for the board. + +The COM port uses the following parameters: + +.. list-table:: + :header-rows: 1 + :widths: 10 10 10 10 10 + + * - Baudrate + - Data bits + - Parity bits + - Stop bits + - Flow control + * - 115200 + - 8 + - None + - 1 + - None + +You can have a look at your application logs with an RS232 Terminal (e.g. `Termite `__). + +Congratulations, you have finished the setup of your environment. You are now ready to discover how to build and flash a MicroEJ application. + +Deploy the Multi-Sandbox Firmware on your STM32F7508-DK Discovery Kit +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +Set up your STM32F7508-DK Discovery kit: + +- Insert a microSD card (formatted as FAT32)in the board connector. +- Connect the Ethernet connector to the internet. +- Connect the USB connector of the board to your computer with + a mini-USB cable by following the + `Board Configuration `__ + instructions. + +Set up STM32CubeProgrammer: + +- Open STM32CubeProgrammer. +- Go to ``External loaders`` tab in the menu. +- Select ``STM32F7508-DISCO`` board in the Available external loaders list. +- Click on ``Connect`` green button and wait until your board is connected. + +Deploy the Multi-Sandbox Firmware: + +- Go to ``Erasing & Programming`` tab in the menu of STM32CubeProgrammer. +- Point ``File path`` to your Multi-Sandbox Firmware (``GREEN-STM32F7508-DK-2.0.0.out`` file). +- Click on ``Start Program...``. Wait for the programming to finish. + +.. note:: + + Sometimes, the programming may fail. Repeat it until it succeeds. + +Set up the logs output: + +- Get the COM port where your board is connected + (if you are using Windows, you can open your Device Manager from the Windows menu). +- Set up a serial terminal (e.g. Termite) to see output logs from the board. + Set it with the COM port retrieved previously and by following `Logs Output `__ + instructions. +- Click on the Reset button of the board by following the `Board Configuration `__ + instructions. +- Get the IP address of your board. You will find it in the logs output: + +.. figure:: images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-termite-green-fw-output.png + :alt: Logs Output on Termite Serial Terminal + :align: center + :scale: 70% + +The Multi-Sandbox Firmware is running on the STM32F7508-DK Discovery kit and is ready to be used. + +Run a Sandboxed Application on the Virtual Device +------------------------------------------------- + +Install MICROEJ SDK 6 +""""""""""""""""""""" + +Install MICROEJ SDK 6 by following :ref:`sdk_6_install` instructions. +Android Studio Koala is used on this Getting Started but feel free to use your favorite IDE. + +Accept the MICROEJ SDK EULA +""""""""""""""""""""""""""" + +You may have to accept the SDK EULA if you didn't already do, please have a look at :ref:`sdk_6_eula_acceptation`. + +Create the Sandboxed Application Project +"""""""""""""""""""""""""""""""""""""""" + +Create a new Sandboxed Application project as follows in Android Studio: + +- Click on :guilabel:`File` > :guilabel:`New` > :guilabel:`Project...`. +- Select :guilabel:`Generic` > :guilabel:`New MicroEJ project`. + +.. figure:: images/android-studio-create-project-01.png + :alt: Project Creation in Android Studio + :align: center + :scale: 70% + + Project Creation in Android Studio + +- Click on the :guilabel:`Next` button. +- Fill the name of the project in the :guilabel:`Name` field. +- Fill the package name of the project in the :guilabel:`Package name` field. +- Select the location of the project in the :guilabel:`Save location` field. +- Keep the default Android SDK in the :guilabel:`Minimum SDK` field. +- Select :guilabel:`Kotlin` for the :guilabel:`Build configuration language` field. + +.. note:: + Groovy build script DSL is not officially supported by the SDK, so the project created by the Wizard uses Kotlin regardless + of the language selected by the user. + +.. figure:: images/android-studio-create-project-02.png + :alt: Project Creation in Android Studio + :align: center + :scale: 70% + + Project Creation in Android Studio + +- Click on :guilabel:`Next` button. +- Fill the group of the artifact to publish in the :guilabel:`Group` field. +- Fill the version of the artifact to publish in the :guilabel:`Version` field. +- Select the project type in the drop-down list. +- Select the :guilabel:`Application` project type. +- Click on :guilabel:`Finish` button. + +.. figure:: images/android-studio-create-project-03.png + :alt: Project Creation in Android Studio + :align: center + :scale: 70% + + Project Creation in Android Studio + +- Change the view from :guilabel:`Android` to :guilabel:`Project` in the selectbox at the top of the project's files tree: + +.. figure:: images/android-studio-create-project-04.png + :alt: Project View in Android Studio + :align: center + :scale: 70% + + Project View in Android Studio + +.. note:: + If you do not use the last version of Android Studio, make sure that Gradle Wrapper uses at least Gradle version ``8.6``. + Refer to the :ref:`sdk_6_create_project_gradle_wrapper` section for more information. + + +Run the Sandboxed Application on the Virtual Device +""""""""""""""""""""""""""""""""""""""""""""""""""" + +The Multi-Sandbox Firmware and Virtual Device need to be provided to the :guilabel:`MyApplication` application: + +- Open the ``app/build.gradle.kts`` file of the :guilabel:`MyApplication` application, +- Declare the dependency to the Multi-Sandbox Firmware and Virtual Device as follows: + +.. code-block:: kotlin + + dependencies { + ... + //Uncomment the microejVee dependency to set the VEE Port or Kernel to use + microejVee(files("C:\\[YOUR_PATH]\\GREEN-STM32F7508-DK-2.0.0\\virtualDevice", "C:\\[YOUR_PATH]\\GREEN-STM32F7508-DK-2.0.0.out")) + } + +In order to execute the :guilabel:`MyApplication` application on the Virtual Device, the SDK provides the Gradle :guilabel:`runOnSimulator` task. + +.. note:: + + If you are using another IDE than Android Studio, please have a look at :ref:`sdk_6_run_on_simulator` section. + +* Double-click on the :guilabel:`runOnSimulator` task in the Gradle tasks view. It may take few seconds. + + .. figure:: images/gettingStarted/STM32F7508DK/getting-started-runOnSimulator.png + :alt: runOnSimulator task + :align: center + :scale: 70% + +The Virtual Device starts and executes the :guilabel:`MyApplication` application. +The ``Hello World!`` message can be seen in the console: + + .. figure:: images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-myapplication-sim.png + :alt: Virtual Device + :align: center + :scale: 70% + +.. figure:: images/gettingStarted/well-done-mascot.png + :alt: Well Done + :align: center + :scale: 70% + +Well done ! +----------- + +Now you know how to run a Sandboxed Application on a Virtual Device. + +If you want to learn how to run a Sandboxed Application on your STM32F7508-DK Discovery Kit, you can continue this Getting Started: :ref:`Run a Sandboxed Application on STM32F7508-DK Discovery Kit `. + +Otherwise, learn how to :ref:`Run the Demo-Sandboxed-Applications `. + +.. _sdk_6_getting_started_stm32f7508dk_run_on_device_multisandbox: + +Run the Sandboxed Application on the STM32F7508-DK Discovery kit +---------------------------------------------------------------- + +The Multi-Sandbox Firmware embeds a server that listens for Sandboxed Applications deployment commands. + +The :guilabel:`MyApplication` application can be deployed on the STM32F7508-DK Discovery kit using the ``Local Deploy tool``. +This tool will deploy the application on the STM32F7508-DK Discovery kit through your local network. + +Configure the Local Deploy tool in :guilabel:`MyApplication` application: + +- Open the ``app/build.gradle.kts`` file of the :guilabel:`MyApplication` application, +- Paste the following code at the beginning of the file: + +.. code-block:: + + import com.microej.gradle.tasks.ExecToolTask + import com.microej.gradle.tasks.LoadKernelExecutableTask + import com.microej.gradle.tasks.LoadVeeTask + +- Paste the following code at the end of the file: + +.. code-block:: kotlin + + val ipAddress = "192.168.1.83" + val port = "4000" + val boardTimeout = "120000" + val useStorage = "true" + + val loadVee = tasks.withType(LoadVeeTask::class).named("loadVee") + val loadKernelExecutableTask = tasks.withType(LoadKernelExecutableTask::class).named("loadKernelExecutable") + + tasks.register("localDeploy") { + + group="microej" + // These inputs are required for now, it should not be the case when M0090IDE-4712 is done. + veeDir.set(loadVee.get().loadedVeeDir) + resourcesDirectories.from(project.extensions.getByType(SourceSetContainer::class) + .getByName(SourceSet.MAIN_SOURCE_SET_NAME).output.resourcesDir, + project.layout.buildDirectory.dir("generated/microej-app-wrapper/resources")) + classesDirectories.from(project.extensions.getByType(SourceSetContainer::class) + .getByName(SourceSet.MAIN_SOURCE_SET_NAME).output.classesDirs) + + classpathFromConfiguration.from(project.getConfigurations().getByName("runtimeClasspath")) + + // These inputs concern the localDeploymentSocket tool only + toolName = "localDeploymentSocket" + inputs.file(loadKernelExecutableTask.get().loadedKernelExecutableFile) + toolProperties.putAll(mapOf( + "application.main.class" to microej.applicationEntryPoint, + "board.server.host" to ipAddress, + "board.server.port" to port, + "board.timeout" to boardTimeout, + "use.storage" to useStorage + )) + doFirst { + toolProperties["kernel.filename"] = loadKernelExecutableTask.get().loadedKernelExecutableFile.get().asFile.absolutePath + } + } + +- Update the ``ipAddress`` variable with your board IP address. +- Reload the Gradle project: + + .. figure:: images/gettingStarted/multiSandbox/getting-started-reload-gradle-project.png + :alt: Virtual Device + :align: center + :scale: 70% + +- A :guilabel:`localdeploy` task is now visible in the :guilabel:`microej` tasks list: + + .. figure:: images/gettingStarted/multiSandbox/getting-started-localdeploy-task.png + :alt: Virtual Device + :align: center + :scale: 70% + +- Double-click on the :guilabel:`localdeploy` task to deploy :guilabel:`MyApplication` on the board. +- :guilabel:`MyApplication` is successfully deployed and the ``Hello World!`` is displayed + in the serial terminal: + + .. figure:: images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-termite-myapplication-output.png + :alt: Virtual Device + :align: center + :scale: 70% + + +.. note:: + If you update your application, just run the :guilabel:`localdeploy` task again to test the + updated application on the board! + +Well done ! +----------- + +Now you know how to run a Sandboxed Application on a Multi-Sandbox Firmware! + +The next step is about :ref:`Running the Demo-Sandboxed-Applications `. +This demo showcases the communication between Sandboxed Applications using the Shared Interfaces. + +.. _sdk_6_getting_started_stm32f7508dk_run_demo_sandboxed_applications: + +Run the Demo-Sandboxed-Applications on your STM32F7508-DK Discovery Kit +----------------------------------------------------------------------- + +Import the Project +"""""""""""""""""" + +The first step is to import the Demo project into your IDE: + +.. note:: + + If you are using another IDE than Android Studio, please have a look at :ref:`sdk_6_import_project` section. + +* If you are in the Welcome Screen, click on the :guilabel:`Open` button. Otherwise click either on :guilabel:`File` > :guilabel:`Open...`. +* Select the ``Demo-Sandboxed-Applications`` directory located where you downloaded it and click on the :guilabel:`OK` button. + +The Gradle project should now be imported in Android Studio, your workspace contains the following project in the :guilabel:`Projects` view: + + .. figure:: images/gettingStarted/multiSandbox/getting-started-demo-sandboxed-applications-project.png + :alt: Workspace view + :align: center + :scale: 70% + + +.. _sdk_6_getting_started_stm32f7508dk_run_virtual_device: + +Going Further +------------- + +You have now successfully executed a MicroEJ application on an embedded device so what's next? + +If you are an application developer you can continue to explore MicroEJ's API and functionalities by running and studying our samples at GitHub: + +.. list-table:: + :widths: 33 33 33 + + * - Foundation Libraries + - Eclasspath + - IoT + * - This project gathers all the basic examples of the foundation libraries. + - This project gather all the examples of eclasspath. + - This project gathers simple applications using net libraries. + * - https://github.com/MicroEJ/Example-Foundation-Libraries + - https://github.com/MicroEJ/Example-Eclasspath + - https://github.com/MicroEJ/Example-IOT + +You can also learn how to build bigger and better applications by reading our :ref:`Application Developer Guide `. + +If you are an embedded engineer you could look at our VEE port examples at `GitHub `_. And to learn how create custom VEE ports you can read our :ref:`VEE Porting Guide `. + +You can also follow the :ref:`Kernel Developer Guide ` for more information on our multi-applications framework or read about our powerful wearable solution called :ref:`VEE Wear `. + +Last but not least you can choose to learn about specific topics by following one of our many :ref:`trainings` ranging from how to easily debug application to setting up a Continuous Integration process and a lot of things in between. + +.. + | Copyright 2024, MicroEJ Corp. Content in this space is free + for read and redistribute. Except if otherwise stated, modification + is subject to MicroEJ Corp prior approval. + | MicroEJ is a trademark of MicroEJ Corp. All other trademarks and + copyrights are the property of their respective owners. \ No newline at end of file diff --git a/SDK6UserGuide/images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-myapplication-sim.png b/SDK6UserGuide/images/gettingStarted/multiSandbox/STM32F7508DK/getting-started-stm32f7508dk-myapplication-sim.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7772c1d1af6816df583e9382ba5f7e815245e2 GIT binary patch literal 600992 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