FC2ブログ

バージョンとレベル(android studio)(Android)(備忘録)


SDK Versionの指定箇所


生成済みのプロジェクトにおいて、アプリのサポート対象Androidバージョン(APIレベル)を変更したい時。

バージョンとレベル(android studio)(Android)(備忘録)

上図左側のように「build.gralde」を選択
1. compileSdkVersion
2. minSdkVersion
3. targetSdkVersion
で、APIレベルを指定する。


参考



Androidのバージョン履歴(wiki)
スポンサーサイト



release版アプリケーションへの署名(android studio)(Android)(備忘録)


自分専用の署名鍵を管理する場合

手順概要


1. Select Build Variant で release を指定する
2. Generate Signed Bundle/APK でAPK用署名済みバンドルを生成
3. Signing Config の作成
4. Build Variant でBuild TypesとSinging Configとを関連付け
5. Build Bundle(s)/APK(s) - Build APK(s)で app-release.apk を生成
6. app\build\outputs\apk\フォルダで app-release.apk ファイルが生成された事を確認
7. 実行する

参考画像


■Select Build Variant で release を指定する
release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)



■Generate Signed Bundle/APK でAPK用署名済みバンドルを生成
release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)
OKで進む

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)



■ Signing Config の作成
release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)



■Build Variant でBuild TypesとSinging Configとを関連付け
release版アプリケーションへの署名(android studio)(Android)(備忘録)



■Build Bundle(s)/APK(s) - Build APK(s)で app-release.apk を生成
release版アプリケーションへの署名(android studio)(Android)(備忘録)

■app\build\outputs\apk\フォルダで app-release.apk ファイルが生成された事を確認
■ 実行する


環境


release版アプリケーションへの署名(android studio)(Android)(備忘録)

release版アプリケーションへの署名(android studio)(Android)(備忘録)


Raspberry Pi zero Visual Studio(Win) .NET core mono 準備(Raspberry Pi)(備忘録)

Raspberry Pi用のアプリケーションをWin10上のVisual Studio C#で開発する場合のRaspberry Pi zeroのインストールメモ。

何回やっても毎回忘れているのでメモります。

注意点


Raspberry Pi zero は ARMv6 ... .NET coreはV6をサポートしていない。 monoを使用する。
Raspberry Pi 3 B は ARMv8 ... .NET coreはV7 V8をサポートしている。

■update
2019/11時点では
$ sudo apt-get update
$ sudo apt-get upgrade
を行うと、raspbianのファイルマネージャが起動後すぐにクローズする現象が発生した為、実施していない。

RaspbianをSDカードにインストール


■Raspbianダウンロード
Raspbianのインストール用イメージファイルはraspberrypi.orgからダウンロード

1. 今回は 2019-09-26-raspbian-buster-full.zip をダウンロード。
2. zipを解凍し、2019-09-26-raspbian-buster-full.img を取り出す。

■SDカードに Raspbian を書き込む
Raspberry Pi zero Visual Studio(Win) .NET core mono 準備(Raspberry Pi)(備忘録)

「balenaEtcher」を使ってWindowsで書き込む。

1. balenaEtcher のダウンロード先はこちら
2. balenaEtcherをWindowsにインストールする
3. FAT32でフォーマットされたSDカードをwindowsにセット
4. balenaEtcher起動
5. 左端の「Select image」で 2019-09-26-raspbian-buster-full.img を選択
6. 中央の「Change」で目的のSDカードドライブを選択
7. 右端の「Flach!」で書き込む

Raspberry Piへのインストール時のハード構成


1. Raspberry Pi zero
2. USBハブ バッファロー BUFFALO BSH4UMB04BK [タブレット・スマホ用 USB2.0 4ポートハブ 変換コネクター付き]
3. LANアダプター バッファロー BUFFALO LUA3-U2-ATX [10/100M USB2.0用 有線LANアダプター Wii/MacBook Air対応]
4. キーボード、マウス ロジテック (USB UNIFYING RECEIVER)
5. モニター HDMI接続

Raspberry Pi 起動と設定


1. SDカードをRaspberry Piにセット後Power On

■「Welcom to Raspberry Pi」ウインドウにてセット
2. 「Set Country」
 Country Japan
 Language japanese
 Timezone Tokyo
3. 「Change Password」 任意に設定
4. 「Set Up Screen」 そのまま
5. 「Update Software」 Skip
6. 「Setup Complete」 Restart

■再起動後の設定
7. イチゴメニュー→設定→Raspberry Pi の設定にて
8. 「システム」タブにて
 「解像度」 任意に設定
9. 「インターフェイス」タブにて
 「カメラ」以外すべて有効
10.「ローカライゼーション」タブにて
 「タイムゾーンの設定」 地域 Asia 位置 Tokyo
 「キーボードの設定」 Model Generic 105-key PC(intl.) Layout Japanese Variant Japanese
11.「OK」クリックですぐに再起動を選択

VNC接続


再起動後はHDMI接続せずに、VNCでリモート接続する。

Visual Studio用 projectsフォルダ作成


/home/pi/projects を新規作成

日本語入力


$ sudo apt-get install ibus-mozc

samba


■sambaのインストール
$ sudo apt-get install samba

■バージョン確認
$ samba -V

■Sambaユーザーアカウントの作成(例は pi)
すでにシステムにユーザーが登録されいる事
$ sudo pdbedit -a pi
new password:
retype new password:

■/etc/samba/smb.conf ←編集
$ sudo mousepadにて/etc/samba/smb.confを開き
下記を追加
[usr_include]
public = yes
path = /usr/include

[pi_projects]
writeable = yes
path = /home/pi/projects

[usr_lib]
path = /usr/lib

■smb リスタート
$ samba restart


.NET Core Runtime のインストール(ARMv6以外のRaspberry Pi)


■ダウンロード
ここから.NET Core 3.0 を windowsでダウンロード
Build apps - SDK → Linux Binaries の ARM32 をダウンロードする

■転送
ダウンロードした dotnet-sdk-3.0.101-linux-arm.tar.gz
winSCPで/home/pi に転送

■インストール
$ sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet-sdk-3.0.101-linux-arm.tar.gz -C /opt/dotnet
$ sudo ln -s /opt/dotnet/dotnet /usr/local/bin
確認
$ dotnet --info (※ Raspberry Pi zero ARMv6ではサポートしていない為 Segmentation fault となる)

mono(ARMv6の場合 zeroなど)


■インストール
$ sudo apt-get install mono-complete
確認
$ mono --versio

■実行時の注意
monoで実行する時、Visual Studioの「発行」のプロファイル設定でのポイントは、
1. 配置モードは「フレームワーク依存」
2. ターゲットランタイムは「ポータブル」
3. ターゲットの場所には、配置モードの「自己完結」のアプリと同居出来ない。
Raspberry Pi zero Visual Studio(Win) .NET core mono 準備(Raspberry Pi)(備忘録)
実行は $ mono ./sample1.dll


Raspberry Pi 3(Raspbian) VS C Sharp 外部ブログラムVLCの起動(Raspberry Pi)(備忘録)

Raspberry Pi 3 B用にwindows10上のVisual Studio C# で作成するプログラムで、
音楽ファイルを非同期に2曲同時に演奏する方法のテストです。

C#で作成したソフトから、外部のVLCを起動して音楽ファイルを再生したい。

■ソース
using System;
using System.Diagnostics;
using System.Threading;

namespace vscsrpiProcessStartTest
{
        class ProcessStartTest
    {
            public static void Main()
            {
            //プロセスとスレッド状態の表示
            Process mp = Process.GetCurrentProcess();
            Console.WriteLine("MAIN プロセス ID = " + mp.Id.ToString());

            Console.WriteLine("MAIN Thread = " + Thread.CurrentThread.ManagedThreadId.ToString());

            foreach (ProcessThread t in mp.Threads)
            {
                Console.WriteLine("Thread ID = " + t.Id.ToString());
            }

            //1つ目のvlc起動
            Process p = new Process();
            p.StartInfo.FileName = "vlc";
            p.StartInfo.Arguments = "--play-and-exit amefuri2.mp3"//--play-and-stopではない
            p.Start();

            Console.WriteLine(p.StartInfo.FileName + "#1 プロセスID = " + p.Id.ToString());


            //2つ目のvlc起動
            Process p2 = new Process();
            p2.StartInfo.FileName = "vlc";
            p2.StartInfo.Arguments = "--play-and-exit amefuri.wav"//--play-and-stopではない
            p2.Start();

            Console.WriteLine(p2.StartInfo.FileName + "#2 プロセスID = " + p.Id.ToString());

            Console.WriteLine("起動 終了");

            //vlc終了待ち
            p.WaitForExit();
            p2.WaitForExit();

            Console.WriteLine("end.");
            string ans = Console.ReadLine();
            }
        }
    }


■結果
MAIN プロセス ID = 24715
MAIN Thread = 1
Thread ID = 24715
Thread ID = 24717
Thread ID = 24718
Thread ID = 24719
Thread ID = 24720
Thread ID = 24721
Thread ID = 24722
Thread ID = 24724
Thread ID = 24725
vlc#1 プロセスID = 24728
VLC media player 3.0.7 Vetinari (revision 3.0.7-0-g86cee31099)
vlc#2 プロセスID = 24728
起動 終了
VLC media player 3.0.7 Vetinari (revision 3.0.7-0-g86cee31099)
[017c6950] main libvlc: vlcはデフォルトのインターフェースで実行しています。インターフェースのない vlc を使用するには'cvlc'を使用してください。
[00c2d950] main libvlc: vlcはデフォルトのインターフェースで実行しています。インターフェースのない vlc を使用するには'cvlc'を使用してください。
libEGL warning: DRI2: failed to authenticate
libEGL warning: DRI2: failed to authenticate
qt5ct: using qt5ct plugin
qt5ct: using qt5ct plugin
qt5ct: D-Bus global menu: no
qt5ct: D-Bus global menu: no
qt5ct: D-Bus system tray: no
qt5ct: D-Bus system tray: no
[0183b078] main playlist: end of playlist, exiting
QObject::~QObject: Timers cannot be stopped from another thread
[00ca2078] main playlist: end of playlist, exiting
QObject::~QObject: Timers cannot be stopped from another thread
end.




C#の SoundPlayer Class で再生する方法を色々試したが挫折し、VLCに頼る事にした。

2つのファイルを順次に再生したい場合は、 p.WaitForExit(); を p.Start(); の次の行に移動させればよい。
2つ同時にと書いていますが、VLCの起動に時間がかかり、同時でありません。すこし時間差があります。

再生が終了した時点でVLCを終了させるコマンドラインのパラメータに --play-and-stop を指定していたが、
--play-and-exit であった。
VLCのコマンドのパラメータを調べた時に --play-and-stop がヒットし、--play-and-exit の記述はなかったが、
期待通りの動作をしなかった。後に --play-and-exit の記述例が見つかりメデタシとなった。

PulseAudio server connection failure: Connection refused 暫定対策(Raspberry Pi 3 B)(Raspbian)

Raspberry Pi 3B(Raspbian)の「端末」でのお話です。
VLCでwavファイルを再生($ vlc amefuri.wav)すると、
「vlcpulse audio output error: PulseAudio server connection failure: Connection refused」エラーが発生する。
$ cvlc amefuri.wav も同じ。

■暫定対策
「VLCメディアプレイヤー」で
ツール→設定→オーディオ→出力モジュールを「自動」から「OpenBSD sndioオーディオ出力」に変更する。
※他の設定方法については調査していない。

■本対策
未調査




資料


■Raspberry Pi 3 B(Raspbian) エラー発生画面
PulseAudio server connection failure: Connection refused 暫定対策(Raspberry Pi 3 B)(Raspbian)

■VLC設定画面
PulseAudio server connection failure: Connection refused 暫定対策(Raspberry Pi 3 B)(Raspbian)

Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)

■課題
雨降り警報機用Raspberry Piプログラムの方式検討。
1.雨滴検出時に、音声案内とメールを送信
2.センサー乾燥時に、音声案内とメールを送信

■着目点
(1)入力
1.入力ピンは一つである
2.入力信号の立ち上がり、立ち下がりで異なる処理をする
3.センサー回路によりチャッタは除去されている
4.センサー回路により雨滴検出時の信号は一定期間以上保持される

(2)Raspbian/libwiringPi
1.wiringPiISR()による割込対象エッジの指定はタスク毎に変える事はできない
2.wiringPiISR()による割込対象エッジの指定は最後に指定したものが有効になる
3.上記割込のキューは最大2つで、しかも2つ目は保証されていない

(3)アプリケーション
1.雨滴検出、センサー乾燥時にそれぞれ異なる音声ファイルを再生する
2.雨滴検出、センサー乾燥時にそれぞれ異なるメールを送信する
3.入力パルス幅より、各処理時間の方が長くなる場合がある
(センサーは微小雨滴を検出できる為、検出後即時に乾燥しパルス幅が短くなる場合がある)

方針


(1)プログラム
1.雨滴検出時と乾燥検出の間隔が短い場合も、検出後極力リアルタイムに処理を行う
2.簡単、単純な作り


(1)プログラム
1.雨滴検出用と乾燥検出用の2つのプログラムとする
(別タスクで動作(スレッドでなく))

検証項目


1.2つのタスクが各々wiringPiISR()を発行して問題が生じない事を確認
2.雨滴検出から乾燥検出期間より長い期間CPUに負荷を掛ける処理を各検出時に起動して、動作状態を観測する

Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)
黄:センサー出力(GPIO24入力)
青:雨滴検出用プログラム(vscsrpiWiringPiInterrutpTest2) (GPIO25)
赤:乾燥検出用プログラム(vscsrpiWiringPiInterrutpTest10) (GPIO7)


■長時間(6時間)連続動作時のゆらぎと割込取りこぼし確認
Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)
オシロスコープ RIGOL DS1054Z の無限残像機能によるゆらぎと取りこぼし有無を確認。

青、赤のラインで基底ラインが切れている為、取りこぼしはない。

■他の高負荷JOBがある時(※)
Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 両エッジ割込と並行処理(Raspberry Pi)(備忘録)

青、赤のラインで基底ラインの切れがなく、その後部に遅延を示すパルスもない。取りこぼしが発生。

※負荷は、ファイル名サーチによってを掛けている。


■割込対象の入力信号作成用
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiSend
{
    class SendProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int PINNO = 23;

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiSend start.");
            wiringPiSetupGpio();

            pinMode(PINNO, PINMODE.OUTPUT);

            while (true)
            {
                digitalWrite(PINNO, HIGH);  //オン
                Thread.Sleep(20); //ミリ秒
                digitalWrite(PINNO, LOW);   //オフ
                Thread.Sleep(200); //ミリ秒
            }
            Console.WriteLine("vscsrpiWiringPiSend done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}


■立ち上がり検出時の処理用
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiInterrutpTest2
{

    public delegate void CallBack(); //■デリゲートを宣言

    class IntProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        [DllImport("libwiringPi")]
        static extern int digitalRead(int pin);

        //■割り込みサービスルーチン用関数
        [DllImport("libwiringPi")]
        static extern int wiringPiISR(int pinint edgeTypeCallBack f);


        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int RECEIVEPINNO = 24;
        private static readonly int CKPINNO = 25;

        //■割り込みトリガエッジ極性指定
        private static readonly int RISINGEDGE = 2;
        private static readonly int FALLINGEDGE = 1;
        private static readonly int BOTHEDGE = 3;

        //■CallBack用メソッド定義
        public static void Intfunc()
        {
            Console.WriteLine("intfunc() begin");

            if (digitalRead(RECEIVEPINNO) == 0)
            {
            } else
            {
                digitalWrite(CKPINNO, HIGH);
                for (int i = 0i < 6000000i++) ;
                digitalWrite(CKPINNO, LOW);
            }

            //digitalWrite(CKPINNO, HIGH);
            //Thread.Sleep(20); //ミリ秒
            //for (int i = 0; i < 1000000; i++) ;
            //digitalWrite(CKPINNO, LOW);
            Console.WriteLine("intfunc() end");
            return;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiInterrutpTest2 start.");
            wiringPiSetupGpio();

            pinMode(RECEIVEPINNO, PINMODE.INPUT);
            pinMode(CKPINNO, PINMODE.OUTPUT);

            digitalWrite(CKPINNO, LOW);

            CallBack intf = new CallBack(Intfunc); //■CallBackインスタンス生成
            Console.WriteLine("ISR begin");

            //wiringPiISR(RECEIVEPINNO, RISINGEDGE, intf);  //■立ち上がりエッジで割り込み設定
            //wiringPiISR(RECEIVEPINNO, FALLINGEDGE, intf);   //■立ち下がりエッジで割り込み設定
            wiringPiISR(RECEIVEPINNO, BOTHEDGE, intf);    //■立ち両エッジで割り込み設定

            Console.WriteLine("ISR end");

            while (true)
            {
                //waitForInterrupt()では、時々、割り込みの取り漏れが発生したので、Sleep()にした(原因は未追及)
                Thread.Sleep(10000); //ミリ秒
            }

            Console.WriteLine("vscsrpiWiringPiInterrutpTest2 done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}



■立ち下がり検出時の処理用
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiInterrutpTest11
{

    public delegate void CallBack(); //■デリゲートを宣言

    class IntProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        [DllImport("libwiringPi")]
        static extern int digitalRead(int pin);

        //■割り込みサービスルーチン用関数
        [DllImport("libwiringPi")]
        static extern int wiringPiISR(int pinint edgeTypeCallBack f);


        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int RECEIVEPINNO = 24;
        private static readonly int CKPINNO = 7;

        //■割り込みトリガエッジ極性指定
        private static readonly int RISINGEDGE = 2;
        private static readonly int FALLINGEDGE = 1;
        private static readonly int BOTHEDGE = 3;

        //■CallBack用メソッド定義
        public static void Intfunc()
        {
            Console.WriteLine("intfunc() begin");

            if (digitalRead(RECEIVEPINNO) == 0)
            {
                digitalWrite(CKPINNO, HIGH);
                for (int i = 0i < 6000000i++) ;
                digitalWrite(CKPINNO, LOW);
            }

            //digitalWrite(CKPINNO, HIGH);
            //Thread.Sleep(20); //ミリ秒
            //for (int i = 0; i < 1000000; i++) ;
            //digitalWrite(CKPINNO, LOW);
            Console.WriteLine("intfunc() end");
            return;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiInterrutpTest10 start.");
            wiringPiSetupGpio();

            pinMode(RECEIVEPINNO, PINMODE.INPUT);
            pinMode(CKPINNO, PINMODE.OUTPUT);

            digitalWrite(CKPINNO, LOW);

            CallBack intf = new CallBack(Intfunc); //■CallBackインスタンス生成
            Console.WriteLine("ISR begin");

            //wiringPiISR(RECEIVEPINNO, RISINGEDGE, intf);  //■立ち上がりエッジで割り込み設定
            //wiringPiISR(RECEIVEPINNO, FALLINGEDGE, intf);   //■立ち下がりエッジで割り込み設定
            wiringPiISR(RECEIVEPINNO, BOTHEDGE, intf);    //■立ち両エッジで割り込み設定

            Console.WriteLine("ISR end");

            while (true)
            {
                //waitForInterrupt()では、時々、割り込みの取り漏れが発生したので、Sleep()にした(原因は未追及)
                Thread.Sleep(10000); //ミリ秒
            }

            Console.WriteLine"vscsrpiWiringPiInterrutpTest10 done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}


環境


■Microsoft Visual Studio Community 2019
Version 16.3.3
VisualStudio.16.Release/16.3.3+29403.142
Microsoft .NET Framework
Version 4.8.03752

■C# ツール 3.3.1-beta3-19461-02+2fd12c210e22f7d6245805c60340f6a34af6875b
■TargetFramework netcoreapp3.0.0

■Raspberry Pi 3 Model B V1.2

■Raspbian
pi@rp:~ $ uname -a
Linux rp 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
pi@rp:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.9 (stretch)
Release: 9.9
Codename: stretch
pi@rp:~ $

■libwiringPi.so.2.50


感想


雨降り警報機用と郵便箱投函センサー用として、外部からの停止や起動の機能を持たない暫定版に適用しようと思っています。
やっぱり、雨降り警報機と郵便投函の通知がないと不便です。


Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 割り込み(Raspberry Pi)(備忘録)

Visual Studio 2019 + C# + libwiringPi を利用して Raspberry Pi 3B のGPIO制御の検討。
GPIOの入力ピンの信号の変化で割り込みを発生させて、処理を行う為の libwiringPi の使用方法。


■サンプルコード
1.GPIO24ピンを入力端子とし、立ち下がりエッジでの割り込みを受ける
2.割り込み処理では、コンソールにメッセージを表示し、GIOP25ピンからパルスを出力する
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace vscsrpiWiringPiInterrutpTest
{
    
    public delegate void CallBack(); //■デリゲートを宣言

    class IntProgram
    {
        [DllImport("libwiringPi")]
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        [DllImport("libwiringPi")]
        static extern int digitalRead(int pin);

        //■割り込みサービスルーチン用関数
        [DllImport("libwiringPi")]
        static extern int wiringPiISR(int pinint edgeType,CallBack f);


        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int RECEIVEPINNO = 24;
        private static readonly int CKPINNO = 25;

        //■割り込みトリガエッジ極性指定
        private static readonly int RISINGEDGE = 2;
        private static readonly int FALLINGEDGE = 1;
        private static readonly int BOTHEDGE = 3;

        //■CallBack用メソッド定義
        public static void Intfunc()
        {
            Console.WriteLine("intfunc() begin");
            digitalWrite(CKPINNO, HIGH);
            //Thread.Sleep(20); //ミリ秒
            for (int i = 0i < 1000000i++) ;
            digitalWrite(CKPINNO, LOW);
            Console.WriteLine("intfunc() end");
            return;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("vscsrpiWiringPiinterruptTest start.");
            wiringPiSetupGpio();

            pinMode(RECEIVEPINNO, PINMODE.INPUT);
            pinMode(CKPINNO, PINMODE.OUTPUT);

            digitalWrite(CKPINNO, LOW);

            CallBack intf = new CallBack(Intfunc); //■CallBackインスタンス生成
            Console.WriteLine("ISR begin");

            //wiringPiISR(RECEIVEPINNO, RISINGEDGE, intf);  //■立ち上がりエッジで割り込み設定
            //wiringPiISR(RECEIVEPINNO, FALLINGEDGE, intf);   //■立ち下がりエッジで割り込み設定
            wiringPiISR(RECEIVEPINNO, BOTHEDGE, intf);    //■立ち両エッジで割り込み設定

            Console.WriteLine("ISR end");

            while (true)
            {
                //waitForInterrupt()では、時々、割り込みの取り漏れが発生したので、Sleep()にした(原因は未追及)
                Thread.Sleep(10000); //ミリ秒
            }

            Console.WriteLine("vscsrpiWiringPiinterruptTest done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}
//■のコメント部分は主要な部分である事を示す。

雑記


■リアルタイム性について
RaspbianがリアルタイムOSではないので当たり前の話ですが、
入力端子の電圧が変化し、CallBack関数が動くまでに、3msも掛かる場合があった。

ただし、割り込みの取り漏れは発生しなかった。

■多重割り込みについて
割り込み処理中の割込は、一つは保留される模様。それ以上は無視される。
ただし、保留された一つも失われる事もあった。

Raspberry Pi 3(Raspbian) VS C Sharp libwiringPi GPIO 検討(Raspberry Pi)(備忘録)

Visual Studio 2019 + C# + libwiringPi を利用して Raspberry Pi 3B のGPIO制御の検討。

既存のEZgpから壊れた為、代替品としてRaspberry Pi 3Bを使用するにあたり、開発環境の検討の一部です。


■実現できる最小パルス幅
Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)


■波形の乱れ
Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)


■アプリに制御が渡らない期間
Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)

Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)




■テスト用ソース
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace LibWiringPiTest
{
    class Program
    {
        [DllImport("libwiringPi")] 
        static extern int wiringPiSetupGpio();

        [DllImport("libwiringPi")]
        static extern int pinMode(int pinPINMODE mode);

        [DllImport("libwiringPi")]
        static extern int digitalWrite(int pinint value);

        enum PINMODE
        {
            INPUT,
            OUTPUT,
            PWM_OUTPUT,
            GPIO_CLOCK,
            SOFT_PWM_OUTPUT,
            SOFT_TONE_OUTPUT,
            PWM_TONE_OUTPUT
        }

        private static readonly int LOW = 0;
        private static readonly int HIGH = 1;

        private static readonly int PINNO = 23;

        static void Main(string[] args)
        {
            wiringPiSetupGpio();

            pinMode(PINNO, PINMODE.OUTPUT);

            while(true)
            { 
                digitalWrite(PINNO, HIGH);  //オン
                digitalWrite(PINNO, LOW);   //オフ
            }
            Console.WriteLine("Done.");
            string ans = Console.ReadLine();
            return;
        }
    }
}

Raspberry Pi 3(Raspbian) VS C# libwiringPi GPIO 検討(Raspberry Pi)(備忘録)
Microsoft Visual Studio Community 2019
Version 16.3.3
VisualStudio.16.Release/16.3.3+29403.142
Microsoft .NET Framework
Version 4.8.03752



結果


雨降り警報、郵便投函センサー、不審者監視などの低速度機器には使えるレベル。
GPIO入力信号の割り込みの評価はこれから。

Visual Studio+C#の環境も、このテストに限れば使いやすい。


追加資料


制御が戻らない期間の調査資料(画像のみ)

4839-17.jpg

4839-17.jpg

4839-12.jpg

4839-14.jpg

4839-15.jpg

4839-16.jpg

4839-17.jpg

Could not find com.android.tools.lint:lint-gradle:26.1.3.(android studio)(Android)(備忘録)

Android Studio 2.xで作成したアプリを Android Studio 3.1.3 でrelease Buildした所、エラーとなりました。

Android Studio 3.1.3で古いプロジェクトをオープンすると
「Android Gradleプラグインをバージョン3.1.3に、Gradleをバージョン4.4に更新することを強くおすすめします(インスタント・ランなどの最新機能、改善点、セキュリティ修正など)。 このバージョンのプラグインについては、リリースノートから学ぶことができます。」(Google 翻訳)
と聞いて来る。
4453-03.jpg

「Update」すると、エラーとなり、「Don't remind me again for this project」を選択すると、エラーは発生しません。
この記事は、「Update」した場合について書いています。



■release Buildした時のメッセージ
Could not find com.android.tools.lint:lint-gradle:26.1.3.
Searched in the following locations:
    file:/C:/Users/xxx/AppData/Local/Android/Sdk/extras/m2repository/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.pom
    file:/C:/Users/xxx/AppData/Local/Android/Sdk/extras/m2repository/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.jar
    file:/C:/Users/xxx/AppData/Local/Android/Sdk/extras/google/m2repository/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.pom
    file:/C:/Users/xxx/AppData/Local/Android/Sdk/extras/google/m2repository/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.jar
    file:/C:/Users/xxx/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.pom
    file:/C:/Users/xxx/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.jar
    https://jcenter.bintray.com/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.pom
    https://jcenter.bintray.com/com/android/tools/lint/lint-gradle/26.1.3/lint-gradle-26.1.3.jar
Required by:
    project :app


C:/Users/xxx/AppData/Local/Android/Sdk/extras/m2repository/com/android/には
「support」フォルダのみがあり、「tools」フォルダはありませんでした。



暫定対策


よく似たフォルダ構成の
C:\Program Files\Android\Android Studio\gradle\m2repository\com\android フォルダ配下の下記フォルダ2つを
tools
databinding

C:/Users/xxx/AppData/Local/Android/Sdk/extras/m2repository/com/android/ にコピー(※1)すると、正常にビルドできました。

■実機でインストールと動作確認
N-03E(4.1.2) インストールOK、実行OK
ZenFone Go ZB551KL(5.1.1) インストールOK、実行OK
g08(7.1.2) インストールOK、実行OK
nexus7 2013 LTE(6.0.1) インストールOK、実行OK


本来の対応方法が分かるまではこれでしのぎます。


※1
下記の2つの「tools」も存在していませんでしたが、エラーとはなりませんでした。
C:/Users/xxx/AppData/Local/Android/Sdk/extras/google/m2repository/com/android/tools/
C:/Users/xxx/AppData/Local/Android/Sdk/extras/android/m2repository/com/android/tools/



環境


4453-01.jpg

4453-02.jpg



「アプリはインストールされていません。」と「アプリケーションへの署名」と「debug.keystore」(android studio)(Android)(備忘録)

きっかけは、
「android studio 3.1.2 で作成したアプリを ZenFone Go ZB551KL にインストール(release版)すると 「アプリはインストールされていません。」となる」
です。結論はアプリに署名していない事が原因です。
この記事は、署名に関しての備忘録として、まずはdebug版の署名に関するメモです。

アプリケーションへの署名に関してはこちら(アプリケーションへの署名)に詳しく書かれています。


「アプリはインストールされていません。」と「アプリケーションへの署名」と「debug.keystore」(android studio)(Android)(備忘録)
ZenFone Go ZB551KLにインストールした時のメッセージ


テスト


■IDE はデバッグ キーストアとデバッグ用証明書を $HOME/.android/debug.keystore に自動的に作成
C:\Users\xxx\.android\debug.keystore
C:\Users\xxx\.android\debug.keystore.lock
※以下ファイルとは上記の2ファイルを指す。

(1)ファイル消去
消去しても、デバッグビルドしたら自動的に作成された。

(2)ファイル消去前後のインストールへの影響
下記項番順にテストを実施する。

1. 消去前に実端末にgoogle drive経由でインストール
2. 実行確認
2-1. N-03E(4.1.2) インストールOK、実行OK
2-2. ZenFone Go ZB551KL(5.1.1) インストールOK、実行OK
2-3. g08(7.1.2) インストールOK、実行OK

3. ファイル消去後、android SDKを再起動し、デバックビルド
3-1. 消去した2つのファイルは再生された。

4. インストール結果確認
(実端末では前回インストールのappをアンイストールしない事)
4-1. N-03E(4.1.2) アプリ更新確認ダイアログ表示後、OKで「アプリはインストールされていません。 名前が同じで署名が競合するパッケージが既にインストールされています。」
4-2. ZenFone Go ZB551KL(5.1.1) アプリ更新確認ダイアログ表示後、「インストール」で「アプリはインストールされていません。」
4-3. g08(7.1.2) アプリ更新確認ダイアログ表示後、「インストール」で「アプリはインストールされていません。パッケージが、名前が同じ既存のバッケージと競合しています。」

5. インストールエラーの為、端末で古いアプリをアンイストール後に再度アプリをインストールし実行確認
5-1. N-03E(4.1.2) インストールOK、実行OK
5-2. ZenFone Go ZB551KL(5.1.1) インストールOK、実行OK
5-1. g08(7.1.2) インストールOK、実行OK

6. ファイルを消去しないで、リビルド後インストール、実行
6-1. N-03E(4.1.2) アプリ更新確認ダイアログ表示後、OKでインストールOK、実行OK
6-2. ZenFone Go ZB551KL(5.1.1) アプリ更新確認ダイアログ表示後、「インストール」でインストールOK、実行OK
6-3. g08(7.1.2) アプリ更新確認ダイアログ表示後、「インストール」でインストールOK、実行OK

(3)debug、release版
debug版にrelease版を上書きする場合も同様の現象となる。
対応策はdebug版をアンイストールしてからrelease版をインストールする事。

■結論
C:\Users\xxx\.android\debug.keystore
C:\Users\xxx\.android\debug.keystore.lock
を消去するとデバックビルドで自動的に生成されるが、アプリへの署名は異なる署名となり、インストール実施時に「アプリはインストールされていません。」となる。
インストールを成功させるには、現在インストールされている該当アプリをアンイストールしてから、インストールする。


release版への署名


release版の署名に関するメモは別途記事にする予定です。のつもりでしたが、「アプリの署名  -  Android Developers」に詳しく書かれていますので、取りやめとなりました。

私の場合は当面、Google Playを使用しない自分個人用のアプリの為、キーの管理は「固有のアプリ署名キーとキーストアを自分で管理」します。
また、開発環境も変更する可能性が高いので、Key store pathはプロジェクト毎にフォルダを作り管理する事にしました。

※手順の概要は下記の記事に追加しました。(2019/12/19)
release版アプリケーションへの署名(android studio)(Android)(備忘録)

感想


最初、ZenFone Go ZB551KLにrelease版をインストールしようとして「アプリはインストールされていません。」となり、
その理由がメッセージにない為、署名だろうと思いながらも右往左往しました。

他の端末はヒントを表示しているのにZenFone Go ZB551KLは「アプリはインストールされていません。」のみ。
全てにおいて「よし」となる端末は無いような気がします。

気の向くままに、写真やエレホビーやプログラミングなどアチコチに飛び回っているので、せっかく分かった事も次に再開した時にはすっかり忘れています。
今回もAndroid Studioの使い方はすっかり忘れていました。
使い方どころかプログラミングのノウハウも90%以上は失われている感じです。
お知らせ
■注意:Google Chrome以外のブラウザでは動作しない事もあります。
お好みに応じて
画像だけの表示でいいよ
やっぱり全部表示して
背景は黒がいいな
背景を元に戻して
サブジャンル
メモリアルマップ
My Favorite Photo
検索フォーム
プロフィール

otsu.usiwakamaru

Author:otsu.usiwakamaru
五条の橋でひらりひらりと欄干を飛び渡る牛若丸のように、興の向くまま電子回路にプログラミングに写真にと飛び回っています。

プロフィール詳細

カレンダー
06 | 2020/07 | 08
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
キーワード
クリックしたキーワードの記事のみ表示します。

ダンサー ミニー ミッキー デイジー ドナルド グーフィー キャラクター  3D 試み MFP 電池 ティンカーベル デザイン 全天球 クラリス パークテーマ プルート チップデール キャスト IXY マレフィセント スクルージ スモールプラネット ダッフィー SPOT 改造 

最新記事
月別アーカイブ
全記事表示リンク

全ての記事を表示する

おすすめプログ(新着記事)
リンク


にほんブログ村
カテゴリ
橋 (1)
PIC (3)
カウンタ
訪問者数(UU)

アクセス数

現在の閲覧者数

tael no013用