Garmin Connect IQのビルド、シミュレーターの動作を自動化するためのアセンブリ。
- 機能概要
- 各環境での使用方法
- 補足情報
- 更新履歴
- ヘルプ
- class Checker
- interface IEnvironment
- class GarminSDK
- class Jungle
- class Simulator
- class TimeSimulator
- delegate Simulation
- delegate PrePostAction
- enum GoalType
- enum Activity
- enum BackgroundColor
- enum Language
- enum ConnectionType
- enum WiFiStatus
- enum ReceiveNotificationType
- enum GPSQualityType
- enum SettingToggleMenu
- class Usage<T>
- class MemoryDiagnostics
- enum ExecuteType
機能概要
以下のクラスを用意し、プログラムのビルド、シミュレーターの実行、シミュレーターのプログラムからの制御を行えるようにしている。
- Connect IQ用の環境情報取り出し
GarminSDKクラス
オブジェクトを生成すると、sdkmanagerでCurrentに指定されているSDKを読み込み、その環境にする。
上記の設定であれば、3.2.3が環境になる。 - プロジェクト(monkey.jungle)の読み込みと管理
Jungleクラス
エクリプス側のConnect IQ Projectを読み込み、各種情報を取得するためのクラス。GarminSDKのビルド処理で必要としている。 - シミュレーターの制御
Simulatorクラス - 1~3のクラスを使用しやすいように管理する機能
Checkerクラス
クラスの概要、メソッド・パラメータの説明(詳細)についてはヘルプを参照。
各環境での使用方法
こちらで確認している環境
Visual Studio 2019の.Net 5.0及びPowerShell 7.1の環境での動作を確認済み。
C#(Visual Studio 2019)で使う場合
NuGetにて「AutomationConnectIQ.Utility」を検索しインストールする。
その後は、名前空間「AutomationConnectIQ.Utility」でクラスを利用することが可能になる。
PowerShellで使う場合
パッケージのインストール
Install-Package automationconnectiq.utility
上記にてパッケージをローディングする。
インストール先に関しては、別途-Scopeで設定するのもいいかも。
現在のユーザーのみであれば、以下の様に実行した。
Install-Package automationconnectiq.utility -Scope CurrentUser
パッケージ利用の事前準備
PowerShellではパッケージのインストールだけでは使えず、dllのローディングが必要になる。
基本となるのは、以下のようなスクリプトを事前に実行しておくこと。
このスクリプトは、automationconnectiq.utilityパッケージの場所を検索しその下にあるdllを読み込むというもの。
Get-ChildItem -Filter *.dll -Recurse (Split-Path (Get-Package AutomationConnectIQ.Utility).Source) |
ForEach-Object { Add-Type -LiteralPath $_ }
これを、以下のいずれか場所に記載しておくこと。
- ファイルps1中の先頭に記述しておく
これで、ps1を実行時にdllをローディングしてAutomationConnectIQ.Utility内のクラスがPowerShellから呼び出し可能になる。 - %USERPROFILE%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1に記述しておく
このファイルは、PowerShell 7.xが起動時にユーザー環境のデフォルトで読み込まれるもので、ここに記述することにより、そのユーザーの全環境でutomationConnectIQ.Utility内のクラスが呼び出し可能になる。
補足情報
サンプルプログラム等はこちらで。
ソースコードはこちら。
更新履歴
Ver0.4.1
追加機能
- ビルドオプションに対応
Connect IQ 4.1.4及び4.2で追加された最適化オプションを渡す仕組みを追加。
不具合修正
- Connect IQ 4.1.5でシミュレーターのタイトル名が変更され、シミュレーターが正しく起動できなかったことに対応。
- Connect IQ 4.1でバッテリーステータスの設定方法が変更されたので、それに対応。
- Connect IQ 4.2で通知に関するウィンドウの仕様が変更されたのでそれに対応。
Ver0.3.3
不具合修正
- “Edit Activity Monitor Info”画面でOK/Cancelの命令が動作しなかった。
Connect IQ 4.0.xで、UIが変わったようでそれに対応できていなかった。
Ver0.3.2
追加機能
- ActiveMonitorに情報を設定する機能を追加
- Checker・GarminSDKにUnitTestを実行するための機能を追加
- デバイス指定のChecker.Checkにプリアクションが指定可能にした
- Checkerにプロジェクトデバイス情報取得関数を追加
- HeatMapが表示可能かどうかのプロパティの追加
不具合修正
- GetMemoryDiagnosticsで値が取得できない場合があった
- ToggleメニューのON/OFF取得にちょっとしたコードミスがあり、将来的にこの機能を使う関数で動作不良が起こる可能性があったため修正した
Ver0.2.1
以下の不具合を修正
- Simulator.GetMemoryDiagnosticsを呼び出したときに異常終了した。
- Simulator.SetNotificationCountで値をしても反映されていなかった。
Ver0.2.0
初期バージョン
Simulatorクラスに関して出来ていない操作もあるのでメジャーバージョン番号は0のままにしている。
また継続的なテストはGarminSDK, Jungle,TimeSimulatorはすべて行っているが、Simulatorに関してはウォッチフェイスに関連するものしか実施していないので、バージョン、レビジョンアップ時に動かなくなる場合があるかも。
0.1.xは欠番。
ヘルプ
class Checker
ビルドしてチェックを自動で行うユーティリティクラス
属性
-
String Key { set; }
ビルド時のキーファイル
-
String Project { set; }
ビルド時のプロジェクト(monkey.jungle)ファイル
-
String LogFile { set; get; }
出力用のログファイル
Writerがnull以外の場合、そちらが優先される -
StreamWriter Writer { set; }
出力のログファイルへのストリーム
-
List<String> Devices { get; }
ターゲットとするデバイス情報
-
String BuildOption { get; }
ビルドオプション情報
Ver0.4.1で追加。
メソッド
-
Boolean Check (System.String device,AutomationConnectIQ.Lib.Checker.Simulation func,AutomationConnectIQ.Lib.Checker.PrePostAction pre);
指定されたデバイスに対して、ビルド&チェックを実施する
- device
処理するデバイス名 - func
シミュレーションチェック関数 - pre
デバイスシミュレーションの前処理
- device
-
Boolean Check (System.Boolean isBreak,AutomationConnectIQ.Lib.Checker.Simulation func,AutomationConnectIQ.Lib.Checker.PrePostAction pre,AutomationConnectIQ.Lib.Checker.PrePostAction post);
全デバイスに対してチェックを実施する
- isBreak
どれか一つのデバイスでエラーが出たらそこで停止する - func
シミュレーションチェック関数 - pre
デバイスシミュレーションの前処理 - post
デバイスシミュレーションの後処理
- isBreak
-
Boolean UnitTest (System.String device);
UnitTestの実施
- device
処理するデバイス名
- device
interface IEnvironment
Connect IQ用の環境情報取り出し
属性
-
String AppBase { get; }
Connect IQの格納先情報
class GarminSDK
Connect IQ関連のファイルを取り扱うためのクラス
コンストラクタ
-
GarminSDK ();
デフォルトコンストラクタ
-
GarminSDK (AutomationConnectIQ.Lib.IEnvironment env);
コンストラクタ
属性
-
String SdkFolder { get; }
現在のSDKのフォルダ名
-
String Version { get; }
現在のSDKのバージョン
-
String Key { set; }
ビルド時のキーファイル
- 注意:
未設定の場合ビルドで必ずfalseになる
- 注意:
-
StreamWriter Writer { set; }
シミュレーター起動、ビルド等での出力のリダイレクト先
- 注意:
設定したWriterを閉じる前には、こちらに必ずnullを設定する
- 注意:
メソッド
-
Process StartSimUI ();
シミュレーターの実行
- 注意:
Writerに何か入っていればそちらに出力をリダイレクトする
シミュレータのメニューなどの操作が可能になる起動完了を待つ場合は、Simulator.WaitForInputを使う。
- 注意:
-
Void StartProgram (System.String progName,System.String device,System.Boolean isUnitTest);
シミュレーションでプログラムを実行する
- progName
プログラム名 - device
デバイス名 - isUnitTest
EvilのUnitTest用プログラムの実行をする場合trueにする
引数が指定されていない場合はfalseで動作する - 注意:
シミュレータでウォッチ用プログラムの起動完了を待つ場合は、WaitForDeviceStartを使う。
- progName
-
Boolean BuildProgram (AutomationConnectIQ.Lib.Jungle project,System.String device);
プログラムのビルド
プログラムはプロジェクトファイルの下のデフォルトの場所に作成される
ビルドが完了するまでwaitする。 -
Boolean BuildProgram (AutomationConnectIQ.Lib.Jungle project,System.String device,System.String progName,System.Boolean isUnitTestBuild);
プログラムのビルド
ビルドが完了するまでwaitする。- project
プロジェクト情報 - device
ビルド対象のデバイス - progName
出力実行形式ファイル名 - isUnitTestBuild
EvilのUnitTest用ビルドの場合trueにする
引数が指定されていない場合はfalseで動作する - リターン値:
ビルドが正しく終了した場合true - 注意:
デバイス名がプロジェクト内に存在しない場合falseでリターンする
Writerに何か入っていればそちらに出力をリダイレクトする
- project
class Jungle
Connect IQのプロジェクトファイルを解析し、いろいろ処理を行えるようにする
注意:
・プログラム名、使用しているデバイス名を取り出せるようにする。
・シミュレーションを連続実行する
コンストラクタ
-
Jungle (System.String projectFile);
プロジェクト読み込み
例外は、StreamReaderと同じものが返ってくる可能性あり- projectFile
プロジェクトファイル
- projectFile
属性
-
List<String> Devices { get; }
ターゲットとするデバイス情報
-
String EntryName { get; }
プロジェクトの中に記載があるエントリー名
(iq:applicationのentryを出力している)- 注意:
本当のビルド時の名前は、iq:applicationのnameに入っているのだが、そちらはリソースを参照している。
このクラス内でリソースまでは見に行ってないので、そちらの名前は参照していない。
- 注意:
-
String JungleFile { get; }
プロジェクトファイル名
-
String DefaultProgramPath { get; }
デフォルトのプログラム出力ファイル名
- 注意:
jungleファイルの場所のbinの下のProgramNameで拡張子がprgとする
- 注意:
メソッド
-
static Jungle Create (System.String projectFile);
プロジェクトファイルからJungleを作成するためのファクトリ関数
バージョン違いで解析方法が異なる場合に、ここでそれらを吸収するようにする- projectFile
対象とするプロジェクト名ファイル名(monkey.jungleを指定する)
- projectFile
-
Boolean IsValidDevice (System.String device);
指定デバイス名が登録されているかどうか判断
-
static String MakeProgramPath (System.String name);
プログラム名を作る
実際には拡張子を追加しているだけだが
class Simulator
シミュレーターの操作
コンストラクタ
-
Simulator ();
デフォルトコンストラクタ
-
Simulator (AutomationConnectIQ.Lib.GarminSDK sdk);
コンストラクタ
属性
-
Boolean IsEnabledHeatMap { get; }
View Screen Heat Mapが選択可能かどうかを返す
trueの場合Low Power ModeをTrueにするとHeat Mapが表示されてしまうので注意が必要
メソッド
-
Void Open (AutomationConnectIQ.Lib.GarminSDK sdk);
シミュレーターの起動
すでに起動していたらそれを探すが、起動していなかった場合は自分で起動する -
Void WaitForInput ();
GarminSDK.StartSimUIを呼び出したのち、シミュレーター側のプログラムロード完了まで待つ
ステータスバーにReadyが出るまでまつだけ。 -
Void Close ();
起動中のシミュレーターを終了する
-
Void KillDevice ();
起動中デバイスのシミュレーションを終了させる
シミュレーター自体は閉じない
別途違うプログラム・デバイスの読み込みを行わせる前に実行する関数。 -
TimeSimulator CreateTime ();
時間シミュレーションクラスの生成
-
ActivityMonitor CreateActivityMonitor ();
Activity Monitorクラスの生成
-
Void TriggerGoal (AutomationConnectIQ.Lib.Simulator.GoalType type);
ゴールの通知
-
Void SetTimerActivity (AutomationConnectIQ.Lib.Simulator.Activity type);
Data Fields-Timerのメニュークリック
-
Boolean IsEnableTimerActivity (AutomationConnectIQ.Lib.Simulator.Activity type);
Data Fields-Timerのメニューの状態
-
Void SetBackgroundColor (AutomationConnectIQ.Lib.Simulator.BackgroundColor type);
Data Fieldsの背景色の設定
-
Boolean SetLanguage (AutomationConnectIQ.Lib.Simulator.Language lang);
UI言語の設定
-
Void SetBleConnection (AutomationConnectIQ.Lib.Simulator.ConnectionType type);
BLEの接続タイプの設定
-
Void SetWiFiConnection (AutomationConnectIQ.Lib.Simulator.ConnectionType type);
WIFIの接続タイプの設定
-
Void SetWiFiStatus (AutomationConnectIQ.Lib.Simulator.WiFiStatus type);
WIFIステータスの設定
-
Void SetDisplayHourType (System.Boolean is24Type);
時間表記の設定
- is24Type
trueの場合24時間表記、falseの場合は12時間表記
- is24Type
-
Void SetDisplayUnit (System.Boolean isMetric);
表記単位の設定
- isMetric
trueの場合メートル表記、falseの場合はマイル表記
- isMetric
-
Void SetFirstDayWeek (System.DayOfWeek type);
週頭とする曜日の設定
- type
曜日の指定は土曜日、日曜日、月曜日のみ
- type
-
Void SetReceiveNotificationType (AutomationConnectIQ.Lib.Simulator.ReceiveNotificationType type);
受け取る通知種類を設定する
-
Void SetGPSQuality (AutomationConnectIQ.Lib.Simulator.GPSQualityType type);
GPSの品質種類を設定する
-
Void SetNotificationCount (System.Int32 num);
通知数を設定する
- num
通知数(0-20)
- num
-
Void SetAlarmCount (System.Int32 num);
アラームの数を設定する
- num
アラーム(0-3)
- num
-
Void SetBatteryStatus (System.Double chargingRate,System.Boolean isCharging);
バッテリーの充電状態、充電率を設定する
-
Boolean SetBleSettings (System.String portName);
BLEの接続ポートを設定する
- リターン値:
ポートに接続できない場合false
ただし同じポート名を連続して入力した場合、2回目はtrueになってしまうので注意
- リターン値:
-
Void SetGPSPosition (System.Double latitude,System.Double longitude);
GPS座標を設定する。
座標値は、google mapでクリックした時に画面下に出てくる2つの実数値をそのまま設定すればいいようにしてある -
Boolean SetForceOn (System.Boolean toHide);
Settings->Force on????の設定
- toHide
onHideを選択する場合true、onShowを選択する場合はfalse - リターン値:
選択できなかった場合false
- toHide
-
Void ToggleMenu (AutomationConnectIQ.Lib.Simulator.SettingToggleMenu type,System.Boolean turnOn);
メニューのON/OFFを設定する
-
Void FastForward (System.UInt32 miniuete);
Activity Monitorの設定で時間を進める
- miniuete
進める時間(分:1~600)
- miniuete
-
TimeDiagnostics GetTimeDiagnostics (System.Boolean doClose);
時間計測画面(Watchface Diagnostics)の内容を取得する
- doClose
開いたWatchface Diagnosticsを閉じる場合trueにする - リターン値:
Watchface Diagnosticsの設定内容
- doClose
-
MemoryDiagnostics GetMemoryDiagnostics ();
メモリ情報を取り出す
時々失敗する場合がある。- リターン値:
nullの場合失敗しているので、リトライすると取得できるかも
- リターン値:
-
Void WaitForDeviceStart ();
デバイスが立ち上がるまで待つ
class TimeSimulator
時間シミュレーションウィンドウの制御クラス
属性
-
DateTime Time { set; }
時間の設定
- 注意:
wxWidgetsの日付・時刻設定は、DTM_GETSYSTEMTIMEを送っただけでは、内部情報との差異でStartボタンを押すとアサートが発生する。
そのため、日付・時刻のスピンを動かし、内部情報との差異をなくしておく必要がある。
- 注意:
-
UInt32 Factor { set; get; }
進捗倍率の設定
-
Boolean IsOpen { get; }
時間シミュレーションウィンドウが開いているかどうか
-
Boolean IsStarted { get; }
時間シミュレーションが実行中かどうか
メソッド
-
Void Open ();
時間設定ウィンドウを開く
-
Void Close ();
時間設定ウィンドウを閉じる
- 注意:
時間シミュレーションが開始されている場合、いったんストップしてから閉じるようにしてある。
- 注意:
-
Void Action (AutomationConnectIQ.Lib.TimeSimulator.ExecuteType type);
ボタンを押して、時間のシミュレーションを実施する。
- 注意:
Start後Sleep(500)位しないと画面が更新されないかもしれない。
実装時に注意すること。
- 注意:
delegate Simulation
チェックで使うシミュレーション部分のデリゲート処理
delegate Boolean Simulation(System.String device,AutomationConnectIQ.Lib.Simulator sim);
delegate PrePostAction
チェック時の前後で行う処理部分のデリゲート処理
主にシミュレーターの事前設定などをやらせるための物
delegate Void PrePostAction(AutomationConnectIQ.Lib.Simulator sim);
enum GoalType
ゴール通知の種類
フィールド
- Steps
- FloorClimbed
- ActiveMinutes
enum Activity
Data Fields-Timerの設定値
フィールド
- Discard
- Save
- Pause
- Resume
- Start
- Lap
- WorkoutStep
- NextMultisport
enum BackgroundColor
Data Fieldsの背景色
フィールド
- White
- Black
enum Language
言語の設定
フィールド
- Arabic
- Bulgarian
- Czech
- Danish
- German
- Dutch
- English
- Estonian
- Finnish
- French
- Greek
- Hebrew
- Croatian
- Hungarian
- Italian
- Latvian
- Lithuanian
- Norwegian
- Polish
- Portuguese
- Romanian
- Russian
- Slovak
- Slovenian
- Spanish
- Swedish
- Turkish
- Ukrainian
- BahasaIndonesia
- BahasaMalaysia
- ChineseSimplified
- ChineseTraditional
- Japanese
- Korean
- Thai
- Vietnamese
enum ConnectionType
BLE/WIFIの接続タイプ
フィールド
- NotInitialized
- NotConnected
- Connected
enum WiFiStatus
WIFIステータス
フィールド
- Avaliable
- LowBattery
- NoAccessPoints
- Unsupported
- UserDisabled
- BatterySaverActive
- StealthModeActive
- AirplaneModeActive
- PoweredDown
- Unknown
enum ReceiveNotificationType
受け付ける通知種類
フィールド
- All
- Actionable
- ActionableLTE
- None
enum GPSQualityType
GPSの品質種類
フィールド
- NotAvailable
- LastKnown
- Poor
- Usable
- Good
enum SettingToggleMenu
On/Offするトグルメニュー
フィールド
- Tones
- Vibrate
- SleepMode
- ActivityTracking
- DoNotDisturb
- UseDeviceHTTPSRequirements
- LowPowerMode
- AppLockEnabled
- EnableAlert
class Usage<T>
MemoryDiagnosticsで使うための現在の値、最大値、ピーク値を保持する構造体
タイプ
- T
値の型、intとかdoubleを想定している
フィールド
-
T Current
現在の値
-
T Max
最大
-
T Peak
Peak
class MemoryDiagnostics
メモリ使用量情報
フィールド
-
Usage<Double> Memory
メモリに関する情報
-
Usage<Int32> Objects
オブジェクトに関する情報
enum ExecuteType
押すボタンの種類
フィールド
- Start
開始 - Stop
停止 - Pause
一時停止 - Resume
再開