225 lines
6.5 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include "main.h"
/* BSP LCD driver */
#include "stm32_adafruit_lcd.h"
/* BSP TS driver */
#include "stm32_adafruit_ts.h"
//=============================================================================
/* Setting section (please set the necessary things in this section) */
/* Touchscreen calibrate at starting
- 0: off (for the touchscreen, use the TS_CINDEX values in stm32_adafruit_ts.h)
- 1: on (the touchscreen must be calibrated at startup)
- 2: on and printf (the touchscreen must be calibrated at startup and printf the cindex values)
- 3: on and displays the TS_CINDEX values on the screen */
#define TS_CALBIBRATE 0
/* If TS_CALBIBRATE == 3 -> Text line size */
#define TS_CALIBTEXTSIZE 12
//=============================================================================
#ifdef osCMSIS
#define Delay(t) osDelay(t)
#define GetTime() osKernelSysTick()
#else
#define Delay(t) HAL_Delay(t)
#define GetTime() HAL_GetTick()
#endif
#if TS_CALBIBRATE == 0
#define ts_calib()
#elif TS_CALBIBRATE > 0
#include "ts.h"
#define CALIBDELAY 500
#define CALIBBOXSIZE 6
#define CALIBBOXPOS 15
#define TOUCHDELAY 50
extern TS_DrvTypeDef *ts_drv;
//-----------------------------------------------------------------------------
void touchcalib_drawBox(int32_t x, int32_t y, uint16_t cl)
{
BSP_LCD_SetTextColor(cl);
BSP_LCD_DrawRect(x - CALIBBOXSIZE / 2, y - CALIBBOXSIZE / 2, CALIBBOXSIZE, CALIBBOXSIZE);
}
//-----------------------------------------------------------------------------
/* Touchscreen calibration function */
void ts_calib(void)
{
uint16_t tx, ty;
ts_three_points tc, dc; /* touchscreen and display corrdinates */
#if TS_CALBIBRATE == 2
ts_cindex ci;
#elif TS_CALBIBRATE == 3
ts_cindex ci;
static char s[16];
#endif
dc.x0 = 20;
dc.y0 = 20;
dc.x1 = BSP_LCD_GetXSize() >> 1;
dc.x2 = BSP_LCD_GetXSize() - 1 - 20;
dc.y1 = BSP_LCD_GetYSize() - 1 - 20;
dc.y2 = BSP_LCD_GetYSize() >> 1;
touchcalib_drawBox(dc.x0, dc.y0, LCD_COLOR_YELLOW);
Delay(CALIBDELAY);
while(!ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
ts_drv->GetXY(0, &tx, &ty);
tc.x0 = tx; tc.y0 = ty;
while(ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
touchcalib_drawBox(dc.x0, dc.y0, LCD_COLOR_GRAY);
touchcalib_drawBox(dc.x1, dc.y1, LCD_COLOR_YELLOW);
Delay(CALIBDELAY);
while(!ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
ts_drv->GetXY(0, &tx, &ty);
tc.x1 = tx; tc.y1 = ty;
while(ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
touchcalib_drawBox(dc.x1, dc.y1, LCD_COLOR_GRAY);
touchcalib_drawBox(dc.x2, dc.y2, LCD_COLOR_YELLOW);
Delay(CALIBDELAY);
while(!ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
ts_drv->GetXY(0, &tx, &ty);
tc.x2 = tx; tc.y2 = ty;
while(ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
#if TS_CALBIBRATE == 1
BSP_TS_CalibCalc(&tc, &dc, NULL);
#elif TS_CALBIBRATE == 2
BSP_TS_CalibCalc(&tc, &dc, &ci);
BSP_TS_SetCindex(&ci);
printf("\r\n#define TS_CINDEX {%d, %d, %d, %d, %d, %d, %d}\r\n", (int)ci[0], (int)ci[1], (int)ci[2], (int)ci[3], (int)ci[4], (int)ci[5], (int)ci[6]);
#elif TS_CALBIBRATE == 3
BSP_TS_CalibCalc(&tc, &dc, &ci);
BSP_TS_SetCindex(&ci);
BSP_LCD_DisplayStringAt(10, 0, (uint8_t *)"#define TS_CINDEX", LEFT_MODE);
for(uint32_t i=0; i<7; i++)
{
sprintf(s, "%d", (int)ci[i]);
BSP_LCD_DisplayStringAt(10, (i+1)*TS_CALIBTEXTSIZE, (uint8_t *)s, LEFT_MODE);
}
Delay(CALIBDELAY);
while(!ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
while(ts_drv->DetectTouch(0))
Delay(TOUCHDELAY);
#endif
Delay(CALIBDELAY);
BSP_LCD_Clear(LCD_COLOR_BLACK);
}
#endif
void mainApp(void)
{
TS_StateTypeDef ts;
uint16_t boxsize;
uint16_t oldcolor, currentcolor;
BSP_LCD_Init();
BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
BSP_LCD_Clear(LCD_COLOR_BLACK);
ts_calib();
boxsize = BSP_LCD_GetXSize() / 6;
BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_FillRect(0, 0, boxsize, boxsize);
BSP_LCD_SetTextColor(LCD_COLOR_YELLOW);
BSP_LCD_FillRect(boxsize, 0, boxsize, boxsize);
BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
BSP_LCD_FillRect(boxsize * 2, 0, boxsize, boxsize);
BSP_LCD_SetTextColor(LCD_COLOR_CYAN);
BSP_LCD_FillRect(boxsize * 3, 0, boxsize, boxsize);
BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
BSP_LCD_FillRect(boxsize * 4, 0, boxsize, boxsize);
BSP_LCD_SetTextColor(LCD_COLOR_MAGENTA);
BSP_LCD_FillRect(boxsize * 5, 0, boxsize, boxsize);
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
BSP_LCD_DrawRect(0, 0, boxsize, boxsize);
currentcolor = LCD_COLOR_RED;
while(1)
{
BSP_TS_GetState(&ts);
if(ts.TouchDetected)
{
if(ts.Y < boxsize)
{
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
if (ts.X < boxsize)
{
currentcolor = LCD_COLOR_RED;
BSP_LCD_DrawRect(0, 0, boxsize, boxsize);
}
else if (ts.X < boxsize * 2)
{
currentcolor = LCD_COLOR_YELLOW;
BSP_LCD_DrawRect(boxsize, 0, boxsize, boxsize);
}
else if (ts.X < boxsize * 3)
{
currentcolor = LCD_COLOR_GREEN;
BSP_LCD_DrawRect(boxsize*2, 0, boxsize, boxsize);
}
else if (ts.X < boxsize * 4)
{
currentcolor = LCD_COLOR_CYAN;
BSP_LCD_DrawRect(boxsize*3, 0, boxsize, boxsize);
}
else if (ts.X < boxsize * 5)
{
currentcolor = LCD_COLOR_BLUE;
BSP_LCD_DrawRect(boxsize*4, 0, boxsize, boxsize);
}
else if (ts.X < boxsize * 6)
{
currentcolor = LCD_COLOR_MAGENTA;
BSP_LCD_DrawRect(boxsize*5, 0, boxsize, boxsize);
}
if (oldcolor != currentcolor)
{
BSP_LCD_SetTextColor(oldcolor);
if (oldcolor == LCD_COLOR_RED)
BSP_LCD_FillRect(0, 0, boxsize, boxsize);
else if (oldcolor == LCD_COLOR_YELLOW)
BSP_LCD_FillRect(boxsize, 0, boxsize, boxsize);
else if (oldcolor == LCD_COLOR_GREEN)
BSP_LCD_FillRect(boxsize * 2, 0, boxsize, boxsize);
else if (oldcolor == LCD_COLOR_CYAN)
BSP_LCD_FillRect(boxsize * 3, 0, boxsize, boxsize);
else if (oldcolor == LCD_COLOR_BLUE)
BSP_LCD_FillRect(boxsize * 4, 0, boxsize, boxsize);
else if (oldcolor == LCD_COLOR_MAGENTA)
BSP_LCD_FillRect(boxsize * 5, 0, boxsize, boxsize);
}
oldcolor = currentcolor;
}
else
{
BSP_LCD_DrawPixel(ts.X, ts.Y, currentcolor);
}
}
Delay(1);
}
}