/** * \brief Starts the calibration routines and displays user instructions on screen. * * \return 0 if calibration is successful, else 1. */ uint32_t rtouch_calibrate(void) { uint32_t i; uint32_t x, y; /* Print user instructions */ lcd_fill(UNI_COLOR_WHITE); lcd_set_foreground_color(UNI_COLOR_BLACK); lcd_draw_string(30, 60, (uint8_t *)"LCD calibration"); lcd_draw_string(1, 190, (uint8_t *)"Touch the dots to\ncalibrate the screen"); /* Calibration points */ for (i = 0; i < 5; i++) { draw_calibration_point(&gs_calibration_points[i].panel); /* Wait for touch & end of conversion */ rtouch_wait_pressed(); rtouch_get_raw_point(&x, &y); gs_calibration_points[i].raw.x = x; gs_calibration_points[i].raw.y = y; clear_calibration_point(&gs_calibration_points[i].panel); /* Wait for contact loss */ rtouch_wait_released(); } if (rtouch_compute_calibration((rtouch_calibration_point_t *) &gs_calibration_points) == 0) { lcd_fill(UNI_COLOR_WHITE); lcd_set_foreground_color(UNI_COLOR_BLACK); lcd_draw_string(20, 130, (uint8_t *)"Calibration done."); return 0; } else { lcd_fill(UNI_COLOR_WHITE); lcd_set_foreground_color(UNI_COLOR_BLACK); lcd_draw_string(10, 100, (uint8_t *)"Calibration failed!"); lcd_draw_string(10, 190, (uint8_t *)"Please try again..."); /* Wait for contact loss */ rtouch_wait_released(); return 1; } }
/** \brief Main function. Execution starts here. */ int main(void) { uint8_t uc_result; /* Initialize the sleep manager */ sleepmgr_init(); membag_init(); sysclk_init(); init_specific_board(); /* Initialize the console uart */ configure_console(); /* Output demo infomation. */ printf("-- SAM Toolkit Demo Example --\n\r"); printf("-- %s\n\r", BOARD_NAME); printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__); /* Configure systick for 1 ms. */ puts("Configure system tick to get 1ms tick period.\r"); if (SysTick_Config(sysclk_get_cpu_hz() / 1000)) { puts("Systick configuration error\r"); while (1) { } } /* Initialize gfx module */ gfx_init(); win_init(); /* Initialize FatFS and bitmap draw interface */ demo_draw_bmpfile_init(); /* Initialize touchscreen without calibration */ rtouch_init(LCD_WIDTH, LCD_HEIGHT); rtouch_enable(); rtouch_set_event_handler(event_handler); /* Initialize demo parameters */ demo_parameters_initialize(); while (g_demo_parameters.calib_points[0].raw.x == 0) { uc_result = rtouch_calibrate(); if (uc_result == 0) { demo_set_special_mode_status(DEMO_LCD_CALIBRATE_MODE, 0); puts("Calibration successful !\r"); break; } else { puts("Calibration failed; error delta is too big ! Please retry calibration procedure...\r"); } } /* Re-caculate the calibration data */ rtouch_compute_calibration( (rtouch_calibration_point_t *)&g_demo_parameters.calib_points[0]); /* Setup root window */ setup_gui_root_window(); gfx_draw_bitmap(&win_startup_bmp, 0, 40); /* Set backlight by the data read from demo parameters */ aat31xx_set_backlight(g_demo_parameters.backlight); /* Default RTC configuration, 24-hour mode */ rtc_set_hour_mode(RTC, 0); rtc_set_time(RTC, g_demo_parameters.hour, g_demo_parameters.minute, g_demo_parameters.second); rtc_set_date( RTC, g_demo_parameters.year, g_demo_parameters.month, g_demo_parameters.day, 1 ); /* Create a semaphore to manage the memories data transfer */ vSemaphoreCreateBinary(main_trans_semphr); /* Turn on main widget */ app_widget_main_on(true); /* Initialize QTouch */ demo_qt_init(); /* Start USB stack to authorize VBus monitoring */ udc_start(); if (!udc_include_vbus_monitoring()) { /* VBUS monitoring is not available on this product * thereby VBUS has to be considered as present */ main_vbus_action(true); } /* Create task to window task */ if (xTaskCreate(task_win, "WIN", TASK_WIN_STACK_SIZE, NULL, TASK_WIN_STACK_PRIORITY, NULL) != pdPASS) { printf("Failed to create test led task\r\n"); } /* Create task to usb mass storage task */ if (xTaskCreate(task_usb, "USB", TASK_USB_STACK_SIZE, NULL, TASK_USB_STACK_PRIORITY, NULL) != pdPASS) { printf("Failed to create test led task\r\n"); } /* Start the scheduler. */ vTaskStartScheduler(); /* Will only get here if there was insufficient memory to create the * idle task. */ return 0; }
/** * \brief Starts the calibration routines and displays user instructions on screen. * * \return 0 if calibration is successful, else 1. */ uint32_t rtouch_calibrate(void) { uint32_t i; uint32_t x, y; /* Fill the whole screen with the background color */ gfx_draw_filled_rect(0, 0, gfx_get_width(), gfx_get_height(), BGCOLOR); /* Print user instructions */ /* Write center-aligned text string to the top of the display */ gfx_draw_string_aligned(string_calib_name, gfx_get_width() / 2, 60, &sysfont, GFX_COLOR_WHITE, TXTCOLOR, TEXT_POS_CENTER, TEXT_ALIGN_LEFT); gfx_draw_string_aligned(string_calib_instruction, gfx_get_width() / 2, 190, &sysfont, GFX_COLOR_WHITE, TXTCOLOR, TEXT_POS_CENTER, TEXT_ALIGN_LEFT); /* Calibration points */ for (i = 0; i < NUM_TOUCH_POINTS; i++) { draw_calibration_point(&gs_calibration_points[i].panel); /* Wait for touch & end of conversion */ rtouch_wait_pressed(); rtouch_get_raw_point(&x, &y); gs_calibration_points[i].raw.x = x; gs_calibration_points[i].raw.y = y; clear_calibration_point(&gs_calibration_points[i].panel); /* Wait for contact loss */ rtouch_wait_released(); } /* Check if the points acceptable */ if (rtouch_compute_calibration((rtouch_calibration_point_t *) &gs_calibration_points) == 0) { for (i=0;i<NUM_TOUCH_POINTS;i++) { g_demo_parameters.calib_points[i].raw.x = gs_calibration_points[i].raw.x; g_demo_parameters.calib_points[i].raw.y = gs_calibration_points[i].raw.y; } /* Commit changes to the parameter area */ demo_parameters_commit_changes(); /* Display calibration done string */ gfx_draw_string_aligned(string_calib_done, gfx_get_width() / 2, 130, &sysfont, GFX_COLOR_WHITE, TXTCOLOR, TEXT_POS_CENTER, TEXT_ALIGN_LEFT); return 0; } else { /* Clear instruction string first */ gfx_draw_string_aligned(string_calib_instruction, gfx_get_width() / 2, 190, &sysfont, GFX_COLOR_WHITE, GFX_COLOR_WHITE, TEXT_POS_CENTER, TEXT_ALIGN_LEFT); /* Show up failed string */ gfx_draw_string_aligned(string_calib_failed, gfx_get_width() / 2, 100, &sysfont, GFX_COLOR_WHITE, TXTCOLOR, TEXT_POS_CENTER, TEXT_ALIGN_LEFT); /* Display retry string */ gfx_draw_string_aligned(string_calib_retry, gfx_get_width() / 2, 190, &sysfont, GFX_COLOR_WHITE, TXTCOLOR, TEXT_POS_CENTER, TEXT_ALIGN_LEFT); /* Wait for contact loss */ rtouch_wait_released(); return 1; } }