背景
今までもSTM32マイコンにFatFsは搭載していました。
CubeMXのミドルウェアにFatFsがあり、簡単に組み込めます。
ドライブも
- USBメモリ
- SDカード
から選べますし、両方使うこともできます。
今まではC言語でFatFsをラッピングして使いやすいように実装していましたが、C++への移行を機にファイルシステムもC++でラッピングします。
それと、ファイルシステムがあるなら、やはりファイルブラウザも欲しいです。
これもC言語からC++へ移行し、ファイルシステムのラッピングに統合します。
これでFatFsを組み込み、さらにラッピングしたC++のクラスを組み込めば、ファイルのリードライトだけでなく、ファイルのブラウズもできるようになります。
CubeMXでのFatFs設定
ファイルシステムとして使うだけであれば、CubeMXの初期設定のままでいいです。
今回、ファイルブラウザとして使うにあたって、必須の機能としてディレクトリの移動があなります。
また、現在のディレクトリパスの取得も必要なので、このための設定を変更します。

FA_RPATH(Relative Path)をEnabled with f_getcwdに変更します。
相対パスを使う必要があるのと、f_getcwdで現在のパスを取得する必要があるからです。
コードジェネレートすれば、簡単にFatFsをプロジェクトに組み込めます。
ほんと、CubeMXってすごいと思います。
ファイルブラウザの機能
FatFsの機能をうまく使えば、ファイルブラウザも用意に実現できます。
最低限の機能を実装してみました。
現在のディレクトリ内にあるファイル一覧
まずはなんといってもファイルの一覧ですよね!
UNIXライクにlsコマンドで表示します。

ファイルの場合はそのサイズを、ディレクトリの場合はDIRと表示します。
ファイル内容の表示
あまり使うことはないかも知れませんが、ファイルのリード操作の確認に便利です。
同じくUNIXライクにcatコマンドを使います。
リストにあるHELLO.TXTを表示しました。
ファイルのサイズは13バイトと小さなもので、ファイルの内容はこんな感じです。
ちゃんと表示できてますね。
サイズの大きなファイルももちろん表示できます。
英文ニュースの記事をコピペしたNEWS.TXTというテキストファイルを表示します。
テキストファイルなら問題なく表示できます。
バイナリファイルはターミナルによってはおかしな動作になりますが、その辺はそれなりに...という感じです。
ディレクトリの移動
STM32F407に接続しているUSBメモリの中身は、Macで確認するとこんなふうになっています。

ちょっと階層が深めのCCM/CCMDIR/testdir/へ移動してみましょう。
Macで確認した通り、CCM/CCMDIR/TESTDIRの中にCCM-001.BINというファイルが入っていますね。
こんな感じでディレクトリが移動できるのに加えて、現在のディレクトリの位置をプロンプトで表示しています。
この現在のディレクトリのプロンプトはf_getcwdで取得しています。
UNIXと同じように、「..」で一つ前のディレクトリに戻れます。
これは相対パスを利用できるようにしたので利用できる機能です。
ファイルシステムのクラス

コードを記載しても仕方ないかなぁ...と思い、こんな感じにクラスにしてますよという画像です。
よく使われるであろう機能をC++のメンバー関数として実装しています。
メンバー関数の中ではFatFsの関数を使っています。
ファイルシステムとしての機能、ファイルブラウザとしての機能の両方を実装してあります。
なので、プロジェクトが変わっても
- CubeMXでFatFsを組み込む
- ファイルシステムのクラスを組み込む
だけで簡単に利用できます。
この簡単さはC++だからできるものです。
C言語の時は処理を共通化してはいましたが、そこそこ手間はかかったものです。
最後に
C言語でやっていたときも、共通処理として共有できるようにはしていました。
でも、クラス化することでメソッドの追加も簡単ですし、使い回しもしやすいです。
ファイルシステム以外でも、いろんなものをクラスかすると便利です。
ちなみに、今回のファイルブラウザはUSB CDCへ文字列を出力しており、もちろんUSB CDCもクラスです。
CubeMXでのドライバ・ミドルウェアの提供はC言語ですが、ちゃんとC++でも使えますよ。
一部「#define __cplusplus」や「extern "C"」が必要ですが、C言語と共存するには避けられません。
この辺は慣れちゃえばいいですね。

