2021年4月29日

[golang]GO111MODULEはまだ使う

お仕事でgolangのプロジェクトをビルドしていた。
ビルドするだけなので手順通りにやったつもりなのだが、srcの下にファイルがないから取ってこい、みたいなエラーが出ていた。

実際にないので、go getで取ってくる。
ドキュメントを見ると -d でソースコードをダウンロードしてくれるようだ。

The -d flag instructs get not to build or install packages. get will only update go.mod and download source code needed to build packages.

が、実行して src/ の下を見てもダウンロードされていない。 pkg/mod/ の下にありそうなのだが、そこでは困るのだ。

 

ドキュメントに Legacy GOPATH go get というのがある。 gopath-get と書いてあるのだが、そんなものはない。

module-aware mode と legacy GOPATH mode というのがあるのだろうけど、go get のオプションが違うわけでもないし、何だかよくわからん。

 

そこで出てきたのが、 GO111MODULE=off だ。
これを指定すると src/ の方にダウンロードしてくれた。これが legacy というやつなのかね。

GO111、と妙にバージョンに依存した書き方になっているから不要になったのかと思ったが、まだそうもいかんようだ。全部がgo modを使う世界になったら不要になるとかなのかもしれん。

 

 

あと、gomobileか何かで Androidのをビルドしていたのだけど、そこで i386 でのビルドもしているためか GO386=GO387 はサポートしてない、というエラーになってしまった。
go v1.16からそうなったらしい。

GO386=softfloat、みたいにしておけば回避できるので、今回はそれで逃げよう。

2021年4月24日

[win]AppDataとProgramData

私のPCはWindowsがインストールされている。
Windows10 Proしか今は無いと思うが、Homeでもそんなに変わらんだろう。

何かというと、インストールされたアプリが使用するディレクトリについてだ。
Windowsだとフォルダと呼んだ方が良いのかもしれん。

 

大昔、Windows3.1とかの時代は、たしかINIファイルに全部保存していたような気がする。
3.0Aまでかもしれんが、ちょっと記憶にない。
で、どこからかパーソナルじゃなくてマルチユーザで使う必要が出てきて、レジストリに保存するということになってたんじゃなかったか。
さらに時代は進み、複数OSで同じアプリを動かしたいことになったためかどうかは知らないが、設定ファイルを作る方式のアプリも多いと思っている。

 

Linuxなんかは、ユーザディレクトリの下にドットで始まるファイル名なりディレクトリ名なりで場所を作って、そこに設定を保存している。/etcとかもあるだろうが、とにかくある程度場所が決まっている。

それに対してWindowsの場合、歴史的経緯もあってか設定がどこに保存されているのか分かりづらい。

  • レジストリ
  • ユーザディレクトリの直下
  • ユーザのAppData
  • ProgramData

おそらくこんなところではないだろうか。
たまにルートディレクトリにファイルを残しているのがあるが、もうそういうのはあきらめよう...


Windowsで見えにくいディレクトリとして、%ProgramData%と%AppData%があると思っている。
ここはもう、個人の感想だ。

なんというか、インストールして動かしたことがあるアプリは、基本的に「直接」インストールしたプログラムファイルは削除しても、使っている間に作ったファイルなんかは削除してくれないイメージがある。
そういうファイルたちが残っているのがこの見えないディレクトリたちだと思っている。

いま%ProgramData%のサイズを見てみると4GB近くあったのだ。
256GBの4GBって、結構な占有率なのだよ。256GBもディスクのGB単位だし。

 

さらに腹立たしいのが%AppData%だ。
環境変数名でアクセスすると Roaming のディレクトリしか出てこないけど、実際に見えないのは Local, LocalLow, Roamingの3ディレクトリだ。
それが9GB近く使っている。

そしてこの3つの使い分けがよくわかってないので、怖くて消せないのだ。
ストレージに余裕があるなら残していてもよいかもしれないが、それでも使っていないファイルが残るのは気持ちが悪い。
見覚えのないファイルは全部消してしまえ!!

 

・・・と、いうのを私はよくやる。
削除好きとも言う。
そして、アプリがいくつか起動しなくなるというのもしばしば。そういうのは気にしないで再インストールさせれば済んだこともあったのだけど、最近はもうそういうのが通用しなくなってきている。
時代の流れは残酷かもしれないが、私も時代に対しては冷たくあしらっているかもしれないのでお互い様だ。

 

 

そんなわけで、こういうディレクトリ達をどうしてよいのか困っているところだ。
ストレージに余裕があるなら放置したかもしれないが、余裕はない。
それに、ファイアウォールで不正な通信はなるべく塞ごうとしているものの、限界はあるので削除できるものはしておきたいというのもある。

解決する案は何もないのだが、記事にしておくよいかもしれんので残しておこう。

2021年4月3日

[win][lubuntu]ファイルコピーするとWindows側で変に見える

謎現象で、私の環境だけのような気もするが、メモを残しておこう。

 

Windows10 Pro

image

Lubuntu 20.04

image

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"

 

WindowsでVirtualBoxを立ち上げていて、、LubuntuはそのゲストOSとしてインストールされている。
あまり覚えてないが、たぶんLinux側でsambaをなんかインストールしてるはず。

 

  1. Windows側でLinux側のホームディレクトリをExplorerで開く
  2. Windows側でそこに空ファイルを作る(ここではtest1.txt)
  3. Linux側のPCManFMでそのディレクトリを開く
  4. test1.txtを選択してCtrl+C
  5. 続けてCtrl+V
  6. ダイアログが開くので、File nameを"test2.txt"にしてRenameをクリック
  7. PCManFMでは、test1.txtとtest2.txtが見える
  8. WindowsのExplorerで見ると、test2.txtが変なファイルとして見える

image

lsで見ても、特に違いが無いのだがね。。。

$ ls -la
total 8
drwxrwxr-x  2 xxx xxx 4096 Apr  3 10:31 .
drwxr-xr-x 47 xxx xxx 4096 Apr  3 10:08 ..
-rw-r--r--  1 xxx xxx    0 Apr  3 10:29 test1.txt
-rw-r--r--  1 xxx xxx    0 Apr  3 10:29 test2.txt

 

で、これをLinux側のコマンドラインから "cp test2.txt test3.txt"でコピーすると、test3.txtは普通のファイルとして見えるのだ。

"touch test4.txt" しても普通のファイルに見えるし、PCManFMで test4.txtを同じ手順で test5.txt にしても普通のファイルに見える。

Explorerで test5.txt を Ctrl+C, Ctrl+Vして test6.txtにしても普通のファイルに見えるが、 test6.txtを PCManFMで Ctrl+C, Ctrl+V して test7.txtにすると、それは変なファイルに見える。

 

そう、Windows側で新規にファイルを作った場合で、それを PCManFMでコピーした場合のみ、なのだ。この法則が分からなくて、ときどき変なファイルになってWindows側から編集できなくなっていたのである。

わかってしまえば、Windows側で新規ファイルにならないように操作すればいいだけなのだけど。今までこういうの無かったよなぁ。。。

2021年3月28日

[c/c++]fffでテストを作る

前回の続き。

hiro99ma blog: [c/c++]久々のfff
https://hiro99ma.blogspot.com/2021/03/ccfff.html

 

何でもいいからmeekrosoft/fffを使ってテストを作ってみよう。


fffはgtest(おそらくgoogle testの古いやつ)が入っているので、まずはfakeの部分は忘れてテストを実行するところだけやる。

main関数はgtest側にあるので、テストされる方のファイルはmain()だけは別のファイルにするようにしておくのが良いだろう。まあこれは他のテストを使う場合でも同じかもしれん。

 

hello.h

01: #ifndef HELLO_H__
02: #define HELLO_H__
03: 
04: const char *get_hello(void);
05: 
06: #endif /* HELLO_H__ */

hello.c

01: #include "hello.h"
02: 
03: const char *get_hello(void)
04: {
05:     return "hello";
06: }
  

main.c

01: #include <stdio.h>
02: #include "hello.h"
03: 
04: int main(void)
05: {
06:     printf("%s\n", get_hello());
07:     return 0;
08: }
  

 

Makefile

01: hello:
02:     gcc -Wall -o hello hello.c main.c
03: 
04: clean:
05:     rm -f *.o hello
  

 

こんなファイルたちがあって、get_hello()が"hello"を返すかどうかというテストにしてみよう。

 

testsディレクトリをつくる

なくてもよいけど、本体とテストは別にしておきたいので、tests/というディレクトリを作る。

ついでに、tests/fffというディレクトリも作っておく。

 

fffのファイルをコピーする

meekrosoft/fffをcloneして、いくつかのファイルを作成した tests/fff/ ディレクトリの中に置く。

    • gtestディレクトリまるまる
    • fff.h
    • LICENSE

全部コピーしても良いのだが、最低限いるのはこれらだ。

 

テスト本体

gtest.hを見る限り、テストで使える比較マクロはこれらのようだ。

//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2

と言いつつ、文字列とboolもあるようだ。stdbool.hがいるのかな? そこは試してない。

{ASSERT|EXPECT}_TRUE(v1)
{ASSERT|EXPECT}_FALSE(v1)

{ASSERT|EXPECT}_STREQ(v1, v2)
{ASSERT|EXPECT}_STRNE((v1, v2)
{ASSERT|EXPECT}_STRCASEEQ((v1, v2)
{ASSERT|EXPECT}_STRCASENE((v1, v2)

FLOATもあったし、他にもいろいろありそうだ。

ASSERTとEXPECTの違いは、失敗時に関数内の処理を継続するかどうか。ASSERTで失敗するとそこでreturnして次のテスト関数に進むし、EXPECTで失敗すると次の行以降も実行する(もちろんテストとしてはエラーになるが)。
個人的にはASSERTだけでいいんじゃないのかと思うが、まあこれは内容次第だろう。

 

tests/test_hello.cpp

01: #include "fff/gtest/gtest.h"
02: 
03: extern "C" {
04:     #include "../hello.c"
05: }
06: 
07: class test_hello: public testing::Test {
08: };
09: 
10: TEST_F(test_hello, hello1)
11: {
12:     ASSERT_STREQ(get_hello(), "hello");
13: }
14: 
15: TEST_F(test_hello, hello2)
16: {
17:     ASSERT_STRNE(get_hello(), "hellos");
18: }
19: 
20: TEST_F(test_hello, hello3)
21: {
22:     ASSERT_STRCASEEQ(get_hello(), "HELLO");
23: }

Makefile

ここはcmakeとか他にもいろいろあるかもしれんし、シェルスクリプトでもいいのかもしれん。
自分の好みで。

01: TEST_SOURCES += \
02:     test_hello.cpp
03: 
04: all: mk_fff
05:     mkdir -p build
06:     g++ -o build/tst $(TEST_SOURCES) fff/build/*.o -pthread
07: 
08: mk_fff:
09:     mkdir -p fff/build
10:     cd fff/gtest; $(MAKE) all
11: 
12: test:
13:     ./build/tst
14: 
15: clean: 
16:     cd fff/gtest; $(MAKE) clean
17:     rm -rf fff/build build

 

ビルド&テスト

makeしてmake testすればテストが実行される。

$ make test
./build/tst
[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from test_hello
[ RUN      ] test_hello.hello1
[       OK ] test_hello.hello1 (0 ms)
[ RUN      ] test_hello.hello2
[       OK ] test_hello.hello2 (0 ms)
[ RUN      ] test_hello.hello3
[       OK ] test_hello.hello3 (0 ms)
[----------] 3 tests from test_hello (0 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 3 tests.


さて、ここまではfff無しだった。
fffはfff.hだけあればよいのだが、いくつか準備がいる。

まず、fffが使うグローバル変数の確保。
includeは何箇所でやっても良いのだが、1箇所だけDEFINE_FFF_GLOBALSを置く。どこに置くか悩むんだったら専用のファイルを作ってしまえば良かろう。
置き忘れたら fffが無いというリンクエラーになるので、気付くだろう。

 

設定はそれだけで、あとはfake関数を作るだけだ。
マクロはこの2つ。

  • FAKE_VOID_FUNC : 戻り値なし
  • FAKE_VALUE_FUNC : 戻り値あり

VOIDかVALUEかは、戻り値があるかどうかだけだ。戻り値なしも同じマクロにできればよいのだが、有ると無しでは大きく違うので仕方なかろう。

書き方はFAKE_VOID_FUNC(funcname, args...)か、FAKE_VALUE_FUNC(戻り値の型, funcname, args...)で、argsは引数の型だけ。引数が無ければ書かなくて良い。

どうやってマクロで引数を処理しているかというと、FUNC0、FUNC1、...、FUNC20、のようにそれぞれの引数のマクロが用意されているのだった。大変ですな。。。

fake関数を作ると、関数名の後ろに_fakeを付けた構造体の変数が定義される。

  • call_count
  • arg_history_len
  • arg_histories_dropped

他にもある。。。が、私が使うのはcall_countくらいか。

戻り値を変更したい場合は、だいたいcustom_fakeを使っている。return_valやSET_RETURN_SEQ()もあるが、使い分けるのが面倒なので、自分で関数を作ってやってしまうことが多い。そういう関数はclassのstatic関数として作っている(こんな感じ)。gccだとnested functionsなるものに対応しているので、関数の中にそこで使うカスタム関数を定義しても良いそうだ。まあ、テスト用だから互換性とかそんなに気にしなくてもよいだろうしね。

call_countなんかは蓄積するので、クリアしたければResettingするとよかろう。書いてあるようにgtestの setUp()に仕込んで毎回クリアするといいんじゃないかね。


あとは、やりたいことがこれでできなかったらREADMEを読む、くらいか。

他のC言語用テストフレームワークを使ったことがないので比較はできないのだが、インストールもいらないし、valgrindと併用してメモリリークを見つけたりもできるし、私は気に入っている。

[c/c++]久々のfff

普段、C言語のことは「clang」と書いていたのだが、LLVMのclangもあったんだということを思い出した。
まあそんなことはどうでもよくて、久々にC言語を使っている。
あんだけ使っていたのに、しばらく使わなかっただけで忘れてしまっているところがあるのは哀しいのだが、まあ加齢もあるから仕方あるまい。

 

で、今日は単体テストについてだ。
自分がどうやってやっていたのか思い出そうとしたところ、これが出てきた。

hiro99ma blog: [c/c++]私のC言語 (5) - FFF
https://hiro99ma.blogspot.com/2016/08/ccc-5-fff.html

モックを作る meekrosoft/fff と(これはmicrosoftと名前をかけてるのかな)、その中にgtestが入っている。gtestは google testのことか、あるいはその前身だろう。ファイルのヘッダを見ると2005年なのだが、GitHubには残っていなさそうだったのだ。今のgoogle testのgtest.hもファイルヘッダは2005年なのだが、fff/gtest/gtest.hとファイルサイズが違いすぎる。おそらく複数のファイルを1つにまとめてあるのだろう。

 


今のfffはv1.1が最新だ。

Release Release v1.1 · meekrosoft/fff
https://github.com/meekrosoft/fff/releases/tag/v1.1

というわけで、私のサンプルも更新した。といってもfff.hだけだが。

hirokuma/fff_examples: FFFを使った例
https://github.com/hirokuma/fff_examples

前回が2016年なのもあるが、fff.hの差分が多すぎて違いを見るのが難しい。

なぜか分からんが、gccのオプションに-pthreadが必要になってしまった。gtest.hでpthread関数が使われているためのようなんだけど、今回gtest.hは変わってないんだよなぁ。。。

# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)

ああ、前回はcygwinで試したからこの条件に入っていなかったのか。納得だ。

 

テストを見ていて気付いたのだが、 weak_linkingサンプルはCソースしかない。
C++じゃないといけないと思い込んでいたのだが、いつしかC言語だけでテストが書けるようになっていたのか? でも、 __attribute__((weak)) とかMakefileに書いてあるし、なんか特殊なのかもしれん。

weakについてはこちらに書かれていた。

hiro99ma blog: [nrf51]app_error_handler()はWEAK
https://hiro99ma.blogspot.com/2015/02/nrf51apperrorhandlerweak.html

昔の私は言いました。

ライブラリ関数としてweakとしておけば、ユーザコードで上書きできるよ、みたいな感じらしい。

へー。
確かにMakefileを見ると、"FFF_GCC_FUNCTION_ATTRIBUTES"に"__attribute__((weak))"を設定していて、fff.hではFFF_GCC_FUNCTION_ATTRIBUTESを使ってFUNCNAMEを修飾している。
libfakes.aは、test内のDEFINE_FAKE_VALUE_FUNCみたいな関数をアーカイブしている。これらがweakになって置き換えられるようになっている、とういことか。
難しいこと考えるねぇ。

今までそういうのはcustom_fakeで行っていたと思う。
C++だとclassが使えて、そこにstaticな関数を作ることができるので、それをcustom_fakeにしてしまえば関数内で閉じたモックを作ることができるので便利だったのだ。
・・・と思っていたのだが、この例だと関数内に関数を書くことができてるな・・・そんなことできるんだっけ。nested functionをサポートしているならできるんだろう。

 

weakの件がC言語だけでテストコードまで書ける件と関係しているのかと思って見ていたのだが、関係はないのか?

別にC++でテストを作るのに困るわけでも無いし、どっちかといえば楽かもしれん。
ただ・・・テストコードは本体のCソースよりもだいたい量が多くなってしまう。そうするとGitHubの"Languages"でC++のプロジェクトのように見られかねないのだ。

image

まあいいんだけど、気になる場合は見直してみるのもよかろう。

 

うーん、今回は(も?)煮え切らない記事になってしまった。
次がんばろう。

2021年2月21日

M5CORE2とタッチパネル

M5Stack Fireで動くアプリをM5CORE2に移植しようとしている。
GPIOのボタンがないので、タッチパネルを有効にしてソフトウェアボタンを代わりにしようとしている。

それはよかったのだが、移植先でソフトウェアボタンの応答性がよろしくない。
ログも出せない状態なのでLEDの点灯だけで様子を見ているのだが、タッチパネルのFT6336UにI2C readしているところがなかなか戻ってこないようで、それも5秒くらい間が空いている。

 

I2Cのアクセスにmutexとかかけてないからよくないのでは、と思っていたのだが、FT6336UのINTピンはOUTPUTで、readできるようになったときにアサートするようになっているらしい。read準備できていないときにI2C readするとどうなるのかはわからなかった。スタートコンディションにならないとかで今回の妙に時間が空く現象が起きたんじゃなかろうか。

ただ、I2C readを定期的に行うようにしたのはINTでtaskを起こしてI2C readする、というのがうまくいっていなさそうだったから変更しただけなのだ。
なんだろうね。

 

M5CORE2でI2C接続しているものは、これら。

image

私が今回使いたいのは、AXP192とFT6336U。
AXP192にGPIOがあるので指示はI2Cで出すし、タッチパネルのFT6336UからはI2Cで結果を読み取るし。
それが別々のtaskで好き勝手やってたら、そりゃうまく動かんわな。

I2Cのドライバレベルでは排他は持ってないだろうから、簡易的にmutexの変数をグローバルにして衝突だけは回避させるか。
失敗したらランダム時間待ってからリトライ、というのでも暫定対応としては悪くないかも。


というわけで、今日の作業はおしまいだ。
何も解決していないのだが、M5CORE2のソケットを外してみたので写真を載せておこう。
裏蓋は六角レンチが無いと開けられないが、ソケットだけなら丈夫な細い鉄串か何かで取り外せる。爪楊枝くらいだとちょっと強度が足りない気がするがね。

image

2021年2月20日

M5CORE2にはGPIOのボタンが無い

M5CORE2は全面がタッチパネルになっていて、ハードウェアのボタンは電源とリセットしかない。
LCDよりもタッチパネルの方が広くなっていて、LCDが無い部分に丸が描いてある。ここをボタンと見なせばいいんじゃないの、ということだろう。

image

for AWSにもソフトウェアボタンの実装がある。
初期化のところを見ると、左上の座標と幅x高さを与えれば、そこがボタン扱いになるようだ。つまり画面の下にある3つに固定されているわけではないということだ。

 

サンプルではボタンの読込をこんな感じで行っている。
for文の中でポーリングしているのだが、本体の方ではtaskが立ち上がっているようで、ポーリングのタイミングでタッチパネルの状態を見に行くのではなく、その時点で最後にtaskで更新されたデータを読むだけである。

状態が変わったタイミングでコールバックもらいたいと思ったが、コールバック関数をよくわからんtaskに登録してコンテキストがどうなってるか悩むことになるくらいなら、コールバックするためのtaskを別に立ち上げた方がよいだろうな。

2021年2月14日

M5CORE2のシステムLED

M5CORE2の電源LEDを点灯させたい。

電源LEDと書いたが、正確にはSYS_LEDという名前だ。

image

なので、電源がONになると自動的に点灯する、というわけではない。
そしてこれ以外にLEDは無いので、LCDもLEDも制御していない状態だと外見から電源が入っているかどうかわからないのだ。

だからLEDを点灯させたいのだ。


困ったことに、SYS_LEDはESP32のGPIOではなくAXP192、つまり電源制御用のチップ側につながっている。
GPIO1だ。

image

LEDのところからすると、SYS_LEDが0Vになれば電流が流れて点灯するはずだ。

 

for AWSのコードでは、起動時に1、Enableにするときに0を設定している。
どちらもAxp192_SetGPIO1Mode()という関数を使っている。
AXP192_GPIO1_CTL_REGが0x92なので、そこがGPIOのHI/LO設定なのだろう。

一応確認しておく。
AXP192データシートは・・・中国語版PDFしか見当たらなかった。

image

くっ・・・。
下位3bitが有効で、デフォルト値は111。なんとなく文字の雰囲気からハイインピーダンスだろうか。
起動時に001、ONにするときに000。

功能设置 → 機能設定

000 NMOS 漏极开路输出 → NMOSオープンドレイン出力
001 通用输入功能 → ユニバーサル入力機能

値の書込では無くモードの設定なのか。
ユニバーサル入出力が、いわゆるGPIOモードなのだと思う。
でも、LEDのONでオープンドレインにする・・・? いや、関数名からするとLEDを有効にする、なのだが同時に点灯もしているのだ。

あ、001は「入力」で、000は「出力」だった。
入力の時って、だいたいハイインピーダンスよね。

 

Hi/Loの制御はこっちだと思う。

image

デフォルトの出力値が0なので、GPIO1の設定を出力にしただけでLEDが点灯する、というわけだ。
念のためHiにしたら点灯しなかったので、間違ってないだろう。

いやあ、久々にポート制御するので不安だったよ。

 

(追記)

システムLEDのON/OFFをする場合、0x94レジスタのHi/Loでは結局ダメだった。
Hiにしたら等電位になって点灯しないと思うのだが、そうならない。
0x92レジスタでINPUT(OFF)/OUTPUT(ON)にするしかなく、まあfor AWSの実装そのままになった。
すっきりせんなぁ。

2021年2月13日

M5CORE2とFireはけっこう違う

何を今さら、と言われそうだが・・。

M5Stack Fireで作られたプログラムをM5CORE2で動かそうと考えていた。
それならFireを購入すればいいやん、と言われそうだが、新しい方を使いたかったのだよ(もちろん値段が安かったからという理由もあるのは言うまでもない)。

LCDは幸い同じデバイスで、FLASHサイズも同じ。PSRAMは大きくなる方だから問題ない。
明らかに違うのはボタンが物理的に存在しないということくらいだ。

 

などとのんきに構えていたのだが、ピンアサインが結構違うのだな……

番号が違うだけだったら変更すれば済むのだが、M5CORE2では一部が電源チップにあるGPIOを使っているのだ。接続がI2Cなので、ESP32から制御するときはI2Cでお話ししないといけない。LCDに何も出てこないと思ったら、そういうことなのだ。

ボタンも、GPIOで直接見に行くようになっていたのだが、そっちはそもそもの方式を変更せねばならない。
for AWSの方にVirtual Buttonというコンポーネントがあったので持ち込めばなんとかなるかもしれんが、ともかく何とかしないといかんのだ。

 

まあいい。
最近組み込みしてないので、気分転換と思おう。

M5CORE2の付属モジュール

前回、AWS版のGitHubにあるサンプルからコードを削りすぎて音が出なくなった。
ノーマルなM5CORE2にもあったハードウェアだから1つはいらないんじゃないの?ということで削ったのだがそうではないらしい。

そもそも、私が思っているハードウェア差分は正しいのだろうか?

 

image

商品ページの2枚目の画像があったのだが、M5CORE2の本体と付属モジュールという分け方をした場合、MPU6886の6軸加速度センサとSPM1423のマイクセンサは付属モジュールに当たるのだ。

for AWSはこの付属モジュールを取り除いて、こっちを挿す。

image

なるほどね。

なのでハードウェアの差分としては、セキュアエレメントのATECC608AとRGB LEDのSK6812、あとは電源周りとなる。

すっきりだ。


そこである程度元に戻して再起動しなくしたのがこちら。

https://github.com/hirokuma/Core2-for-AWS-IoT-EduKit/tree/d9000f4a1fdf23fe01f1d48d1cb98f60c9cbbf11/Hardware-Features-Demo

どうも再起動している原因はスピーカーのようなのだ。
分かりづらいので、masterとの差分で見るとこちらだ。

https://github.com/m5stack/Core2-for-AWS-IoT-EduKit/compare/m5stack:3c5aa62...hirokuma:d9000f4#diff-fea5e934abd550c3049b8f91b1f307c8200a0610f1f3e06acb60a2273058855bR59

あれ、マイクじゃ無くてスピーカー?
いや、microphoneTaskを止めれば起動した。

https://github.com/m5stack/Core2-for-AWS-IoT-EduKit/compare/m5stack:3c5aa62...hirokuma:8561420#diff-fea5e934abd550c3049b8f91b1f307c8200a0610f1f3e06acb60a2273058855bR192

microphoneTaskはなにかというと、mic_fft_test.cにあった。グラフィックっぽいデータもあるようだが、一番下に出力するのだろうか?

image