1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TWELITE に時間のかかる処理を記述

Posted at

「電子ペーパーを 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;
		}
	}
} 

うまくいきました。

IMG_20200930_141303405 (1).jpg

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?