「電子ペーパーを TWELITE に接続する」
https://qiita.com/nanbuwks/items/be4f8125b686079e74d6
において、チェッカーを表示させました。
これは cbAppColdStart 内に記述し、起動時1度のみ描画処理を行いました。
今回は、任意のタイミングで描画してみます。
ePaper のタイミング
ePaper の描画は秒単位で時間がかかります。先のコードは描画が終わるまで処理が帰ってこないように作っているため、そのまま使うとタイミング的な問題が発生しそうです。
TWELITEの作法
「TWENET 動作フロー」
https://sdk.twelite.info/tweliet-net-api-jie-shuo/twenet-fur
によると、
- cbAppColdStart
以外のハンドラとして、
- cbAppWarmStart
- cbToCoNet_vMain
- cbToCoNet_vRxEvent
- cbToCoNet_vTxEvent
- cbToCoNet_vNwkEvent
- cbToCoNet_vHwEvent
- cbToCoNet_u8HwInt
があります。このうち、
- cbAppWarmStart
はスリープ復帰時に呼び出されます。
- cbToCoNet_vRxEvent
- cbToCoNet_vTxEvent
- cbToCoNet_vNwkEvent
は無線通信時に呼び出されます。
- cbToCoNet_vHwEvent
- cbToCoNet_u8HwInt
はタイマーなどのハードウェア割り込みから呼び出されます。
- cbToCoNet_vMain
は cbToCoNet_vRxEvent や cbToCoNet_vHwEvent などの処理が終わった後に呼び出されます。
これらの呼び出しトリガはFIFOバッファに格納されているのである程度タイミングを乱すような処理をこれらに書いてもなんとかなりそうですが・・・
「TWELIET NET API 解説」-「TWENET 動作フロー」-「メインループフロー」
https://sdk.twelite.info/tweliet-net-api-jie-shuo/twenet-fur/meinrpufur
において、
「各コールバック関数で相対的に長い時間のかかる処理を行うと、他の処理が滞るため各処理は簡潔にとどめる。」
とあります。
確かに上記の cbToCoNet_****Event のほとんどは割り込みハンドラなのですが、cbToCoNet_vHwEvent だけについては
ペリフェラルの割り込み処理の遅延実行部。割り込み処理後に呼び出されます
とあり、ここには時間のかかる処理を置いても大丈夫ぽいです。
cf., https://sdk.twelite.info/twelite-net-api-rifurensu/krubakku
同様に、 cbToCoNet_vMain も時間のかかる処理を置けるかな? と思いましたが、
「電子ペーパーを TWELITE に接続する」
https://qiita.com/nanbuwks/items/be4f8125b686079e74d6
のコードに cbToCoNet_vMain に処理を書いても実行して無さそうでした。
ということで今回は cbToCoNet_vHwEvent 内に処理を置いてみました。
なお、上記以外の方法についてもあるようだが未検証。
cf.,ToCoNet SDK マニュアル
https://mono-wireless.com/download/SDK/TWESDK_201404/ToCoNet_SDK_manual_20140404.pdf
95ページ 「システム組込イベント」
cbToCoNet_vRxEvent()
実行内容
1分ごとに e-Paper の描画を変更します。
cbToCoNet_vHwEvent
は何種類かのトリガにより呼び出されますが、
case E_AHI_DEVICE_TIMER0:
において、タイマーでの定期呼び出しによる処理を書くことができます。
この定期呼び出しは 64回 / 秒 の呼び出しとなっているようです。
グローバル変数 epaperstatus :
- 2 未処理
- 1 処理中
- 0 処理完了
グローバル変数 epaperremaincount :
- カウントダウンを秒数で格納
として、残り時間を分単位で表示するようにしました。
// epaper処理
static int epapertimer0count=0;
epapertimer0count++;
if ( 0 != epaperremaincount && 2 == epaperstatus ){
epaperstatus=1;
ePaperDispMin((epaperremaincount +59 )/ 60 );
epaperstatus=0;
}
if (0 == ( epapertimer0count % 64 ) ){ // 1秒おき
epaperremaincount--;
if ( 0 == epaperremaincount % 60 ){ // 1分おき
if (( 0 <= epaperremaincount ) && (0 == epaperstatus)) { // カウントが0以上でなおかつ処理中でなければ
epaperstatus=1;
// ePaper書き込み
ePaperInit();
ePaperDispMin((epaperremaincount +59) / 60 );
epaperstatus=0;
}
}
}
うまくいきました。