areaDetector / ADAravis

areaDetector driver for GenICam cameras using the Aravis library on Linux.
https://areadetector.github.io/master/ADAravis/ADAravis.html
6 stars 8 forks source link

node xyz is not writable #6

Closed hinxx closed 3 years ago

hinxx commented 3 years ago

I'm getting these messages in IOC shell when trying to talk to FLIR BFS-PGE-70S7M camera:

2020/09/15 12:24:22.169 Param[ACQ_PERIOD] GenICamFeature::write: node AcquisitionFrameRate is not writable

2020/09/15 12:24:35.885 Param[GC_FRAMERATE] GenICamFeature::write: node AcquisitionFrameRate is not writable

2020/09/15 12:25:27.845 ADAravis:writeInt32 error, status=3 function=95 GC_FRAMERATE_ENABLE, value=0
2020/09/15 12:25:30.945 Param[GC_FRAMERATE] GenICamFeature::write: node AcquisitionFrameRate is not writable

2020/09/15 12:26:23.230 Param[GC_D_ExposureTime] GenICamFeature::write: node ExposureTime is not writable

2020/09/15 12:26:30.109 ADAravis:writeInt32 error, status=3 function=165 GC_E_ExposureMode, value=2
2020/09/15 12:26:30.109 LAB:FLIR1:GC_ExposureMode devAsynInt32::processCallbackOutput process write error 
2020/09/15 12:26:32.195 Param[GC_D_ExposureTime] GenICamFeature::write: node ExposureTime is not writable

2020/09/15 12:26:49.272 ADAravis:writeInt32 error, status=3 function=424 GC_C_TriggerSoftware, value=0
2020/09/15 12:26:49.272 LAB:FLIR1:GC_TriggerSoftware devAsynInt32::processCallbackOutput process write error 
2020/09/15 12:27:00.478 Param[GC_D_AcquisitionFrameRate] GenICamFeature::write: node AcquisitionFrameRate is not writable

2020/09/15 12:27:07.245 Param[GC_D_AcquisitionFrameRate] GenICamFeature::write: node AcquisitionFrameRate is not writable

2020/09/15 12:27:09.614 Param[GC_D_AcquisitionFrameRate] GenICamFeature::write: node AcquisitionFrameRate is not writable

Not sure why these parameters would not be writable. Aravis lib is tag ARAVIS_0_7_2, if it matters.

MarkRivers commented 3 years ago

Those errors are normal. It means that the node exists and that the ADAravis tried to write to it but that the node is not currently writable.

The reason that ExposureTime is not writable is typically because ExposureAuto is On.

AcquisitionFrameRate is not writable either because FrameRateEnable is Off or because GC_AcqFrameRateAuto is On (that is on a camera-specific OPI screen).

hinxx commented 3 years ago

The reason that ExposureTime is not writable is typically because ExposureAuto is On.

Confirmed. Now exposure setting works as expected.

AcquisitionFrameRate is not writable..

My camera has no GC_AcqFrameRateAuto PV. Did set FrameRateEnable to Yes, but FrameRateEnable_RBV does not change to Yes; remains No with no errors in IOC shell.

MarkRivers commented 3 years ago

What is your camera model?

hinxx commented 3 years ago

It is FLIR BFS-PGE-70S7M.

MarkRivers commented 3 years ago

Can you e-mail me the XML file?

hinxx commented 3 years ago

XML is in this PR https://github.com/areaDetector/ADGenICam/pull/19 already.

MarkRivers commented 3 years ago

XML is in this PR areaDetector/ADGenICam#19 already.

Sorry, I've now merged that.

I don't see any Auto features in the template file that would prevent setting the FrameRate.

In your original message you showed this error:

2020/09/15 12:25:27.845 ADAravis:writeInt32 error, status=3 function=95 GC_FRAMERATE_ENABLE, value=0

But then you said:

Did set FrameRateEnable to Yes, but FrameRateEnable_RBV does not change to Yes; remains No with no errors in IOC shell.

What action caused the error shown above?

MarkRivers commented 3 years ago

You can see the values of all the GenICam features with the iocsh command

asynReport 2 ARV1

Scroll back and search for the FrameRateEnable feature and post the values shown.

Here is the output for my FLIR GS3-U3-23S6M. On this model the feature name is AcquisitionFrameRateEnabled (with a "d" at the end), while on yours it is AcquisitionFrameRateEnable.

      Node name: AcquisitionFrameRateEnabled
          value: true
      asynIndex: 95
       asynName: GC_FRAMERATE_ENABLE
       asynType: 1
  isImplemented: true
    isAvailable: true
     isReadable: true
     isWritable: true

      Node name: AcquisitionFrameRateEnabled
          value: true
      asynIndex: 259
       asynName: GC_B_AcquisitionFrameRateEnabled
       asynType: 1
  isImplemented: true
    isAvailable: true
     isReadable: true
     isWritable: true
hinxx commented 3 years ago

What action caused the error shown above?

After the initial post, I noticed that the 'Detector state' was showing 'Disconnected' state. I guess this likely caused most of the problems initially posted, but the FrameRateEnable related one remained even after IOC restart.

Here is the info about AcquisitionFrameRateEnable:

      Node name: AcquisitionFrameRateEnable
          value: false
      asynIndex: 95
       asynName: GC_FRAMERATE_ENABLE
       asynType: 1
  isImplemented: true
    isAvailable: true
     isReadable: true
     isWritable: true

      Node name: AcquisitionFrameRateEnable
          value: false
      asynIndex: 115
       asynName: GC_B_AcquisitionFrameRateEnable
       asynType: 1
  isImplemented: true
    isAvailable: true
     isReadable: true
     isWritable: true

I made a little gif of the behavior: Peek 2020-09-16 10-00

Notice that, upon changing, the value always wobbles between Yes/No for the setter.

hinxx commented 3 years ago

Here are couple of more notes about IOC error received right after startup:


2020/09/16 13:18:13.423 Param[GC_TRIGGER_SOFTWARE] GenICamFeature::write: node TriggerSoftware is not writable

2020/09/16 13:18:14.255 Param[ACQ_PERIOD] GenICamFeature::write: node AcquisitionFrameRate is not writable

2020/09/16 13:18:14.308 Param[GAIN] GenICamFeature::write: node Gain is not writable
      Node name: TriggerSoftware
          value: 
      asynIndex: 98
       asynName: GC_TRIGGER_SOFTWARE
       asynType: 1
  isImplemented: true
    isAvailable: true
     isReadable: true
     isWritable: false

      Node name: AcquisitionFrameRate
          value: 15.819627
      asynIndex: 78
       asynName: ACQ_PERIOD
       asynType: 4
  isImplemented: true
    isAvailable: true
     isReadable: true
     isWritable: false

      Node name: Gain
          value: 17.897909
      asynIndex: 60
       asynName: GAIN
       asynType: 4
  isImplemented: true
    isAvailable: true
     isReadable: true
     isWritable: false
MarkRivers commented 3 years ago

You can see that all 3 of these features have isWritable=false.

For TriggerSoftware that is probably because TriggerMode=Off or TriggerSource is not Software.

For AcquisitionFrameRate that is because AcquisitionFrameRateEnable=false. We need to figure out why you can't set that to true.

For Gain that is probably because GainAuto=true. I see in your screen shot above that GainAuto should be false. When you are sure that GainAuto is false can you see if you still get an error setting Gain?

MarkRivers commented 3 years ago

I don't understand why you cannot change FrameRateEnable to Yes because asynReport shows that the feature is writable.

I recently updated the ADAravis master branch to use aravis 0.8.0. If it's possible for you to update aravis to 0.8.0 and update ADAravis to master that would be good, since I want to make sure what you are seeing is not a problem with the "unstable" 0.7.2 release.

I have a FLIR Oryx camera connected at work, so I can check if FrameRateEnable is working for me. I also have a FLIR BlackflyS available, but it is not connected so I can't test until I go to the lab, which won't be this week.

hinxx commented 3 years ago

You're right for about the TriggerSoftware & Gain; it was the Auto thing. I apologize for, what seem to me, basic user questions. I'm not the end user of the camera but merely providing IOC for it and have not seen such Auto controlled features.

When you are sure that GainAuto is false can you see if you still get an error setting Gain?

Now is OK, the value changes from OPI/IOC perspective.

update aravis to 0.8.0 and update ADAravis to master

Just did that as well couple of hours ago. AFAICT, the issue still persists in regard to the FrameRateEnable. We'll look into it more closely, though.

I guess going down to aravis level and trying to achieve the same feature change using arv-tool might a good way to narrow down where the issue is at.

Thank you for the help so far!

MarkRivers commented 3 years ago

I guess going down to aravis level and trying to achieve the same feature change using arv-tool might a good way to narrow down where the issue is at.

Yes, that is a good idea. You can also try turning on asynTrace and see if there is any useful information when you try changing AcquisitionFrameRateEnable.

Have you tried changing the low-level GC_AcqFraRateEnable PV rather than the high-level FrameRateEnable? It is on the features-1 screen.

hinxx commented 3 years ago

Have you tried changing the low-level GC_AcqFraRateEnable PV rather than the high-level FrameRateEnable? It is on the features-1 screen.

Yes. The same effect as from the main screen.

MarkRivers commented 3 years ago

I just tested with a FLIR Oryx 51S5M camera.

I have the same problem with not being able to set or read FrameRateEnable with ADAravis. arv-tool shows that AcquisitionFrameRateEnable=true. But setting it to false in ADAravis does not change the value reported by arv-tool, and the readback value in ADAravis is always false, even when arv-tool says it is true.

However, I can also control this camera with ADSpinnaker on the same Ubuntu 18 system. With ADSpinnaker FrameRateEnable is working fine. I can change it in ADSpinnaker and arv-tool sees the correct new value. The readback value in ADSpinnaker is correct.

This suggests that there is some problem with ADAravis. Both ADAravis and ADSpinnaker use ADGenICam for most of the GenICam feature code, so this is a strange problem.

MarkRivers commented 3 years ago

I found and fixed the problem and pushed to the master branch.

This was the fix:

diff --git a/aravisApp/src/arvFeature.cpp b/aravisApp/src/arvFeature.cpp
index 073bb91..ca7ebbb 100644
--- a/aravisApp/src/arvFeature.cpp
+++ b/aravisApp/src/arvFeature.cpp
@@ -64,11 +64,11 @@ void arvFeature::writeInteger(epicsInt64 value) {
 }

 bool arvFeature::readBoolean() {
-    return arv_device_get_integer_feature_value(mDevice, mFeatureName.c_str(), NULL);
+    return arv_device_get_boolean_feature_value(mDevice, mFeatureName.c_str(), NULL);
 }
 void arvFeature::writeBoolean(bool value) {
-    arv_device_set_integer_feature_value(mDevice, mFeatureName.c_str(), value ? 1 : 0, NULL);
+    arv_device_set_boolean_feature_value(mDevice, mFeatureName.c_str(), value, NULL);
 }

I was calling the function for integer features when I should have been calling the function for boolean features.

hinxx commented 3 years ago

The fix above indeed fixes the setting of FrameRateEnable for me as well. Great job @MarkRivers !

MarkRivers commented 3 years ago

I'm closing this issue.