Automation Connect IQ SDK

Garmin Connect IQのビルド、シミュレーターの動作を自動化するためのアセンブリ。

機能概要

以下のクラスを用意し、プログラムのビルド、シミュレーターの実行、シミュレーターのプログラムからの制御を行えるようにしている。

  1. Connect IQ用の環境情報取り出し
    GarminSDKクラス
    オブジェクトを生成すると、sdkmanagerでCurrentに指定されているSDKを読み込み、その環境にする。

    上記の設定であれば、3.2.3が環境になる。
  2. プロジェクト(monkey.jungle)の読み込みと管理
    Jungleクラス
    エクリプス側のConnect IQ Projectを読み込み、各種情報を取得するためのクラス。GarminSDKのビルド処理で必要としている。
  3. シミュレーターの制御
    Simulatorクラス
  4. 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 $_ }

これを、以下のいずれか場所に記載しておくこと。

  1. ファイルps1中の先頭に記述しておく
    これで、ps1を実行時にdllをローディングしてAutomationConnectIQ.Utility内のクラスがPowerShellから呼び出し可能になる。
  2. %USERPROFILE%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1に記述しておく
    このファイルは、PowerShell 7.xが起動時にユーザー環境のデフォルトで読み込まれるもので、ここに記述することにより、そのユーザーの全環境でutomationConnectIQ.Utility内のクラスが呼び出し可能になる。

補足情報

サンプルプログラム等はこちらで。

Garmin-AutomationConnectIQ
「Garmin-AutomationConnectIQ」の記事一覧です。

ソースコードはこちら。

GitHub - take4blue/AutomationConnectIQ
Contribute to take4blue/AutomationConnectIQ development by creating an account on GitHub.

更新履歴

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
      デバイスシミュレーションの前処理
  •  Boolean Check (System.Boolean isBreak,AutomationConnectIQ.Lib.Checker.Simulation func,AutomationConnectIQ.Lib.Checker.PrePostAction pre,AutomationConnectIQ.Lib.Checker.PrePostAction post);

    全デバイスに対してチェックを実施する

    • isBreak
      どれか一つのデバイスでエラーが出たらそこで停止する
    • func
      シミュレーションチェック関数
    • pre
      デバイスシミュレーションの前処理
    • post
      デバイスシミュレーションの後処理
  •  Boolean UnitTest (System.String device);

    UnitTestの実施

    • 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を使う。
  •  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に何か入っていればそちらに出力をリダイレクトする

class Jungle

Connect IQのプロジェクトファイルを解析し、いろいろ処理を行えるようにする

注意:
・プログラム名、使用しているデバイス名を取り出せるようにする。
・シミュレーションを連続実行する

コンストラクタ

  •  Jungle (System.String projectFile);

    プロジェクト読み込み
    例外は、StreamReaderと同じものが返ってくる可能性あり

    • 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を指定する)
  •  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時間表記
  •  Void SetDisplayUnit (System.Boolean isMetric);

    表記単位の設定

    • isMetric
      trueの場合メートル表記、falseの場合はマイル表記
  •  Void SetFirstDayWeek (System.DayOfWeek 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)
  •  Void SetAlarmCount (System.Int32 num);

    アラームの数を設定する

    • num
      アラーム(0-3)
  •  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
  •  Void ToggleMenu (AutomationConnectIQ.Lib.Simulator.SettingToggleMenu type,System.Boolean turnOn);

    メニューのON/OFFを設定する

  •  Void FastForward (System.UInt32 miniuete);

    Activity Monitorの設定で時間を進める

    • miniuete
      進める時間(分:1~600)
  •  TimeDiagnostics GetTimeDiagnostics (System.Boolean doClose);

    時間計測画面(Watchface Diagnostics)の内容を取得する

    • doClose
      開いたWatchface Diagnosticsを閉じる場合trueにする
    • リターン値:
      Watchface Diagnosticsの設定内容
  •  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
    再開
タイトルとURLをコピーしました