Skip to content
This repository has been archived by the owner on Sep 4, 2024. It is now read-only.

Commit

Permalink
fix and test software triggering (#34)
Browse files Browse the repository at this point in the history
* trying to get integration tests up

* Add integration tests for real this time

* added tests. something strange in the neighborhood

* fix/test software triggering

* strcmp

* again with the strcmp

* strcmp round 3

* update dep

* add comments on sleeps in test

* address review comments

* fix test name

* update dep

* actually call setup

* fix
  • Loading branch information
nclack authored Aug 8, 2023
1 parent 9a57597 commit 3f59301
Show file tree
Hide file tree
Showing 15 changed files with 747 additions and 68 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@
path = src/acquire-core-libs
url = ../acquire-core-libs.git
branch = main
[submodule "tests/integration/acquire-video-runtime"]
path = tests/integration/acquire-video-runtime
url = ../acquire-video-runtime.git
2 changes: 1 addition & 1 deletion src/basics.driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ basic_device_describe(const struct Driver* driver,
XXX(Camera,Empty,"simulated: empty"),
XXX(Storage,Raw,"raw"),
XXX(Storage,Tiff,"tiff"),
XXX(Storage,Trash,"Trash"),
XXX(Storage,Trash,"trash"),
XXX(Storage,SideBySideTiffJson,"tiff-json"),
};
// clang-format on
Expand Down
43 changes: 27 additions & 16 deletions src/simcams/simulated.camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ struct SimulatedCamera

struct
{
struct event event;
int triggered;
struct condition_variable trigger_ready;
} software_trigger;

uint64_t hardware_timestamp;
Expand Down Expand Up @@ -268,7 +269,11 @@ simulated_camera_streamer_thread(struct SimulatedCamera* self)
}

if (self->properties.input_triggers.frame_start.enable) {
ECHO(event_wait(&self->software_trigger.event));
while (!self->software_trigger.triggered) {
ECHO(condition_variable_wait(
&self->software_trigger.trigger_ready, &self->im.lock));
}
self->software_trigger.triggered = 0;
}

self->hardware_timestamp = clock_tic(0);
Expand Down Expand Up @@ -323,7 +328,7 @@ simcam_get_meta(const struct Camera* camera,
(1ULL << SampleType_f32),
.digital_lines = {
.line_count=1,
.names = { [0] = "Software" },
.names = { [0] = "software" },
},
.triggers = {
.frame_start = {.input=1, .output=0,},
Expand All @@ -332,6 +337,9 @@ simcam_get_meta(const struct Camera* camera,
return Device_Ok;
}

static enum DeviceStatusCode
simcam_execute_trigger(struct Camera* camera);

#define clamp(v, L, H) (((v) < (L)) ? (L) : (((v) > (H)) ? (H) : (v)))

static enum DeviceStatusCode
Expand All @@ -351,7 +359,7 @@ simcam_set(struct Camera* camera, struct CameraProperties* settings)
if (self->properties.input_triggers.frame_start.enable &&
!settings->input_triggers.frame_start.enable) {
// fire if disabling the software trigger while live
event_notify_all(&self->software_trigger.event);
simcam_execute_trigger(camera);
}

self->properties = *settings;
Expand Down Expand Up @@ -429,27 +437,32 @@ simcam_start(struct Camera* camera)
}

static enum DeviceStatusCode
simcam_stop(struct Camera* camera)
simcam_execute_trigger(struct Camera* camera)
{
struct SimulatedCamera* self =
containerof(camera, struct SimulatedCamera, camera);
self->streamer.is_running = 0;
event_notify_all(&self->software_trigger.event);
condition_variable_notify_all(&self->im.frame_ready);

TRACE("SIMULATED CAMERA: thread join");
ECHO(thread_join(&self->streamer.thread));
lock_acquire(&self->im.lock);
self->software_trigger.triggered = 1;
condition_variable_notify_all(&self->software_trigger.trigger_ready);
lock_release(&self->im.lock);

TRACE("SIMULATED CAMERA: exiting");
return Device_Ok;
}

static enum DeviceStatusCode
simcam_execute_trigger(struct Camera* camera)
simcam_stop(struct Camera* camera)
{
struct SimulatedCamera* self =
containerof(camera, struct SimulatedCamera, camera);
event_notify_all(&self->software_trigger.event);
self->streamer.is_running = 0;
simcam_execute_trigger(camera);
condition_variable_notify_all(&self->im.frame_ready);

TRACE("SIMULATED CAMERA: thread join");
ECHO(thread_join(&self->streamer.thread));

TRACE("SIMULATED CAMERA: exiting");
return Device_Ok;
}

Expand All @@ -464,8 +477,6 @@ simcam_get_frame(struct Camera* camera,
CHECK(*nbytes >= bytes_of_image(&self->im.shape));
CHECK(self->streamer.is_running);

// FIXME: software trigger. Could use a bool or maybe just trigger frame
// ready
TRACE("last: %5d current %5d",
self->im.last_emitted_frame_id,
self->im.frame_id);
Expand Down Expand Up @@ -559,7 +570,7 @@ simcam_make_camera(enum BasicDeviceKind kind)
thread_init(&self->streamer.thread);
lock_init(&self->im.lock);
condition_variable_init(&self->im.frame_ready);
event_init(&self->software_trigger.event);
condition_variable_init(&self->software_trigger.trigger_ready);

return &self->camera;
Error:
Expand Down
53 changes: 2 additions & 51 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,51 +1,2 @@
if(${NOTEST})
message(STATUS "Skipping test targets")
else()
#
# PARAMETERS
#
set(project acquire-driver-common) # CMAKE_PROJECT_NAME gets overridden if this is a subtree of another project
set(driver acquire-driver-common)

#
# Tests
#
set(tests
can-load-driver-interface
list-devices
storage-get-meta
unit-tests
)

foreach(name ${tests})
set(tgt ${project}-${name})
add_executable(${tgt} ${name}.cpp)
target_compile_definitions(${tgt} PUBLIC "TEST=\"${tgt}\"")
target_include_directories(${tgt} PRIVATE "../src/simcams")
target_link_libraries(${tgt}
acquire-core-platform
acquire-core-logger
acquire-device-kit
acquire-device-hal
acquire-device-properties
)
add_test(NAME test-${tgt} COMMAND ${tgt})
set_tests_properties(test-${tgt} PROPERTIES LABELS "anyplatform;acquire-driver-common")
endforeach()

#
# Copy driver to tests
#
list(POP_FRONT tests onename)
add_custom_target(${project}-copy-${driver}-for-tests
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:${driver}>
$<TARGET_FILE_DIR:${project}-${onename}>
DEPENDS ${driver}
COMMENT "Copying ${driver} to $<TARGET_FILE_DIR:${project}-${onename}>"
)

foreach(name ${tests})
add_dependencies(${tgt} ${project}-copy-${driver}-for-tests)
endforeach()
endif()
add_subdirectory(devkit)
add_subdirectory(integration)
51 changes: 51 additions & 0 deletions tests/devkit/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
if(${NOTEST})
message(STATUS "Skipping test targets")
else()
#
# PARAMETERS
#
set(project acquire-driver-common) # CMAKE_PROJECT_NAME gets overridden if this is a subtree of another project
set(driver acquire-driver-common)

#
# Tests
#
set(tests
list-devices
can-load-driver-interface
storage-get-meta
unit-tests
)

foreach(name ${tests})
set(tgt ${project}-${name})
add_executable(${tgt} ${name}.cpp)
target_compile_definitions(${tgt} PUBLIC "TEST=\"${tgt}\"")
target_include_directories(${tgt} PRIVATE "../src/simcams")
target_link_libraries(${tgt}
acquire-core-platform
acquire-core-logger
acquire-device-kit
acquire-device-hal
acquire-device-properties
)
add_test(NAME test-${tgt} COMMAND ${tgt})
set_tests_properties(test-${tgt} PROPERTIES LABELS "anyplatform;acquire-driver-common")
endforeach()

#
# Copy driver to tests
#
list(POP_FRONT tests onename)
add_custom_target(${project}-copy-${driver}-for-devkit-tests
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:${driver}>
$<TARGET_FILE_DIR:${project}-${onename}>
DEPENDS ${driver}
COMMENT "Copying ${driver} to $<TARGET_FILE_DIR:${project}-${onename}>"
)

foreach(name ${tests})
add_dependencies(${tgt} ${project}-copy-${driver}-for-devkit-tests)
endforeach()
endif()
File renamed without changes.
File renamed without changes.
File renamed without changes.
59 changes: 59 additions & 0 deletions tests/integration/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
if(${NOTEST})
message(STATUS "Skipping test targets")
else()
aq_require(acquire-video-runtime)

#
# PARAMETERS
#
set(project acquire-driver-common) # CMAKE_PROJECT_NAME gets overridden if this is a subtree of another project

#
# Tests
#
set(tests
abort-while-waiting-for-trigger
configure-triggering
list-digital-lines
software-trigger-acquires-single-frames
)

foreach(name ${tests})
set(tgt "${project}-${name}")
add_executable(${tgt} ${name}.cpp)
target_compile_definitions(${tgt} PUBLIC "TEST=\"${tgt}\"")
set_target_properties(${tgt} PROPERTIES
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
)
target_include_directories(${tgt} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/../")
target_link_libraries(${tgt}
acquire-core-logger
acquire-core-platform
acquire-video-runtime
)

add_test(NAME test-${tgt} COMMAND ${tgt})
set_tests_properties(test-${tgt} PROPERTIES LABELS acquire-driver-common)
endforeach()

#
# Copy driver to tests
#
list(POP_FRONT tests onename)

foreach(driver
acquire-driver-common
)
add_custom_target(${project}-copy-${driver}-for-integration-tests
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:${driver}>
$<TARGET_FILE_DIR:${project}-${onename}>
DEPENDS ${driver}
COMMENT "Copying ${driver} to $<TARGET_FILE_DIR:${project}-${onename}>"
)

foreach(name ${tests})
add_dependencies(${tgt} ${project}-copy-${driver}-for-integration-tests)
endforeach()
endforeach()
endif()
Loading

0 comments on commit 3f59301

Please sign in to comment.