UfoTwCtrl Ver2.10 U.F.O. TWを左右別々ランダムコントロールアプリ

今回の改修はランダムパターンの自由度を少しだけ向上する拡張を行っております。
このアプリはBluetooth通信によりU.F.O. TWの制御を左右別々にも左右同調にも左右反転にもランダム動作できるAndroid端末用野良アプリです。
BLEに対応しているBluetoothが使用できるAndroid4.4以上を対象にしております。

以下、修正内容と今後の宿題については同時期にリリースしました『UfoSaCtrlTrip Ver3.10 U.F.O. SA A10サイクロンSA (+PLUS プラス) バッハスマート ROCKET+1D ランダムコントロールアプリ』と全く同じですので、そちらの記事を既にお読みの方はこちらの修正内容等は読み飛ばしていただいて大丈夫です。

機能追加および変更点

ランダムパターンの継続時間の選択肢を制限するパラメータ「TimeIndexLimit」は各々選択されたPowerPattern毎にTimePatternの選択肢を制限できるようにしたものでしたが、その制限の仕方が非常に限定的でした。
例えば、現在の規定のU.F.O. TW用ランダムパターンのVolume1の場合ですと、

[Vol.1 PowerPattern: int(0~100): 要素数は自由(ランダムに選ばれる)]
0,1,5,10,15,20,25
[TimePattern: int(1~): 要素数は自由(ランダムに選ばれる) 単位100msec]
10,16,22,28,34,40,46,52
[TimeIndexLimit: int(1~): 要素数はPowerPatternと合わせる 各数値はTimePattern要素数以内とする]
5,8,6,8,8,6,4

となっていまして、PowerPattenで1番目の要素「0」が選択されたときのTimeIndexLimitは1番目の要素が採択されて「5」となっていて、これはTimePatternに書いてある1〜5番目の要素の中からランダムで選択されることを示しています。つまり、「10,16,22,28,34」の中から選ばれます。

同様にPowerPattenで2番目の要素「12」が選択されたときのTimeIndexLimitは2番目の要素が採択されて「8」となりますので1〜8番目要素「10,16,22,28,34,40,46,52」の中から選ばれる、という仕組みになっています。

この選択肢の制限は開始が「1」に固定されているため、選択肢が外せるのは後方に書いたものだけに限定されていました。
このパラメータは元々、PowerPattenで速いパターンが選択されたときにそれが長時間続くのはキツいからそういうときは長時間が選択されないようにしたいな、という発想で設けたものでありました。
また、停止があまり長くなると「焦らし」を超えて「早く動けよ!」という苛立ちになったり、あとこれは多分作成者ならではの感覚だと思いますが「アプリが不具合起こしてる?」という不安が起こりチクニーどころではなくなってしまうため、停止も長時間にならないようにしたい、という思いもありました。

つまり、いずれも特定のPowerPattenの場合に長時間の選択肢を外したいという欲求から来ていたので、選択肢の制限は一方向でも(筆者的には)十分なモノでした。

ただ、やはり、使用者が筆者だけではなくなると、別の優先度を持っている方もいらっしゃるわけでして、例えば筆者は以前、「停止時間は長くしたい」というコメントをいただいたりもしました。
長いパターンも含めたいというだけなのであれば従来のパラメータに長いTimePatternをガンガン書け(書き足せ)ば良いだけなのですが、特定のPowerPattenでは短時間だけにしたいが別の特定のPowerPattenでは長時間だけにしたい、みたいな感じになってくると、従来の仕様ではどうしても実現不可能になってしまいます。

そこでしばらく自由度の拡張について考えを巡らせておりました。
このアプリ「ランダム」とは言っていますが、実際には「ランダム感を演出しつつも好みの範疇の動きばかりをするようにコントロールする」アプリでして、単純ランダムではありません。

例えば、上記のパラメータなんかも範囲指定とかにしていないでわざわざ個別に数値を書いていっているのは同じ数値を何度も書けばその数値が選択される確率を上げられる、つまり確率可変にできるようにしているのであって、また、似たようなPowerPattenが連続しないように最低差分のパラメータも設定していたりします(Displacement Threshold)。

なので、ランダムと言いながらも「好みのランダム」にできるように工夫しつつパラメータの記述量もなるべく少なく済むようにバランスを取った設計をしているんですね。
単純に自由度を増やすだけなら、いくらでも増やしても良いのですが、それだとパラメータの記述量が爆発的に増えるか、もしくは、あまり好ましくない動きでも平等に採用される真のランダムに近付いていってしまうようになってしまうわけです。

んで、まあ、しばらく考えた結果、割と少ない改修で多少の自由度を上げることが出来るようになったので、今回はそのバージョンを公開させていただくことにしました。
その方法とは。

TimeIndexLimitのパラメータをTimeIndexRangeに変更します!
TimePatternの選択肢の制限は今まで「1〜n」という形でしか出来なかったのですが、これを「n〜m」という範囲指定とすることで制限の仕方の自由度を高めます。

これで例えば上記の例で挙げた特定のPowerPattenでは短時間だけにしたいが別の特定のPowerPattenでは長時間だけにしたい、みたいな要求も実現できるようになります。
また、規定のパラメータの記述は昇順になるように書いてはいますが、別にここを昇順に書かなければいけない決まりなどありませんので、短時間にしたいとか長時間にしたいとか以外の理由で制限したい場合でも今までの一方向の制限が二方向から制限できるようになったため、そこそこ自由度が向上すると思います。

というわけで、今まで

[TimeIndexLimit: int(1~): 要素数はPowerPatternと合わせる 各数値はTimePattern要素数以内とする]
5,8,6,8,8,6,4

と書いてきたところは、

[TimeIndexRange: int(1~): 要素数はPowerPatternと合わせる 各数値はTimePattern要素数以内とする "1-"省略化]
1-5,1-8,1-6,1-8,1-8,1-6,1-4

という具合にマイナス記号(半角ハイフン)を使って範囲指定するようになります。

とここで、開始が「1-」の場合は記述を省略できるようにすることで従来どおり、

[TimeIndexRange: int(1~): 要素数はPowerPatternと合わせる 各数値はTimePattern要素数以内とする "1-"省略化]
5,8,6,8,8,6,4

と記述していても動作するようにプログラムを組みましたので、パターンの記述を変更して独自パターンで使用されている方等は今までのパターンがそのまま使用できます。
また、「1-5」を逆に「5-1」みたいに書いても動くようにはしてあります。(わざわざ逆順に書く意味もありませんが(エラー処理するより楽というくらいの理由))

特定のPowerPatternで選択させたくないTimePatternはTimePatternの両端に寄せて書くようにしてTimeIndexRangeで選択されないようにしてください。

例(停止は長時間に限定したい場合)

[Vol.1 PowerPattern: int(0~100): 要素数は自由(ランダムに選ばれる)]
0,1,5,10,15,20,25
[TimePattern: int(1~): 要素数は自由(ランダムに選ばれる) 単位100msec]
10,16,22,28,34,40,46,52,200,250,300
[TimeIndexRange: int(1~): 要素数はPowerPatternと合わせる 各数値はTimePattern要素数以内とする "1-"省略化]
9-11,1-8,1-6,1-8,1-8,1-6,1-4

PowerPattern0(停止)のときのTimeIndexRangeを9-11として、TimePatternの9-11要素は200,250,300と長時間を記述。これにより停止時は20秒、25秒、30秒のいずれかがランダムで選択されるようになります。

今後の課題(宿題)について

前回のUfoTwCtrl Ver2.00 U.F.O. TWを左右別々ランダムコントロールアプリでAndroid12(S)対応をしたのですが、相変わらずAndroid13(T)対応が出来ていません。
理由は毎度お馴染みで、そもそも筆者がそんな最新機種を所持していない、ということが挙げられます。
これもコトあるごとに言っていますが、実機でないとBLE通信周りの確認が出来ないためエミュレータでテストとか出来ません。

ただ、筆者の所持している古いスマホでも有り難いことに最新のカスタムROMを公開してくれている方がいらっしゃいまして、Android13は流石に出てこないだろうと思っていたらなんとAndroid13も出してくれたので一応カスタムROMではあるものの1機種Android13で確認する機体を確保することができました。

しかし、そこで動作確認した限りですと、Android13ではまたもや接続が出来なくされているみたいです。
このアプリ、というかBLEの接続周りは度々AndroidOSの仕様変更に翻弄されていまして、古くはAndroid6(M)でなぜか位置情報(GPS)をオンにしないと接続できないようにされてしまったりAndroid10(Q)で位置情報の権限が必須とされてしまったり、Android12(S)でBLE関連の権限の種類がごっそり変更されてしまったり、と迷走が続いているわけなんですが、なんかですね、はっきりと理由はまだ分かっていないのですが、現状うちの環境ではAndroid13(T)では接続できないんです。

これから徐々にどうやって対応したら良いか考えていくことになるとは思うのですが、その対処がいよいよもって古めの機種に厳しい改修になってしまう可能性が高まって来ています。

技術的な話になってしまいますが、このアプリ、Android12(S)まで対応したソースを書いておきながら、TargetAPIを22(Android5.1(L))に留めています。
その理由はTargetAPIを新しくすると位置情報(GPS)をオンにしないと接続できない機種が増えるからです。
今までしっかりまとめたことが無かったのでここで一旦、筆者が所持している全てのスマホもしくはタブレットでUfoTwCtrlが動作する機種において、Target APIやCompile SDK Version、Build Tools Versionを変更して動作確認をしてみました。

まとめてみたら驚愕の事実が明らかになってしまったのですが、まずは下記の表をご覧ください。
○は位置情報(GPS)をONにしなくても接続できた
△は位置情報(GPS)をONにすれば接続できた
×は位置情報(GPS)をONにしても接続できなかった
ことを表しています。

MachineAndroid
Version
API
Version
CodenameTarget 22
Compile 32
Build 32
Target 32
Compile 32
Build 32
Target 33
Compile 33
Build 33.0.2
Target 34
Compile 34
Build 33.0.2
備考
FLEAZF44.419KitKat
HT17Pro623Marshmallow
g07724Nougat
U22724Nougat
Alpha724Nougat
Fire7928Pie起動できないそもそもGPSが無い
近接センサーが無い
FireHD10928Pie
XZ21029QuinceTart
LeMax21333Tiramisu×カスタムROM
Redmi12C1333Tiramisu近接センサーが無い
がFカメラで代用

一番左のTarget 22となっているのがリリースしている版で、Android13以外は接続が出来ています。
本当はここで、Target APIを最新に近付けると位置情報(GPS)をオンにしないと接続できない機種が増えるということを示したかったし、確かにそうなのですが、それよりも目立つのがそもそもアプリが起動できなくなるという結果(´;ω;`)
現状BLE周りの権限について古いのも新しいのも両方書いているのですが、これがいけないのか? ちょっとまだ確かなことは言えませんが、少なくとも現状筆者の環境ではAndroid13では全く接続出来ず、対応をすると過去の機種で位置情報(GPS)をオンにしなければならないというケースが増えそうではあるのです。

(2023-08-22:追記)
純正でAndroid13な安価機種を調達出来まして、動作を確認したところこのリリースで接続できました。
どうやらカスタムROMのBLE周りに不具合があったようです。
デバッガー周りの挙動もおかしかったのでカスタムROMの完成度があまりよろしく無かったということのようでした。
けどTargetAPIを上げるとアプリが落ちる挙動は変わりませんでしたね……。
(追記ここまで)

なので、ここら辺をすっきりさせてからリリースすべきという意見もあるかとは思うのですが一旦TartgetAPI22で粘るのはこのバージョンまでという形で整理をして、次のリリースではTargetAPIを進めてAndroid13対応をしたいと思っています。
その際に過去機種で若干扱いやすさが後退してしまうケースが出てしまうかもしれません。そういう危惧があるのでリリースを分けさせていただきます。
なお、現時点でAndroid13対応をどうすれば良いのか筆者は全く分かっておりませんので少々お時間掛かるかもしれません。
少なくともBLE接続関係以外にも対応必須な課題があることは確認しています。フォアグランドサービス関連や通知関連、権限関連など。
ただ、現状Android13のカスタムROMではAndroid Studioのデバッガが機能しない状況に陥っていまして、そもそもこの現象をどうしたら解決できるのか、というところからになってしまうので前途多難ですので解決が相当先になってしまう可能性があります。

申し訳ありませんが当面Android13以上での動作は困難とお考えいただければと思います。

※以前の説明はこちら
毎度ゴメンナサイ。m(__)m
いい加減たまには使用方法とかまとめないとなあ、とはちょくちょく思うのですが、こうして変更点書くだけで毎回結構な量になってしまってとてもまとめなんかした日にゃあ薄い本が分厚くなるのでその他既存の機能についてはこちら
UfoTwCtrl Ver2.00 U.F.O. TWを左右別々ランダムコントロールアプリ
UfoTwCtrl Ver1.20 U.F.O. TWをBluetoothで左右独立ランダム制御するアプリ
UfoTwCtrl Ver1.10 U.F.O. TWをBluetoothで左右独立ランダム制御するアプリ
UfoTwCtrl V1.0 U.F.O. TWをBluetoothで左右独立ランダム制御するアプリ
の過去記事をご覧ください。

筆者のへんてこなコダワリにより、200KB弱の小さいアプリながらも機能がアホみたいにてんこ盛りなので、もっと使い込んでみたいと思われた奇特なお方(ほめことばよん♥)は過去記事の説明もご参照ください。
きっと文量に圧倒されて見る気を失うことでしょう。わはは。

ダウンロードファイル

勝手な再配布はしないでください。
また、このファイルのみへの直接リンクを貼ることもご遠慮ください。
特に、うちのサイトは弱小なので、検索で上位に表示されるサイトに勝手にコピーされると、盗まれたのとほぼ同じ状況に陥ります。
何かしらの問題が発覚して、こちらのサイトでファイルを差し替えても、それが皆さんの元には反映されなくなることにも繋がります。

諸事情によりアプリの無料配布を終了致しました。
今後は活動を支援してくださる方とのみ細細と共有していければと思います。

今後のUfoCtrlアプリ配布ページはこちらです。
UfoCtrl Ver1.00 (UfoCtrl開発活動支援プラン)

設定ファイルを何かしらイジったことがある場合は単純に上書きインストールするだけですと今回変更した設定は反映されないかもしれません。
その場合は設定画面で右上のメニューを開き『RecoveryBasicData』をタップしてください。
すると今回の規定の設定になります。(ということはそれまでの設定が上書きされてしまうので事前に退避するなりしておいてくださいね。

アップデートインストール後に動作がおかしくなった場合は再起動してみてください。
それでもおかしい場合はキャッシュのクリアや一旦アンインストールしてからインストールし直してみてください。
その際、設定を書き換えている方はその設定が消えてしまいますので、操作をする前に設定の退避(テキストファイルなどに移して保存)をしてください。

2023-07-26

この記事のタグ

U.F.O.

TW

アプリ

制御

電動

自作

チクニー