baseRef = camera.getEdsCamera();
}
final EdsDataType type = CanonUtils.getPropertyType( baseRef, property, param );
EdsError err = EdsError.EDS_ERR_DEVICE_BUSY;
int retries = 0;
while ( retries < busyRetryCount &&
err == EdsError.EDS_ERR_DEVICE_BUSY ) {
//TODO: it would be better to use the actual error from CanonUtils.getPropertyType(), but in testing a valid value was always returned if something was supported
err = EdsError.EDS_ERR_NOT_SUPPORTED;
switch ( type ) {
case kEdsDataType_Int32: //EdsInt32
case kEdsDataType_UInt32: { //EdsUInt32
final long longValue;
if ( Boolean.class.isAssignableFrom( klass ) ) {
// Boolean
longValue = (Boolean) value ? 1l : 0l;
} else if ( DescriptiveEnum.class.isAssignableFrom( klass ) ) {
// DescriptiveEnum
longValue = ( (DescriptiveEnum<? extends Number>) value ).value().longValue();
} else {
// Long
longValue = (Long) value;
}
err = CanonUtils.setPropertyData( baseRef, property, param, longValue );
break;
}
case kEdsDataType_String: //EdsChar[]
case kEdsDataType_Point: //EdsPoint
case kEdsDataType_Rect: //EdsRect
case kEdsDataType_Time: //EdsTime
case kEdsDataType_FocusInfo: //EdsFocusInfo
case kEdsDataType_PictureStyleDesc: { //EdsPictureStyleDesc
err = CanonUtils.setPropertyDataAdvanced( baseRef, property, param, value );
break;
}
case kEdsDataType_ByteBlock: //EdsUInt32[]
case kEdsDataType_Int32_Array: //EdsInt32[]
case kEdsDataType_UInt32_Array: { //EdsUInt32[]
final int[] array;
if ( DescriptiveEnum[].class.isAssignableFrom( klass ) ) {
// DescriptiveEnum[]
final DescriptiveEnum<? extends Number>[] valueArray = (DescriptiveEnum<? extends Number>[]) value;
array = new int[valueArray.length];
for ( int i = 0; i < valueArray.length; i++ ) {
array[i] = valueArray[i].value().intValue();
}
} else if ( DescriptiveEnum.class.isAssignableFrom( klass ) ) {
// DescriptiveEnum
array = new int[] { ( (DescriptiveEnum<? extends Number>) value ).value().intValue() };
} else if ( EdsRect.class.isAssignableFrom( klass ) ) {
// EdsRect
final EdsRect edsRect = (EdsRect) value;
array = new int[] { edsRect.point.x.intValue(),
edsRect.point.y.intValue(),
edsRect.size.width.intValue(),
edsRect.size.height.intValue() };
} else if ( EdsSize.class.isAssignableFrom( klass ) ) {
// EdsSize
final EdsSize edsSize = (EdsSize) value;
array = new int[] { edsSize.width.intValue(),
edsSize.height.intValue() };
} else {
// int[]
array = (int[]) value;
}
err = CanonUtils.setPropertyDataAdvanced( baseRef, property, param, array );
break;
}
default:
System.err.println( type.description() +
" (" +
type.name() +
") is not currently supported by SetPropertyCommand. Likely this camera does not support property " +
property.name() +
" in the current mode or at all." );
// throw new IllegalStateException( type.description() + " (" +
// type.name() +
// ") is not currently supported by SetPropertyCommand. Likely this camera does not support property " + property.name() + " in the current mode or at all." );
}
retries++;
Thread.sleep( 10 );
}
if( retries > 1 ){
System.out.println( "Set property: " + property.name() + " - " +
property.description() +
( param > 0l ? param : "" ) + " = " + value +
", result " + err.value() + ": " + err.name() +
" - " + err.description() + " after " +
retries + " tries" );
}
setResult( err == EdsError.EDS_ERR_OK );
return;
}