Check用のPowershellクラス

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
	}
}

コメント

タイトルとURLをコピーしました