Skip to content

Side effects when setting TriggerMode and TriggerSource #1045

@huywork

Description

@huywork

Describe the bug
Summary

  1. With ARV_REGISTER_CACHE_POLICY_DEBUG, there are a lot of warnings about mismatches between cached and current values for RegTriggerMode and RegTriggerSource
  2. With ARV_REGISTER_CACHE_POLICY_ENABLE, setting TriggerMode to On or Off can have side effects on TriggerSource and setting TriggerSource to Freerun or Line1 can also have side effects on TriggerMode.
  3. With ARV_REGISTER_CACHE_POLICY_ENABLE, some of the side effects above are such that it it not possible to have the combination (TriggerMode, TriggerSource) = (On, Freerun).

The results we are getting are


=====================================================================
Test suite 1
Set cache policy to ARV_REGISTER_CACHE_POLICY_DEBUG
This shows that with ARV_REGISTER_CACHE_POLICY_DEBUG everything works
but there are mismatches between current & cached values
=====================================================================
Initialise (TriggerMode, TriggerSource) to (On, Freerun)
[15:34:50.902] 🆆 policies> Current and cached value mismatch for 'RegTriggerMode'
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = On
TriggerSource = Freerun

1. Change (On, Freerun) to (On, Line1)
[15:34:51.304] 🆆 policies> Current and cached value mismatch for 'RegTriggerMode'
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = On
TriggerSource = Line1

2. Change (On, Line1) to (On, Freerun)
[15:34:51.681] 🆆 policies> Current and cached value mismatch for 'RegTriggerMode'
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = On
TriggerSource = Freerun

3. Change (On, Freerun) to (Off, Freerun)
[15:34:52.056] 🆆 policies> Current and cached value mismatch for 'RegTriggerSource'
Read back with with arv_camera_get_string:
TriggerMode = Off
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Freerun

4. Change (Off, Freerun) to (On, Freerun)
[15:34:52.427] 🆆 policies> Current and cached value mismatch for 'RegTriggerSource'
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = On
TriggerSource = Freerun

5. Re-initialise to (On, Line1)
[15:34:52.805] 🆆 policies> Current and cached value mismatch for 'RegTriggerMode'
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = On
TriggerSource = Line1

6. Change (On, Line1) to (Off, Line1)
[15:34:53.214] 🆆 policies> Current and cached value mismatch for 'RegTriggerSource'
Read back with with arv_camera_get_string:
TriggerMode = Off
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Line1

7. Change (Off, Line1) to (On, Line1)
[15:34:53.621] 🆆 policies> Current and cached value mismatch for 'RegTriggerSource'
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = On
TriggerSource = Line1

8. Re-initilalise to (Off, Line1)
[15:34:54.022] 🆆 policies> Current and cached value mismatch for 'RegTriggerSource'
Read back with with arv_camera_get_string:
TriggerMode = Off
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Line1

9. Change (Off, Line1) to (Off, Freerun)
[15:34:54.438] 🆆 policies> Current and cached value mismatch for 'RegTriggerMode'
Read back with with arv_camera_get_string:
TriggerMode = Off
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Freerun

10. Change (Off, Freerun) to (Off, Line1)
[15:34:54.842] 🆆 policies> Current and cached value mismatch for 'RegTriggerMode'
Read back with with arv_camera_get_string:
TriggerMode = Off
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Line1

========================================================================
Test suite 2
Set cache policy to ARV_REGISTER_CACHE_POLICY_ENABLE
This shows that with ARV_REGISTER_CACHE_POLICY_ENABLE there are problems
-We cannot have (TriggerMode, TriggerSource) = (On, Freerun)
-There are side effects when setting TriggerMode and TriggerSource
========================================================================
Trying to set (TriggerMode, TriggerSource) to (On, Freerun)
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Freerun
!!! PROBLEM: Setting TriggerSource to Freerun has side effect of changing TriggerMode to Off !!!
Changing this back to On to continue with test suite
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = On
TriggerSource = Line1
!!! PROBLEM: Setting TriggerMode to On has side effect of changing TriggerSource to Line1 !!!
Changing this back to Freerun to continue with test suite
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Freerun
!!! PROBLEM: Setting TriggerSource to Freerun has side effect of changing TriggerMode to Off !!!
!!! PROBLEM: It seems we can't have (On, Freerun) !!!

1. Trying to set (On, Line1)
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Line1
!!! PROBLEM: Setting TriggerSource to Line1 has side effect of changing TriggerMode to Off !!!
Changing this back to On to continue with test suite
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = On
TriggerSource = Line1
So we can have (On, Line1), notwithsanding the side effect above

2. Trying to change (On, Line1) to (On, Freerun)
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Freerun
!!! PROBLEM: Setting TriggerSource to Freerun has side effect of changing TriggerMode to Off !!!
Changing this back to On to continue with test suite
Read back with with arv_camera_get_string:
TriggerMode = On
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = On
TriggerSource = Line1
!!! PROBLEM: Setting TriggerMode to On has side effect of changing TriggerSource to Line1 !!!
!!! PROBLEM: It seems we can't have (On, Freerun) !!!

3. Trying to set (Off, Freerun)
Read back with with arv_camera_get_string:
TriggerMode = Off
TriggerSource = Freerun
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Freerun
So we can have (Off, Freerun)

4. Trying to set (Off, Line1)
Read back with with arv_camera_get_string:
TriggerMode = Off
TriggerSource = Line1
Read back with arv-tool:
TriggerMode = Off
TriggerSource = Line1
So we can have (off Line1)

To Reproduce
Run the reproducer script. This runs 2 test suites. The first test suite shows that with ARV_REGISTER_CACHE_POLICY_DEBUG there are mistmaches between current and cached values, but arv_camera_set_string works as expected. The second testsuite shows that with ARV_REGISTER_CACHE_POLICY_ENABLE, there are a lot of strange side effects, plus it's not possible to have (On, Freerun).

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <arv.h>

void checkError(GError *error){
	if (error != NULL) {
		printf ("Error: %s\n", error->message);
		exit(1);
	}
}

void printStatus(ArvCamera *camera, const char *expectedTriggerMode = NULL, const char *expectedTriggerSource = NULL){

	GError *error = NULL;
	const char *triggerMode = arv_camera_get_string(camera, "TriggerMode", &error);
	checkError(error);

	const char *triggerSource = arv_camera_get_string(camera, "TriggerSource", &error);
	checkError(error);	

	printf ("Read back with with arv_camera_get_string:\nTriggerMode = %s\nTriggerSource = %s\n",
		triggerMode,
		triggerSource
	);

	if (expectedTriggerMode != NULL && strcmp(expectedTriggerMode, triggerMode) != 0) {
		printf ("WARNING: TriggerMode is expected to be %s but it is %s\n", expectedTriggerMode, triggerMode);
	}
	if (expectedTriggerSource != NULL && strcmp(expectedTriggerSource, triggerSource) != 0 ){
		printf ("WARNING: TriggerSource is expected to be %s but it is %s\n", expectedTriggerSource, triggerSource);
	}	

	printf ("Read back with arv-tool:\n");
	int returnCode = system("arv-tool-0.8 -n 172.23.240.151 control 'TriggerMode' 'TriggerSource'");
}

void testSuite1(ArvCamera *camera) {
	GError *error = NULL;

	arv_camera_set_register_cache_policy(camera, ARV_REGISTER_CACHE_POLICY_DEBUG);

	printf ("=====================================================================\n");
	printf ("Test suite 1\n");
	printf ("Set cache policy to ARV_REGISTER_CACHE_POLICY_DEBUG\n");
	printf ("This shows that with ARV_REGISTER_CACHE_POLICY_DEBUG everything works\n");
	printf ("but there are mismatches between current & cached values\n");
	printf ("=====================================================================\n");

	printf ("Initialise (TriggerMode, TriggerSource) to (On, Freerun)\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	arv_camera_set_string (camera, "TriggerSource", "Freerun", &error);
	checkError(error);
	printStatus(camera, "On", "Freerun");
	printf("\n");

	printf ("1. Change (On, Freerun) to (On, Line1)\n");
	arv_camera_set_string (camera, "TriggerSource", "Line1", &error);
	checkError(error);
	printStatus(camera, "On", "Line1");
	printf("\n");

	printf ("2. Change (On, Line1) to (On, Freerun)\n");
	arv_camera_set_string (camera, "TriggerSource", "Freerun", &error);
	checkError(error);
	printStatus(camera, "On", "Freerun");
	printf("\n");

	printf ("3. Change (On, Freerun) to (Off, Freerun)\n");
	arv_camera_set_string (camera, "TriggerMode", "Off", &error);
	checkError(error);
	printStatus(camera);
	printf("\n");

	printf ("4. Change (Off, Freerun) to (On, Freerun)\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	printStatus(camera);
	printf("\n");

	printf ("5. Re-initialise to (On, Line1)\n");
	arv_camera_set_string (camera, "TriggerSource", "Line1", &error);
	checkError(error);
	printStatus(camera);
	printf("\n");

	printf ("6. Change (On, Line1) to (Off, Line1)\n");
	arv_camera_set_string (camera, "TriggerMode", "Off", &error);
	checkError(error);
	printStatus(camera);
	printf("\n");

	printf ("7. Change (Off, Line1) to (On, Line1)\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	printStatus(camera);
	printf("\n");

	printf ("8. Re-initilalise to (Off, Line1)\n");
	arv_camera_set_string (camera, "TriggerMode", "Off", &error);
	checkError(error);
	printStatus(camera);
	printf("\n");

	printf ("9. Change (Off, Line1) to (Off, Freerun)\n");
	arv_camera_set_string (camera, "TriggerSource", "Freerun", &error);
	checkError(error);
	printStatus(camera);
	printf("\n");

	printf ("10. Change (Off, Freerun) to (Off, Line1)\n");
	arv_camera_set_string (camera, "TriggerSource", "Line1", &error);
	checkError(error);
	printStatus(camera);	
	printf("\n");

}

void testSuite2(ArvCamera *camera) {
	GError *error = NULL;

	arv_camera_set_register_cache_policy(camera, ARV_REGISTER_CACHE_POLICY_ENABLE);

	printf ("========================================================================\n");
	printf ("Test suite 2\n");
	printf ("Set cache policy to ARV_REGISTER_CACHE_POLICY_ENABLE\n");
	printf ("This shows that with ARV_REGISTER_CACHE_POLICY_ENABLE there are problems\n");
	printf ("-We cannot have (TriggerMode, TriggerSource) = (On, Freerun)\n");
	printf ("-There are side effects when setting TriggerMode and TriggerSource\n");
	printf ("========================================================================\n");

	printf ("Trying to set (TriggerMode, TriggerSource) to (On, Freerun)\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	arv_camera_set_string (camera, "TriggerSource", "Freerun", &error);
	checkError(error);
	printStatus(camera, "On", "Freerun");
	printf ("!!! PROBLEM: Setting TriggerSource to Freerun has side effect of changing TriggerMode to Off !!!\n");
	printf ("Changing this back to On to continue with test suite\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	printStatus(camera, "On", "Freerun");
	printf ("!!! PROBLEM: Setting TriggerMode to On has side effect of changing TriggerSource to Line1 !!!\n");
	printf ("Changing this back to Freerun to continue with test suite\n");
	arv_camera_set_string (camera, "TriggerSource", "Freerun", &error);
	checkError(error);
	printStatus(camera, "On", "Freerun");
	printf ("!!! PROBLEM: Setting TriggerSource to Freerun has side effect of changing TriggerMode to Off !!!\n");
	printf ("!!! PROBLEM: It seems we can't have (On, Freerun) !!!\n");
	printf("\n");

	printf ("1. Trying to set (On, Line1)\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	arv_camera_set_string (camera, "TriggerSource", "Line1", &error);
	checkError(error);
	printStatus(camera, "On", "Line1");
	printf ("!!! PROBLEM: Setting TriggerSource to Line1 has side effect of changing TriggerMode to Off !!!\n");
	printf ("Changing this back to On to continue with test suite\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	printStatus(camera, "On", "Line1");
	printf ("So we can have (On, Line1), notwithsanding the side effect above\n");
	printf("\n");

	printf ("2. Trying to change (On, Line1) to (On, Freerun)\n");
	arv_camera_set_string (camera, "TriggerSource", "Freerun", &error);
	checkError(error);
	printStatus(camera, "On", "Freerun");
	printf ("!!! PROBLEM: Setting TriggerSource to Freerun has side effect of changing TriggerMode to Off !!!\n");
	printf ("Changing this back to On to continue with test suite\n");
	arv_camera_set_string (camera, "TriggerMode", "On", &error);
	checkError(error);
	printStatus(camera, "On", "Freerun");
	printf ("!!! PROBLEM: Setting TriggerMode to On has side effect of changing TriggerSource to Line1 !!!\n");
	printf ("!!! PROBLEM: It seems we can't have (On, Freerun) !!!\n");
	printf("\n");

	printf ("3. Trying to set (Off, Freerun)\n");
	arv_camera_set_string (camera, "TriggerMode", "Off", &error);
	checkError(error);
	arv_camera_set_string (camera, "TriggerSource", "Freerun", &error);
	checkError(error);
	printStatus(camera);
	printf ("So we can have (Off, Freerun)\n");
	printf("\n");

	printf ("4. Trying to set (Off, Line1)\n");
	arv_camera_set_string (camera, "TriggerMode", "Off", &error);
	checkError(error);
	arv_camera_set_string (camera, "TriggerSource", "Line1", &error);
	checkError(error);
	printStatus(camera);
	printf ("So we can have (off Line1)\n");
	printf("\n");
}


int main (int argc, char **argv) {
	ArvCamera *camera;
	GError *error = NULL;

	camera = arv_camera_new ("172.23.240.151", &error);
	checkError(error);

	testSuite1(camera);
	testSuite2(camera);

	printf ("Ok\n");

	return 0;
}

Expected behavior
We expect that setting TriggerMode have no side effect on TriggerSource and vice versa even with ARV_REGISTER_CACHE_POLICY_ENABLE

Camera description:

  • Manufacturer: Allied_Vision_Technologies
  • Model: MAKO_A_SONY_CMOS
  • Interface: GigE

Platform description:

  • Aravis version: 0.8
  • OS: RHEL 8
  • Hardware: x86_64

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions