【軸の秤】 version 0.2.0 リリースノート
前回の0.1.1にバグがあったのでそこだけ直してさっさと公開すればよかったんですが、直してるとあちこち弄《いじ》りたくなってしまい、時間かかってしまいました。
ファームウェアのダウンロードや書き込み方法はファームウェアのダウンロードの記事からお願いいたします。
0.2.0からファームウェアの書き込みに加えて、(Webサーバー機能で使う)SPIFFSに置くファイルの更新が必要になりますのでよろしくお願いします。
【軸の秤】ファームウェアのダウンロード
https://romly.com/blog/jikunohakari_firmware
新機能
ファームウェアアップデート機能
- SDカード経由でファームウェアをアップデートできるようになりました。
と言っても、このバージョンのファームウェアは従来の方法で書き込まなければならないので、使えるのは次回以降のバージョンなんですけどね…… - 伴って、SPIFFSに必要なファイルもSDカードから更新できるようにしました。こちらは今回のバージョンから使えます。というか、アップデート時に必ず必要な操作になります。
Webサーバー機能
- 測定データ一覧を表示した時にファイルサイズ、タイムスタンプも表示されるようになりました。
- SDカード内のファイルを閲覧できる機能を追加しました。ファイルのコピー/削除も行えるので、WiFiさえ繋げばSDカードを抜き差しする手間が激減して便利です。
- ダークモードに対応しました。OSの設定(
prefers-color-scheme
)を見て必要に応じて暗い色になります。やっぱり、急に白い画面が表示されると眩《まぶ》しいですからネ。
その他
- 測定データファイル一覧に並び替え機能を追加。
名前順以外に書き込み順にも表示できるようになったので、直近のデータを参照するのがだいぶ楽になりました。
変更点
- 起動時にWiFiに自動接続できるようになりました。また接続に成功した場合は接続画面を自動的に閉じるようにしました。
- 画面左上のWiFi及びマイクロSDカードアイコンがより多くの画面で表示されるようになりました。
- UIの日本語対応部分も拡充しています。
バグ修正
- 測定時にリリース状態が記録されていなかった(リリースカーブもプレスカーブとして記録していた)不具合を修正しました。
軸の秤のデータファイルは最後の数字が0の場合プレスカーブ、1ならリリースカーブになっていて、全て0として記録してしまうバグでした。 - WiFi接続時に "Idle" や "Disconnected" で止まってしまい接続されない不具合に対し、一定回数リトライすることで可能な限り正しく接続されるよう修正しました。
- WiFi接続後に前の画面に戻った時に接続状況が更新されず、IPアドレスが表示されない事がある不具合を修正しました。
- 日付時刻が設定されていない状態でもスクリーンショット画像ファイルにタイムスタンプが書き込まれてしまう不具合を修正しました。
- Webサーバー機能で測定データ一覧を表示した時に60個までしか表示されない不具合を修正しました(999個までにしました)。
- Webサーバー機能でファイルのフィルタリングが行われず、計測データ以外も表示されていた不具合を修正しました。
裏話
Webサーバー機能
内部的な変更なので表には全く見えないんですが、Webサーバー機能は大改修でした……
大きな改修は2つあって、一つは必要なHTMLファイル等をESP32のSPIFFS領域に直に保存していたんですが、これを一つのバイナリファイルにまとめました。ファームウェアのアップデート機能が付いたので、バージョンアップ時にこちらも簡単に書き換えられる必要があって、そうすると複数ファイルより楽かなと……
実体部分は無圧縮で結合しただけなんですけど、必要な部分を取り出せるよう独自形式のインデックスを書き出すスクリプトを作ったり、それを取り出す仕組みを実装したり。時間かかりましたが、おかげでSPIFFSに置かなければならないファイルは一つで済むようになり、アップデート処理はわかりやすくなったはず。
もう一つはけっこう頑張って作ったSDカードブラウザです。ESP32は比較的簡単にWebサーバー機能を実現できるようになってるんですが、<input type="file">
を含むmultipart/form-data
を良きに計らってくれるほど万能ではないので、HTTPリクエストとそこに含まれるバイナリデータを受信しながら同時にSDカードに書き込む処理をセコセコ実装することに。
HTTPリクエストヘッダの境界文字列なるものを初めて知ったし、その処理とかもめんどくさかったー…… PCみたくガッとメモリに一括受信して後から処理っていう富豪プログラミングができなくて、受信しながらSDカードに書き込まないといけないのが辛《つら》みポイントでした。そのせいでどーしてもバイナリが一致しない事があるのでMD5チェックするようにしたり……
あ、そういえばJavaScript、File.lastModified
はあるのに作成日時が参照できないの不思議ですね。
測定機能のStateパターン化
測定中の処理も地味に複雑でごちゃごちゃしていたので、ステートマシン的な感じで個々の状態を表すクラスを作って処理を任せる形にまるっと変更。コード量は多くなるけど、やっぱり処理と関連変数がまとまってクラスでブラックボックスになってるとわかりやすいなーと。
多言語対応の文字列リソースとか
文字列を扱う場面での英語と日本語の場合分けも増えてきたので、文字列リソース的な仕組みも作りました。日本語と英語の各種メッセージを羅列したファイルを作っておいて、そこから必要なメッセージを取り出せるような、よくある仕組みです。JSON形式のリソースファイルをPythonスクリプトが.hに変換してくれて、それを扱うちょっとしたクラスみたいな形にまとまってます。
モバイルアプリなんかだと大抵はフレームワークに標準搭載されてたりしますが、Arduinoの様なマイコン的なやつだとあんまり無い…… のかな? そもそもこんな小さな画面で多言語対応する必要ないですしね……
ついでに日本語のピクセルフォントもかなり増えました。漢字は美咲ゴシックをベースにしつつ、7x7ピクセルに収める必要はないので必要に応じてアレンジしてます。ひらがなはほとんど描き起こし。前述のPythonスクリプトが不足しているピクセルフォントを教えてくれるので過不足無く文字を増やせます。
PlatformIOはイイ感じ
C++言語にも徐々に慣れてきたと言うか、いろいろ知らなかった機能を学んでおります。constexpr
とか、enum class
とかも最近やっと知ったので、コード上には最初の方に作った#define
マクロとが混在するごちゃまぜ状態、一貫性ゼロ……
あ、あと開発環境をArduino IDEからPlatformIOに変えました。
ライブラリのソースに一切手を加えずにマクロを上書きしたくて導入した(PlatformIOだとコンパイラフラグを使ってそういう事が出来ちゃう)んですが、エディタとして使っていたVS Codeと統合されて使いやすいし、コンパイルも進捗が表示されるので速くなった気がするし、コンパイルエラーもクリックして該当位置にジャンプできるしで快適です。
ってか軸の秤、ソースファイルは優に120超えてるので、むしろさっさとArduino IDEを卒業すべきだったのかもしれないです。タブ表示大変なことになってたし(笑)。
移行に伴うソースの書き換えは思ったより少なくて済みました。むしろ、inoファイルだとメソッドの前方宣言が必要なケースと不要なケースの違いが不明瞭で、たまに謎のエラーが発生しては一日悩んだ挙げ句前方宣言で解消するという事があって気持ち悪かったんですが、PlatformIOだと基本的に必ず前方宣言しなければならない(C言語の基本的なルール通り)なのでわかりやすいですし、精神衛生上もよろしいです。
いじょ!
というわけで軸の秤、ファームウェアバージョン0.2.0、よろしければお楽しみ下さいー。
この記事はここで終わりです。
読んでいただきありがとうございました。
良かったらシェアしてね!
That's all for this article. Thank you for your reading.
Please share this if you like it!