pipeline {
  agent none
  stages {

    stage('Build') {

      parallel {

        stage('px4_fmu-v2') {
          agent {
            docker {
              image 'px4io/px4-dev-nuttx:2018-11-22'
              args '-e CCACHE_BASEDIR=$WORKSPACE -v ${CCACHE_DIR}:${CCACHE_DIR}:rw'
            }
          }
          steps {
            sh 'export'
            sh 'make distclean'
            sh 'ccache -z'
            sh 'git fetch --tags'
            sh 'make px4_fmu-v2_test'
            sh 'make sizes'
            sh 'ccache -s'
            stash includes: 'build/px4_fmu-v2_test/px4_fmu-v2_test.elf', name: 'px4_fmu-v2_test'
            stash includes: 'Tools/HIL/monitor_firmware_upload.py, Tools/HIL/run_tests.py', name: 'scripts-px4_fmu-v2'
          }
          post {
            always {
                sh 'make distclean'
            }
          }
        }

        stage('px4_fmu-v4 (stackcheck)') {
          agent {
            docker {
              image 'px4io/px4-dev-nuttx:2018-11-22'
              args '-e CCACHE_BASEDIR=$WORKSPACE -v ${CCACHE_DIR}:${CCACHE_DIR}:rw'
            }
          }
          steps {
            sh 'export'
            sh 'make distclean'
            sh 'ccache -z'
            sh 'git fetch --tags'
            sh 'make px4_fmu-v4_stackcheck'
            sh 'make sizes'
            sh 'ccache -s'
            stash includes: 'build/px4_fmu-v4_stackcheck/px4_fmu-v4_stackcheck.elf', name: 'px4_fmu-v4_stackcheck'
            stash includes: 'Tools/HIL/monitor_firmware_upload.py, Tools/HIL/run_tests.py', name: 'scripts-px4_fmu-v4'
          }
          post {
            always {
                sh 'make distclean'
            }
          }
        }

      } // parallel
    } // stage Build

    stage('Flash and Run') {

      parallel {

        stage('px4_fmu-v2') {
          agent {
            label 'px4fmu-v2'
          }
          steps {
            script {
              try {
                sh 'export'
                sh 'find /dev/serial'
                unstash 'scripts-px4_fmu-v2'
                unstash 'px4_fmu-v2_test'
                sh ''' gdb -nx --batch \
                      -ex "target extended-remote `find /dev/serial -name *Black_Magic_Probe_*-if00`" \
                      -ex "monitor version" \
                      -ex "monitor connect_srst enable" \
                      -ex "monitor swdp_scan" \
                      -ex "attach 1" \
                      -ex "load" \
                      -ex "kill" \
                      build/px4_fmu-v2_test/px4_fmu-v2_test.elf
                '''
                sh './Tools/HIL/monitor_firmware_upload.py --device `find /dev/serial -name *Black_Magic_Probe_*-if02` --baudrate 57600'
                sh './Tools/HIL/run_tests.py --device `find /dev/serial -name *Black_Magic_Probe_*-if02`'
              } catch (Exception err) {
                  // always report passed for now
                  currentBuild.result = 'SUCCESS'
              }
            } // script
          }
          options {
            timeout(time: 300, unit: 'SECONDS')
          }
        }

        stage('px4_fmu-v4') {
          agent {
            label 'px4fmu-v4'
          }
          steps {
            script {
              try {
                sh 'export'
                sh 'find /dev/serial'
                unstash 'scripts-px4_fmu-v4'
                unstash 'px4_fmu-v4_stackcheck'
                sh ''' gdb -nx --batch \
                      -ex "target extended-remote `find /dev/serial -name *Black_Magic_Probe_*-if00`" \
                      -ex "monitor version" \
                      -ex "monitor connect_srst enable" \
                      -ex "monitor swdp_scan" \
                      -ex "attach 1" \
                      -ex "load" \
                      -ex "kill" \
                      build/px4_fmu-v4_stackcheck/px4_fmu-v4_stackcheck.elf
                '''
                sh './Tools/HIL/monitor_firmware_upload.py --device `find /dev/serial -name *Black_Magic_Probe_*-if02` --baudrate 57600'
                sh './Tools/HIL/run_tests.py --device `find /dev/serial -name *Black_Magic_Probe_*-if02`'
              } catch (Exception err) {
                  // always report passed for now
                  currentBuild.result = 'SUCCESS'
              }
            } // script
          }
          options {
            timeout(time: 300, unit: 'SECONDS')
          }
        }

      } // parallel
    } // stage Flash

  } // stages
  environment {
    CCACHE_DIR = '/tmp/ccache'
    CI = true
  }
  options {
    buildDiscarder(logRotator(numToKeepStr: '5', artifactDaysToKeepStr: '30'))
    timeout(time: 60, unit: 'MINUTES')
  }
}
