PowerShellでクラスを作成し、今まで紹介したクラスを有効に活用できるものを紹介。
SimulatorActionクラス
各個人で修正する箇所は、ActionとPreの関数。
SimulatorActionの派生を作り、ActionとPreをオーバーライドしてもいいし、このクラスを直接修正してもいいと思う。
using namespace AutomationConnectIQ.Lib;
class SimulatorAction {
[string]$Device
[string]$OutputDir
[Simulator]$Sim
[TimeSimulator]$Time
[int]$Number
[string]$key
[string]$project
[void]Capture()
{
$this.Time.Action([TimeSimulator+ExecuteType]::Start)
Start-sleep -Milliseconds 500
$this.Time.Action([TimeSimulator+ExecuteType]::Pause)
$bitmap = $this.Sim.Capture()
$filename = $this.Number.ToString("D2") + ".png"
$bitmap.Save($(Join-Path $this.OutputDir $this.Device $filename))
$this.Time.Action([TimeSimulator+ExecuteType]::Stop)
$this.Number++
}
[bool]Action([string]$dev, [Simulator]$simulator)
{
$this.Sim = $simulator
$this.Device = $dev
$this.Number = 0
if (-Not (Test-Path -Path $this.OutputDir)) {
New-Item -Path $this.OutputDir -ItemType Directory
}
if (-not (Test-Path $(Join-Path $this.OutputDir $this.Device))) {
New-Item -Path $(Join-Path $this.OutputDir $this.Device) -ItemType Directory
}
$simulator.SetGPSPosition(35.685233, 139.752485)
$simulator.SetLanguage([Simulator+Language]::English)
$this.Time = $simulator.CreateTime()
$this.Time.Open()
$this.Time.Time = Get-Date "2019-12-31 13:59:59"
$this.Capture()
$this.Time.Close()
return $true # CheckAllでは$falseでリターンした場合にそこで終了
}
[void]Pre([Simulator]$simulator)
{
$this.Sim = $simulator
$simulator.SetBatteryStatus(50, $false)
}
[void]Simulate([string]$device) {
$this.Device = $device
$sdk = New-Object GarminSDK -Property @{
Key = $this.key
}
$this.Sim = New-Object Simulator($sdk)
$this.Sim.WaitForInput()
$this.Action($device, $this.Sim)
}
[void]BuildAndLoad([string]$device) {
$this.Device = $device
$sdk = New-Object GarminSDK -Property @{
Key = $this.key
}
$proj = New-Object Jungle($this.project)
$sdk.BuildProgram($proj, $this.Device)
$this.Sim = New-Object Simulator($sdk)
$this.Sim.WaitForInput()
$sdk.StartProgram($proj.DefaultProgramPath, $this.Device)
$this.Sim.WaitForDeviceStart()
}
[void]CheckAll() {
$check = New-Object Checker -Property @{
Key = $this.key
Project = $this.project
}
$check.Check($true, $this.Action, $this.Pre, $null)
}
}
$action = [SimulatorAction]::new()
$action.key = "developer_key"
$action.project = "monkey.jungle"
$action.OutputDir = "output"
$action.CheckAll()
12行目:Capture関数
AutomationConnectIQ-サンプル7のものをちょっと改良し、保存先フォルダをOutputDir\デバイス名にし、その下に番号を振ったpngファイルを保存するようにしている。
またCaptureを呼び出すたびに、番号をカウントアップしていくようにしている。
25行目:Action関数
AutomationConnectIQ-サンプル8、AutomationConnectIQ-サンプル9で示したCheckerクラスのCheckメソッドに渡すための関数になる。
27~29行目はSimulatorAction内で使う変数を初期化している。
50行目:Pre関数
AutomationConnectIQ-サンプル9で示したCheckerクラスのCheckメソッドに渡すプリ処理を行うための関数になる。
66行目:BuildAndLoad関数
デバイス名を渡すことで、そのデバイスのプログラムを構築し、シミュレーターを起動、そこにプログラムを読み込むまでの処理を実施している。
56行目:Simulate関数
Action関数を呼び出し、シミュレーション処理を行わせる。
79行目:CheckAll関数
Checkerクラスの全デバイスに対してチェックを行うメソッドの呼び出しを行う。
利用方法
Action関数とPre関数の中身を変更するのだが、次のような手順でAction関数の中身を作成していくのがいいと思われる。
- BuildAndLoad関数でシミュレーターを起動しておく。
- Action関数を変更した後、Simulate関数を呼び出す。
- Action関数とPre関数の作成が終わったらCheckAll関数を呼び出す。
PowerShellスクリプトの編集はVisual Studio Codeを使うのが、手間が少なくいいと思われる。
上の手順を実施する場合、コードの93行目を変更しF5(実行)を行うことで確認をすることができる。
SimulatorActionのCaptureではデバイス単位にフォルダが作成されるため若干一覧性に欠けるかもしれない。その場合は、単一フォルダの下にキャプチャファイルが保存されるようにCaptureを変更するといいと思う。
その場合31~36行目の保存先フォルダを作成する処理も同時に修正する必要がある。
コメント