U.F.O. SA/A10サイクロンSAコントロールアプリPro版Ver.1.00

U.F.O. SAやA10サイクロンSAを独自パターンでコントロールできるAndroidアプリUfoSaCtrlがより自由にカスタマイズできるPro版になりました!

更なるチクニー/オナニー環境の向上を目指して、より突き詰めた制御をしたいと思っている方がそれなりにおられそうな感じがいたします。
拙作アプリのパラメータ指定を外部から行えるようになれば、プログラミングの心得が無くてもその夢は叶えられる。
そこで、UfoSaCtrlのコントロールエンジンで使用しているパラメータのほぼ全てを外部から指定可能なように改修しました!

このアプリの対象となる製品はこちらです。

一体どこがProなのか? アプリがProというよりも、使用者の皆さんがProになっていただく必要がある。そんな、不親切なアプリです。(^^ゞ
しかし、しか~し! カスタマイズ可能な部分を大胆に拡張! 筆者が作成したコントロールエンジンのパラメータを自在に変更できますので、全て自作の制御パターンを追究しても良し、ランダムパターンの改良を追求しても良しという自由度の高いアプリになりました。

UfoSaCtrl (Pro)ってこんなアプリ

UfoSaCtrl、および、今回初公開のUfoSaCtrlProはBLE(Bluetooth Low Energy)に対応したAndroid機からU.F.O. SAやA10サイクロンSAをリモートでコントロールできる野良アプリです。

元々は独自のランダムパターンでコントロールして、基本的に人間はON/OFFだけをすれば良いようにして、よりオナニー/チクニーに没頭できるようにしたい、という思いで開発しました。
そのため、ランダムで動作する「Step」「Gradual」「Composite」という3つのモードとVolume(強さ/速さ調整)、後はその設定を即時反映して動くか(Immediately)、画面をOFFにしたときに動くようにするか(Start when LCD turnOff)切り替えられるボタンだけを装備していました。
「Step」は階段状に速度変化するモード。いくつかのSpeedPatternと速度維持する時間TimePatternの組み合わせをランダムで選択し、状態変化させていきます。
「Gradual」は速度変化をさせていくときに滑らかに変化させていくモードです。
「Composite」は「Step」と「Gradual」をランダムに選択してゆく混合モードです。

UfoSaCtrlV4.0でエンジンもUIも大幅改修して現在とほぼ同じ形になりました。
UfoSaCtrlV6.0で動作指定モードを追加して、ランダム制御だけでなく使用者の自由に制御できるようにもなりました。
今回のUfoSaCtrlProでは動作指定モードの設定を従来の最大3つから最大10個に大幅増強。UIも一部改修して、コントロールエンジンのパラメータのほとんどを外部から指定できるようにして自由度を飛躍的に向上させました。
なんと、ランダム制御の方まで手を入れることが可能。ランダム制御もより好みの動きになるように調整が可能になりました!

正直、自由度が高過ぎて、使いこなすのには骨が折れると思いますが、追究したい方の要求に応えられるかとは思います。
その一方で、特に設定を弄らなければUfoSaCtrlV4.0の頃とほとんど同じ「Step」「Gradual」「Composite」の3つのランダムパターンが使用できますので、初心者の方でもインストールしておいて害はありません。

あと、これは作者が不勉強だったので申し訳ないのですが、今回のProで大幅にアプリのサイズが小さくなっています(約60KBと約1/10に)。
これはUIを色々と試行錯誤している間に導入していたライブラリが結果的に不要になっていたのにも関わらずずっと含まれていたためです。
(そのライブラリとはAndroidのバージョンが違う機体でも同じUIを提供できるようにするGoogle謹製のものであって、決して悪さをするものではないのでご安心ください。Appcompatです。)
約500KBほどですがストレージを無駄に食ってしまってすみませんでした。m(__)m
ちなみに従来のUfoSaCtrlと共存可能です。なんと同時起動も可能みたいです。1台のAndroidで2台のU.F.O. SAやA10サイクロンSAをコントロールすることもできなくないみたいです。(うちでは2台のU.F.O. SAを個別に動かすことができました。)

アプリサイズもググッと小さくなりましたので、こそっとインストールしておくとイザというときに捗ります。
BLE対応は少なくともAndroid4.3以上です。Bluetooth4.0と混同されがちですが厳密には違うものですので、Bluetooth4.0以上だからといって100%BLE対応であるとは限りません。まぁ、対応していなかったらアプリ実行時に対応してないよというメッセージを残して終了するようにはなっています。(それ以前にインストールできないかもしれませんが)

まずは見てみよう

UfoSaCtrlProスクリーンショット1

ふーむ、特に変わった様子は見られない、しかし、ボタンを長押ししても設定画面に遷移しませんね。

おや? 右上のメニューに「Settings」が追加されてるぞ?

UfoSaCtrlProスクリーンショット2 設定画面

切り替えボタンとか無くなってるね。

んで、また右上になんかある。
試しに「RecoveryAdvancedData」をポチッとしてみましょう。

UfoSaCtrlProスクリーンショット3 AdvanceData

なんか小難しいのがダラダラ出てきた。

とりあえず、一旦戻ってみましょうか。

UfoSaCtrlProスクリーンショット4 Advance画面

な、な、な、なんじゃあこりゃあ~!!

ボタンが13個も! 色がケバい!

「落ち着いてユーザーさん。これは、あくまでも設定例を示しただけのもの。これだけ自由度があるという見本なのですよ」

そ、そっか、そうなのか。
しかし、よく見るとVolumeを選択できる左側の数字、0の上が8じゃなくて5になってるよね。こんなところも変えられるのか……。

あ、しかも、ボタンのサイズも変わってるよね?

比べてみましょう。

UfoSaCtrlProスクリーンショット6 Basic Advance比較画面

ほら、サイズが変わってる。

そうなんです。
ボタンのサイズや色が自由に設定できるだけでなく、不要なボタンは非表示にも出来る、それが今回のUfoSaCtrlProなんです。

従来のCustomと同じにする設定方法

「これじゃあ、一気に複雑になり過ぎて良く分かんないよ」
そうですね。それではまずは、従来の3つのボタンを全てCustomにしたのと同じ状態を再現してみましょう。

まずは「Settings」で文字がいっぱい出てきた設定画面に移動してください。
「RecoveryBasicData」を押して、一旦元のシンプルな文字列の状態に戻してくださいね。

んで、これです!

UfoSaCtrlPro Custom説明

「1,1,1,0,0,0,0,0,0,0,0,0,0」とは最初の3つランダムパターンである「Step」「Composite」「Gradual」のボタンだけを高さ比1:1:1の割合で表示する、という意味です。
これを「0,0,0,1,1,1,0,0,0,0,0,0」と書き換えると動作指定パターンのボタンを3つ表示できるようになります。
このカンマ区切りの4番目以降は動作指定パターン用で最大10個の動作指定パターンボタンを登録することができます。

ボタン名の指定は「Step,C……」となっている行の4番目から好きな名前を入力してください。(当然のことながら","(カンマ)は区切りと見做されますので名前に使えません)

色の指定もできます。左の画面例では4番目以降全て「red」となっていますが、ここに書ける値は#RRGGBB(RGB各16進数)形式とそれに透過率追加された#AARRGGBB形式。あと、Androidで定義されている色名称が指定できます。
(red,blue,green,black,white,gray,cyan,magenta,yellow,lightgray,darkgray,aqua,fuchsia,lime,maroon,navy,olive,purple,silver,teal)
あとは[と[の間に従来のUfoSaCtrlで記入していた「11,22,s」等の動作指定文字列を入力してください。(1つ指定ごとに改行してね)

これでメイン画面に戻ってみると、動作指定の3つのボタンだけが表示されて動作できる状態になります。

指定ファイルの書き方

それでは、UfoSaCtrlProで設定できる全項目の解説です。
まずは例を見ていただいて、それから、各項目を解説させていただきます。
この例はアプリに仕込んであるAdvancedDataと同じものですので、アプリで「RecoveryAdvancedData」メニューを選択して呼び出してそちらを見てもらっても良いかと思います。
頑張って付いて来てくださいね。♥


[SpeedOffset: int(0~100): 2要素必須 通常,減速時]
10,1
[MaxVolume: int(1~100): Speed * Volume + Offset が100を超えないように注意]
5
[SpeedPattern: int(0~100): 要素数は自由(ランダムに選ばれる)]
0,2,5,7,9,11,18,13
[TimePattern: int(1~): 要素数は自由(ランダムに選ばれる) 単位100msec]
7,11,16,22,29,37,46,2,62
[SpeedDisplacementThreshold: int(0~100): 似たようなSpeedを続けないため最低限変化すべき量を指定]
4
[TimeIndexLimit(Step): int(1~): 要素数はSpeedPatternと合わせる 各数値はTimePattern要素数以内とする]
6,8,9,7,5,4,3,4
[TimeIndexLimit(Gradual): int(1~): 要素数はSpeedPatternと合わせる 各数値はTimePattern要素数以内とする]
6,8,9,7,5,3,1,3
[WidthWeight:int or float(0~) 2要素必須 画面左右分割比]
3,4
[LeftSideButtonHeightWeight:int or float(0~) 2要素必須 画面左側のVolumeとボタンの高さ比]
3,2
[RightSideButtonHeightWeight:int or float(0~) 13要素必須 画面右側のボタンの高さ比(不要なボタンは0で非表示)]
1,1,1,1,1,1,1,1,1,1,1,1,1
[RightSideButtonName:String 13要素必須]
Step,Composite,Gradual,Custom0,Custom1,Custom2,Custom3,Custom4,Custom5,Custom6,Custom7,Custom8,Custom9
[RightSideButtonColor:String 13要素必須 透過#AARRGGBB指定OK,色名称も以下可red,blue,green,black,white,gray,cyan,magenta,yellow,lightgray,darkgray,aqua,fuchsia,lime,maroon,navy,olive,purple,silver,teal]
#3953f7c1,cyan,magenta,yellow,aqua,fuchsia,lime,maroon,navy,olive,purple,silver,teal
[Custom0Data]
11,11,s
0,22,s
-11,11,s
0,22,s
[Custom1Data]
11,11,g
-11,11,g
[Custom2Data]
11,11,s
0,16,g
-11,11,g
0,16,s
-11,11,s
0,16,g
11,11,g
0,16,s
[Custom3Data]
11,11,g
-11,11,g
[Custom4Data]
11,11,g
-11,11,g
[Custom5Data]
11,11,g
-11,11,g
[Custom6Data]
11,11,g
-11,11,g
[Custom7Data]
11,11,g
-11,11,g
[Custom8Data]
11,11,g
-11,11,g
[Custom9Data]
11,11,g
-11,11,g
[DataEnd]

各設定項目の影響範囲

設定項目は制御エンジンの根幹から画面関係まで多岐にわたります。ここでどの設定がどの範囲に影響するか整理しておきましょう。
[SpeedOffset][MaxVolume]は制御全体に関わる影響大の設定項目です。
[SpeedPattern]~[TimeIndexLimit(Gradual)]はランダム制御のみで使用するパラメータですので、動作指定でしか使う予定の無い方はすっ飛ばしていただいて結構です。
逆に最後の[CustomData]合計10個書きますが、ランダム制御でしか使う予定の無い方は放っておいて良い項目です。
画面関係では[RightSideButtonHeightWeight]がボタンの大きさだけでなく表示/非表示のコントロールにもなる(当然非表示のボタンは押せなくなる→その設定は選択できなくなる)なので重要項目です。

設定項目ランダム制御動作指定
SpeedOffset
MaxVolume
SpeedPattern-
TimePattern-
SpeedDisplacementThreshold-
TimeIndexLimit(Step)-
TimeIndexLimit(Gradual)-
WidthWeight画面関係
LeftSideButtonHeightWeight画面関係
RightSideButtonHeightWeight画面関係
RightSideButtonName画面関係
RightSideButtonColor画面関係
CustomData-

SpeedOffset

U.F.O. SAやA10サイクロンSAのコントロールはモーターへの出力指示だけで成立させています。どちらの方向にどれくらいの速さ(強さ)で回転させるか。その値は-100~+100。0が停止状態で、±は回転方向の違いを表します。-100および100がフル回転です。

新品無負荷状態であれば±1のような超弱い指定でも動作するのですが、バッテリーの劣化や駆動部劣化による抵抗の増加、実使用時には乳首も抵抗になりますので、あまりに弱い指定だとモーターの力が負けて唸っているだけという状況に陥ります。
この状況は異常に発熱したりしてあまり好ましいものではないため、UfoSaCtrlの方であまりに弱い指定はしないようにすっ飛ばそうというのが最初の設定[SpeedOffset]です。
2つ数値がありますが、通常は1つ目の数値が適用されて、動作するときには常にこの値が上乗せされて動きます。

2つ目の数値は減速時専用で、徐々に弱くなって停止したり反転したりするような動きをするときはこの値になるまで減速を続け、それから停止なり反転なりします。
(UfoSaCtrlでは独自にエンジンを組んでいて、指定した速さに即時反映するモードStepと、指定した速さに徐々に近づけていくモードGradual、そして、その両者をランダムに混合したCompositeという合計3つのモードを持っています。Stepには無関係でGradualで速度が0に近付いていくとき専用の設定です。)
例えば上記例の10,1としている場合、徐々に減速して反転する動きは
12→11→10→9→8→7→6→5→4→3→2→1→0→-10→-11→-12…
という具合に遅くなっていくときだけ2つ目に指定した値になるまで粘ります。
停止状態から動かすのには大きな力が必要ですが、動いている状態から停止に向かっているときは大きな力は必要ありません。
12→11→10→0→-10→-11→-12…
でも良いのですが、より滑らかな変化が感じられるのは上記の方でしょう。そのために2つ目の数値が指定できるようになっています。

MaxVolume

UfoSaCtrlでは出力する数値の算出を
Speed × Volume + SpeedOffsetで算出しています。
既に出てきたSpeedOffsetの値と、この後出てくるSpeedの値によって、算出した値が-100~+100の範囲に収まるように最大ボリュームを指定する必要があります。ここはその値です。
上記例ではSpeedOffsetが10、Speedの最大値を18としていますので、18×5+10=100ということでMaxVolumeは5にしています。
ちなみに出力数値が-100~+100を超えると確か無視されたと思うのですが、いずれにしろ想定外の動きになってしまいますので、収まるようにしてくださいね。(算出結果が範囲に収まっているかどうかのチェックはUfoSaCtrlではしていません。)

SpeedPattern

ランダム制御するときのSpeedは完全ランダムではありません。完全ランダムだと本当につまらないパターンが連続する場合があるので、期待するランダム感とは別物になってしまうのです。
そこで、UfoSaCtrl(Pro)ではあらかじめSpeedの候補値を幾つか用意していてそこからランダムに選択するようにしています。それがこのSpeedPatternです。

ここに書ける数値の個数に制限はありません。欲しいパターンの数だけカンマ区切りで記入してください。
出力数値が-100~+100に収まるように気を付けながら。
0はランダム制御に停止状態も含めたいときに書いてください。
特に小さい順に書く必要もありません。

回転方向は別にランダムで決定しますので、±の両方を書く必要はありません。逆にマイナス値を書いても(多分)動きます。ランダムで決定される回転方向が逆になるだけです。
同じ値を複数書くのも(多分)大丈夫です。同じ値を複数書く意味は確率を上昇させたい場合ですね。このSpeedは沢山選択されたいという場合に複数書くと良いかと思います。

TimePattern

時間の制御も上記SpeedPatternと同様に、幾つかの候補値を用意しておいてそこからランダムに選択するようにしています。それがこのTimePatternです。

こちらも個数制限なし、いくつ書いても良いです。これはどれだけの時間その状態を維持するかという値を書きます。
単位は100msec。10で1秒になります。
これは徐々にスピードを変化させているときの時間を含めません。そのスピードになってからどれだけ同じスピードを維持するかを表します。

こちらは必ず正の値で。
同じ値を複数書くと選択される確率が上がります。

SpeedDisplacementThreshold

さて、ランダム制御といっても本当にただのランダムだと嫌になる場合があります。それはあまりにも似たようなSpeedばっかりが選択されてしまう場合です。ランダム感を演出するには似たようなSpeedが連続しないようにした方が良いのです。
そこで、ここに書いた数値以上の変化が無いPatternは選択しないというロジックを組んでいます。
上記の例では「4」ですね。
SpeedPatternに書いてある2→5は3しか変化しないので、2で動いている状態から5に切り替わることはありません。
しかし、回転方向が逆ならば2→-5で7の変化があるので、この状態には切り替わることがあります。
特例として、Speed0(停止状態)が選択された場合は差を気にせずに停止状態に移行します。2→0はあり得るということです。

TimeIndexLimit(Step)

さて、ここから更にややこしくなります。
TimePattenの選択がどのSpeedであっても同じ候補値からの選択になるのは若干イケてないランダムパターンが発生し得る原因になります。
一般論的にはあまり速いSpeedのときに長いTimeが選択されてしまうとしんどいですね。また、Speed0停止状態が長く続くとBluetooth接続が切れたのか、アプリが異常終了したのか不安になってチクニーどころではなくなってしまいます(これは開発者だけの悩みかもしれませんが)。
そこで、選択されたSpeedによってTimePattenの候補をあらかじめ絞ってしまおうというのが、この項目の主旨です。

ここに書く数値の個数はSpeedPattenに書いた個数と合わせてください。各数値と一対一対応するものになります。
そして、書く値はTimePatternに書いた個数以下に限定されます。(それ以上の数値を書くと異常終了します)

上記の例で最初の数値は6となっていますね。
最初のSpeed0が選択されたときに、TimePattternは書かれた最初から6つ目までの値「7,11,16,22,29,37」の中から選択されるようになります。「46,2,62」は使われません。
7つ目に書いた値だとSpeedが18と速く、TimeIndexLimit(Step)に書いた値は3ですから、TimePatternの「7,11,16」の中から選択されることになります。
つまり、速いSpeedでは長い時間が選択されないようにしているんですね。

SpeedPattern02579111813
TimeIndexLimit68975434
TimePattern「7,11,16,22,29,37」の6つからランダムに選択される同じノリ「7,11,16」の3つからランダムに選択される

TimeIndexLimit(Gradual)

これはすぐ上のTimeIndexLimit(Step)と概念は同じですが、じりじりと速度変化していくGradualモードのとき専用です。
どうしてわざわざ分けているのかというと、Stepはいきなり指定した速度になるのですが、Gradualは少しづつ指定した速度に近付いていくので、その分変化に時間が掛かります。なので、その速度に到達してから余り長い時間その速度を維持されていると「ランダムのくせに変化に乏しくてタルい」という感想になりがちです。そのため、Gradualのときにはより短くできるようにと設定を分けました。

SpeedPatternと対になっているので、同じ個数書く。その数値はTimePatternの個数以下という制限も同じです。

WidthWeight

小難しいところが一旦過ぎてホッと一息。画面表示の設定です。

UfoSaCtrl(Pro)のメイン画面は左右2つに分割されていますね。その幅を指定できます。
各数値は比です。同じ数値にすれば左右の幅は均等になります。より大きくしたい方に大きな値を書けば良いことになります。
悩んだらとりあえず1:1のままで良いんじゃないかな?
何気に小数も書けるらしいです。

0にしちゃうと表示されなくなるので注意!

LeftSideButtonHeightWeight

メイン画面左側のVolumeとトグルボタン(「Immediately」と「Start when LCD turnOff」の切り替えボタン)の高さの設定項目です。
上記と同じく比です。

RightSideButtonHeightWeight

メイン画面右側のボタンの高さを決めます。上記と同じ比です。
が、ここでは使用しないボタンは0にすると非表示にできますので、0を積極的に活用しましょう!
数字の順はボタンの上から順です。
最初の3つはランダム制御用のボタン、後ろ10個が動作指定用ボタンです。

RightSideButtonName

メイン画面右側のボタンの名前を設定できます。
ボタンを非表示にしていたり、名前なんて要らないやという場合は名前無しでも良いのですが、プログラムの作りの都合上","カンマを12個、そして、最後にはなんかしらの文字を1つで良いのでダミーでぶっ込んで置いてください。
もちろん、最後のボタンにちゃんとした名称を設定する場合はダミー不要です。

本来ならダミー文字なんか書かなくても良いようにするのが開発者の義務だとは思うのですが、費用対効果が薄いので甘えました。
要するにカンマで区切って文字列が(途中が空でも)13個必ず在るという状況にしておきたいのです。

あ、あと、カンマ区切りなのでボタン名称にカンマは使用してはいけません。どうしても使用したかったら全角のカンマを使用してください。

RightSideButtonColor

メイン画面右側のボタンの背景色を設定できます。
ここは表示/非表示に関わらず、必ず色指定をしておく必要があります。
16進数6桁で色をあらわす#RRGGBB指定に、透過率も含めて16進数8桁とした#AARRGGBB、そして、Androidで定義されている色名称(red,blue,green,black,white,gray,cyan,magenta,yellow,lightgray,darkgray,aqua,fuchsia,lime,maroon,navy,olive,purple,silver,teal)を使用することができます。
一番短いのがredなので、非表示のボタンはredってしとくと多少面倒さが軽減されます。(^^)

CustomData

Custom0Data~Custom9Dataは動作指定のパターンを記述します。
ここはランダム制御ではなく、完全に指定した動作での動きとなります。
何行でも書けて、1行には3つの要素
Speed,Time,StepかGradualか
をカンマ区切りで書きます。

例えば、
17,30,s
と書くとSpeed17で時間は3秒間、すぐにそのSpeedにする(Step)ということになります。次に
-5,10,g
と書くとSpeed17の状態から-5(反対方向のSpeed5)に徐々に変化(Gradual)させていってSpeedが-5になったらその状態で1秒間維持というふうになります。

このとき、設定の上2つにあった[SpeedOffset][MaxVolume]の影響を受けますので、それを考慮のうえで動作指定してください。
実際に出力する値は
Speed × Volume + SpeedOffset
になります。これが100を超えないようにしてください。
(100を超えても想定外の動作になってしまうだけではありますが。)
あるいは、計算上100を超えてしまう場合があったとしても、低いVolumeしか使わないなど使用方法で100以内に収めるようにしてもOKです。(特にエラーチェックとかはしてませんし、値制限ロジックも組んでません。)

何行でも書けるので非常に複雑な動作パターンを記述することができます。
一方で、逆に何行で終わりなのか、区切りがどこなのか明確にしなければなりません。
最初が"["で始まる行、そこを区切りとみなしています。
使わないCustomDataはデータ無しでも良いので必ず10ボタン分定義してください。
つまり、"["で始まる行が10個必要です。

そして、設定全体の終了を示す行も必要としていますので、合計11行"["で始まる行を必要としています。
BasicDataで"["の行が11行あるのはそのためです。

このCustomDataは記述したものの最後まで動作し終えたら最初に戻ります。OFFにするまで自動でループする仕様です。

仕組み、超面倒なんだけど……

それじゃあ、とりあえず、一番上の行を
0,0
にしましょうか。
あとはCustomDataのところにひたすら
数字,数字,s
を書いていく、最初の数字がSpeedで-100~100。次の数字が時間で10で1秒。
これで素でダイレクトにSpeedコントロールができます。
あとは頑張ってそのCustomDataのボタンを表示して、Volumeは0か1しか選ばないように気をつける。
これで行きましょう!

その他の制限事項等

記載順序の変更はできません。
空行はどこに含めても(多分)大丈夫です。
[CustomData]が始まるところまでは"["で始まる行を読み飛ばしますのでコメントを書きたかったら"["で始めてください。
(AdvancedDataでそういう書き方をしていますので参考にしてください。)
[CustomData]以降でも区切りに使っている"["で始まる行には好きな文言を書けますのでコメント行として利用できます。

設定の途中で勝手な改行を含めないようにしてください。
[CustomData]が始まるところまでは各項目を1行で書き切る必要があります。
[CustomData]では1つの動作を1行で書く必要があります。(1行に必ずカンマ区切りで3つの要素を書く)

16KBまでというサイズ制限があります。
相当[CustomData]を書き込まないとなかなか16KBというサイズを超過することはないとは思いますが、もしサイズ的に危なくなったらコメントや空行を減らす、特に全角文字を減らすなどして工夫してください。
(16KBを超える方が結構いらっしゃるようでしたら、アプリの方で拡張検討します。ただし、この制限を大きくすると設定画面のレスポンスが悪化します。)
ほぼ最小のパターンがBasicDataですのでご参考ください。
ちなみにBasicDataで221Byte(約0.2KB)、AdvancedDataで2KB弱といったところです。

エラーチェックは最小限にしかしていませんので、書き方が悪いとメイン画面に戻る際に設定登録エラーで異常終了したり、動作を開始させてから異常終了したりします。
また、運良く異常終了しなくても想定通りの動作がしない原因になりますので、書き方にミスが無いかどうかは常に気にしてください。この辺りは完全にユーザーさんに頼ってしまっています。(逆に言うとこんなところをキッチリエラーチェックなんてしたらアプリとして成立しない→結局自由に設定できるようにするのやっぱ止めた~、という結論に逆戻りです。詳細なエラーチェックを省くがゆえに提供できるようになった自由とご理解ください。m(__)m)

セーブ/ロード機能について

BasicDataやAdvancedDataを呼び出すと現在記述されている設定が上書きされてしまいます。そこで、現在の記述をセーブできるようにメニューにセーブ/ロード機能を追加しています。
#1~#3と3つセーブできます。冒険の書みたいな感じですね。

セーブデータを呼び出す前に今の設定を保存しておきたい場合はセーブしておいてください。
ただし、これはアプリの保存領域内に保存するだけですので、アプリをアンインストールしたりアプリのデータを消去したりすると消えてしまいます。
ですので大事なデータは全コピーして他のテキストエディタ等に貼り付けて別途ファイルに保存すると良いでしょう。
ファイルを直にセーブしたりロードしたりといった機能は……ごめんなさい、エライ大変そうなのでちょっとペンディングで。m(__)m

あ、AdvancedDataは上記に貼りましたので、BasicDataも参考のためここで貼っておきましょう。
BasicDataは今までUfoSaCtrlで使用してきたパラメータそのまんま。つまり、UfoSaCtrlProでもほぼ同じランダム制御をしてくれる設定データです。


12,8
8
0,2,5,7,9,11
4,7,11,16,22,29,37,46
5
5,8,7,6,5,4
5,3,4,5,4,3
1,1
2,1
1,1,1,0,0,0,0,0,0,0,0,0,0
Step,Composite,Gradual,,,,,,,,,,D
#009900,#990000,#000099,red,red,red,red,red,red,red,red,red,red
[
[
[
[
[
[
[
[
[
[
[

物凄く硬いスルメですが、是非しゃぶってみてください。(^^)

GradualのSpeed制御を改良しました

今回のPro版開発に当たり、新たな発見がありました。
それは、100msec単位でどんどんとデータ送信を続けるとU.F.O. SA側が受信できずに取りこぼす現象が発生する、ということです。

皆さん、UfoSaCtrlを使用していて、停止しないことがたまにある、って思ったことありませんでしたか?
しかも、停止しないときは必ずGradual、徐々に速度変化させているときに停止させようとしても止まらない、って気付かれました?
実は筆者、この現象を結構気にしていました。
筆者は基本的にCompositeパターンしか使っていません。後はON/OFFしているだけなのですが、どうにもOFFで止まらないケースがある。
改めてボリュームを変更したりImmediatelyとStart when LCD turnOffを切り替えたりすれば止まるので、止まらない時はそのように対処していました。
一方で、皆様にはBluetooth通信は不確実、と言って誤魔化してきました。(実際、U.F.O. SAとの接続が切れてしまうこともあるので、嘘を言っているわけではないのですが)

そもそも、メーカー謹製のツールでも時間指定は100msec単位ですよね。それで、UfoSaCtrlでもそれに倣っていたのですが、連続して何回も送信すると5割くらいの確率で受信漏れを起こすようなのです。
速度変化させているときは1個受信漏れを起こしても次のデータが反映されればリカバリーできますし、動きとしても気になるほどの誤差は発生しません。
しかし、停止時だけは別です。
停止の情報が受信漏れを起こすと動きっぱなしです。
今までのUfoSaCtrlではこれがよく発生していました。
え? うちのは起こんないよ、って?
その方はStep主体で動作させている方でしょう。速度変化を起こさないときは送信していませんので、送信間隔が非常に空くStepではほぼ発生しない現象です。逆にGradualやCompositeを多用する方は結構経験していたのではないかと思います。
筆者もこの点が結構気になっていて、停止の情報だけは2回送信するようにしていたりと工夫したつもりだったのですが、そもそもU.F.O. SAやA10サイクロンSA側の方がお腹いっぱいで受け付けられないところに余計に情報送ろうとしても受け付けてもらえない、というオチだったようです。

そこで、どれくらいの間隔だったら全ての送信を受け付けてもらえるのか、全てという条件だとなかなか難しいです。一旦は200msecなら大丈夫かと思ったのですが、200msecでもたまに発生する。
なんか、こう、U.F.O. SAからbusyって返答がうわーっと返ってくることがあるんですね。「もう、こっちはいっぱいいっぱいやねん!」って声が聞こえきそうです。(今までその声に筆者は気付いていなかったんですけど(^^ゞ)

160msec辺りでも大半は受け付けてもらえるようにはなるのですがまだ受信漏れが目立つ、180msecでもたまに受信漏れを起こします。あまり伸ばし過ぎても制御が荒くなってしまいます。
200msecなら取りこぼしはまれなので、これで行こうと思いました。

一旦は速度変化そのものを200msecごとに起こすように(変化の速さが2倍遅くなる)改修してみたのですが、Gradual制御の変化がタルく感じてしまうし、何より従来のデータが異なる動きになってしまうので、データ互換性も無くなってしまいます。

そこで、速度変化は従来通り100msec毎にしておいて、送信頻度を半分に間引くという形で解決を試みました。
厳密に2回に1回間引いているわけではありません。例えば、10→19に変化するとき、厳密に2回に1回としてしまうと12,14,16,18と送信して19が送信されなくなってしまいます。9→0だと7,5,3,1で停止しなくなってしまいますよね。
なので、ちょっとその辺りは細工しつつ、だいたい半分に間引いたとお考えください。

それにしても、うーん、そっかあ、100msec間隔じゃあU.F.O. SAやA10サイクロンSAの処理が追い付かないんですね。
あ、ちなみに動作指定でも100msec間隔での送信を連発したら同じように受信漏れ起こしますので、あまり連続変化するようなデータ書かない方が良いと思います。
例えば、
10,1,s
15,1,s
17,1,s
18,1,s
って書くんだったら
10,2,s
17,2,s
ってした方が確実に動きます。変化の段差がやや荒っぽくはなりますが、そもそもU.F.O. SAやA10サイクロンSAってそんなに精密な機械じゃないので、こんなに細かく指定すること自体あまり意味がありませんです。はい。

しかし、今回この現象に気付けたことでかなり安定した制御ができるようになったのではないかと思っています。
逆に、メーカー謹製のツールなど、他の制御ツールを使う際にも頻繁過ぎる速度変更はなるべくしないように気をつける、というようにこのノウハウが活かせるのではないでしょうか。

書き漏らしたこと

過去記事にも書いているのですが、軽くさらっておきますね。

UfoSaCtrlもUfoSaCtrlProも画面OFF時にも動作するように作っているためサービスにしています。アプリを終了させる際は必ずアプリが画面上部の戻る"<"印か、Backキーを押して終了してください。他の画面を呼び出すだけだと裏でサービスが動きっぱなしになってしまいます。U.F.O. SAやA10サイクロンSA側の電源を切っても、延々と探し続けるためAndroid側のバッテリー消費に悪影響が出ます。
サービスが動いているときは通知が出ていますので確認してみてください。

メーカー謹製のVorzePlayerを使用している場合はそのままではUfoSaCtrlおよびUfoSaCtrlProは正常に動作しません。
というのも、VorzePlayerは一度起動するとちゃんと終了しません。裏に隠れて動き続けているようです。そして、それに邪魔されてしまうのでUfoSaCtrlはフリーズしたかのように固まってしまいます。
これは例えばVorzePlayerを起動した後ホーム画面に戻ってランチャーからVorzePlayer起動しても同様で、先に起動したVorzePlayerが裏に隠れて動いているまま多重起動になってしまうので新たに起動したVorzePlayerが正常に動かないという状況に陥ります。
アプリの強制終了をするしか終了方法が無く、強制終了のやり方が分からない方は再起動するしかありません。
もちろん、インストールしていても起動さえしていなければ問題ありませんので、VorzePlayerを起動したら強制終了か再起動、宜しくお願い致します。(2017/11/09追記:もしかしたらこれらの現象はVorzePlayerのバージョンアップにより発生しなくなったかもしれません)
UfoSaCtrlおよびUfoSaCtrlProは上記の通り、戻る選択をして終了させればちゃんと終了しますのでご安心ください。

BLE通信の調子が悪くなってきた場合はBluetoothを一旦オフ・オンし直してみたり、再起動してみたりしてください。

既にUfoSaCtrlを使いこなしている方はご存知かと思いますが、画面表示されているときに、ハードキーのボリューム上下ボタンでボリューム上下できます。画面OFFになっているときはAndroidOSの制限により反応しません(音量コントロールとか特定の用途にしか使えないようにされてるんよ)

なお、Android6.0以上の機種では位置情報(GPS)をONにしないとBLE通信が接続できない場合があります。アプリとU.F.O. SAやA10サイクロンSAの双方とも起動しているのに一向に接続されないという場合は位置情報の設定を疑ってみてください。

あと、BLE通信は非常に微弱で不確実な通信です。指向性もありますし、人体が遮るだけで通信失敗に陥ったりもすることがあります。
その辺は環境やAndroid機にもよりますので、繋がりやすい状態というのは各自で探っていただく必要があります。
U.F.O. SAの方にも受信しやすい角度、しにくい角度というものが存在します。繋がりが悪いと感じたらそちらも疑ってみてください。

もし、停止させたつもりが停止しないという状況が発生した場合は、ご面倒ですが、他のボタンを一回押してみたりボリュームを上下させてみたりしてください。改めてSpeed0を送信しますので、そこで止められます。

U.F.O. SAの受信感度

「各自で探れ」だけだと不親切なので、例を示しておきますね。

U.F.O. SA 感度良好状態

深緑の丸の中に白文字で「-36」という値が見えますね。
これ、0に近い方が受信感度良好(電波が強い)という状態です。
この写真の例はほぼ最高に良い状態です。
そりゃあ、これだけ近ければねぇ、って思うでしょ?

ところが、……

U.F.O. SA 感度不良状態

見えます?「-65」!
近接してるのに-65ってかなり悪い数値です。
実はこの角度近辺はU.F.O. SAの不感帯です。こちら側にはなにか受信妨害する板でも貼っているのだろうかと思うくらい数値が悪くなります。

これで距離を離すとあっという間に数値が悪化。
-75とか-80とかのレベルになると実使用でも接続が不安定に。よく見失うようになります。

ですので、Android機の位置と方向。U.F.O. SAの位置と方向。双方の相性を上手いこと探って良好な通信状態で使用できるよう工夫してみてください。

筆者もしばらく経つとつい忘れてしまって、「なんか調子悪い、なんでだ!?」って今回のPro版開発テストで悩んでいたのですが、このことがすっぽり頭から抜け落ちておりました。
(特にこの写真にも写っているFLEAZ F4はあまりBluetoothの性能良い方でないようなので)

ダウンロードファイル

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

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

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

ブログに無理矢理載せている都合上、ちょっと特殊なダウンロード形式にしているので、Androidの標準ブラウザではダウンロードに失敗するかもしれません。Chromeなら大丈夫みたい。ブラウザをある程度選んでしまうようです。ご了承ください。

最後に

アダルドグッズや同人コンテンツなどをご購入の際にはこのサイトのリンクを踏んでから購入していただけると、いくばくかの紹介料をいただけるので筆者が大変助かります。
このアプリや筆者の作成コンテンツが役に立ったとか面白かったとか、ありましたら応援していただけると幸いです。

このアプリの対象となる製品はこちらです。

2017-01-30

この記事のタグ

U.F.O.

SA

アプリ

制御

自作