mbed
mbed-os
mbed-cli
MbedDay 10

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

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

ライブラリコード

Mbed Connect @ Arm Tech SymposiaでSeeedブースに展示するmbedRO359Bのデモのために、Grove - ジェスチャーセンサーからI2Cでジェスチャーを取得する、PAJ7620U2クラスを作りました。ファイルはPAJ7620U2.hとPAJ7620U2.cppの2つです。
image.png

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

余談ですが、デモはmbedRO359Bに接続したGroveモジュールのタッチセンサー、可変抵抗、ジェスチャーセンサーで、プロジェクターに投影した画像をグリグリと回したり上下左右に動かすというものでした。mbedRO359Bとパソコンの間はMQTT通信。
image.png

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

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

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

image.png

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

image.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

次に、コマンドプロンプトで貼り付け(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

.hgという名前から、MbedサイトのリポジトリはMercurialで管理されていることが分かります。

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

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

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

image.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

感想

  • mbed-cli(とMercurial)について少しレベルアップした気がする。
  • mbed-cliのドキュメントすばらしい。
  • Mbedサイトでリモートリポジトリを作った後、リモートとローカルのやりとりはmbed-cliコマンド、ローカルはMercurialコマンドを使ったが、mbed-cliコマンドを使わない方が楽なのかも?それだとプログラムを作る必要は無いのかも。(Mercurialわからん)
  • Mercurialわからんので、Windowsシェル連携VisualStudio連携を試したい。