20210106のC#に関する記事は4件です。

visual studioの設定メモ

概要

visual studioの初期設定でかっこが勝手に改行されるのが鬱陶しかったので設定変更方法をまとめる
ついでになぜかinsert(上書きモード)になってしまったときの対処法書いておく

かっこを改行するかどうかの設定

  1. ヘッダーの「ツール(T)」を選択
  2. 「オプション(O)」を選択
  3. 「テキストエディター」→「C#」→「コードスタイル」→「書式設定」→「改行」を選択
  4. 「新しい行に型の始めをかっこを配置する」のチェックを外す
  5. 「OK」を押す

上書きモードの解除方法

  1. ヘッダーの「ツール(T)」を選択
  2. 「オプション(O)」を選択
  3. 「環境」→「キーボード」を選択
  4. 「以下の文字列を含むコマンドを表示」に「上書き」と入力
  5. 「編集.上書きモード」を選択
  6. 「選択したコマンドへのショートカット」を削除して何も選択されていない状態にする
  7. 「OK」を押す

image.png


反映されない場合は、一度visual studioを立ち上げなおす

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

勝手にかっこが改行される(Visual Studio)

概要

visual studioの初期設定でかっこが勝手に改行されるのが鬱陶しかったので設定変更方法をまとめる
ついでになぜかinsert(上書きモード)になってしまったときの対処法書いておく

かっこを改行するかどうかの設定

  1. ヘッダーの「ツール(T)」を選択
  2. 「オプション(O)」を選択
  3. 「テキストエディター」→「C#」→「コードスタイル」→「書式設定」→「改行」を選択
  4. 「新しい行に型の始めをかっこを配置する」のチェックを外す
  5. 「OK」を押す

上書きモードの解除方法

  1. ヘッダーの「ツール(T)」を選択
  2. 「オプション(O)」を選択
  3. 「環境」→「キーボード」を選択
  4. 「以下の文字列を含むコマンドを表示」に「上書き」と入力
  5. 「編集.上書きモード」を選択
  6. 「選択したコマンドへのショートカット」を削除して何も選択されていない状態にする
  7. 「OK」を押す

image.png


反映されない場合は、一度visual studioを立ち上げなおす

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#でProtocolBuffersを使って見た!!

?新年明けましておめでとうございます?

業務の中でProtocolBuffersを使用することになり、
"なんなんそれ..."と思い、習うより慣れろということで動かしてみました。
詳しい説明を知りたい方は先人の方々がわかりやすく解説してくださっているものが
ありますのでそちらを参考にしていただきたいと思います。
ちなみに、私はこちらのページを参考にしました。

手順の流れ

  1. Protocを入手
  2. Protoファイル作成
  3. ProtoファイルからC#のクラスを自動生成する
  4. サンプルプログラムを書く

1. Protocを入手

Homebrewを使用して入手

# terminal
$ brew update     # formula を更新
$ brew upgrade    # 更新があるパッケージを再ビルドする
$ brew install protobuf # protobufをインストール
$ brew upgrade protobuf # protobufをアップグレード

$ protoc --version
libprotoc 3.14.0

2. Protoファイル作成

Human.proto
syntax = "proto3";
package MyPackage;

message Human {
  string name = 1;
  uint32 age = 2;
}

3. ProtoファイルからC#のクラスを自動生成する

・Protoファイルが存在する場所まで移動する。

# terminal
protoc --csharp_out=. -I. Human.proto

4. サンプルプログラムを書く

下準備

・NuGetから Google.Protobuf をインストールする。
・先程の自動生成したcsファイルをRiderのProgram.csと同じ階層に置く。

Program.cs
using System;
using Google.Protobuf;
using MyPackage;

namespace protocol_test
{
    class Program
    {
        static void Main(string[] args)
        {
            var human = new Human
            {
                Name = "name001",
                Age = 20
            };

            byte[] bytes = human.ToByteArray();
            Console.WriteLine(BitConverter.ToString(bytes)); // 

            // デシリアライズ
            var human2 = new Human();
            human2 = Human.Parser.ParseFrom(bytes);

            Console.WriteLine(human2.Age);
        }
    }
}
#実行結果
0A-07-6E-61-6D-65-30-30-31-10-14
20

参考文献

C#でProtocolBuffersを使う方法
Protocol Buffers 導入メモ Mac/Win
XML、JSON、Protocol Buffersを比較してみました

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EnOcean BLE スイッチ Easyfit(EWSDB)を買ってみた② Windowsフォームアプリを作成する。

目次

・はじめに
・Windowsフォームアプリ作成結果
・フォームアプリ作成準備
・C#プログラム

はじめに

 BLE対応のEnOceanスイッチ_Easyfit(EWSDB)を購入した。
 まずは前回にあるように動作確認してみた。
https://qiita.com/get_itchy_feet/items/0e29cda011fce7da7b73
 このデバイスの詳細はスイッチサイエンスさんのホームページにある。
https://www.switch-science.com/catalog/6526/
 今回はこの動画の後半にあるようなスイッチを押したことがわかるアプリの作成を行いたい。
 スマホのアプリは作成できないため、PCアプリで作成を行う。UWPとかもわからんのでフォームアプリである。

Windowsフォームアプリ作成結果

 実際に作成したアプリは以下の通りである。


 ボタンを押すと4つあるスイッチのうち押したスイッチの場所が青く表示される。
 非常に反応が悪い・・・。データを取得できたり、できなかったりである。
 スマホのBLEスキャナアプリで動作確認していた時にはこんなに反応が悪くなかった。コードの書き方が悪いのか、WINDOWS自体の性能なのか。

フォームアプリ作成準備

 アドバタイズパケットに含まれているデータから目的のデータ(SwitchStatus)を取り出したい。
 まずはManifacture Dataを取り出す必要がある。
 以下の記事にアドバタイズパケットの中身の詳細があるので参考にした。
 https://qiita.com/gebo/items/2e51bebd3d26a3025d9f
 
 BLEの送受信は以前に以下の記事でやってみている。
 https://qiita.com/get_itchy_feet/items/a61c49fed9c9fe46b5f0
 ただし、今回はScanのみである。
 まずは【Microsoft Visual Studio Community 2019】から新しいプロジェクト【Windowsフォームアプリケーション .NET Framework】を作成する。使用する言語は【C#】となる。
 BLEを扱えるようにするために【Microsoft.Windows.SDK.Contracts】アドオンをいれる。
 
 以下のようにフォームアプリをデザインする。
 テキストボックスにデバイスアドレス(スイッチの裏面に記載のあるID)を記入
 →【Scan Start】ボタンをおすと、Scanを開始し、スイッチからのデータが受信できるようになる。
 →スイッチを押すと押された場所に該当するPicture Boxの色が灰色から青に変わる。スイッチを離すと灰色に戻る。

C#プログラム

 実際のFormのプログラムは以下の通りである。

WindowsFormsAppEnOceanSwitchBle.cs
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Windows.Devices.Bluetooth.Advertisement;
using System.Runtime.InteropServices.WindowsRuntime;        //Asbuffer

namespace WindowsFormsAppEnOceanSwitchBle
{
    public partial class Form1 : Form
    {
        //状態確認用コメントを表示
        string textBleScanStatus;
        //Scanの準備
        static BluetoothLEAdvertisementWatcher watcherEnOcean;
        //対象のBleDeviceAddress
        ulong addressBleDevice = 0xE215000183BE,addressTextBox;
        public Form1()
        {
            InitializeComponent();
            //Scanの準備
            watcherEnOcean = new BluetoothLEAdvertisementWatcher();
            labelCommnetButton.Text = "( Watcher initialized ) click button -> Scan start";
            //テキストボックスの数値の初期化
            textBoxBleDeviceAddress.Text = addressBleDevice.ToString("X");
        }
        private void buttonScan_Click(object sender, EventArgs e)
        {
            //TextBoxの数値を取得 -> 変換
            string textBox = textBoxBleDeviceAddress.Text;
            addressTextBox = ulong.Parse(textBox, System.Globalization.NumberStyles.HexNumber);        //16進数で変換
            textBleScanStatus = watcherEnOcean.Status.ToString();
            //Started -> Scan Stop ,Created or Stopped -> Scan Start ,その他 -> よくわからんのでもう一回押してみる
            if (textBleScanStatus == "Started")
            {
                watcherEnOcean.Stop();
                buttonScan.Text = "Start Scan";
                labelCommnetButton.Text = "( Scan Stoped ) click button -> Scan start";
            }
            else if ((textBleScanStatus == "Created") || (textBleScanStatus == "Stopped"))
            {
                BleScanStart();
                buttonScan.Text = "Stop Scan";
                labelCommnetButton.Text = "( Scanning ) click button -> Scan start";
            }
            else
            {
                labelCommnetButton.Text = "( Error Occured ) click button after a while";
            }
        }
        void BleScanStart()
        {
            watcherEnOcean.Received += Watcher_Received;
            //追加データがあった場合に取得できるようにスキャン要求を可能にする(必要なのか?)。
            watcherEnOcean.ScanningMode = BluetoothLEScanningMode.Active;
            watcherEnOcean.Start();
        }
        void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
        {
            //BleDeviceのAddressを取得し、Textboxの中身と比較
            if (args.BluetoothAddress == addressTextBox)
            {
                //ManufacturerDataの中身を取得する。
                var dataScanManufacturerData = args.Advertisement.ManufacturerData;
                foreach (var dataM in dataScanManufacturerData)
                {
                    var dataA = dataM.Data.ToArray();
                    //ManufacturerDataの内、Status(dataA[4]に相当)の中身を分解し、格納する。
                    //SwitchID A0 = dataSwitchNumber[0] , A1 = dataSwitchNumber[1] , B0 = dataSwitchNumber[2] , B1 = dataSwitchNumber[3] 
                    //dataSwitchPress Press=1,Release=0
                    int[] dataSwitchNumber = new int[4];
                    int dataSwitchPress;
                    dataSwitchPress = dataA[4] % 2;
                    int dataP = dataA[4];
                    for (int a = 0 ; a < 4 ; a++)
                    {
                        dataP = dataP / 2;
                        dataSwitchNumber[a] = dataP % 2;
                    }
                    //ボタンの表示用の4つの四角形を変更する。
                    PictureBox[] pictureBoxSwitch = { pictureBoxSwitchA0, pictureBoxSwitchA1, pictureBoxSwitchB0, pictureBoxSwitchB1 };
                    Bitmap[] canvasSwitch = new Bitmap[4];
                    Graphics[] graphicSwitch = new Graphics[4];
                    for (int a = 0; a < 4; a++)
                    {
                        if (dataSwitchNumber[a] == 1)
                        {
                            canvasSwitch[a] = new Bitmap(pictureBoxSwitch[a].Width, pictureBoxSwitch[a].Height);                            //pictureBoxSwitchと同じサイズのビットマップを作成
                            graphicSwitch[a] = Graphics.FromImage(canvasSwitch[a]);
                            Brush brush;
                            if (dataSwitchPress == 1) brush = Brushes.Blue;
                            else brush = Brushes.Gray;
                            graphicSwitch[a].FillRectangle(brush, 0, 0, canvasSwitch[a].Width, canvasSwitch[a].Height);        //pictureBoxSwitchと同じサイズの四角形をGrayで塗りつぶし
                            graphicSwitch[a].Dispose();
                            pictureBoxSwitch[a].Image = canvasSwitch[a];
                        }
                    }
                }
            }
        }
    }
}

プログラムの中身

 ボタンが押されるとテキストボックスの中身を読み込み、ulong型に変換する。
 WatcherのStatusの中身を確認し、Scan中ならScanをやめ、Scanしていない場合は【BleScanStart()】でScanを開始する。あと終了作業中及びエラー発生時というステータスがあるらしいが、この場合にどうすればよいんかわからなかったため、何も起こらないようにした。
 スキャンを開始すると、周囲のBLEデバイスのアドバタイズデータを取得し始める。
 スキャン要求もできるようにしているが、必要かどうかがわからない。たぶん必要ないと思われる。
 デバイスのアドレスが Easyfit(EWSDB)のアドレスと合った場合にManifactureDataを取得する。Statusは4番目に格納されているため、4番目のデータの中身を確認し、4つあるPicture Boxに反映させている。

 以上である。
 アドバタイズデータの取得に関してはWindowsよりAndroidとかのほうが安定していそうな感じではあるな。
 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む