Swift-UIでタイマで画面遷移する ‘24.5月編

Swift-UI にて、一定時間を待ち別画面に自動遷移する方法が、他記事に見つからなかったのでその覚え書きです。Xcode 14.2 です。

スプラッシュ(起動画面)中に特に時間がかかる初期化処理もなく、一瞬しかスプラッシュが見せれない。スプラッシュにはお客さんが作成したロゴとキャラクタを表示するのでこのままではまずい。しかしSwiftの画面遷移は自由度がないといったシチュエーションです。

更にスプラッシュにBackされては困ります。iOSではBackボタンがなくても、スワイプ操作でBackできてしまいます。

ます view の画面定義内でif文で分岐するという他言語では異常すぎるコードを書きます( 下図中※1 )。if文には任意のstate変数を定義して参照します。( 下図中※2 )

import SwiftUI
import Foundation
	
struct カレントtView: View {
    @State private var isActiveNextView = false     // 次画面遷移有無 ※2

    var body: some View {
         /* 次画面へ遷移する場合 ※1 */
         if isActiveNextView == true {
	            次のView() 	//  Memo: 次Viewを直callするとBack無効にできる ※1
         }
         /* カレント画面の場合 */
         else {
              VStack {
                     :
   	         カレント画面の定義
                     :

あとはvew表示イベントに待ち時間でTimerを仕掛けて( 下図中※3 )、その時間経過後、state変数値を変更します。( 下図中※4 )

   private var splashTimer: Timer!                 // 起動待ちtimer ※3
                     :
                   中略
                     :

             VStack {
                     :
   	           カレント画面の定義
                     :
             }
             .onAppear {
                  Timer.scheduledTimer(withTimeInterval:5.0, repeats: false){ _ in  // ※3
                      isActiveNextView = true    // 次画面に遷移 ※4
             }
         }
     }
}

違和感ありありですが仕方ないです。

なおコード表示には、Code Block Pro を使用させていただいたいてます。

Execlセル内でハッシュする

外部に提出しないExeclは効率UPのため2003を使用しています。最新のExeclでは、base64 エンコードくらいあるかと思っていましたがないんですね。win32APIを動的callできますが、Visual Studio 6 でインストールされる VB6用Declare 宣言をまとめた winapi32.txt に入ってない。手打ちは面倒なので検索すると、https://gist.github.com/rmdavy/db7cb6d81cc487172a86430f68633a21 に公開されていました。セル内使用に特化させ、コードが見にくい、エラー処理不足、32bit対応を直したので、ここで公開いたします。

しかし CryptAcquireContext 系は現在非奨励で、新しいのを使えとMicrosoft公開情報に掲載されています。いずれ調べたいと思います。

Execlセル内でbase64エンコードする

外部に提出しないExeclは効率UPのため2003を使用しています。最新のExeclでは、base64 エンコードくらいあるかと思っていましたが、ないんですね。「Execl base64」で検索してもあまり出てこなかったので、マクロExecl .xlm で作成しました。

Win32 APIの暗号化ライブラリで、API:CryptBinaryToStringA があったのでそちらの .dll を動的参照います。使用します。1コールでいけます。コードは以下の通りです。2003や32bit版offsice ビルドスイッチで切り分けています。URLセーフ(URLで使えない記号を置き替え、%xxのURLエンコードとはだいぶちがう) は、APIないので作りました。VBAエディタで「標準モジュール」に挿入します。

ちゃんとAPIエラー、引数エラー、VBエラー検出も組込みましょう。ネット上のサンプルはそれがあまりできていないようで実用上問題です。Execlの記述は、

Google Testとは? その1

複数のプラットフォームで稼働するといわれている Google Test とはとんなものでしょうか? 単体テストツールということは存じています。

昔昔、PCはおもちゃで、高価なUNIXワークステーションでソフト開発をしていました。当然一人一台はありません。マシンでの作業の手戻りを少なくするため、単体テストは重要度が高かったです。しかし近年PCは一人2台以上、クロスプラットフォーム、OSシュミレータ等々あり、(新人さん以外は)どんどん作って動かした方が効率的ともいえます。

しかし組込みソフトは、基板が未だできていない場合、基板が全員分無い、実行時間と人の時間の差が大きく、実機リソースも小さいため、実全てのパスを通しそれを確認することが難しい。そこで自動車業界では、WinAMS がよく使われます。PC上でマイコンレスでコードレベルの検証を行うものです。GUI上で引数を指定して関数単位で実行しカバレッジを収集します。テスト項目の自動生成もある程度できていたかと思います。しかしとても高価です。

もちろんUNIX系でGUI無し以外では、このような場合 Google Test (以降 gtest と呼びます)の出番なのかと。GUI無しぱっと試した感じ以下のようでした。

テスト項目や条件、実行は人が行う必要があります。

いわゆるドライバ、スタブ(モック)の標準機構といえそうです。デバック用に関数の呼出しと結果判定、スタブの呼出しと切替えのための各種機構と部品がそろっているプラットフォームと言えます。ですから覚えることは色々あるようです。

C++ は gtest に合わせて少し直しが必要そうです。

基本は git-hub から落としてビルドする必要があります。テスト対象との結合方式は ライブラリ( XXXX.a もしくは XXXX.lib )。うまくできてたか心配になります。

基本結果はコンソール出力です。GUIアプリにマージできなくもないとは思いますが、イベントドリブン的な感じではなさそうです。

Visual Stdio 2019でも含まれていました。この場合はWindows上から直接実行できます。しかし2018くらいのバージョンの模様です。

Visual Stdio 2019でということで以下試した結果です。いつものプロジェクト作成から選べました。

スタテックリンクするかdllか聞いてきます。

しかしスタブ(モック)機構が Visual Stdio 2019 は入っていないので、NuGetからパッケージを入れます。mockとのネーミングとなっていますが、gtest 本体も含まれています。

インクルードとlibパスは手動で追加します。gtestのみのパッケージ、プロジェクトフォルダ\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.4 は参照しないようrenameしておく。

実際のコードです。Performance クラス の Acceleration メソッドのテストにて、Acceleration 内て呼び出している Parameter クラスの Speedメソッド と Weightメソッドを、テスト用に固定値を返すようにしたものです。クラス図を以下に示します。

コードは以下に示します。説明はコメントをみてください。

test_main.cpp:

test_class.h:

test_class.cpp:

Mock_class.h:

以下、実行結果です。

なるほど。UNIXサーバ上でtターミナルでログインして開発していたころを思い出します。


その他 gtest に付随して、カバレッジの取得と、カバレッジのhtmlでのビジュアル表示なども可能です。Mockについては、クラス化が前提となってるのが難点ですが、必ずしも使わなくてもよいです。何分、高価な単体テストツールを投資せずカバレッジがとれるので、組込みソフトの机上デバッグに最適かと。もしも急いで動かしたい方は、ぜひこちらよりご相談ください。

Xperia Z3 tablet Compact Wi-Fi 32GB版をAndroid11当にSetupする2 ‘24.4月編

前記事では基本的なセットアップを行いました。ここでは動作確認した結果の問題点を報告します。

LTE版のSGP621、後継10inch版の Z4 Tablet でも少し危うい感がありましたが、Wi-Fi版 32GB SGP612 では完全にGPSが動作しません。うんともすんともです。以下、GPSTestアプリの実行です。

以下のROMを試しましたが全てダメでした。

  • lineage-18.1-20230301-4microg-CUSTOM-WiFi-z3tcw.zip
  • lineage-18.1-20230428-UNOFFICIAL-z3tcw.zip
  • lineage-18.1-20231011-4microg-UNOFFICIAL-z3tcw.zip
  • lineage-18.1-20240321-microG-UNOFFICIAL-z3tcw.zip

iode-2.15-20230927-z3tcw.zip は試さずですが、祖先は同じでしょうから無理でしょうね。

一度純正ROMに戻して、ダイアル #*#*7378423*#*# によるfactorytestモードで確認してみます。衛星は見つかってますね。ハードウェアの問題ではないといえます。

海外の情報を調べてみます。有名な XDA に SGP621 – GPS can not found any statlites custom ROM というスレッドがありました。このスレッドは、2016年から始まっており、2023年10月21日の記事でも “does not woek” と投稿があります。最終的には改善したという投稿はなかったです。かなり潜在的で長期的な問題であるようです。

ストレージ容量の違うSGP611では動作したという投稿もありました。推測ですが、Wi-Fi版とLTE版でGPS制御方法が違うのではないでしょうか? それを合わせこもうとすると、調査とプログラミングで数日でできるようなハナシでは無くなります。費用体効果からみても誰もやらないのでしょう。SGP612ではGPSは諦めましょう。Z3 tablet Compact でGPSをどうしても使いたい方は、SGP621を手に入れるのが賢いでしょう。

FMラジオの周波数が表示されないです。どのみち周波数バンドが海外になっているので追及しても仕方ない感じです。とおもいましたが起動2回目で表示されるようになるようです。


カスタムROMは有志の方が作られたもので、メーカのような開発体制はありません。制約があって当然です。少し都合が悪くてもそれ理解しありがたく利用しましょう。