51CTOとHuaweiの公式戦略協力によって構築されたHongmengテクノロジーコミュニティ
https://harmonyos.51cto.com/#bkwz
前回の投稿「S1、S2、User-Upの3つの物理ボタンの独立したイベントの実装(ソリューションの分析)」では、HI_ADC_CHANNEL_2のADC値を読み取ることで、S1、S2、およびUserの3つの物理ボタンを正常に区別しました。 。
上の写真のプリントアウトは、それぞれユーザーS1、S2を押したときの効果であり、ボタンを区別するという私たちのニーズを完全に満たしているようですが。。。
しかし、何ですか?質問は?
私が言いたいのは、問題は非常に明白です。これら3つのキーのいずれかを押すと、キーイベントが複数回トリガーされます(上の図の実験は、印刷することでキーイベントに応答します)。したがって、S1、S2、Userを区別するだけでは不十分であり、実際の開発のニーズを満たすことはできません。したがって、ボタンを押すたびに1つのイベントのみがトリガーされるように、さらに改善する必要があります。
これを見て、誰もが以前のオープンソースボタンユニバーサルフレームワークDTButtonについて考えたと思います!バージョンV0.0.2では、さまざまなGPIOキーイベントを区別してトリガーできますが、S1、S2、ユーザーのみを区別することはできません。ただし、S1、S2、およびUserを区別するためのスキームがあります。このスキームをDTButtonフレームワークに統合するのは完璧ではありませんか??!!
OK!早くやれよ!
次に行うことは次のとおりです。
- GetSSU()をフレームワークに統合して、フレームワークがS1、S2、User(Pressed、LongPressed、Released)の3つのイベントをサポートするようにします。
- フレームワークの外部インターフェイスを変更しないでください(フレーム呼び出しメソッドを変更しないでください。新しいインターフェイス関数を追加しないでください)。
- フレームワークV0.0.2の元の機能には影響しません
上記の3つのタスクを実行するには、DTButtonフレームワークのコアデザインを確認する必要があります。
GPIOボタンマークイベントの発生割り込みサービスルーチンでは、その後、イベントコールバック関数を呼び出してマークイベント処理スレッドで(一度だけ)!
注:コールバック関数への複数の呼び出しを防ぐために、イベントがトリガーされた直後にイベントマークをクリアする必要があります。
したがって、最も簡単な統合方法は、S1、S2、Userのキーが押されたときにイベントをマークし、イベントマークを介して対応するコールバック関数を呼び出すことです(戻った後にイベントマークをクリアします)。
プロセスは次のとおりです。
考慮すべき次の質問は、S1、S2、ユーザーのプレスイベントとリリースイベントをどのように構築するかです。
この問題を解決するには、一般的なGPIOボタンイベントトリガーモード(立ち上がりエッジトリガーと立ち下がりエッジトリガー)を参照できます。ただし、S1、S2、UserはADC値を検出することで区別され、GPIOボタンのように立ち上がりエッジと立ち下がりエッジを直接正確にキャプチャできないこともご存知だと思います。どうやるか???直接は不可能であり、間接的である可能性があります。リリースイベントとプレスイベントは、立ち上がりエッジと立ち下がりエッジをシミュレートすることによって構築されます。
具体的な方法は次のとおりです。
コードレベルでは、変数preKeyを使用して、GetSSU()で取得した最後のキー状態を記録し、GetSSU()を呼び出して取得したキー状態と比較できます。比較結果により、キーイベントが構築されているかどうかを判断できます。
上記の分析で、あなたは手で次のコードを書くことができます!
その後、フレームワーク全体が、S1、S2、User、またはGPIOキーのいずれであっても、キーイベントを統一された方法で処理し、トリガーされたイベントはすべてEventHandler()で処理されます。
この時点で、ボタンユニバーサルフレームV0.0.3バージョンの設計が完了しました。特定のコード実装はオープンソースであり(記事の最後にダウンロードが添付されています)、箱から出してすぐに使用できます。
使用例は次のとおりです。
同じインターフェース、同じ方法、同じエクスペリエンス、唯一出てくるのは、S1、S2、およびユーザーの3つの物理ボタンの際立ったサポートです。
51CTOとHuaweiの公式戦略協力によって構築されたHongmengテクノロジーコミュニティ
https://harmonyos.51cto.com/#bkwz