|
//
// This work is licensed under a Creative Commons Attribution 3.0 Unported License.
// Thomas Dideriksen (thomas@dideriksen.com)
//
// Modified by M_shi@Lab. of Eclips Manuscript
// http://horukeu.web.fc2.com/Exp/2020Trial/Index.html
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using Nikon;
//
// This demo shows how to perform continuous capture and store the images to disk
//
namespace demo_continuouscapture
{
class DemoContinuousCapture
{
int _captureCount = 0;
NikonDevice _device;
AutoResetEvent _waitForDevice = new AutoResetEvent(false);
AutoResetEvent _waitForCaptureComplete = new AutoResetEvent(false);
int C2hour = 13;
int C2min = 7;
int C2sec = 59;
int Cmaxhour = 13;
int Cmaxmin = 9;
int Cmaxsec = 3;
int C3hour = 13;
int C3min = 10;
int C3sec = 5; publicvoid Run()
{
int C2 = C2hour * 3600 + C2min * 60 + C2sec;
int Cmax = Cmaxhour * 3600 + Cmaxmin * 60 + Cmaxsec;
int C3 = C3hour * 3600 + C3min * 60 + C3sec;
try { // Create manager object - make sure you have the correct MD3 file for your Nikon DSLR
//Type00##.md3の##が機種によって違う
NikonManager manager = new NikonManager("Type0024.md3");
// Listen for the 'DeviceAdded' event
manager.DeviceAdded += manager_DeviceAdded;
// Wait for a device to arrive
_waitForDevice.WaitOne();
while (true)
{
int NowTime = Now(); //Console.WriteLine(NowTime);//Console.ReadLine();
if (NowTime < Cmax - 121 && (Cmax - NowTime) % 120 == 0)
{
//1EV間隔6段ブラケティング撮像
_ = Interval_Capture();
}
else if (NowTime > Cmax - 120 && NowTime == C2 - 15)
{
//連写指示のビープ音&連写終了待ち
Console.Beep(5000, 300);
System.Threading.Thread.Sleep(21000);
//多段階AEブラケティング
_ = AEBlacket_Capture();
//連写指示のビープ音&連写終了待ち
Console.Beep(5000, 300);
System.Threading.Thread.Sleep(21000);
}
else if (NowTime > C3 + 5 && (NowTime - Cmax) % 120 == 0)
{
//1EV間隔6段ブラケティング撮像
_ = Interval_Capture();
}
System.Threading.Thread.Sleep(200);
}
// Shutdown
manager.Shutdown();
}
catch (NikonException ex)
{
Console.WriteLine(ex.Message);
}
}
static int Now()
{
DateTime dt = DateTime.Now;
int hour = dt.Hour;
int minute = dt.Minute;
int second = dt.Second;
int x = hour * 3600 + minute * 60 + second;
return x;
}
//2分毎の1EV step 6段階撮像
public int Interval_Capture()
{
//Set Sensitivity 100
NikonEnum ISOSens = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity);
ISOSens.Index = 2;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity, ISOSens);
NikonEnum SpeedMode = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed);
//1/2000-1/60sec 1EV間隔6段AEブラケティング撮影
int i = 0;
for (i = 35; i >= 25; i = i - 2)
{
//シャッター速度を指定
SpeedMode.Index = i;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
// Set number of continuous captures - in this case we want 1
_device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1);
// Hook up capture events
_device.ImageReady += _device_ImageReady;
_device.CaptureComplete += _device_CaptureComplete;
// Capture
_device.Capture();
// Wait for the capture to complete
_waitForCaptureComplete.WaitOne();
}
//set SS 1/500
SpeedMode.Index = 31;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
return 0;
}
//多段階AEブラケティング撮像
public int AEBlacket_Capture()
{
// Set shooting mode to 'continuous, highspeed'
NikonEnum shootingMode = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_ShootingMode);
shootingMode.Index = (int)eNkMAIDShootingMode.kNkMAIDShootingMode_CH;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShootingMode, shootingMode);
//Set Sesitivity 800
NikonEnum ISOSens = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity);
ISOSens.Index = 8;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity, ISOSens);
int i = 0;
NikonEnum SpeedMode = _device.GetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed);
// SS2秒で地球照を撮像
SpeedMode.Index = 11;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
_device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1);
_device.ImageReady += _device_ImageReady;
_device.CaptureComplete += _device_CaptureComplete;
_device.Capture();
_waitForCaptureComplete.WaitOne();
int C3 = C3hour * 3600 + C3min * 60 + C3sec;
//多段階撮像開始
while (true)
{
// SS 1/4000 - 1sec, 1.5EV step, 9段で多段階撮像する
for (i = 37; i >= 13; i = i - 3)
{
SpeedMode.Index = i;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
// Set number of continuous captures - in this case we want 1
_device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1);
// Hook up capture events
_device.ImageReady += _device_ImageReady;
_device.CaptureComplete += _device_CaptureComplete;
// Capture
_device.Capture();
// Wait for the capture to complete
_waitForCaptureComplete.WaitOne();
// 時間調整
System.Threading.Thread.Sleep(750);
}
// 時刻をピックアップして次の連写に行けるかを判断、16秒以内ならC3用連写
int NowTime = Now();
if (NowTime > C3 - 17)
{
break;
}
}
// SS2秒で地球照を撮像
SpeedMode.Index = 11;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
_device.SetUnsigned(eNkMAIDCapability.kNkMAIDCapability_ContinuousShootingNum, 1);
_device.ImageReady += _device_ImageReady;
_device.CaptureComplete += _device_CaptureComplete;
_device.Capture(); _waitForCaptureComplete.WaitOne();
//ダイヤモンドリング撮像の下準備//set SS 1/500
SpeedMode.Index = 31;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_ShutterSpeed, SpeedMode);
//Set Sensitivity 100
ISOSens.Index = 2;
_device.SetEnum(eNkMAIDCapability.kNkMAIDCapability_Sensitivity, ISOSens);
return 0;
}
void _device_ImageReady(NikonDevice sender, NikonImage image)
{
// Save captured image to disk
string filename = "image" + _captureCount.ToString() + ((image.Type == NikonImageType.Jpeg) ? ".jpg" : ".nef");
_captureCount++;
using (FileStream s = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
s.Write(image.Buffer, 0, image.Buffer.Length);
}
}
void _device_CaptureComplete(NikonDevice sender, int data)
{
// Signal the the capture completed
_waitForCaptureComplete.Set();
}
void manager_DeviceAdded(NikonManager sender, NikonDevice device)
{
if (_device == null)
{
// Save device
_device = device;
// Signal that we got a device
_waitForDevice.Set();
}
}
}
class Program { staticvoid Main(string[] args)
{
DemoContinuousCapture demo = new DemoContinuousCapture();
demo.Run();
}
}
}
|