$VERSION
=
'1.06'
;
my
%versionInfo
= (
Format
=>
'undef[7]'
,
ValueConv
=>
'sprintf("V%.2x.%.2x %.4x:%.2x:%.2x Rev.%s", unpack("CCvCCa", $val))'
,
ValueConvInv
=>
q{
my @v = $val =~ /^V([0-9a-f]+)\.([0-9a-f]+) (\d{4}
):(\d{2}):(\d{2})\s
*Rev
\.(\w)/i or
return
undef
;
pack
(
'CCvCCa'
,
map
(
hex
,
@v
[0..4]),
$v
[5]);
},
);
%Image::ExifTool::Reconyx::Main
= (
GROUPS
=> {
0
=>
'MakerNotes'
,
2
=>
'Camera'
},
PROCESS_PROC
=> \
&Image::ExifTool::ProcessBinaryData
,
WRITE_PROC
=> \
&Image::ExifTool::WriteBinaryData
,
CHECK_PROC
=> \
&Image::ExifTool::CheckBinaryData
,
TAG_PREFIX
=>
'Reconyx'
,
FORMAT
=>
'int16u'
,
WRITABLE
=> 1,
FIRST_ENTRY
=> 0,
NOTES
=>
q{
The following tags are extracted from the maker notes of Reconyx Hyperfire
cameras such as the HC500, HC600 and PC900.
}
,
0x00
=> {
Name
=>
'MakerNoteVersion'
,
PrintConv
=>
'sprintf("0x%.4x", $val)'
,
Writable
=> 0,
PrintConvInv
=>
'hex $val'
,
},
0x01
=> {
Name
=>
'FirmwareVersion'
,
Format
=>
'int16u[3]'
,
PrintConv
=>
'$val=~tr/ /./; $val'
,
Writable
=> 0,
},
0x04
=> {
Name
=>
'FirmwareDate'
,
Format
=>
'int16u[2]'
,
ValueConv
=>
q{
my @v = split(' ',$val);
sprintf('%.4x:%.2x:%.2x', $v[0], $v[1]>>8, $v[1]&0xff);
}
,
ValueConvInv
=>
q{
my @v = split(':', $val);
hex($v[0]) . ' ' . hex($v[1] . $v[2]);
}
,
},
0x06
=> {
Name
=>
'TriggerMode'
,
Format
=>
'string[2]'
,
PrintConv
=> {
C
=>
'CodeLoc Not Entered'
,
E
=>
'External Sensor'
,
M
=>
'Motion Detection'
,
T
=>
'Time Lapse'
,
},
},
0x07
=> {
Name
=>
'Sequence'
,
Format
=>
'int16u[2]'
,
PrintConv
=>
'$val =~ s/ / of /; $val'
,
PrintConvInv
=>
'join(" ", $val=~/\d+/g)'
,
},
0x09
=> {
Name
=>
'EventNumber'
,
Format
=>
'int16u[2]'
,
ValueConv
=>
'my @v=split(" ",$val); ($v[0]<<16) + $v[1]'
,
ValueConvInv
=>
'($val>>16) . " " . ($val&0xffff)'
,
},
0x0b
=> {
Name
=>
'DateTimeOriginal'
,
Description
=>
'Date/Time Original'
,
Format
=>
'int16u[6]'
,
Groups
=> {
2
=>
'Time'
},
Priority
=> 0,
Shift
=>
'Time'
,
ValueConv
=>
q{
my @a = split ' ', $val;
# have seen these values written big-endian when everything else is little-endian
if ($a[0] & 0xff00 and not $a[0] & 0xff) {
$_ = ($_ >> 8) | (($_ & 0xff) << 8) foreach @a;
}
sprintf
(
'%.4d:%.2d:%.2d %.2d:%.2d:%.2d'
,
@a
[5,3,4,2,1,0]);
},
ValueConvInv
=>
q{
my @a = ($val =~ /\d+/g);
return undef unless @a >= 6;
join ' ', @a[5,4,3,1,2,0];
}
,
PrintConv
=>
'$self->ConvertDateTime($val)'
,
PrintConvInv
=>
'$self->InverseDateTime($val)'
,
},
0x12
=> {
Name
=>
'MoonPhase'
,
Groups
=> {
2
=>
'Time'
},
PrintConv
=> {
0
=>
'New'
,
1
=>
'New Crescent'
,
2
=>
'First Quarter'
,
3
=>
'Waxing Gibbous'
,
4
=>
'Full'
,
5
=>
'Waning Gibbous'
,
6
=>
'Last Quarter'
,
7
=>
'Old Crescent'
,
},
},
0x13
=> {
Name
=>
'AmbientTemperatureFahrenheit'
,
Format
=>
'int16s'
,
PrintConv
=>
'"$val F"'
,
PrintConvInv
=>
'$val=~/(-?\d+)/ ? $1 : $val'
,
},
0x14
=> {
Name
=>
'AmbientTemperature'
,
Format
=>
'int16s'
,
PrintConv
=>
'"$val C"'
,
PrintConvInv
=>
'$val=~/(-?\d+)/ ? $1 : $val'
,
},
0x15
=> {
Name
=>
'SerialNumber'
,
Format
=>
'undef[30]'
,
RawConv
=>
'$_ = $self->Decode($val, "UCS2"); s/\0.*//; $_'
,
RawConvInv
=>
q{
$_ = $self->Encode($val, "UCS2");
$_ = substr($_, 0, 30) if length($_) > 30;
return $_;
}
,
},
0x24
=>
'Contrast'
,
0x25
=>
'Brightness'
,
0x26
=>
'Sharpness'
,
0x27
=>
'Saturation'
,
0x28
=> {
Name
=>
'InfraredIlluminator'
,
PrintConv
=> {
0
=>
'Off'
,
1
=>
'On'
},
},
0x29
=>
'MotionSensitivity'
,
0x2a
=> {
Name
=>
'BatteryVoltage'
,
ValueConv
=>
'$val / 1000'
,
ValueConvInv
=>
'$val * 1000'
,
PrintConv
=>
'"$val V"'
,
PrintConvInv
=>
'$val=~s/ ?V$//; $val'
,
},
0x2b
=> {
Name
=>
'UserLabel'
,
Format
=>
'string[22]'
,
},
);
%Image::ExifTool::Reconyx::Type2
= (
GROUPS
=> {
0
=>
'MakerNotes'
,
2
=>
'Camera'
},
PROCESS_PROC
=> \
&Image::ExifTool::ProcessBinaryData
,
WRITE_PROC
=> \
&Image::ExifTool::WriteBinaryData
,
CHECK_PROC
=> \
&Image::ExifTool::CheckBinaryData
,
TAG_PREFIX
=>
'Reconyx'
,
WRITABLE
=> 1,
FIRST_ENTRY
=> 0,
NOTES
=>
'Tags extracted from models such as the UltraFire.'
,
0x18
=> {
Name
=>
'FirmwareVersion'
,
%versionInfo
},
0x1f
=> {
Name
=>
'Micro1Version'
,
%versionInfo
},
0x26
=> {
Name
=>
'BootLoaderVersion'
,
%versionInfo
},
0x2d
=> {
Name
=>
'Micro2Version'
,
%versionInfo
},
0x34
=> {
Name
=>
'TriggerMode'
,
Format
=>
'undef[1]'
,
PrintConv
=> {
M
=>
'Motion Detection'
,
T
=>
'Time Lapse'
,
P
=>
'Point and Shoot'
,
},
},
0x35
=> {
Name
=>
'Sequence'
,
Format
=>
'int8u[2]'
,
PrintConv
=>
'$val =~ s/ / of /; $val'
,
PrintConvInv
=>
'join(" ", $val=~/\d+/g)'
,
},
0x37
=> {
Name
=>
'EventNumber'
,
Format
=>
'int32u'
,
},
0x3b
=> {
Name
=>
'DateTimeOriginal'
,
Description
=>
'Date/Time Original'
,
Format
=>
'int8u[7]'
,
Groups
=> {
2
=>
'Time'
},
Priority
=> 0,
Shift
=>
'Time'
,
ValueConv
=>
q{
my @a = split ' ', $val;
$a[5] += pop(@a) * 256;
sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', reverse @a);
}
,
ValueConvInv
=>
q{
my @a = ($val =~ /\d+/g);
return undef unless @a >= 6;
unshift @a, ($a[0] >> 8);
$a[1] -= $a[0] * 256;
join ' ', @a[6,5,4,3,2,1,0];
}
,
PrintConv
=>
'$self->ConvertDateTime($val)'
,
PrintConvInv
=>
'$self->InverseDateTime($val)'
,
},
0x42
=> {
Name
=>
'DayOfWeek'
,
Groups
=> {
2
=>
'Time'
},
PrintConv
=> {
0
=>
'Sunday'
,
1
=>
'Monday'
,
2
=>
'Tuesday'
,
3
=>
'Wednesday'
,
4
=>
'Thursday'
,
5
=>
'Friday'
,
6
=>
'Saturday'
,
},
},
0x43
=> {
Name
=>
'MoonPhase'
,
Groups
=> {
2
=>
'Time'
},
PrintConv
=> {
0
=>
'New'
,
1
=>
'New Crescent'
,
2
=>
'First Quarter'
,
3
=>
'Waxing Gibbous'
,
4
=>
'Full'
,
5
=>
'Waning Gibbous'
,
6
=>
'Last Quarter'
,
7
=>
'Old Crescent'
,
},
},
0x44
=> {
Name
=>
'AmbientTemperatureFahrenheit'
,
Format
=>
'int16s'
,
PrintConv
=>
'"$val F"'
,
PrintConvInv
=>
'$val=~/(-?\d+)/ ? $1 : $val'
,
},
0x46
=> {
Name
=>
'AmbientTemperature'
,
Format
=>
'int16s'
,
PrintConv
=>
'"$val C"'
,
PrintConvInv
=>
'$val=~/(-?\d+)/ ? $1 : $val'
,
},
0x48
=> {
Name
=>
'Illumination'
,
PrintConv
=> {
0
=>
'Off'
,
1
=>
'On'
},
},
0x49
=> {
Name
=>
'BatteryVoltage'
,
Format
=>
'int16u'
,
ValueConv
=>
'$val / 1000'
,
ValueConvInv
=>
'$val * 1000'
,
PrintConv
=>
'"$val V"'
,
PrintConvInv
=>
'$val=~s/ ?V$//; $val'
,
},
0x4b
=> {
Name
=>
'SerialNumber'
,
Format
=>
'string[15]'
,
},
0x5a
=> {
Name
=>
'UserLabel'
,
Format
=>
'string[21]'
,
},
);
%Image::ExifTool::Reconyx::Type3
= (
GROUPS
=> {
0
=>
'MakerNotes'
,
2
=>
'Camera'
},
PROCESS_PROC
=> \
&Image::ExifTool::ProcessBinaryData
,
WRITE_PROC
=> \
&Image::ExifTool::WriteBinaryData
,
CHECK_PROC
=> \
&Image::ExifTool::CheckBinaryData
,
TAG_PREFIX
=>
'Reconyx'
,
WRITABLE
=> 1,
FIRST_ENTRY
=> 0,
NOTES
=>
'Tags extracted from models such as the HF2 PRO.'
,
0x10
=> {
Name
=>
'FileNumber'
,
Format
=>
'int16u'
},
0x12
=> {
Name
=>
'DirectoryNumber'
,
Format
=>
'int16u'
},
0x2a
=> {
Name
=>
'FirmwareVersion'
,
Format
=>
'int16u[3]'
,
ValueConv
=>
'my @a = split " ",$val; sprintf("%d.%d%c",@a)'
,
ValueConvInv
=>
'$val=~/(\d+)\.(\d+)([a-zA-Z])/ ? "$1 $2 ".ord($3) : undef'
,
},
0x30
=> {
Name
=>
'FirmwareDate'
,
Format
=>
'int16u[2]'
,
ValueConv
=>
'my ($y,$d) = split " ", $val; sprintf("%.4x:%.2x:%.2x",$y,$d>>8,$d&0xff)'
,
ValueConvInv
=>
'my @a=split ":", $val; hex($a[0])." ".hex($a[1].$a[2])'
,
},
0x34
=> {
Name
=>
'TriggerMode'
,
Format
=>
'string[2]'
,
PrintConv
=> {
M
=>
'Motion Detection'
,
T
=>
'Time Lapse'
,
P
=>
'Point and Shoot'
,
},
},
0x36
=> {
Name
=>
'Sequence'
,
Format
=>
'int16u[2]'
,
PrintConv
=>
'$val =~ s/ / of /; $val'
,
PrintConvInv
=>
'join(" ", $val=~/\d+/g)'
,
},
0x3a
=> {
Name
=>
'EventNumber'
,
Format
=>
'int16u[2]'
,
ValueConv
=>
'my @a=split " ",$val;($a[0]<<16)+$a[1]'
,
ValueConvInv
=>
'($val >> 16) . " " . ($val & 0xffff)'
,
},
0x3e
=> {
Name
=>
'DateTimeOriginal'
,
Description
=>
'Date/Time Original'
,
Format
=>
'int16u[6]'
,
Groups
=> {
2
=>
'Time'
},
Priority
=> 0,
Shift
=>
'Time'
,
ValueConv
=>
q{
my @a = split ' ', $val;
sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', reverse @a);
}
,
ValueConvInv
=>
q{
my @a = ($val =~ /\d+/g);
return undef unless @a >= 6;
join ' ', @a[6,5,4,3,2,1,0];
}
,
PrintConv
=>
'$self->ConvertDateTime($val)'
,
PrintConvInv
=>
'$self->InverseDateTime($val)'
,
},
0x4a
=> {
Name
=>
'DayOfWeek'
,
Groups
=> {
2
=>
'Time'
},
Format
=>
'int16u'
,
PrintConv
=> {
0
=>
'Sunday'
,
1
=>
'Monday'
,
2
=>
'Tuesday'
,
3
=>
'Wednesday'
,
4
=>
'Thursday'
,
5
=>
'Friday'
,
6
=>
'Saturday'
,
},
},
0x4c
=> {
Name
=>
'MoonPhase'
,
Groups
=> {
2
=>
'Time'
},
Format
=>
'int16u'
,
PrintConv
=> {
0
=>
'New'
,
1
=>
'New Crescent'
,
2
=>
'First Quarter'
,
3
=>
'Waxing Gibbous'
,
4
=>
'Full'
,
5
=>
'Waning Gibbous'
,
6
=>
'Last Quarter'
,
7
=>
'Old Crescent'
,
},
},
0x4e
=> {
Name
=>
'AmbientTemperatureFahrenheit'
,
Format
=>
'int16s'
,
PrintConv
=>
'"$val F"'
,
PrintConvInv
=>
'$val=~/(-?\d+)/ ? $1 : $val'
,
},
0x50
=> {
Name
=>
'AmbientTemperature'
,
Format
=>
'int16s'
,
PrintConv
=>
'"$val C"'
,
PrintConvInv
=>
'$val=~/(-?\d+)/ ? $1 : $val'
,
},
0x52
=> {
Name
=>
'Contrast'
,
Format
=>
'int16u'
},
0x54
=> {
Name
=>
'Brightness'
,
Format
=>
'int16u'
},
0x56
=> {
Name
=>
'Sharpness'
,
Format
=>
'int16u'
},
0x58
=> {
Name
=>
'Saturation'
,
Format
=>
'int16u'
},
0x5a
=> {
Name
=>
'Flash'
,
Format
=>
'int16u'
,
PrintConv
=> {
0
=>
'Off'
,
1
=>
'On'
} },
0x5c
=> {
Name
=>
'AmbientInfrared'
,
Format
=>
'int16u'
},
0x5e
=> {
Name
=>
'AmbientLight'
,
Format
=>
'int16u'
},
0x60
=> {
Name
=>
'MotionSensitivity'
,
Format
=>
'int16u'
},
0x62
=> {
Name
=>
'BatteryVoltage'
,
Format
=>
'int16u'
},
0x64
=> {
Name
=>
'BatteryVoltageAvg'
,
Format
=>
'int16u'
},
0x66
=> {
Name
=>
'BatteryType'
,
Format
=>
'int16u'
},
0x68
=> {
Name
=>
'UserLabel'
,
Format
=>
'string[22]'
},
0x7e
=> {
Name
=>
'SerialNumber'
,
Format
=>
'unicode[15]'
},
);