やぎ星人です。どうもこんにちは。
本記事はスマートカーテンアプリ設計の後編記事になります。
前編記事はこちら↓です。是非ご覧ください。
アプリ設計(後編)
それでは本題のアプリ設計です。
データフロー(全体)
前回の記事でも少し触れましたが、アプリ内共有データとなる”SystemState”クラスにフォーカスし、データ設計を行いました。
SystemStateクラスのプロパティ定義とプロパティの取りうる値を定義し、各プロパティをどのインスタンスが更新・参照をするかを整理しました。
尚、BleControllerはSwiftUIビューではないため、@EnvironmentObject属性を利用した共有インスタンス(SystemStateインスタンス)の参照ができません。これについては、実インスタンスを保有しているContentViewとの間でインスタンス情報の受け渡しを行うことでデータの共有を行っています。
@EnvironmentObjectについては↓こちらの記事に纏めておりますので、是非ご覧ください。
データフロー(機能別)
前述したデータフローはデータの更新・参照関係を静的に示したものになります。
このままだと少し分かりにくいので、機能毎に分割し、データの更新・参照タイミングについてご説明いたします。
ペアリング(BLE)
アプリの起動時、またはアプリ画面上の「再接続」ボタンが押下された時、デバイスとのBLE接続(ペアリング)を行います。
- BleStateView上の「再接続」ボタンが押下されると、「ユーザリクエスト」プロパティを「デバイス検索」値に更新します。
- 「ユーザリクエスト」プロパティの更新により、BleControllerはユーザ要求(デバイス検索)を認知します。
- BleControllerは「デバイス接続状態」プロパティを「検索中」値に変更します。
- 「デバイス接続状態」プロパティの更新により、BleStateViewは画面表示を変更します。(デバイス検索中を示すアニメーションの実行)
- BleControllerはBleHandlerに対し、ペアリング開始を要求します。
- BleHandlerとCoreBluetooth間でのペアリング処理シーケンスが完了すると、処理結果がBleControllerに通知されます。
- 通知結果に応じて「デバイス接続状態」プロパティを「接続済み」or「未接続」値に変更します。
- 「デバイス接続状態」プロパティの更新により、BleStateViewは画面表示を変更します。(接続済みor未接続を示す表示)
開閉予約時刻の同期
ペアリング成功時、デバイス側から開閉予約時刻情報が送信されます。(BLE Notify)
受け取った予約時刻をAlarmViewに反映させます。予約時刻はアプリ側でも管理できるのですが、何らかの理由でデバイスの予約設定が解除された場合など、デバイスとアプリ間で設定値がアンマッチになるケースを懸念し、デバイス設定時刻を正として同期を取ることとしました。
- ペアリング完了後、デバイスより予約時刻を受信(BLE Notify)し、受信情報がBleHandlerからBleControllerに通知されます。
- BleControllerは受信情報を解析し、「開予約時刻」プロパティおよび「閉予約時刻」プロパティを更新します。
- 「開予約時刻」プロパティおよび「閉予約時刻」プロパティの更新により、AlarmView上の予約時刻表示が更新されます。
リモコンボタンでの動作
アプリのリモコン画面で「OPEN」「CLOSE」「STOP」ボタンを押下することで、スマートカーテンデバイスに制御指示を送信します。
- ControlView上の「OPEN」「CLOSE」「STOP」ボタンのいずれかが押下されると、「ユーザリクエスト」プロパティを「自動開要件」または「自動閉要求」、「停止要求」値に更新します。
- 「ユーザリクエスト」プロパティの更新により、BleControllerはユーザ要求(制御指示)を認知します。
- BleControllerはBleHandlerに対し、制御指示送信を要求することでデバイスに対しデータ送信を行います。
- デバイスは動作を開始(まはた停止)すると、一定間隔でデバイス情報(カーテン動作状態)を送信します。(BLE Notify)
アプリでは受信情報がBleHandlerからBleControllerに通知されます。 - BleControllerは受信情報を解析し、「デバイス作動状態」プロパティおよび「現在カーテン位置」プロパティを更新します。
- 「デバイス作動状態」プロパティおよび「現在カーテン位置」プロパティの更新により、ControlView上の表示が更新されます。(カーテンの開閉動作アニメーションの開始または停止)
開閉時刻予約
アラーム設定画面で「開時刻」「閉時刻」を入力することで、 スマートカーテンデバイスに制御指示を送信します。
- AlarmView上で開または閉予約時刻が入力される(DatePickerを想定)と、「開予約時刻」プロパティまたは「閉予約時刻」プロパティを更新します。
- AlarmView上のトグルSWにより予約設定が有効化されると、「ユーザリクエスト」プロパティを「開時刻予約」または「閉時刻予約」値に更新します。
- 「ユーザリクエスト」プロパティの更新により、BleControllerはユーザ要求(制御指示)を認知します。
- BleControllerはBleHandlerに対し、制御指示送信を要求することでデバイスに対しデータ送信を行います。これによりデバイスに予約時刻が設定されます。
予約作動
デバイスは、開予約時刻または閉予約時刻になると単独でカーテンの開または閉作動を開始します。このタイミングでアプリを起動していた場合、デバイスよりカーテン動作状態を受信します。(BLE Notify)
ユーザーにカーテンが開閉動作していること知らせるため、カーテンの開閉アニメーションを表示します。
- デバイスが開または閉予約時刻になると、動作を開始します。この間、デバイスより一定間隔でカーテン動作状態を受信(BLE Notify)し、受信情報がBleHandlerからBleControllerに通知されます。
- BleControllerは受信情報を解析し、「デバイス作動状態」プロパティおよび「現在カーテン位置」プロパティを更新します。
- 「デバイス作動状態」プロパティおよび「現在カーテン位置」プロパティの更新により、ControlView上の表示が更新されます。(カーテンの開閉動作アニメーションの開始または停止)
マニュアル作動
デバイスに備え付けられている昇降スイッチが押下されると、デバイスは単独でカーテンの開または閉作動を開始します。このタイミングでアプリを起動していた場合、デバイスよりカーテン動作状態を受信します。(BLE Notify)
ユーザーにカーテンが開閉動作していること知らせるため、カーテンの開閉アニメーションを表示します。また、昇降スイッチによるカーテン開閉作動中は、リモコン画面による制御指示を禁止します。(ユーザーの昇降スイッチ操作を最優先とするため)
- デバイスの昇降スイッチが押下されるとカーテン開または閉動作を開始します。この間、デバイスより一定間隔でカーテン動作状態を受信(BLE Notify)し、受信情報がBleHandlerからBleControllerに通知されます。
- BleControllerは受信情報を解析し、「デバイス作動状態」プロパティおよび「現在カーテン位置」プロパティを更新します。
- 「デバイス作動状態」プロパティおよび「現在カーテン位置」プロパティの更新により、ControlView上の表示が更新されます。(カーテンの開閉動作アニメーションの開始または停止)
※この間、ControlView上の「OPEN」「CLOSE」「STOP」は非アクティブとなります。
おわりに
ざっくりですが、以上が設計イメージになります。
今さらですが、BleControllerはユーザーリクエストや現在カーテン位置などを解釈するため、別名称(例えばMainControllerとか)したほうが分かりやすかったかもしれないですね。
現状としてはAlarmView以外の実装は概ね完了しており、そちらの実装が完了した段階でデバイスとの結合デバッグを行う予定です。
ひとまず次回の記事では、AlarmViewの実装結果についてご報告したいと思います。
次回の記事も是非ご覧ください!
コメント