lvglライブラリのlv_obj_get_user_data関数の戻り値がNULLになってしまう。

実現したいこと

現在、ESP32にili9488というTFTをつなげて、lvglライブラリを使って簡単な画面遷移プログラムを作っています。

発生している問題・分からないこと

chat GPTに、lvglを使った簡単な画面遷移プログラムの作成を求めてみたところ、4つのスクリーンにそれぞれ"next","prev"ボタンを表示して、ボタンを押せば画面を順番に遷移するようなサンプルプログラムを作ってもらえました。

ただ、next,prevボタンを押しても次の画面が表示できません。

該当のソースコード

cpp

12 3void screen_setup() {4 //lv_init();5 //ili9488_init();6 7 screen1 = lv_obj_create(NULL);8 create_keypad_screen(screen1);9 10 screen2 = lv_obj_create(NULL);11 create_clock_screen(screen2);12 13 screen3 = lv_obj_create(NULL);14 create_security_screen(screen3);15 16 screen4 = lv_obj_create(NULL);17 create_fourth_screen(screen4);18 19 lv_scr_load(screen1);20 21 lv_timer_create(update_clock, 1000, NULL);22}23 24 25 26void add_navigation_buttons(lv_obj_t *scr, lv_obj_t *next_screen, lv_obj_t *prev_screen) {27 lv_obj_t *btn_next = lv_btn_create(scr);28 lv_obj_set_size(btn_next, 100, 50);29 lv_obj_align(btn_next, LV_ALIGN_BOTTOM_RIGHT, -10, -10);30 lv_obj_set_user_data(btn_next, next_screen);31 lv_obj_add_event_cb(btn_next, btn_event_cb, LV_EVENT_CLICKED, NULL);32 lv_obj_t *label_next = lv_label_create(btn_next);33 lv_label_set_text(label_next, "Next");34 35 lv_obj_t *btn_back = lv_btn_create(scr);36 lv_obj_set_size(btn_back, 100, 50);37 lv_obj_align(btn_back, LV_ALIGN_BOTTOM_LEFT, 10, -10);38 lv_obj_set_user_data(btn_back, prev_screen);39 lv_obj_add_event_cb(btn_back, btn_event_cb, LV_EVENT_CLICKED, NULL);40 lv_obj_t *label_back = lv_label_create(btn_back);41 lv_label_set_text(label_back, "Back");42}43 44 45void btn_event_cb(lv_event_t *e) {46 47 Serial.println("btn_event_cb start");48 49 #if 150 lv_obj_t *btn = lv_event_get_target(e);51 52 // デバッグ情報の出力53 if (btn != NULL) {54 Serial.println("Event target (button) is not NULL");55 // さらに、ボタンに関する詳細情報を出力できます56 } else {57 Serial.println("Event target (button) is NULL");58 }59 #endif60 61 62 lv_obj_t *next_screen = (lv_obj_t *)lv_obj_get_user_data(btn);63 //lv_obj_t *next_screen = (lv_obj_t *)lv_event_get_target(e);64 65 // デバッグ情報の出力66 if (next_screen != NULL) {67 Serial.println("next_screen is not NULL");68 lv_scr_load(next_screen);69 } else {70 Serial.println("next_screen is NULL");71 }72 73 74 if (next_screen != NULL) {75 Serial.println("next_screen");76 lv_scr_load(next_screen);77 }78 79 Serial.println("btn_event_cb end");80}

特になし

試したこと・調べたこと

上記の詳細・結果

色々と調べてみると、”next”ボタンを押した時に呼び出されるハンドラ関数で、次の表示する画面のデータを返す関数がNULLを返しているため、次の画面に切り替えることができないことはわかっています。

cpp

1 lv_obj_t *next_screen = (lv_obj_t *)lv_obj_get_user_data(btn);

補足

githubのリンクはこちら

コメントを投稿

0 コメント