mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-22 22:38:08 +00:00
feat(core/prodtest): add more touch layer tests
This commit is contained in:
parent
fbf380caba
commit
e30fe7769a
1
core/embed/prodtest/.changelog.d/4064.added
Normal file
1
core/embed/prodtest/.changelog.d/4064.added
Normal file
@ -0,0 +1 @@
|
||||
Added TOUCH_CUSTOM and TOUCH_IDLE commands
|
@ -88,7 +88,7 @@ OK
|
||||
```
|
||||
|
||||
### TOUCH
|
||||
The `TOUCH` command test the functionality of the display's touch screen.
|
||||
The `TOUCH` command tests the functionality of the display's touch screen.
|
||||
It draws a filled rectangle in one of the four display quadrants and waits for user interaction.
|
||||
|
||||
The command requires two input parameters:
|
||||
@ -106,6 +106,48 @@ TOUCH 09
|
||||
OK 50 90
|
||||
```
|
||||
|
||||
|
||||
### TOUCH_CUSTOM
|
||||
The `TOUCH_CUSTOM` command tests the functionality of the display's touch screen.
|
||||
It draws a filled rectangle on custom coordinates and waits for user interaction.
|
||||
|
||||
The command requires five input parameters:
|
||||
|
||||
* X position of the top-left corner of the rectangle
|
||||
* Y position of the top-left corner of the rectangle
|
||||
* Width of the rectangle
|
||||
* Height of the rectangle
|
||||
* The timeout in seconds
|
||||
|
||||
If the display is not touched within the specified timeout, the command will return an `ERROR TIMEOUT`.
|
||||
|
||||
The device report touch events, coordinates and timestamps (in ms), correctness of the touch point is not checked and is left to the test equipment.
|
||||
|
||||
The test ends with first lift-up event.
|
||||
|
||||
Example (to draw a 100x100 rectangle in the top-left (10,10) position and wait for 15 seconds for touch input):
|
||||
```
|
||||
TOUCH_CUSTOM 10 10 100 100 15
|
||||
TOUCH D 69 35 357300
|
||||
TOUCH U 69 35 357328
|
||||
OK
|
||||
```
|
||||
|
||||
### TOUCH_IDLE
|
||||
The `TOUCH_IDLE` command tests the functionality of the display's touch screen.
|
||||
It waits for a specific time period without any touch input.
|
||||
|
||||
The command requires one input parameter:
|
||||
* The timeout in seconds
|
||||
|
||||
If a touch activity is detected within the specified timeout, the command will return an `ERROR TOUCH DETECTED`.
|
||||
|
||||
Example - wait ten seconds for no touch input:
|
||||
```
|
||||
TOUCH_IDLE 10
|
||||
OK
|
||||
```
|
||||
|
||||
### SENS
|
||||
The `SENS` command is used to evaluating the touch screen sensitivity.
|
||||
It draws a filled box around the touch coordinates.
|
||||
|
@ -17,6 +17,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
@ -160,6 +161,30 @@ static void usb_init_all(void) {
|
||||
ensure(usb_start(), NULL);
|
||||
}
|
||||
|
||||
void extract_params(const char *str, int *numbers, int *count, int max_count) {
|
||||
int i = 0;
|
||||
int num_index = 0;
|
||||
int len = strlen(str);
|
||||
char buffer[20]; // buffer to hold the current number string
|
||||
|
||||
while (i < len && num_index < max_count) {
|
||||
if (isdigit((int)str[i])) {
|
||||
int buffer_index = 0;
|
||||
// Extract the number
|
||||
while (isdigit((int)str[i]) && i < len) {
|
||||
buffer[buffer_index++] = str[i++];
|
||||
}
|
||||
buffer[buffer_index] = '\0'; // null-terminate the string
|
||||
|
||||
// Convert the extracted string to an integer
|
||||
numbers[num_index++] = atoi(buffer);
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
*count = num_index;
|
||||
}
|
||||
|
||||
static void draw_border(int width, int padding) {
|
||||
const int W = width, P = padding, RX = DISPLAY_RESX, RY = DISPLAY_RESY;
|
||||
display_clear();
|
||||
@ -331,19 +356,22 @@ static void test_touch(const char *args) {
|
||||
int column = args[0] - '0';
|
||||
int timeout = args[1] - '0';
|
||||
|
||||
const int width = DISPLAY_RESX / 2;
|
||||
const int height = DISPLAY_RESY / 2;
|
||||
|
||||
display_clear();
|
||||
switch (column) {
|
||||
case 1:
|
||||
display_bar(0, 0, 120, 120, 0xFFFF);
|
||||
display_bar(0, 0, width, height, 0xFFFF);
|
||||
break;
|
||||
case 2:
|
||||
display_bar(120, 0, 120, 120, 0xFFFF);
|
||||
display_bar(width, 0, width, height, 0xFFFF);
|
||||
break;
|
||||
case 3:
|
||||
display_bar(120, 120, 120, 120, 0xFFFF);
|
||||
display_bar(width, height, width, height, 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
display_bar(0, 120, 120, 120, 0xFFFF);
|
||||
display_bar(0, height, width, height, 0xFFFF);
|
||||
break;
|
||||
}
|
||||
display_refresh();
|
||||
@ -364,6 +392,108 @@ static void test_touch(const char *args) {
|
||||
touch_deinit();
|
||||
}
|
||||
|
||||
static void test_touch_custom(const char *args) {
|
||||
static const int expected_params = 5;
|
||||
|
||||
int params[expected_params];
|
||||
int num_params = 0;
|
||||
|
||||
extract_params(args, params, &num_params, expected_params);
|
||||
|
||||
if (num_params != expected_params) {
|
||||
vcp_println("ERROR PARAM");
|
||||
return;
|
||||
}
|
||||
|
||||
#undef NUM_PARAMS
|
||||
|
||||
int x = params[0];
|
||||
int y = params[1];
|
||||
int width = params[2];
|
||||
int height = params[3];
|
||||
int timeout = params[4];
|
||||
|
||||
uint32_t ticks_start = hal_ticks_ms();
|
||||
|
||||
display_clear();
|
||||
display_bar(x, y, width, height, 0xFFFF);
|
||||
display_refresh();
|
||||
|
||||
touch_init();
|
||||
|
||||
while (true) {
|
||||
if (hal_ticks_ms() - ticks_start > timeout * 1000) {
|
||||
vcp_println("ERROR TIMEOUT");
|
||||
break;
|
||||
}
|
||||
|
||||
uint32_t touch_event = touch_get_event();
|
||||
if (touch_event != 0) {
|
||||
uint16_t touch_x = touch_unpack_x(touch_event);
|
||||
uint16_t touch_y = touch_unpack_y(touch_event);
|
||||
|
||||
if (touch_event & TOUCH_START) {
|
||||
vcp_println("TOUCH D %d %d %d", touch_x, touch_y, hal_ticks_ms());
|
||||
}
|
||||
if (touch_event & TOUCH_MOVE) {
|
||||
vcp_println("TOUCH C %d %d %d", touch_x, touch_y, hal_ticks_ms());
|
||||
}
|
||||
if (touch_event & TOUCH_END) {
|
||||
vcp_println("TOUCH U %d %d %d", touch_x, touch_y, hal_ticks_ms());
|
||||
vcp_println("OK");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
display_clear();
|
||||
display_refresh();
|
||||
|
||||
touch_deinit();
|
||||
}
|
||||
|
||||
static void test_touch_idle(const char *args) {
|
||||
static const int expected_params = 5;
|
||||
int num_params = 0;
|
||||
|
||||
int params[expected_params];
|
||||
|
||||
extract_params(args, params, &num_params, expected_params);
|
||||
|
||||
if (num_params != expected_params) {
|
||||
vcp_println("ERROR PARAM");
|
||||
return;
|
||||
}
|
||||
|
||||
int timeout = params[0];
|
||||
|
||||
uint32_t ticks_start = hal_ticks_ms();
|
||||
|
||||
display_clear();
|
||||
display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY / 2, "DON'T TOUCH", -1,
|
||||
FONT_BOLD, COLOR_WHITE, COLOR_BLACK);
|
||||
display_refresh();
|
||||
|
||||
touch_init();
|
||||
|
||||
while (true) {
|
||||
if (hal_ticks_ms() - ticks_start > timeout * 1000) {
|
||||
vcp_println("OK");
|
||||
break;
|
||||
}
|
||||
|
||||
if (touch_activity() == sectrue) {
|
||||
vcp_println("ERROR TOUCH DETECTED");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
display_clear();
|
||||
display_refresh();
|
||||
|
||||
touch_deinit();
|
||||
}
|
||||
|
||||
static void test_sensitivity(const char *args) {
|
||||
int v = atoi(args);
|
||||
|
||||
@ -703,6 +833,12 @@ int main(void) {
|
||||
} else if (startswith(line, "TOUCH ")) {
|
||||
test_touch(line + 6);
|
||||
|
||||
} else if (startswith(line, "TOUCH_CUSTOM ")) {
|
||||
test_touch_custom(line + 13);
|
||||
|
||||
} else if (startswith(line, "TOUCH_IDLE ")) {
|
||||
test_touch_idle(line + 11);
|
||||
|
||||
} else if (startswith(line, "SENS ")) {
|
||||
test_sensitivity(line + 5);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user