diff --git a/README.md b/README.md index 31d20fe..bf60dac 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +> [!NOTE] +> work in progress, but works! + ## K1NG-Driver a driver for K1NG PRO (4K) mouse from redragon diff --git a/main.c b/main.c index 65e5d55..3ae6f85 100644 --- a/main.c +++ b/main.c @@ -2,22 +2,23 @@ #include "src/driver.h" int main(int argc, char *argv[]) { - int level; + int sens; printf("K1NG PRO (4k) driver | Cli\n"); printf("set any sens from 50-26000\n\n"); + printf("rememeber to set an value like in original software so for example `50 + 50 = 100` or `100 + 50 = 150` u get the point it goes up by 50\n\n"); if (argc < 2) { printf("set sensitivity to: "); - if (scanf("%d", &level) != 1) { + if (scanf("%d", &sens) != 1) { printf("u forgot to input a number?\n"); return 1; } } else { - level = atoi(argv[1]); - printf("set sensitivity to: %d\n", level); + sens = atoi(argv[1]); + printf("set sensitivity to: %d\n", sens); } - run_driver(level); + run_driver(sens); return 0; } diff --git a/src/data.c b/src/data.c index 75f1f29..807c26d 100644 --- a/src/data.c +++ b/src/data.c @@ -1,15 +1,12 @@ -#ifndef DATA_H -#define DATA_H +#include "data.h" +#include +#include struct dpi_payload { int level; unsigned char buf[17]; }; -/* - all possible sens values - reverse engineered from "goldgoldgold.pcapng" -*/ static const struct dpi_payload payload_table[] = { {50 , {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}}, {100 , {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x01, 0x01, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}}, @@ -533,4 +530,26 @@ static const struct dpi_payload payload_table[] = { {26000, {0x08, 0x07, 0x00, 0x00, 0x0c, 0x04, 0x07, 0x07, 0x88, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1}}, }; -#endif +static const size_t payload_table_len = sizeof(payload_table) / sizeof(payload_table[0]); + +void get_payload(int level, unsigned char *buf) { + if (level < payload_table[0].level) { + level = payload_table[0].level; + } else if (level > payload_table[payload_table_len - 1].level) { + level = payload_table[payload_table_len - 1].level; + } + + size_t best = 0; + int best_diff = abs(level - payload_table[0].level); + + for (size_t i = 1; i < payload_table_len; i++) { + int diff = level - payload_table[i].level; + if (diff < 0) diff = -diff; + if (diff < best_diff) { + best_diff = diff; + best = i; + } + } + + memcpy(buf, payload_table[best].buf, sizeof(payload_table[best].buf)); +} diff --git a/src/driver.c b/src/driver.c index 946b650..73c6668 100644 --- a/src/driver.c +++ b/src/driver.c @@ -2,7 +2,7 @@ #include "driver.h" #include "data.h" -void run_driver(int target_level) { +void run_driver(int sens) { libusb_device_handle *handle = NULL; int r = libusb_init(NULL); if (r < 0) { @@ -25,7 +25,7 @@ void run_driver(int target_level) { libusb_claim_interface(handle, 1); unsigned char payload[17]; - get_payload(target_level, payload); + get_payload(sens, payload); int transferred = libusb_control_transfer( handle, @@ -41,7 +41,7 @@ void run_driver(int target_level) { if (transferred < 0) { fprintf(stderr, "byte transfer failed: %s\n", libusb_error_name(transferred)); } else { - printf("write succeed %d (%d bytes written)\n", target_level, transferred); + printf("write succeed %d (%d bytes written)\n", sens, transferred); } libusb_release_interface(handle, 1);