AutomationConnectIQのCheckクラス動作のサンプル動画での実装のベースとなるクラス。
クラスの実装がちょっと長いんで、まずクラスを定義しているモジュールファイル(psm1)の保存先について、次にベースクラスを使ったスクリプトとその使い方、最後にベースとなるクラスの定義といった順番にしている。
クラス定義ファイルの保存先
クラス定義ファイルは、$env:PSModulePathに設定されているパスに、モジュール名/モジュール名.psm1という方たちで保存して利用する。
わしの場合は、%USERPROFILE%\Documents\PowerShell\Modules\ConnectIQDevelopの下に保存した。
使用方法
派生クラスの作成
using module ConnectIQDevelop
using namespace AutomationConnectIQ.Lib
Param($Key, $Jungle, $Dev, $Output)
class SimulatorAction : ConnectIQDevelop {
[bool]Action([string]$dev, [Simulator]$simulator)
{
([ConnectIQDevelop]$this).Action($dev, $simulator)
# ここに実際の処理を入れる
return $true
}
[void]Pre([Simulator]$simulator) {
([ConnectIQDevelop]$this).Pre($simulator)
# ここに実際の処理を入れる
}
}
$action = [SimulatorAction]::new()
$action.key = $Key
$action.project = $Jungle
$action.OutputDir = $Output
$action.Check($Dev)
remove-variable action
上記のようなスクリプトを作成し、4つのパラメータを渡すような形にする。これをVS Codeではタスクとして起動する。
using module ConnectIQDevelop
が定義しているクラスモジュールの読み込み部分になる。
SimulatorActionでは読み込んだモジュールで定義されているConnectIQDevelopクラスの派生とし、Action/Pre処理部分を個別に実装するようにする。
Action/Preの具体的な例としては、AutomationConnectIQのCheckクラス動作のサンプル動画の中のFr45TestとかPreになる。
VS Code用タスクの作成
タスクファイルには次のような形で記述している。スクリプトはscript/test.ps1としている。
このタスク内で、4つのパラメータを渡すようにしてある。
{
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "${workspaceFolder}/script/test.ps1",
"problemMatcher": [
"$monkeyc.error",
"$monkeyc.fileWarning",
"$monkeyc.genericWarning"
],
"args": [
"-Key", "${config:monkeyC.developerKeyPath}",
"-Jungle", "${workspaceFolder}/monkey.jungle",
"-Output", "${workspaceFolder}/output/Current",
"-Dev", "fr45",
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false
}
},
]
}
VS CodeでCtrl+Alt+Tを押すことで以下のような選択肢が表示され、PowerShellスクリプトの実行ができるようになる。
ConnectIQDevelopクラスの定義内容
using namespace AutomationConnectIQ.Lib
class ConnectIQDevelop {
[string]$Device # ビルド対象デバイス名
[string]$OutputDir # データの出力先フォルダ名
[Simulator]$Sim # シミュレータ操作用オブジェクト
[TimeSimulator]$Time # 時間シミュレーション操作用オブジェクト
[int]$Number # キャプチャファイル名の連番
[string]$key # ビルド用のキーファイル
[string]$project # プロジェクトファイル名
# キャプチャーをするが、番号の後ろにコメントを付与している
[void]Capture([string]$comment)
{
$this.Time.Action([TimeSimulator+ExecuteType]::Start)
Start-sleep -Milliseconds 500
$this.Time.Action([TimeSimulator+ExecuteType]::Pause)
$bitmap = $this.Sim.Capture()
$filename = $this.Device + "_" + $this.Number.ToString("D2") + "_" + $comment + ".png"
$bitmap.Save($(Join-Path $this.OutputDir $filename))
$this.Time.Action([TimeSimulator+ExecuteType]::Stop)
$this.Number++
}
[bool]Action([string]$dev, [Simulator]$simulator)
{
# クラス内メソッドでメンバー利用するため、変数を初期化
# Actionをオーバーライドする場合、([ConnectIQDevelop]$this).Action($dev, $simulator)でこのメソッドを呼び出す
$this.Sim = $simulator
$this.Device = $dev
$this.Number = 0
return $true # CheckAllでは$falseでリターンした場合にそこで終了
}
[void]Pre([Simulator]$simulator) {
}
[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]Build([string]$device) {
$this.Device = $device
$sdk = New-Object GarminSDK -Property @{
Key = $this.key
}
# プロジェクトファイルの読み込み
$proj = New-Object Jungle($this.project)
$sdk.BuildProgram($proj, $this.Device)
}
[void]CheckAll() {
if (-Not (Test-Path -Path $this.OutputDir)) {
New-Item -Path $this.OutputDir -ItemType Directory
}
# プロセス側の作業フォルダも変更するためEnvironment側も変更している
push-Location -Path $this.OutputDir
[Environment]::CurrentDirectory = $pwd
$check = New-Object Checker -Property @{
Key = $this.key
Project = $this.project
}
$check.Check($true, $this.Action, $this.Pre, $null)
Pop-Location
[Environment]::CurrentDirectory = $pwd
}
[void]Check([string]$device) {
if (-Not (Test-Path -Path $this.OutputDir)) {
New-Item -Path $this.OutputDir -ItemType Directory
}
# プロセス側の作業フォルダも変更するためEnvironment側も変更している
push-Location -Path $this.OutputDir
[Environment]::CurrentDirectory = $pwd
$check = New-Object Checker -Property @{
Key = $this.key
Project = $this.project
}
$check.Check($device, $this.Action, $this.Pre)
Pop-Location
[Environment]::CurrentDirectory = $pwd
}
[void]UnitTest([string]$device) {
if (-Not (Test-Path -Path $this.OutputDir)) {
New-Item -Path $this.OutputDir -ItemType Directory
}
# プロセス側の作業フォルダも変更するためEnvironment側も変更している
push-Location -Path $this.OutputDir
[Environment]::CurrentDirectory = $pwd
$check = New-Object Checker -Property @{
Key = $this.key
Project = $this.project
}
$check.UnitTest($device)
Pop-Location
[Environment]::CurrentDirectory = $pwd
}
}
コメント