122 lines
3.5 KiB
C
122 lines
3.5 KiB
C
/**************************************************************************************************************************************
|
|
* Project: discoverpixy
|
|
* Website: https://github.com/t-moe/discoverpixy
|
|
* Authors: Aaron Schmocker, Timo Lang
|
|
* Institution: BFH Bern University of Applied Sciences
|
|
* File: common/touch/screen_calibrate.c
|
|
*
|
|
* Version History:
|
|
* Date Autor Email SHA Changes
|
|
* 2015-06-01 timolang@gmail.com 06227da Added calibrate screen (WIP). fixed bug in emulator drawing.
|
|
* 2015-06-01 timolang@gmail.com eb573bc Finalized calibration. Fixed a bug in screen module.
|
|
*
|
|
**************************************************************************************************************************************/
|
|
|
|
#include "screen_calibrate.h"
|
|
#include "tft.h"
|
|
#include "touch.h"
|
|
|
|
|
|
extern volatile bool calibration; //from touch.c
|
|
|
|
|
|
static void enter(void* screen)
|
|
{
|
|
tft_clear(BLACK);
|
|
}
|
|
|
|
static void leave(void* screen)
|
|
{
|
|
|
|
}
|
|
|
|
static void update(void* screen)
|
|
{
|
|
int x1, y1, x2, y2, dx, dy;
|
|
|
|
|
|
tft_print_line(50, 50, WHITE, BLACK, 1, "Calibration:");
|
|
tft_print_line(50, 120, WHITE, BLACK, 0, "Hit the markers exactly!");
|
|
//-----------------First Point--------------------
|
|
tft_draw_line(CCENTER, CBEGIN, CCENTER, CEND, WHITE); //Draw Cross
|
|
tft_draw_line(CBEGIN, CCENTER, CEND, CCENTER, WHITE); //Draw Cross
|
|
calibration = 1; //TouchX + TouchY Values will not be converted to Pixels
|
|
|
|
while (calibration); //Wait on PenUp
|
|
|
|
POINT_STRUCT p1 = touch_get_last_point();
|
|
x1 = p1.x;
|
|
y1 = p1.y;
|
|
tft_fill_rectangle(CBEGIN, CBEGIN, CEND, CEND, BLACK); //Clear Cross
|
|
|
|
//-----------------Second Point-------------------
|
|
tft_draw_line(DWIDTH - CCENTER, DHEIGHT - CBEGIN, DWIDTH - CCENTER, DHEIGHT - CEND, WHITE);
|
|
tft_draw_line(DWIDTH - CBEGIN, DHEIGHT - CCENTER, DWIDTH - CEND, DHEIGHT - CCENTER, WHITE);
|
|
calibration = 1;
|
|
|
|
while (calibration);
|
|
|
|
POINT_STRUCT p2 = touch_get_last_point();
|
|
x2 = p2.x;
|
|
y2 = p2.y;
|
|
tft_fill_rectangle(DWIDTH - CBEGIN, DHEIGHT - CBEGIN, DWIDTH - CEND, DHEIGHT - CEND, BLACK);
|
|
|
|
//-----------------Third Point--------------------
|
|
tft_draw_line(CCENTER, DHEIGHT - CBEGIN, CCENTER, DHEIGHT - CEND, WHITE);
|
|
tft_draw_line(CBEGIN, DHEIGHT - CCENTER, CEND, DHEIGHT - CCENTER, WHITE);
|
|
calibration = 1;
|
|
|
|
while (calibration);
|
|
|
|
POINT_STRUCT p3 = touch_get_last_point();
|
|
x1 += p3.x; //Add(!) values. We'll build the average later
|
|
y2 += p3.y;
|
|
tft_fill_rectangle(CBEGIN, DHEIGHT - CBEGIN, CEND, DHEIGHT - CEND, BLACK);
|
|
|
|
//------------------4. Point---------------------
|
|
tft_draw_line(DWIDTH - CCENTER, CBEGIN, DWIDTH - CCENTER, CEND, WHITE);
|
|
tft_draw_line(DWIDTH - CBEGIN, CCENTER, DWIDTH - CEND, CCENTER, WHITE);
|
|
calibration = 1;
|
|
|
|
while (calibration);
|
|
|
|
POINT_STRUCT p4 = touch_get_last_point();
|
|
x2 += p4.x;
|
|
y1 += p4.y;
|
|
tft_fill_rectangle(DWIDTH - CBEGIN, CBEGIN, DWIDTH - CEND, CEND, BLACK);
|
|
//-------------------Calculation---------------------
|
|
x1++; //Add 1 and divide by 2 later = +0.5 (for correct rounding)
|
|
y1++;
|
|
x2++;
|
|
y2++;
|
|
x1 >>= 1; //Divide by 2
|
|
y1 >>= 1;
|
|
x2 >>= 1;
|
|
y2 >>= 1;
|
|
dx = (x2 - x1); //Build the Difference
|
|
dy = (y2 - y1);
|
|
|
|
touch_set_calibration_values(x1, dx, y1, dy);
|
|
tft_print_line(50, 120, WHITE, BLACK, 0, "Calibration Done. Press anywhere");
|
|
|
|
calibration = 1;
|
|
|
|
while (calibration);
|
|
|
|
gui_screen_back();
|
|
|
|
}
|
|
|
|
|
|
static SCREEN_STRUCT screen = {
|
|
enter,
|
|
leave,
|
|
update
|
|
};
|
|
|
|
|
|
SCREEN_STRUCT* get_screen_calibrate()
|
|
{
|
|
return &screen;
|
|
}
|