YS電子工作ラボ

グラフィックス
動的文字列の表示

(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード


 動的文字列(dynamic text)をラベルウィジェットやテキストフィールドウィジェットなどに表示する例を紹介します。 動的文字列とは プログラム作成時点では 不明な文字列です。 たとえば以下のような文字列があります。
  ・ UARTやUSBなどの通信から受信する文字列
  ・ SDカードやUSBメモリの中にあるファイル名 及びテキストファイルの中身のテキスト
  ・ キーボードから打ち込まれてくる文字列
                             他

<仕様>
  ・グラフィック液晶INT035の画面にラベルウィジェットとテキストフィールドウィジェットを配置する 
  ・初期状態での各ウィジェットへの表示文字列は以下とする
  ラベルウィジェット …… Default Label Text
  テキストフィールドウィジェット …… Default TextField Text
  ・ラベルウィジェットとテキストウィジェットに表示する文字列は同一とする。
・ウィジェットに表示する文字列は、 "How are you ?" と "I am fine."とし、それぞれの文字列が 2sec毎に交互に表示されること。
 また 各文字列の後に ウィジェットの文字列が変更された回数も表示すること。
 ウィジェットに表示される文字列例
  文字列が変更された回数が4回目の場合 …… How are you ?   N=4
  文字列が変更された回数が9回目の場合 …… I am fine.      N=9
・周期2secのインターバルタイマはシステムタイマを使用すること。                              
 


<回路図>(→ PDFファイル




<外観>PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。
       本テーマと関係ない部品が多々実装されています。





<動作結果>(→ 動画:1080pのHD動画を見ることができます。)

デフォルト画面
上段:テキストウィジェット
下段:テキストフィールドウィジェット
画面変更回数が10回目の画面 
上段:テキストウィジェット
下段:テキストフィールドウィジェット
画面変更回数が21回目の画面
上段:テキストウィジェット
下段:テキストフィールドウィジェット




<解説>記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
        (以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なる点があるかもしれませんので注意してください。)


■ 新規プロジェクトの作成 (→ 新規プロジェクト作成手順
   PICは、PIC32MZ2048EFH100を選択します。 グラフィックに係る特段の設定はありません。
  忘れないで設定項目しておく項目としてencodingに Shift_JISを選択しておくことがあげられます。 これを忘れるとコメント欄が文字化けして
  しまいます。


 MHC設定 1 Options & Pin Settingsの設定

  Options

 タッチに関するMHCは省略してもかまいません。

項目 ①Configuration設定
Device & Project Configuration
  > PIC32MZ2048 Device Configuration
②PMP設定 
Harmony Framework Configuration > Drivers
 > PMP
③ Touch Drivers 設定
Harmony Framework Configuration > Drivers
 > Touch Drivers
M
H
C

デフォルトからの変更要領:
 FPLLIDIV: DIV3
 FPLLICLK: PLL_POSC
 POSCMOD: EC

システムクロック周波数: 200MHz
外部
 主発振器: 24MHz

#pragma config FNOSC = SPLL
#pragma config POSCMOD = EC
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLICLK = PLL_POSC
#pragma config FPLLMULT = MUL_50
#pragma config FPLLODIV = DIV_2
デフォルトからの変更要領:
 □Use PMP driver? : チェック追加
 Transfer size: PMP_DATA_SIZE_16BITS
 
デフォルトからの変更要領:
□Use GENERIC Driver?: チェック追加

④ Graphics Stacks 設定
Harmony Framework Configuration > Graphics Stacks
⑤Message 設定
Harmony Framework Configuration > System Services
>Message
⑥Touch ,Timer設定
Harmony Framework Configuration > System Services
 > Touch
Harmony Framework Configuration > System Services

 > Timer
M
H
C

デフォルトからの変更要領:
 □Use Graphics Stack?: チェックを追加
 Graphics display > Resolution >Height: 240
 Graphics controller >Select controller type
      : Generic Customizable Driver
   
デフォルトからの変更要領:
 □Use Message System Service?
                  : チェックを追加
 
デフォルトからの変更要領:
 □Use Touch System Service?
                 : チェックを追加
 □Use Timer System Service?
                 : チェックを追加


 

 MHC設定2 Graphics Composerの設定 

  ラベルウィジェットとイメージウィジェットを使って 以下のような Screen1  を作成します。 作成するScreenは1つです。
 作成要領については、Graphics Composerの使い方 (  → URL )を参照願います。

screen  Screen1 
Graphics  
  Composer 




■ INT035用グラフィックライブラリの追加要領
   タッチパネルに関する部分は 本テーマの場合省略可能です。
  INT035用グラフィックライブラリを以下の要領で組み込みます。
   以下の説明ではプロジェクトフォルダは"C:\microchip\harmony\v2_04\_WK\sample204\gfx1\01 035 Led OnOff" です。

 ①  drv_gfx_generic.h
 

 "C:\microchip\harmony\v2_04\_WK\sample204\gfx1
         \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\driver\controller\generic\drv_gfx_generic.h"
上記パスにあるdrv_gfx_generic.hを開きファイル内容をすべて削除したあと、ys_drv_gfx_int035.h(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
"C:\microchip\harmony\v2_04\framework\gfx\driver\controller\generic\templates\drv_gfx_generic.h.ftl"
上記ファイルの内容をys_drv_gfx_int035.hの内容に変更しておくとMHCが自動的に所要の drv_gfx_generic.hを生成してくれます。また煩わしいプロジェクトファイル再生成時のチェックが発生しなくなります。

以下、ys_drv_gfx_int035.h
  drv_gfx_generic.c
 
 "C:\microchip\harmony\v2_04\_WK\sample204\gfx1
         \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\driver\controller\generic\drv_gfx_generic.c"
上記パスにあるdrv_gfx_generic.cを開きファイル内容をすべて削除したあと、ys_drv_gfx_int035.c(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
"C:\microchip\harmony\v2_04\framework\gfx\driver\controller\generic\templates\drv_gfx_generic.c.ftl"
上記ファイルの内容をys_drv_gfx_int035.cの内容に変更しておくとMHCが自動的に所要の drv_gfx_generic.hを生成してくれます。また煩わしいプロジェクトファイル再生成時のチェックが発生しなくなります。
以下、ys_drv_gfx_int035.c

 ③ gfx_driver_def.c
 
"C:\microchip\harmony\v2_04\_WK\sample204\gfx1
         \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\hal\gfx_driver_def.c"
上記パスにあるgfx_driver_def.cを開きファイル内容をすべて削除したあと、ys_gfx_driver_def_int035.c(以下参照)のファイル内容をコピーして貼り付けます。

以下、ys_gfx_driver_def_int035.c
 ④  drv_touch_generic.h
 

"C:\microchip\harmony\v2_04\framework\driver\touch\generic\drv_touch_generic.h"
drv_touch_generic.hの内容を削除したあと、ys_drv_touch_generic_int035.h(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
 このファイルはMHCの内部ファイルを変更することになるので、以降MHCが自動的に所要の drv_touch_generic.hを生成してくれます。

以下、ys_drv_touch_generic_int035.h
 ⑤  drv_touch_generic.c
 
"C:\microchip\harmony\v2_04\framework\driver\touch\generic\drv_touch_generic.c"
drv_touch_generic.cの内容を削除したあと、ys_drv_touch_generic_int035.c(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
 このファイルはMHCの内部ファイルを変更することになるので、以降MHCが自動的に所要の drv_touch_generic.hを生成してくれます。

以下、ys_drv_touch_generic_int035.c


■ app.cに、青字部分を追加します。

➀ delay_us( )、delay_ms( ) という NOPを使った 1μsec 、1msec単位の遅延関数をつくります。
  int delay_Clock = 200000000; //システムクロック:200MHz

  void delay_us(volatile unsigned int usec) //1μsec遅延
  {
    volatile int count;

    count = (int)(delay_Clock/20000000)*usec;
  ……
  ……



➁APP_Tasks ( )の中の case APP_STATE_SERVICE_TASKS:に MyLibariaEvents()を追加して、毎サイクル グラフィックに係るイベントを
 更新するようにします。MyLibariaEvents()は Libaria_evnet.cの中で定義されています。
  MyLibariaEvents(); //グラフィック関連イベント ---> libaria_event.c


 以下、app.c



■ system_init.cに 青字部分を追加します。
➀SYS_Initialize( )関数内の先頭部分に INT035が立ち上がるまでのウェイト時間を設定します。
  delay_ms(350); //INT035の内部回路が立ち上がるまで待つ


以下、 system_init.c



■ libaria_events.cに 青字部分を追加します。
➀ インクルードファイルを追加します。stdio.hがないと、sprintf( )がコンパイラのバージョンによってコンパイルで警告となることが
  あります。
  #include "stdio.h"


➁ 変数の宣言、定義を行います
  SYS_TMR_HANDLE handleTimer3;で システムタイマのハンドルを定義しています。
  laString str1,str2;で laString構造体の文字列を定義しています。 この文字列にダイナミックテキストを書き込みます。
  Countは、テキストウィジェットとテキストフィールドウィジェットに書き込む関数が呼び出されるとインクリメントされる整数です。
  SYS_TMR_HANDLE handleTimer3;
  bool notFirst;
  bool Flag;
  char charBuff1[32];
  char charBuff2[32];

  laString str1,str2;

  char How_are_you[] = "How are you ?";
  char I_am_fine[] = "I am fine.";
  int Count;


③テキストウィジェットとテキストフィールドウィジェットに "How are you ? N=回数" を書き込関数です。
  void Func1(void) //
  {
    Count++;
    sprintf(charBuff1, "%s N=%d",How_are_you,Count );

    str1 = laString_CreateFromCharBuffer(charBuff1,
    GFXU_StringFontIndexLookup(&stringTable, string_LabelStr1, 0));

    laLabelWidget_SetText(LabelWidget1, str1);

    laTextFieldWidget_SetText(TextFieldWidget1, str1);
  }



④テキストウィジェットとテキストフィールドウィジェットに "I am fine. N=回数" を書き込関数です。
  void Func2(void) // 
  {
    Count++;
    sprintf(charBuff2, "%s N=%d", I_am_fine, Count);

    str1 = laString_CreateFromCharBuffer(charBuff2,
                        GFXU_StringFontIndexLookup(&stringTable, string_LabelStr1, 0));
    laLabelWidget_SetText(LabelWidget1, str1);

    laTextFieldWidget_SetText(TextFieldWidget1, str1);
  }



⑤周期2sec毎に呼び出されるコールバック関数です。
 Func1( ) とFunc2( )を交互に呼び出します。
  void Timer_Callback3 ( uintptr_t context, uint32_t currTick )
  {
    if(Flag == false)
    {
      Flag = true;
      Func1();
    }
    else
    {
      Flag = false;
      Func2();
    }
  }



⑥周期2secの繰り返し型のシステムタイマを起動しています。
  void Screen1_LcdFlicker(void)
  {
    Flag = true;
    handleTimer3 = SYS_TMR_CallbackPeriodic(2000, 1, Timer_Callback3);//LCD表示切り替えコールバックタイマ起動
  }



⑦PICが起動した時のみ1回だけScreen1_LcdFlicker( ) 関数を起動します。
  void MyLibariaEvents(void) //APP_Tasks ()からの呼び出し
  {
    if(notFirst == false) //ブート直後の場合
    {
      notFirst = true;
      Screen1_LcdFlicker();//LCD表示切り替えコールバックタイマ起動
    }

  }


以下、libaria_events.c