#!/usr/bin/env bash # run.sh – Build UDPStreamer and launch the test MARTe2 application. # # Usage: # ./run.sh # run MARTe2 app only # ./run.sh --webui # also start the WebUI Go client in the background # ./run.sh --help # show this message # # Prerequisites: # - marte_env.sh must be present in the repo root (sets MARTe2_DIR, etc.) # - MARTe2 and MARTe2-components must already be built # # The script resolves all paths relative to the repo root so it can be # called from any working directory. set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" # ── Parse arguments ────────────────────────────────────────────────────────── START_WEBUI=0 for arg in "$@"; do case "$arg" in --webui) START_WEBUI=1 ;; --help|-h) sed -n '2,12p' "$0" exit 0 ;; esac done # ── Load MARTe2 environment ────────────────────────────────────────────────── ENV_SCRIPT="${REPO_ROOT}/marte_env.sh" if [ ! -f "${ENV_SCRIPT}" ]; then echo "ERROR: ${ENV_SCRIPT} not found." >&2 exit 1 fi # shellcheck source=/dev/null source "${ENV_SCRIPT}" if [ -z "${MARTe2_DIR}" ]; then echo "ERROR: MARTe2_DIR is not set after sourcing marte_env.sh." >&2 exit 1 fi # ── Build UDPStreamer ───────────────────────────────────────────────────────── TARGET=x86-linux UDPSTREAMER_SRC="${REPO_ROOT}/Source/Components/DataSources/UDPStreamer" UDPSTREAMER_LIB="${REPO_ROOT}/Build/${TARGET}/Components/DataSources/UDPStreamer" echo "==> Building UDPStreamer (TARGET=${TARGET})..." make -C "${UDPSTREAMER_SRC}" \ -f Makefile.gcc \ TARGET="${TARGET}" \ 2>&1 | tail -5 echo "==> Build done." # ── Build WebUI binary (if requested and not already built) ────────────────── WEBUI_DIR="${REPO_ROOT}/Client/WebUI" WEBUI_BIN="${WEBUI_DIR}/udpstreamer-webui" if [ "${START_WEBUI}" -eq 1 ] && [ ! -x "${WEBUI_BIN}" ]; then echo "==> Building WebUI..." (cd "${WEBUI_DIR}" && go build -o udpstreamer-webui ./...) echo "==> WebUI build done." fi # ── Set LD_LIBRARY_PATH ─────────────────────────────────────────────────────── COMP="${MARTe2_Components_DIR}/Build/${TARGET}/Components" export LD_LIBRARY_PATH="\ ${UDPSTREAMER_LIB}:\ ${MARTe2_DIR}/Build/${TARGET}/Core:\ ${COMP}/DataSources/LinuxTimer:\ ${COMP}/DataSources/LoggerDataSource:\ ${COMP}/GAMs/IOGAM:\ ${COMP}/GAMs/WaveformGAM:\ ${LD_LIBRARY_PATH}" echo "==> LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" # ── Create class-name symlinks for MARTe2 auto-loader ──────────────────────── # MARTe2 looks for .so when a class is not yet registered. # Some components bundle multiple classes into one .so (e.g. WaveformGAM.so # contains WaveformSin, WaveformChirp, WaveformPointsDef). We need symlinks # so dlopen(".so") succeeds. WAVEFORM_DIR="${COMP}/GAMs/WaveformGAM" for cls in WaveformSin WaveformChirp WaveformPointsDef; do target="${WAVEFORM_DIR}/${cls}.so" if [ ! -e "${target}" ]; then ln -sf "${WAVEFORM_DIR}/WaveformGAM.so" "${target}" fi done # SineArrayGAM is bundled inside UDPStreamer.so; create a symlink so MARTe2 # can dlopen("SineArrayGAM.so") before UDPStreamer has been registered. SINE_LINK="${UDPSTREAMER_LIB}/SineArrayGAM.so" if [ ! -e "${SINE_LINK}" ]; then ln -sf "${UDPSTREAMER_LIB}/UDPStreamer.so" "${SINE_LINK}" fi # ── Optionally start WebUI ──────────────────────────────────────────────────── if [ "${START_WEBUI}" -eq 1 ]; then echo "==> Starting WebUI on http://localhost:8080 (streamer at 127.0.0.1:44500)..." "${WEBUI_BIN}" \ --streamer 127.0.0.1:44500 \ --listen :8080 \ --clientport 44900 & WEBUI_PID=$! echo "==> WebUI PID ${WEBUI_PID}" fi # ── Launch MARTe2 application ───────────────────────────────────────────────── MARTE_APP="${MARTe2_DIR}/Build/${TARGET}/App/MARTeApp.ex" CFG="${SCRIPT_DIR}/TestApp.cfg" if [ ! -x "${MARTE_APP}" ]; then echo "ERROR: MARTeApp.ex not found at ${MARTE_APP}" >&2 exit 1 fi echo "==> Starting MARTe2 application (state=Running, 100 Hz)..." echo "==> Press Ctrl+C to stop." echo "" cleanup() { echo "" echo "==> Stopping..." if [ "${START_WEBUI}" -eq 1 ] && kill -0 "${WEBUI_PID}" 2>/dev/null; then kill "${WEBUI_PID}" fi } trap cleanup EXIT INT TERM "${MARTE_APP}" \ -l RealTimeLoader \ -f "${CFG}" \ -s Running