name: Build

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  PC_Application_Ubuntu:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v1

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y libusb-1.0-0-dev qt5-default qt5-qmake qtbase5-dev

      - name: Get build timestamp
        id: id_date
        run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT

      - name: Get app version
        id: id_version
        run: |
          cd Software/PC_Application/LibreVNA-GUI
          fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
          fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
          fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro` 
          echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT

      - name: Build application
        run: |
          cd Software/PC_Application/LibreVNA-GUI
          qmake LibreVNA-GUI.pro
          make -j9
        shell: bash

      - name: Upload artifact
        env: 
          LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
        uses: actions/upload-artifact@v2
        with:
          name: LibreVNA-GUI-Ubuntu-${{env.LIBREVNA_VERSION}}
          path: Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI
          
  PC_Application_Windows:
    runs-on: windows-2019
    steps:
      - uses: actions/checkout@v1
      - uses: msys2/setup-msys2@v2

      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: '5.15.2'
          arch: 'win64_mingw81'
      
      - name: Download libusb
        run: |
          curl -o libusb.7z -L https://github.com/libusb/libusb/releases/download/v1.0.25/libusb-1.0.25.7z
          7z x libusb.7z -r -olibusb
          Xcopy /E /I /Y libusb\include ..\Qt\5.15.2\mingw81_64\include
          Xcopy /E /I /Y libusb\MinGW64\static\libusb-1.0.a Software\PC_Application\LibreVNA-GUI
        shell: cmd

      - name: Get build timestamp
        shell: msys2 {0}
        id: id_date
        run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT

      - name: Get app version
        id: id_version
        shell: msys2 {0}
        run: |
          cd Software/PC_Application/LibreVNA-GUI
          fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
          fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
          fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro` 
          echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT

      - name: Build application
        run: |
          cd Software/PC_Application/LibreVNA-GUI
          qmake LibreVNA-GUI.pro
          make -j9
        shell: cmd

      - name: Deploy application
        run: |
          cd Software/PC_Application/LibreVNA-GUI/release
          del *.o *.cpp
          windeployqt.exe .
          copy ..\..\..\..\..\Qt\5.15.2\mingw81_64\bin\libwinpthread-1.dll .
          copy ..\..\..\..\..\Qt\5.15.2\mingw81_64\bin\libgcc_s_seh-1.dll .
          copy "..\..\..\..\..\Qt\5.15.2\mingw81_64\bin\libstdc++-6.dll" .
          copy ..\..\..\..\..\Qt\5.15.2\mingw81_64\bin\Qt5OpenGL.dll .
        shell: cmd
        
      - name: Upload
        uses: actions/upload-artifact@v2
        env: 
          LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
        with:
          name: GUI_Windows-${{env.LIBREVNA_VERSION}}
          path: Software/PC_Application/LibreVNA-GUI/release

  PC_Application_OSX:
    runs-on: macos-11
    steps:
      - uses: actions/checkout@v1

      - name: Install dependencies
        run: |
          brew install qt@5 libusb pcre
          
      - name: Set Environment
        run: |
          echo "/usr/local/opt/qt@5/bin" >> $GITHUB_PATH
          
      - name: Get build timestamp
        id: id_date
        run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT

      - name: Get app version
        id: id_version
        run: |
          cd Software/PC_Application/LibreVNA-GUI
          fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
          fw_minor=`pcregrep -o '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
          fw_patch=`pcregrep -o '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro` 
          echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT

      - name: Build application
        run: |
          cd Software/PC_Application/LibreVNA-GUI
          qmake LibreVNA-GUI.pro
          make -j9
          macdeployqt LibreVNA-GUI.app
          zip -ry LibreVNA-GUI.zip LibreVNA-GUI.app
        shell: bash

      - name: Upload artifact
        env: 
          LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
        uses: actions/upload-artifact@v2
        with:
          name: LibreVNA-GUI-OSX-${{env.LIBREVNA_VERSION}}
          path: Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.zip
          
  Embedded_Firmware:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v1

      - name: Install toolchain
        run: |
          sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi
        
      - name: Get build timestamp
        id: id_date
        run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT

      - name: Get app version
        id: id_version
        run: |
          cd Software/VNA_embedded
          fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' Makefile`
          fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' Makefile`
          fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' Makefile`
          hw_revision=`grep "DHW_REVISION=" Makefile | sed "s/-DHW_REVISION=\"'//" | sed "sr'\" [\]rr"`
          echo "app_version=hw-rev-$hw_revision-v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT

      - name: Build application
        run: |
          cd Software/VNA_embedded
          make -j9
          cp build/VNA_embedded.elf ../../
        shell: bash

      - name: Combine with FPGA bitstream
        run: |
          python3 AssembleFirmware.py
        shell: bash

      - name: Upload
        uses: actions/upload-artifact@v2
        env: 
          LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
        with:
          name: EmbeddedFirmware-${{env.LIBREVNA_VERSION}}
          path: |
            VNA_embedded.elf
            combined.vnafw
