地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1136 lines
52 KiB

/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#include "CameraSectionTest.h"
CameraSectionTest::CameraSectionTest(void)
: _spyCamera(NULL)
, _spySection(NULL)
, _cameraSection(NULL)
, _validGimbalItem(NULL)
, _validDistanceItem(NULL)
, _validTimeItem(NULL)
, _validStartVideoItem(NULL)
, _validStopVideoItem(NULL)
, _validStopDistanceItem(NULL)
, _validStopTimeItem(NULL)
{
}
void CameraSectionTest::init(void)
{
SectionTest::init();
rgCameraSignals[specifyGimbalChangedIndex] = SIGNAL(specifyGimbalChanged(bool));
rgCameraSignals[specifiedGimbalYawChangedIndex] = SIGNAL(specifiedGimbalYawChanged(double));
rgCameraSignals[specifyCameraModeChangedIndex] = SIGNAL(specifyCameraModeChanged(bool));
_cameraSection = _simpleItem->cameraSection();
_createSpy(_cameraSection, &_spyCamera);
QVERIFY(_spyCamera);
SectionTest::_createSpy(_cameraSection, &_spySection);
QVERIFY(_spySection);
_validGimbalItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, MAV_CMD_DO_MOUNT_CONTROL, MAV_FRAME_MISSION, 10.1234, 0, 20.1234, 0, 0, 0, MAV_MOUNT_MODE_MAVLINK_TARGETING, true, false),
this);
_validTimeItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, MAV_CMD_IMAGE_START_CAPTURE, MAV_FRAME_MISSION, 0, 48, 0, -1, -1, 0, 0, true, false),
this);
_validDistanceItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, MAV_CMD_DO_SET_CAM_TRIGG_DIST, MAV_FRAME_MISSION, 72, 0, 0, 0, 0, 0, 0, true, false),
this);
_validStartVideoItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, MAV_CMD_VIDEO_START_CAPTURE, MAV_FRAME_MISSION, 0, -1, -1, 0, 0, 0, 0, true, false),
this);
_validStopVideoItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, MAV_CMD_VIDEO_STOP_CAPTURE, MAV_FRAME_MISSION, 0, 0, 0, 0, 0, 0, 0, true, false),
this);
_validStopDistanceItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, MAV_CMD_DO_SET_CAM_TRIGG_DIST, MAV_FRAME_MISSION, 0, 0, 0, 0, 0, 0, 0, true, false),
this);
_validStopTimeItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(1, MAV_CMD_IMAGE_STOP_CAPTURE, MAV_FRAME_MISSION, 0, 0, 0, 0, 0, 0, 0, true, false),
this);
_validCameraPhotoModeItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, // sequence number
MAV_CMD_SET_CAMERA_MODE,
MAV_FRAME_MISSION,
0, // camera id = 0, all cameras
CameraSection::CameraModePhoto,
NAN, NAN, NAN, NAN, NAN, // param 3-7 unused
true, // autocontinue
false), // isCurrentItem
this);
_validCameraVideoModeItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0, // sequence number
MAV_CMD_SET_CAMERA_MODE,
MAV_FRAME_MISSION,
0, // camera id = 0, all cameras
CameraSection::CameraModeVideo,
NAN, NAN, NAN, NAN, NAN, // param 3-7 unused
true, // autocontinue
false), // isCurrentItem
this);
_validTakePhotoItem = new SimpleMissionItem(_offlineVehicle,
MissionItem(0,
MAV_CMD_IMAGE_START_CAPTURE,
MAV_FRAME_MISSION,
0, // camera id = 0, all cameras
0, // Interval (none)
1, // Take 1 photo
-1, // Max horizontal resolution
-1, // Max vertical resolution
0, 0, // param 6-7 not used
true, // autoContinue
false), // isCurrentItem
this);
}
void CameraSectionTest::cleanup(void)
{
delete _spyCamera;
delete _spySection;
delete _validGimbalItem;
delete _validDistanceItem;
delete _validTimeItem;
delete _validStartVideoItem;
delete _validStopVideoItem;
delete _validStopDistanceItem;
delete _validStopTimeItem;
delete _validTakePhotoItem;
SectionTest::cleanup();
}
void CameraSectionTest::_createSpy(CameraSection* cameraSection, MultiSignalSpy** cameraSpy)
{
*cameraSpy = NULL;
MultiSignalSpy* spy = new MultiSignalSpy();
QCOMPARE(spy->init(cameraSection, rgCameraSignals, cCameraSignals), true);
*cameraSpy = spy;
}
void CameraSectionTest::_testDirty(void)
{
// Check for dirty not signalled if same value
_cameraSection->setSpecifyGimbal(_cameraSection->specifyGimbal());
QVERIFY(_spySection->checkNoSignals());
QCOMPARE(_cameraSection->dirty(), false);
_cameraSection->setSpecifyCameraMode(_cameraSection->specifyCameraMode());
QVERIFY(_spySection->checkNoSignals());
QCOMPARE(_cameraSection->dirty(), false);
_cameraSection->gimbalPitch()->setRawValue(_cameraSection->gimbalPitch()->rawValue());
QVERIFY(_spySection->checkNoSignals());
QCOMPARE(_cameraSection->dirty(), false);
_cameraSection->gimbalYaw()->setRawValue(_cameraSection->gimbalPitch()->rawValue());
QVERIFY(_spySection->checkNoSignals());
QCOMPARE(_cameraSection->dirty(), false);
_cameraSection->cameraAction()->setRawValue(_cameraSection->cameraAction()->rawValue());
QVERIFY(_spySection->checkNoSignals());
QCOMPARE(_cameraSection->dirty(), false);
_cameraSection->cameraPhotoIntervalTime()->setRawValue(_cameraSection->cameraPhotoIntervalTime()->rawValue());
QVERIFY(_spySection->checkNoSignals());
QCOMPARE(_cameraSection->dirty(), false);
_cameraSection->cameraPhotoIntervalDistance()->setRawValue(_cameraSection->cameraPhotoIntervalDistance()->rawValue());
QVERIFY(_spySection->checkNoSignals());
QCOMPARE(_cameraSection->dirty(), false);
// Check for no duplicate dirty signalling on change
_cameraSection->setSpecifyGimbal(!_cameraSection->specifyGimbal());
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_spySection->clearAllSignals();
_cameraSection->setSpecifyGimbal(!_cameraSection->specifyGimbal());
QVERIFY(_spySection->checkNoSignalByMask(dirtyChangedMask));
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
_cameraSection->setSpecifyCameraMode(!_cameraSection->specifyCameraMode());
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_spySection->clearAllSignals();
_cameraSection->setSpecifyCameraMode(!_cameraSection->specifyCameraMode());
QVERIFY(_spySection->checkNoSignalByMask(dirtyChangedMask));
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
// Check the remaining items that should set dirty bit
_cameraSection->gimbalPitch()->setRawValue(_cameraSection->gimbalPitch()->rawValue().toDouble() + 1);
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
_cameraSection->gimbalYaw()->setRawValue(_cameraSection->gimbalPitch()->rawValue().toDouble() + 1);
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
_cameraSection->cameraAction()->setRawValue(_cameraSection->cameraAction()->rawValue().toInt() + 1);
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
_cameraSection->cameraPhotoIntervalTime()->setRawValue(_cameraSection->cameraPhotoIntervalTime()->rawValue().toInt() + 1);
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
_cameraSection->cameraPhotoIntervalDistance()->setRawValue(_cameraSection->cameraPhotoIntervalDistance()->rawValue().toDouble() + 1);
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
_cameraSection->cameraMode()->setRawValue(_cameraSection->cameraMode()->rawValue().toInt() == 0 ? 1 : 0);
QVERIFY(_spySection->checkSignalByMask(dirtyChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(dirtyChangedIndex), true);
QCOMPARE(_cameraSection->dirty(), true);
_cameraSection->setDirty(false);
_spySection->clearAllSignals();
}
void CameraSectionTest::_testSettingsAvailable(void)
{
// No settings specified to start
QVERIFY(_cameraSection->cameraAction()->rawValue().toInt() == CameraSection::CameraActionNone);
QCOMPARE(_cameraSection->specifyGimbal(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
// Check correct reaction to specify methods on/off
_cameraSection->setSpecifyGimbal(true);
QCOMPARE(_cameraSection->specifyGimbal(), true);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QVERIFY(_spyCamera->checkSignalByMask(specifyGimbalChangedMask));
QCOMPARE(_spyCamera->pullBoolFromSignalIndex(specifyGimbalChangedIndex), true);
QVERIFY(_spySection->checkSignalByMask(settingsSpecifiedChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(settingsSpecifiedChangedIndex), true);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyGimbal(false);
QCOMPARE(_cameraSection->specifyGimbal(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
QVERIFY(_spyCamera->checkSignalByMask(specifyGimbalChangedMask));
QCOMPARE(_spyCamera->pullBoolFromSignalIndex(specifyGimbalChangedIndex), false);
QVERIFY(_spySection->checkSignalByMask(settingsSpecifiedChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(settingsSpecifiedChangedIndex), false);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyCameraMode(true);
QCOMPARE(_cameraSection->specifyCameraMode(), true);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QVERIFY(_spyCamera->checkSignalByMask(specifyCameraModeChangedMask));
QCOMPARE(_spyCamera->pullBoolFromSignalIndex(specifyCameraModeChangedIndex), true);
QVERIFY(_spySection->checkSignalByMask(settingsSpecifiedChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(settingsSpecifiedChangedIndex), true);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyCameraMode(false);
QCOMPARE(_cameraSection->specifyCameraMode(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
QVERIFY(_spyCamera->checkSignalByMask(specifyCameraModeChangedMask));
QCOMPARE(_spyCamera->pullBoolFromSignalIndex(specifyCameraModeChangedIndex), false);
QVERIFY(_spySection->checkSignalByMask(settingsSpecifiedChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(settingsSpecifiedChangedIndex), false);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
// Check correct reaction to cameraAction on/off
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhotosIntervalTime);
QVERIFY(_cameraSection->cameraAction()->rawValue().toInt() == CameraSection::TakePhotosIntervalTime);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QVERIFY(_spySection->checkSignalByMask(settingsSpecifiedChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(settingsSpecifiedChangedIndex), true);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
QVERIFY(_cameraSection->cameraAction()->rawValue().toInt() == CameraSection::CameraActionNone);
QCOMPARE(_cameraSection->settingsSpecified(), false);
QVERIFY(_spySection->checkSignalByMask(settingsSpecifiedChangedMask));
QCOMPARE(_spySection->pullBoolFromSignalIndex(settingsSpecifiedChangedIndex), false);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
// Check that there is not multiple signalling of settingsSpecified
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhotosIntervalTime);
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhotosIntervalTime);
_cameraSection->setSpecifyGimbal(true);
QVERIFY(_spySection->checkSignalByMask(settingsSpecifiedChangedMask));
}
void CameraSectionTest::_checkAvailable(void)
{
MissionItem missionItem(1, // sequence number
MAV_CMD_NAV_TAKEOFF,
MAV_FRAME_GLOBAL_RELATIVE_ALT,
10.1234567, // param 1-7
20.1234567,
30.1234567,
40.1234567,
50.1234567,
60.1234567,
70.1234567,
true, // autoContinue
false); // isCurrentItem
SimpleMissionItem* item = new SimpleMissionItem(_offlineVehicle, missionItem);
QVERIFY(item->cameraSection());
QCOMPARE(item->cameraSection()->available(), false);
}
void CameraSectionTest::_testItemCount(void)
{
// No settings specified to start
QCOMPARE(_cameraSection->itemCount(), 0);
// Check specify methods
_cameraSection->setSpecifyGimbal(true);
QCOMPARE(_cameraSection->itemCount(), 1);
QVERIFY(_spySection->checkSignalByMask(itemCountChangedMask));
QCOMPARE(_spySection->pullIntFromSignalIndex(itemCountChangedIndex), 1);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyGimbal(false);
QCOMPARE(_cameraSection->itemCount(), 0);
QVERIFY(_spySection->checkSignalByMask(itemCountChangedMask));
QCOMPARE(_spySection->pullIntFromSignalIndex(itemCountChangedIndex), 0);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyCameraMode(true);
QCOMPARE(_cameraSection->itemCount(), 1);
QVERIFY(_spySection->checkSignalByMask(itemCountChangedMask));
QCOMPARE(_spySection->pullIntFromSignalIndex(itemCountChangedIndex), 1);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyCameraMode(false);
QCOMPARE(_cameraSection->itemCount(), 0);
QVERIFY(_spySection->checkSignalByMask(itemCountChangedMask));
QCOMPARE(_spySection->pullIntFromSignalIndex(itemCountChangedIndex), 0);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyGimbal(true);
_cameraSection->setSpecifyCameraMode(true);
QCOMPARE(_cameraSection->itemCount(), 2);
QVERIFY(_spySection->checkSignalsByMask(itemCountChangedMask));
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->setSpecifyGimbal(false);
_cameraSection->setSpecifyCameraMode(false);
QCOMPARE(_cameraSection->itemCount(), 0);
QVERIFY(_spySection->checkSignalsByMask(itemCountChangedMask));
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
// Check camera actions
QList<int> rgCameraActions;
rgCameraActions << CameraSection::TakePhotosIntervalTime << CameraSection::TakePhotoIntervalDistance << CameraSection::StopTakingPhotos << CameraSection::TakeVideo << CameraSection::StopTakingVideo << CameraSection::TakePhoto;
foreach(int cameraAction, rgCameraActions) {
qDebug() << "camera action" << cameraAction;
// Reset
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
QCOMPARE(_cameraSection->itemCount(), 0);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
// Set to new action
_cameraSection->cameraAction()->setRawValue(cameraAction);
QCOMPARE(_cameraSection->itemCount(), 1);
QVERIFY(_spySection->checkSignalByMask(itemCountChangedMask));
QCOMPARE(_spySection->pullIntFromSignalIndex(itemCountChangedIndex), 1);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
}
// Reset
_cameraSection->setSpecifyGimbal(false);
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
QCOMPARE(_cameraSection->itemCount(), 0);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
// Check both camera action and gimbal set
_cameraSection->setSpecifyGimbal(true);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhotosIntervalTime);
QCOMPARE(_cameraSection->itemCount(), 2);
QVERIFY(_spySection->checkSignalsByMask(itemCountChangedMask));
QCOMPARE(_spySection->pullIntFromSignalIndex(itemCountChangedIndex), 2);
_spySection->clearAllSignals();
_spyCamera->clearAllSignals();
}
void CameraSectionTest::_testAppendSectionItems(void)
{
int seqNum = 0;
QList<MissionItem*> rgMissionItems;
// No settings specified to start
QCOMPARE(_cameraSection->itemCount(), 0);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 0);
QCOMPARE(seqNum, 0);
rgMissionItems.clear();
// Test specifyGimbal
_cameraSection->setSpecifyGimbal(true);
_cameraSection->gimbalPitch()->setRawValue(_validGimbalItem->missionItem().param1());
_cameraSection->gimbalYaw()->setRawValue(_validGimbalItem->missionItem().param3());
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validGimbalItem->missionItem());
_cameraSection->setSpecifyGimbal(false);
rgMissionItems.clear();
seqNum = 0;
// Test specifyCameraMode
_cameraSection->setSpecifyCameraMode(true);
_cameraSection->cameraMode()->setRawValue(CameraSection::CameraModePhoto);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validCameraPhotoModeItem->missionItem());
_cameraSection->setSpecifyGimbal(false);
rgMissionItems.clear();
seqNum = 0;
_cameraSection->setSpecifyCameraMode(true);
_cameraSection->cameraMode()->setRawValue(CameraSection::CameraModeVideo);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validCameraVideoModeItem->missionItem());
_cameraSection->setSpecifyCameraMode(false);
rgMissionItems.clear();
seqNum = 0;
// Test camera actions
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhoto);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validTakePhotoItem->missionItem());
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
rgMissionItems.clear();
seqNum = 0;
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhotosIntervalTime);
_cameraSection->cameraPhotoIntervalTime()->setRawValue(_validTimeItem->missionItem().param2());
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validTimeItem->missionItem());
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
rgMissionItems.clear();
seqNum = 0;
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhotoIntervalDistance);
_cameraSection->cameraPhotoIntervalDistance()->setRawValue(_validDistanceItem->missionItem().param1());
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validDistanceItem->missionItem());
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
rgMissionItems.clear();
seqNum = 0;
_cameraSection->cameraAction()->setRawValue(CameraSection::TakeVideo);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validStartVideoItem->missionItem());
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
rgMissionItems.clear();
seqNum = 0;
_cameraSection->cameraAction()->setRawValue(CameraSection::StopTakingVideo);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 1);
QCOMPARE(seqNum, 1);
_missionItemsEqual(*rgMissionItems[0], _validStopVideoItem->missionItem());
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
rgMissionItems.clear();
seqNum = 0;
_cameraSection->cameraAction()->setRawValue(CameraSection::StopTakingPhotos);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 2);
QCOMPARE(seqNum, 2);
_missionItemsEqual(*rgMissionItems[0], _validStopDistanceItem->missionItem());
_missionItemsEqual(*rgMissionItems[1], _validStopTimeItem->missionItem());
_cameraSection->cameraAction()->setRawValue(CameraSection::CameraActionNone);
rgMissionItems.clear();
seqNum = 0;
// Test multiple
_cameraSection->setSpecifyGimbal(true);
_cameraSection->gimbalPitch()->setRawValue(_validGimbalItem->missionItem().param1());
_cameraSection->gimbalYaw()->setRawValue(_validGimbalItem->missionItem().param3());
_cameraSection->cameraAction()->setRawValue(CameraSection::TakePhotosIntervalTime);
_cameraSection->cameraPhotoIntervalTime()->setRawValue(_validTimeItem->missionItem().param2());
_cameraSection->setSpecifyCameraMode(true);
_cameraSection->cameraMode()->setRawValue(CameraSection::CameraModePhoto);
_cameraSection->appendSectionItems(rgMissionItems, this, seqNum);
QCOMPARE(rgMissionItems.count(), 3);
QCOMPARE(seqNum, 3);
_missionItemsEqual(*rgMissionItems[0], _validCameraPhotoModeItem->missionItem()); // Camera mode change must always be first
_missionItemsEqual(*rgMissionItems[1], _validGimbalItem->missionItem());
_missionItemsEqual(*rgMissionItems[2], _validTimeItem->missionItem());
_cameraSection->setSpecifyGimbal(false);
rgMissionItems.clear();
seqNum = 0;
}
void CameraSectionTest::_testScanForGimbalSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
// Check for a scan success
SimpleMissionItem* newValidGimbalItem = new SimpleMissionItem(_offlineVehicle, this);
newValidGimbalItem->missionItem() = _validGimbalItem->missionItem();
visualItems.append(newValidGimbalItem);
scanIndex = 0;
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->specifyGimbal(), true);
QCOMPARE(_cameraSection->gimbalPitch()->rawValue().toDouble(), _validGimbalItem->missionItem().param1());
QCOMPARE(_cameraSection->gimbalYaw()->rawValue().toDouble(), _validGimbalItem->missionItem().param3());
_cameraSection->setSpecifyGimbal(false);
visualItems.clear();
scanIndex = 0;
/*
MAV_CMD_DO_MOUNT_CONTROL
Mission Param #1 pitch (WIP: DEPRECATED: or lat in degrees) depending on mount mode.
Mission Param #2 roll (WIP: DEPRECATED: or lon in degrees) depending on mount mode.
Mission Param #3 yaw (WIP: DEPRECATED: or alt in meters) depending on mount mode.
Mission Param #4 WIP: alt in meters depending on mount mode.
Mission Param #5 WIP: latitude in degrees * 1E7, set if appropriate mount mode.
Mission Param #6 WIP: longitude in degrees * 1E7, set if appropriate mount mode.
Mission Param #7 MAV_MOUNT_MODE enum value
*/
// Gimbal command but incorrect settings
SimpleMissionItem invalidSimpleItem(_offlineVehicle, _validGimbalItem->missionItem());
invalidSimpleItem.missionItem().setParam2(10); // roll is not supported
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyGimbal(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validGimbalItem->missionItem();
invalidSimpleItem.missionItem().setParam4(10); // alt is not supported
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyGimbal(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validGimbalItem->missionItem();
invalidSimpleItem.missionItem().setParam5(10); // lat is not supported
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyGimbal(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validGimbalItem->missionItem();
invalidSimpleItem.missionItem().setParam6(10); // lon is not supported
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyGimbal(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validGimbalItem->missionItem();
invalidSimpleItem.missionItem().setParam7(MAV_MOUNT_MODE_RETRACT); // Only MAV_MOUNT_MODE_MAVLINK_TARGETING supported
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyGimbal(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForCameraModeSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
// Check for a scan success
SimpleMissionItem* newValidCameraModeItem = new SimpleMissionItem(_offlineVehicle, this);
newValidCameraModeItem->missionItem() = _validCameraPhotoModeItem->missionItem();
visualItems.append(newValidCameraModeItem);
scanIndex = 0;
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->specifyCameraMode(), true);
QCOMPARE(_cameraSection->cameraMode()->rawValue().toDouble(), _validCameraPhotoModeItem->missionItem().param2());
_cameraSection->setSpecifyCameraMode(false);
visualItems.clear();
scanIndex = 0;
newValidCameraModeItem->missionItem() = _validCameraVideoModeItem->missionItem();
visualItems.append(newValidCameraModeItem);
scanIndex = 0;
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->specifyCameraMode(), true);
QCOMPARE(_cameraSection->cameraMode()->rawValue().toDouble(), _validCameraVideoModeItem->missionItem().param2());
_cameraSection->setSpecifyCameraMode(false);
visualItems.clear();
scanIndex = 0;
/*
MAV_CMD_SET_CAMERA_MODE
Mission Param #1 Camera ID (0 for all cameras, 1 for first, 2 for second, etc.)
Mission Param #2 Camera mode (0: photo mode, 1: video mode)
Mission Param #3 Audio recording enabled (0: off 1: on)
Mission Param #4 Reserved (all remaining params)
*/
// Mode command but incorrect settings
SimpleMissionItem invalidSimpleItem(_offlineVehicle, _validCameraPhotoModeItem->missionItem());
invalidSimpleItem.missionItem().setParam3(0); // Audio is not supported
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->specifyCameraMode(), false);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForPhotoIntervalTimeSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
/*
MAV_CMD_IMAGE_START_CAPTURE WIP: Start image capture sequence. Sends CAMERA_IMAGE_CAPTURED after each capture.
Mission Param #1 Camera ID (0 for all cameras, 1 for first, 2 for second, etc.)
Mission Param #2 Duration between two consecutive pictures (in seconds)
Mission Param #3 Number of images to capture total - 0 for unlimited capture
Mission Param #4 Resolution horizontal in pixels (set to -1 for highest resolution possible)
Mission Param #5 Resolution vertical in pixels (set to -1 for highest resolution possible)
*/
SimpleMissionItem* newValidTimeItem = new SimpleMissionItem(_offlineVehicle, this);
newValidTimeItem->missionItem() = _validTimeItem->missionItem();
visualItems.append(newValidTimeItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->cameraAction()->rawValue().toInt(), (int)CameraSection::TakePhotosIntervalTime);
QCOMPARE(_cameraSection->cameraPhotoIntervalTime()->rawValue().toInt(), (int)_validTimeItem->missionItem().param2());
visualItems.clear();
scanIndex = 0;
// Image start command but incorrect settings
SimpleMissionItem invalidSimpleItem(_offlineVehicle, _validTimeItem->missionItem());
invalidSimpleItem.missionItem().setParam3(10); // must be 0 for unlimited
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam4(10); // must be -1 for highest res
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam5(10); // must be -1 for highest res
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam6(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam7(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForPhotoIntervalDistanceSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
/*
MAV_CMD_DO_SET_CAM_TRIGG_DIST Mission command to set CAM_TRIGG_DIST for this flight
Mission Param #1 Camera trigger distance (meters)
Mission Param #2 Empty
Mission Param #3 Empty
Mission Param #4 Empty
Mission Param #5 Empty
Mission Param #6 Empty
Mission Param #7 Empty
*/
SimpleMissionItem* newValidDistanceItem = new SimpleMissionItem(_offlineVehicle, this);
newValidDistanceItem->missionItem() = _validDistanceItem->missionItem();
visualItems.append(newValidDistanceItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->cameraAction()->rawValue().toInt(), (int)CameraSection::TakePhotoIntervalDistance);
QCOMPARE(_cameraSection->cameraPhotoIntervalDistance()->rawValue().toInt(), (int)_validDistanceItem->missionItem().param1());
visualItems.clear();
scanIndex = 0;
// Trigger distance command but incorrect settings
SimpleMissionItem invalidSimpleItem(_offlineVehicle, _validDistanceItem->missionItem());
invalidSimpleItem.missionItem().setParam1(-1); // must be >= 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validDistanceItem->missionItem();
invalidSimpleItem.missionItem().setParam2(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validDistanceItem->missionItem();
invalidSimpleItem.missionItem().setParam3(1); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validDistanceItem->missionItem();
invalidSimpleItem.missionItem().setParam4(100); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validDistanceItem->missionItem();
invalidSimpleItem.missionItem().setParam5(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validDistanceItem->missionItem();
invalidSimpleItem.missionItem().setParam6(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validDistanceItem->missionItem();
invalidSimpleItem.missionItem().setParam7(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForStartVideoSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
/*
MAV_CMD_VIDEO_STOP_CAPTURE Stop the current video capture (recording)
Mission Param #1 WIP: Camera ID
Mission Param #2 Reserved
Mission Param #3 Resolution in megapixels (0.3 for 640x480, 1.3 for 1280x720, etc), set to 0 if param 4/5 are used, set to -1 for highest resolution possible.
Mission Param #4 WIP: Resolution horizontal in pixels
Mission Param #5 WIP: Resolution horizontal in pixels
Mission Param #6 WIP: Frequency CAMERA_CAPTURE_STATUS messages should be sent while recording (0 for no messages, otherwise time in Hz)
*/
SimpleMissionItem* newValidStartVideoItem = new SimpleMissionItem(_offlineVehicle, this);
newValidStartVideoItem->missionItem() = _validStartVideoItem->missionItem();
visualItems.append(newValidStartVideoItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->cameraAction()->rawValue().toInt(), (int)CameraSection::TakeVideo);
visualItems.clear();
scanIndex = 0;
// Trigger distance command but incorrect settings
SimpleMissionItem invalidSimpleItem(_offlineVehicle, _validStartVideoItem->missionItem());
invalidSimpleItem.missionItem().setParam1(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStartVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam2(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStartVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam3(1); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStartVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam4(100); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStartVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam5(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStartVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam6(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStartVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam7(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForStopVideoSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
/*
MAV_CMD_VIDEO_STOP_CAPTURE Stop the current video capture (recording)
Mission Param #1 WIP: Camera ID
*/
SimpleMissionItem* newValidStopVideoItem = new SimpleMissionItem(_offlineVehicle, this);
newValidStopVideoItem->missionItem() = _validStopVideoItem->missionItem();
visualItems.append(newValidStopVideoItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->cameraAction()->rawValue().toInt(), (int)CameraSection::StopTakingVideo);
visualItems.clear();
scanIndex = 0;
// Trigger distance command but incorrect settings
SimpleMissionItem invalidSimpleItem(_offlineVehicle, _validStopVideoItem->missionItem());
invalidSimpleItem.missionItem().setParam1(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStopVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam2(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStopVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam3(1); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStopVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam4(100); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStopVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam5(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStopVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam6(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validStopVideoItem->missionItem();
invalidSimpleItem.missionItem().setParam7(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForStopImageSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
SimpleMissionItem* newValidStopDistanceItem = new SimpleMissionItem(_offlineVehicle, this);
SimpleMissionItem* newValidStopTimeItem = new SimpleMissionItem(_offlineVehicle, this);
newValidStopDistanceItem->missionItem() = _validStopDistanceItem->missionItem();
newValidStopTimeItem->missionItem() = _validStopTimeItem->missionItem();
visualItems.append(newValidStopDistanceItem);
visualItems.append(newValidStopTimeItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->cameraAction()->rawValue().toInt(), (int)CameraSection::StopTakingPhotos);
visualItems.clear();
// Out of order commands
SimpleMissionItem validStopDistanceItem(_offlineVehicle);
SimpleMissionItem validStopTimeItem(_offlineVehicle);
validStopDistanceItem.missionItem() = _validStopDistanceItem->missionItem();
validStopTimeItem.missionItem() = _validStopTimeItem->missionItem();
visualItems.append(&validStopTimeItem);
visualItems.append(&validStopDistanceItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 2);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForTakePhotoSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
/*
MAV_CMD_IMAGE_START_CAPTURE Start image capture sequence. Sends CAMERA_IMAGE_CAPTURED after each capture.
Mission Param #1 Camera ID (0 for all cameras, 1 for first, 2 for second, etc.)
Mission Param #2 Duration between two consecutive pictures (in seconds)
Mission Param #3 Number of images to capture total - 0 for unlimited capture
Mission Param #4 Resolution horizontal in pixels (set to -1 for highest resolution possible)
Mission Param #5 Resolution vertical in pixels (set to -1 for highest resolution possible)
*/
SimpleMissionItem* newValidTakePhotoItem = new SimpleMissionItem(_offlineVehicle, this);
newValidTakePhotoItem->missionItem() = _validTakePhotoItem->missionItem();
visualItems.append(newValidTakePhotoItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->cameraAction()->rawValue().toInt(), (int)CameraSection::TakePhoto);
visualItems.clear();
scanIndex = 0;
// Take Photo command but incorrect settings
SimpleMissionItem invalidSimpleItem(_offlineVehicle, _validTimeItem->missionItem());
invalidSimpleItem.missionItem().setParam3(10); // must be 1 for single photo
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam4(10); // must be -1 for highest res
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam5(10); // must be -1 for highest res
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam6(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
invalidSimpleItem.missionItem() = _validTimeItem->missionItem();
invalidSimpleItem.missionItem().setParam7(10); // must be 0
visualItems.append(&invalidSimpleItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), false);
QCOMPARE(visualItems.count(), 1);
QCOMPARE(_cameraSection->settingsSpecified(), false);
visualItems.clear();
}
void CameraSectionTest::_testScanForFullSection(void)
{
QCOMPARE(_cameraSection->available(), true);
int scanIndex = 0;
QmlObjectListModel visualItems;
_commonScanTest(_cameraSection);
SimpleMissionItem* newValidGimbalItem = new SimpleMissionItem(_offlineVehicle, this);
SimpleMissionItem* newValidDistanceItem = new SimpleMissionItem(_offlineVehicle, this);
newValidGimbalItem->missionItem() = _validGimbalItem->missionItem();
newValidDistanceItem->missionItem() = _validDistanceItem->missionItem();
visualItems.append(newValidGimbalItem);
visualItems.append(newValidDistanceItem);
QCOMPARE(_cameraSection->scanForSection(&visualItems, scanIndex), true);
QCOMPARE(visualItems.count(), 0);
QCOMPARE(_cameraSection->settingsSpecified(), true);
QCOMPARE(_cameraSection->specifyGimbal(), true);
QCOMPARE(_cameraSection->cameraAction()->rawValue().toInt(), (int)CameraSection::TakePhotoIntervalDistance);
QCOMPARE(_cameraSection->cameraPhotoIntervalDistance()->rawValue().toInt(), (int)_validDistanceItem->missionItem().param1());
QCOMPARE(_cameraSection->gimbalPitch()->rawValue().toDouble(), _validGimbalItem->missionItem().param1());
QCOMPARE(_cameraSection->gimbalYaw()->rawValue().toDouble(), _validGimbalItem->missionItem().param3());
visualItems.clear();
}