Mbedサイトにライブラリを作る方法

最近、お仕事でMbed使っていますw
Mbedオンラインコンパイラはほとんど使っておらず、ローカルでコンパイルできるmbed-cliをVisual Studioと組み合わせて使っています。（組み合わせて使うといっても、編集とgithub操作にVisual Studioを使っているだけですが。このあたりの話はまたの機会に。）
久しぶりにライブラリになりそうなコードを書いたのですが、mbed-cliからMbedサイトのライブラリにどうやってアップするのか分からなかったので調べながらやってみました。

# ライブラリコード

[Mbed Connect @ Arm Tech Symposia](https://www.mbed.com/en/about-mbed/mbed-connect/)でSeeedブースに展示するmbedRO359Bのデモのために、[Grove - ジェスチャーセンサー](https://www.seeedstudio.com/Grove-Gesture%EF%BC%88PAJ7620U2%EF%BC%89-p-2463.html)からI2Cでジェスチャーを取得する、**PAJ7620U2クラス**を作りました。ファイルはPAJ7620U2.hとPAJ7620U2.cppの2つです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/c4910bd5-1132-cc6b-de44-ca4a2ff8e6c2.png)

```cpp:PAJ7620U2.hの一部
public:
	PAJ7620U2(I2C* i2c, uint8_t address);
	bool Init();
	bool GetGesture(GestureFlag* flag);
```

> 余談ですが、デモはmbedRO359Bに接続したGroveモジュールのタッチセンサー、可変抵抗、ジェスチャーセンサーで、プロジェクターに投影した画像をグリグリと回したり上下左右に動かすというものでした。mbedRO359Bとパソコンの間はMQTT通信。
>![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/67004751-2d09-3e01-a601-7ffea38060e7.png)

# リモートリポジトリを作成

最終的にライブラリコードを格納するリポジトリを、Mbedサイトに作ります。空のリポジトリってやつです。

Mbedサイトの個人のProfileにあるCodeタブを選んで、そこにある**Create repository**をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/ca3c576f-6cb5-c4b3-5705-fff27e6cd742.png)

リポジトリ名とかを記入して、**Create repository**をクリックします。今回はリポジトリ名をPAJ7620U2としました。
ここのRepository visibilityは、PublicかPublic(Unlisted)を選んでください。Privateだと、ローカルからリモートに転送するところでフリーズしてしまうようなので。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/420196c0-8e55-e3a2-8564-7b605638a208.png)

PAJ7620U2リポジトリが出来上がりました。この時点では、何もコードが無いです。

> リポジトリを作るときに、プログラム or ライブラリの指定がありませんでした。アップしたコードから自動判定するのかな？

# ローカルにプログラムを作成

mbed-cliでは、プログラムが無いとライブラリを取って来れないようなので、mbed-cliのmbed newコマンドでプログラムを作ります。

今回はgesture-testという名前にしました。
このコマンドを実行すると、githubからmbed-osライブラリを取ってくのでパケ死しないよう気をつけましょう。完了するまでに結構、時間がかかりました。

```
C:\mbed>mbed new gesture-test
[mbed] Creating new program "gesture-test" (git)
[mbed] Adding library "mbed-os" from "https://github.com/ARMmbed/mbed-os" at branch latest
[mbed] Updating reference "mbed-os" -> "https://github.com/ARMmbed/mbed-os/#5f6572179d66ce4c09d6517b659ac51133cc980d"
warning: LF will be replaced by CRLF in mbed-os.lib.
The file will have its original line endings in your working directory.

C:\mbed>
```

# リモートリポジトリをローカルにコピー

Mbedサイトに作った空のリポジトリを、ローカルに作ったプログラムに追加します。

リモートリポジトリの右側にあるRepository toolboxの、Import into Compilerをドロップダウン（右側の下矢印っぽいマークをクリック）すると、Import with mbed CLIというのが表示されるのでクリックします。すると、リモートリポジトリをローカルにコピーするコマンドが表示されるので、右にあるコピーアイコンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/ade17242-9f3b-7693-8681-4511cca97555.png)

次に、コマンドプロンプトで貼り付け（Ctrl+V）して実行すると、リモートリポジトリがローカルにコピーされます。

```
C:\mbed>cd gesture-test

C:\mbed\gesture-test>mbed add http://os.mbed.com/users/matsujirushi/code/PAJ7620U2/
[mbed] Adding library "PAJ7620U2" from "https://os.mbed.com/users/matsujirushi/code/PAJ7620U2" at latest revision in the current branch
[mbed] Updating reference "PAJ7620U2" -> "https://os.mbed.com/users/matsujirushi/code/PAJ7620U2/"
warning: LF will be replaced by CRLF in PAJ7620U2.lib.
The file will have its original line endings in your working directory.

C:\mbed\gesture-test>
```

といっても、元のリポジトリが空なので...（ﾓｺﾞﾓｺﾞ
ローカルには、**.hg**というフォルダが出来上がりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/d620a92f-9ed7-0b87-f4c6-a3af5b1c955f.png)

> **.hg**という名前から、Mbedサイトのリポジトリは[Mercurial](https://ja.wikipedia.org/wiki/Mercurial)で管理されていることが分かります。

# ローカルリポジトリにライブラリコードを追加

あらかじめ作ってあるライブラリコードを、さきほどコピーしたローカルリポジトリに追加します。

PAJ7620U2.hとPAJ7620U2.cppの2つをコピーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/a7dbe328-3e8e-6e98-0620-591a466fa08d.png)

ローカルリポジトリに対して、ファイル追加とコミットを実行します。

```
C:\mbed\gesture-test>cd PAJ7620U2

C:\mbed\gesture-test\PAJ7620U2>hg add .
PAJ7620U2.cpp を追加登録中
PAJ7620U2.h を追加登録中

C:\mbed\gesture-test\PAJ7620U2>hg status
A PAJ7620U2.cpp
A PAJ7620U2.h


C:\mbed\gesture-test\PAJ7620U2>hg commit -m "1st commit"

C:\mbed\gesture-test\PAJ7620U2>hg log
リビジョン:   0:ea8f1bb16afc
タグ:         tip
ユーザ:       matsujirushi <matsujirushi@live.jp>
日付:         Mon Dec 18 13:48:31 2017 +0900
要約:         1st commit



C:\mbed\gesture-test\PAJ7620U2>
```

# ローカルリポジトリをリモートリポジトリにプッシュ

出来上がったローカルリポジトリをリモートリポジトリへコピー（プッシュ）します。

```
C:\mbed\gesture-test\PAJ7620U2>mbed publish
[mbed] Checking for local modifications...
[mbed] Updating reference "PAJ7620U2" -> "https://os.mbed.com/users/matsujirushi/code/PAJ7620U2/#ea8f1bb16afc"
[mbed] Pushing local repository "PAJ7620U2" to remote "https://os.mbed.com/users/matsujirushi/code/PAJ7620U2"
https://os.mbed.com/users/matsujirushi/code/PAJ7620U2/ は HTTP 認証が必要です
認証領域(realm): mbed.org
ユーザ:matsujirushi
 パスワード:

C:\mbed\gesture-test\PAJ7620U2>
```

# 出来上がり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/8fda9c54-bb26-17be-d81b-d1dbdd15351b.png)

# 感想

* mbed-cli（とMercurial）について少しレベルアップした気がする。
* [mbed-cliのドキュメント](https://github.com/ARMmbed/mbed-cli#introduction)すばらしい。
* Mbedサイトでリモートリポジトリを作った後、リモートとローカルのやりとりはmbed-cliコマンド、ローカルはMercurialコマンドを使ったが、mbed-cliコマンドを使わない方が楽なのかも？それだとプログラムを作る必要は無いのかも。（Mercurialわからん）
* Mercurialわからんので、[Windowsシェル連携](https://tortoisehg.bitbucket.io/download/index.html)や[VisualStudio連携](https://marketplace.visualstudio.com/items?itemName=Multicoreware.HgVS)を試したい。