AP_Camera: take_pic and take_multiple_pic report success

Methods return success if at least one backend succeeds
This commit is contained in:
Randy Mackay 2023-09-22 15:45:56 +09:00 committed by Andrew Tridgell
parent 66337af882
commit 9e3ab558b3
2 changed files with 33 additions and 8 deletions

View File

@ -77,16 +77,20 @@ void AP_Camera::cam_mode_toggle()
}
// take a picture
void AP_Camera::take_picture()
bool AP_Camera::take_picture()
{
WITH_SEMAPHORE(_rsem);
// call for each instance
bool success = false;
for (uint8_t i = 0; i < AP_CAMERA_MAX_INSTANCES; i++) {
if (_backends[i] != nullptr) {
_backends[i]->take_picture();
success |= _backends[i]->take_picture();
}
}
// return true if at least once pic taken
return success;
}
bool AP_Camera::take_picture(uint8_t instance)
@ -97,28 +101,45 @@ bool AP_Camera::take_picture(uint8_t instance)
if (backend == nullptr) {
return false;
}
backend->take_picture();
return true;
return backend->take_picture();
}
// take multiple pictures, time_interval between two consecutive pictures is in miliseconds
// if instance is not provided, all available cameras affected
// time_interval_ms must be positive
// total_num is number of pictures to be taken, -1 means capture forever
void AP_Camera::take_multiple_pictures(uint32_t time_interval_ms, int16_t total_num)
// returns true if at least one camera is successful
bool AP_Camera::take_multiple_pictures(uint32_t time_interval_ms, int16_t total_num)
{
WITH_SEMAPHORE(_rsem);
// sanity check time interval
if (time_interval_ms == 0) {
return false;
}
// call for all instances
bool success = false;
for (uint8_t i = 0; i < AP_CAMERA_MAX_INSTANCES; i++) {
if (_backends[i] != nullptr) {
_backends[i]->take_multiple_pictures(time_interval_ms, total_num);
success = true;
}
}
// return true if at least once backend was successful
return success;
}
bool AP_Camera::take_multiple_pictures(uint8_t instance, uint32_t time_interval_ms, int16_t total_num)
{
WITH_SEMAPHORE(_rsem);
// sanity check time interval
if (time_interval_ms == 0) {
return false;
}
auto *backend = get_instance(instance);
if (backend == nullptr) {
return false;

View File

@ -111,13 +111,17 @@ public:
void cam_mode_toggle();
void cam_mode_toggle(uint8_t instance);
// take a picture
void take_picture();
// take a picture. If instance is not provided, all available cameras affected
// returns true if at least one camera took a picture
bool take_picture();
bool take_picture(uint8_t instance);
// take multiple pictures, time_interval between two consecutive pictures is in miliseconds
// if instance is not provided, all available cameras affected
// time_interval_ms must be positive
// total_num is number of pictures to be taken, -1 means capture forever
void take_multiple_pictures(uint32_t time_interval_ms, int16_t total_num);
// returns true if at least one camera is successful
bool take_multiple_pictures(uint32_t time_interval_ms, int16_t total_num);
bool take_multiple_pictures(uint8_t instance, uint32_t time_interval_ms, int16_t total_num);
// stop capturing multiple image sequence