From 866d6599a1f0c4102a3a321858e3e106dc745329 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 15 Sep 2024 01:18:37 +0200 Subject: [PATCH] Implement Mode Point and Mode Down/Up. Merge HEX/DEC functions in order to do so efficiently. Optimize. --- src/device/mouse_microtouch_touchscreen.c | 93 +++++++++-------------- 1 file changed, 35 insertions(+), 58 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index d91b10440..1c2393d16 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -22,7 +22,6 @@ - Decouple serial packet generation from mouse poll rate. - Dynamic baud rate selection from software following this. - Add additional SMT2/3 formats as we currently only support Tablet, Hex and Dec. - - Add additional SMT2/3 modes as we currently hardcode Mode Stream. */ #include #include @@ -62,8 +61,7 @@ const char* mtouch_identity[] = { }; typedef struct mouse_microtouch_t { - double baud_rate; - unsigned int abs_x_int, abs_y_int; + double baud_rate, abs_x, abs_y; int b; char cmd[256]; int cmd_pos; @@ -266,10 +264,10 @@ mtouch_poll(void *priv) return 0; } - unsigned int abs_x_int = 0, abs_y_int = 0; double abs_x; double abs_y; int b = mouse_get_buttons_ex(); + char buffer[10]; mouse_get_abs_coords(&abs_x, &abs_y); @@ -314,76 +312,55 @@ mtouch_poll(void *priv) return 0; } - if (dev->format == FORMAT_DEC) { - abs_x_int = abs_x * 999; - abs_y_int = 999 - (abs_y * 999); - char buffer[10]; - - if (!dev->mode_status) { - if (b) { // Touch - snprintf(buffer, sizeof(buffer), "\x1%03d,%03d\r", abs_x_int, abs_y_int); + if (dev->format == FORMAT_DEC || dev->format == FORMAT_HEX) { + if (b) { + if (!dev->b) { /* Touchdown (MS, MP, MDU)*/ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x19 : 0x01); + if (dev->format == FORMAT_DEC){ + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); + } else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } else if (dev->mode == MODE_STREAM){ /* Touch Continuation (MS)*/ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x1c : 0x01); + if (dev->format == FORMAT_DEC){ + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); + } else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); + } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - } else { - if (b) { - if (!dev->b) { /* Touchdown Status */ - snprintf(buffer, sizeof(buffer), "\x19%03d,%03d\r", abs_x_int, abs_y_int); - } else { /* Touch Continuation Status */ - snprintf(buffer, sizeof(buffer), "\x1c%03d,%03d\r", abs_x_int, abs_y_int); - } - } else if (dev->b) { /* Liftoff Status */ - snprintf(buffer, sizeof(buffer), "\x18%03d,%03d\r", dev->abs_x_int, dev->abs_y_int); - } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } - } - - else if (dev->format == FORMAT_HEX) { - abs_x_int = abs_x * 1023; - abs_y_int = 1023 - (abs_y * 1023); - char buffer[10]; - - if (!dev->mode_status) { - if (b) { // Touch - snprintf(buffer, sizeof(buffer), "\x1%03X,%03X\r", abs_x_int, abs_y_int); - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } - } else { - if (b) { - if (!dev->b) { /* Touchdown Status */ - snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); - } else { /* Touch Continuation Status */ - snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); - } - } else if (dev->b) { /* Liftoff Status */ - snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", dev->abs_x_int, dev->abs_y_int); + } else if (dev->b && dev->mode != MODE_POINT) { /* Touch Liftoff (MS, MDU)*/ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x18 : 0x01); + if (dev->format == FORMAT_DEC) { + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * dev->abs_x), (uint16_t)(999 * (1 - dev->abs_y))); + } else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * dev->abs_x), (uint16_t)(1023 * (1 - dev->abs_y))); } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } } else if (dev->format == FORMAT_TABLET) { - abs_x_int = abs_x * 16383; - abs_y_int = 16383 - abs_y * 16383; - if (b) { /* Touchdown/Continuation */ fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5) | ((b & 3))) : 0)); - fifo8_push(&dev->resp, abs_x_int & 0b1111111); - fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); - fifo8_push(&dev->resp, abs_y_int & 0b1111111); - fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * abs_x) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * abs_x) >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - abs_y)) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - abs_y)) >> 7) & 0b1111111); } else if (dev->b) { /* Liftoff */ fifo8_push(&dev->resp, 0b10000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); - fifo8_push(&dev->resp, dev->abs_x_int & 0b1111111); - fifo8_push(&dev->resp, (dev->abs_x_int >> 7) & 0b1111111); - fifo8_push(&dev->resp, dev->abs_y_int & 0b1111111); - fifo8_push(&dev->resp, (dev->abs_y_int >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * dev->abs_x) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * dev->abs_x) >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - dev->abs_y))& 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - dev->abs_y)) >> 7) & 0b1111111); } } /* Save old states*/ - dev->abs_x_int = abs_x_int; - dev->abs_y_int = abs_y_int; + dev->abs_x = abs_x; + dev->abs_y = abs_y; dev->b = b; return 0; }