-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathTakeImage.lua
162 lines (105 loc) · 4.7 KB
/
TakeImage.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
--
-- RemotePhotoTool - remote camera control software
-- Copyright (C) 2008-2016 Michael Fink
-- file TakeImage.lua - Demo script: Takes an image
--
-- The App object is a global object, and its run() function is called by the Lua
-- scripting engine when starting the script.
App = {
-- event that is set when transferring image has finished
eventFinishedTransfer = nil;
-- entry point function
run = function(self)
print("TakeImage.lua - Demo script: Takes an image\n\n");
local instance = Sys:getInstance();
local allSourceInfos = instance:enumerateDevices();
-- The enumerateDevices() function returns nil when no device is
-- connected, so check before using
if (allSourceInfos ~= nil and allSourceInfos.length > 0) then
local remoteReleaseControl = self:openCamera(allSourceInfos[1]);
self:printCurrentShootingSettings(remoteReleaseControl);
self:takeImage(remoteReleaseControl);
remoteReleaseControl:close();
print("Finished.\n\n");
else
print("No cameras connected. Exiting.\n");
end;
end;
-- opens the camera to take images
openCamera = function(self, sourceInfo)
print("Opening camera " .. sourceInfo.name .. "\n");
local sourceDevice = sourceInfo:open();
local capRemoteReleaseControl = sourceDevice:getDeviceCapability(Constants.SourceDevice.capRemoteReleaseControl);
if (not capRemoteReleaseControl) then
print("Camera can't be remote controlled!");
return nil;
end;
local remoteReleaseControl = sourceDevice:enterReleaseControl();
return remoteReleaseControl;
end;
-- prints current shooting settings
printCurrentShootingSettings = function(self, remoteReleaseControl)
local shootingMode = remoteReleaseControl:getImagePropertyByType(Constants.ImageProperty.shootingMode);
local aperture = remoteReleaseControl:getImagePropertyByType(Constants.ImageProperty.Av);
local shutterSpeed = remoteReleaseControl:getImagePropertyByType(Constants.ImageProperty.Tv);
local isoSpeed = remoteReleaseControl:getImagePropertyByType(Constants.ImageProperty.ISOSpeed);
print(
"Mode: " .. shootingMode.asString .. ", " ..
"Aperture: " .. aperture.asString .. ", " ..
"Shutter speed: " .. shutterSpeed.asString .. ", " ..
"ISO: " .. isoSpeed.asString .. "\n");
end;
-- takes an image
takeImage = function(self, remoteReleaseControl)
local downloadHandlerId =
remoteReleaseControl:addDownloadEventHandler(self.onDownloadEvent);
if (remoteReleaseControl ~= nil) then
self:releaseShutter(remoteReleaseControl);
end;
remoteReleaseControl:removeDownloadEventHandler(downloadHandlerId);
end;
-- called when a download event occurs
onDownloadEvent = function(self, downloadEventType, eventParam)
local downloadEventName =
downloadEventType == Constants.RemoteReleaseControl.downloadEventStarted and "downloadEventStarted" or
downloadEventType == Constants.RemoteReleaseControl.downloadEventInProgress and "downloadEventStarted" or
downloadEventType == Constants.RemoteReleaseControl.downloadEventFinished and "downloadEventStarted" or "???";
print("onDownloadEvent! type=" .. downloadEventName ..
" eventParam=" .. eventParam .. "\n");
end;
-- releases shutter and takes a picture
releaseShutter = function(self, remoteReleaseControl)
print("Taking an image\n");
self.setReleaseSettings(remoteReleaseControl);
self.eventFinishedTransfer = Sys:createEvent();
-- auto focus on current view
print("Auto-focus...\n");
remoteReleaseControl:sendCommand(Constants.RemoteReleaseControl.commandAdjustFocus);
print("Release shutter...\n");
remoteReleaseControl:release();
-- wait for photo to be downloaded
local result = self.eventFinishedTransfer:wait(10.0);
print(result and "Finished.\n" or "Failed waiting for image.\n");
self.resetTransferHandler(remoteReleaseControl);
end;
-- sets new release settings
setReleaseSettings = function(remoteReleaseControl)
local releaseSettings = remoteReleaseControl:getReleaseSettings();
releaseSettings.saveTarget = Constants.RemoteReleaseControl.saveToHost;
local randomName = math.random(1, 9999);
releaseSettings.outputFilename = "IMG_" .. randomName .. ".jpg";
releaseSettings.onFinishedTransfer = App.onFinishedTransfer;
remoteReleaseControl:setReleaseSettings(releaseSettings);
end;
-- resets handler
resetTransferHandler = function(remoteReleaseControl)
local releaseSettings = remoteReleaseControl:getReleaseSettings();
releaseSettings.onFinishedTransfer = nil;
remoteReleaseControl:setReleaseSettings(releaseSettings);
end;
-- called when transfer of an image has finished
onFinishedTransfer = function(self, releaseSettings)
print("Received image: " .. releaseSettings.outputFilename .. "\n");
self.eventFinishedTransfer:signal();
end;
}