From fd85677485de20bd92fcd4f7f234a681438914cf Mon Sep 17 00:00:00 2001 From: TheNotary Date: Mon, 9 Sep 2024 22:56:03 -0500 Subject: [PATCH] finishes mapping the sk80 --- CMakeLists.txt | 5 +- TODO.txt | 5 - include/blink.h | 1 + include/main/keyboards/sk80/constants_sk80.h | 2 +- .../main/keyboards/sk80/key_mappings_sk80.h | 175 +++++++++--------- include/main/keyboards/sk80/messages_sk80.h | 5 +- include/main/usb_functions.h | 2 +- src/blink/blink.cpp | 5 + src/blink/keyboards/sk80/sk80.cpp | 17 +- src/demo/activities/cycle_keyids.cpp | 8 +- src/demo/activities/cycle_keyids.h | 1 + src/demo/blink_loader.cpp | 2 +- test/keyboard_sk80_test.cpp | 45 ++++- 13 files changed, 155 insertions(+), 118 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1eb33ae..839679b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,10 @@ add_executable(main "src/demo/main.cpp" "src/demo/blink_loader.cpp" "src/demo/blink_loader.h" "src/demo/activities/push_to_light.cpp" "src/demo/activities/push_to_light.h" "src/demo/activities/cycle_keyids.cpp" "src/demo/activities/cycle_keyids.h" - "include/main/misc.h" "src/demo/choose_keyboard.cpp" "src/demo/choose_keyboard.h" "src/demo/choose_activity.cpp" "src/demo/choose_activity.h" "src/demo/util.cpp" "src/demo/util.h" "src/demo/activities/test_single_key.cpp" "src/demo/activities/test_single_key.h") + "include/main/misc.h" "src/demo/choose_keyboard.cpp" "src/demo/choose_keyboard.h" + "src/demo/choose_activity.cpp" "src/demo/choose_activity.h" + "src/demo/util.cpp" "src/demo/util.h" + "src/demo/activities/test_single_key.cpp" "src/demo/activities/test_single_key.h") target_include_directories(main PRIVATE "${CMAKE_SOURCE_DIR}/src/demo") diff --git a/TODO.txt b/TODO.txt index 243a78f..3a30685 100644 --- a/TODO.txt +++ b/TODO.txt @@ -2,8 +2,3 @@ - SendBufferToDeviceAndGetResp et. al. use a hard-coded message_length value of 65. Technically not currently an issue but should be possible to make it more dynamic -- Map sk80 - - define SetKeysOnOff for the SK80 - - - Begin mapping all the keys - - turn on the escape key diff --git a/include/blink.h b/include/blink.h index b2de9c5..bf3ba3b 100644 --- a/include/blink.h +++ b/include/blink.h @@ -16,6 +16,7 @@ #include "misc.h" extern "C" { + DLL_EXPORT void PrintMessagesInBufferA(const unsigned char* buffer, size_t message_count, size_t message_length); DLL_EXPORT void HelloDll(); DLL_EXPORT int BlinkKeys(char* keyIds, int nKeys); DLL_EXPORT int TurnOnKeyIdsD(char* key_ids, UINT8 n_keys, unsigned char* messages_sent, KeyboardInfo keyboard); diff --git a/include/main/keyboards/sk80/constants_sk80.h b/include/main/keyboards/sk80/constants_sk80.h index 2468e32..5475678 100644 --- a/include/main/keyboards/sk80/constants_sk80.h +++ b/include/main/keyboards/sk80/constants_sk80.h @@ -7,7 +7,7 @@ namespace sk80 { const short VID = 0x05ac; const short PID = 0x024f; -const UINT8 max_key_id = 79; +const UINT8 max_key_id = 121; const UINT8 MESSAGE_LENGTH = 65; const UINT8 BULK_LED_VALUE_MESSAGES_COUNT = 9; const UINT8 BULK_LED_HEADER_MESSAGES_COUNT = 2; diff --git a/include/main/keyboards/sk80/key_mappings_sk80.h b/include/main/keyboards/sk80/key_mappings_sk80.h index d43d6aa..50d02cb 100644 --- a/include/main/keyboards/sk80/key_mappings_sk80.h +++ b/include/main/keyboards/sk80/key_mappings_sk80.h @@ -5,102 +5,99 @@ namespace sk80 { -const std::unordered_map keyname_keyid_mappings = { - { - {"esc", 1}, - {"f1" , 2}, - {"f2" , 3}, - {"f3" , 4}, - {"f4" , 5}, - {"f5" , 6}, - {"f6" , 7}, - {"f7" , 8}, - {"f8" , 9}, - {"f9" , 10}, - {"f10", 11}, - {"f11", 12}, - {"f12", 13}, + const std::unordered_map keyname_keyid_mappings = { + { + {"esc", 1}, + {"f1" , 2}, + {"f2" , 3}, + {"f3" , 4}, + {"f4" , 5}, + {"f5" , 6}, + {"f6" , 7}, + {"f7" , 8}, + {"f8" , 9}, + {"f9" , 10}, + {"f10", 11}, + {"f11", 12}, + {"f12", 13}, - {"~", 16}, + {"`", 19}, + {"1", 20}, + {"2", 21}, + {"3", 22}, + {"4", 23}, + {"5", 24}, + {"6", 25}, + {"7", 26}, + {"8", 27}, + {"9", 28}, + {"0", 29}, + {"-", 30}, + {"=", 31}, + {"backspace", 2}, - {"tab", 3}, // this is wrong + {"tab", 37}, + {"q", 38}, + {"w", 39}, + {"e", 40}, + {"r", 41}, + {"t", 42}, + {"y", 43}, + {"u", 44}, + {"i", 45}, + {"o", 46}, + {"p", 47}, + {"[", 48}, + {"]", 49}, + {"caps", 55}, + {"a", 56}, + {"s", 57}, + {"d", 58}, + {"f", 59}, + {"g", 60}, + {"h", 61}, + {"j", 62}, + {"k", 63}, + {"l", 64}, + {";", 65}, + {"'", 66}, + {"\\", 67}, - /* - {"1", 8}, - {"2", 14}, - {"3", 20}, - {"4", 26}, - {"5", 32}, - {"6", 38}, - {"7", 44}, - {"8", 50}, - {"9", 56}, - {"0", 62}, - {"-", 68}, - {"=", 74}, - {"backspace", 80}, - {"home", 92}, - {"tab", 3}, - {"q", 9}, - {"w", 15}, - {"e", 21}, - {"r", 27}, - {"t", 33}, - {"y", 39}, - {"u", 45}, - {"i", 51}, - {"o", 57}, - {"p", 63}, - {"[", 69}, - {"]", 75}, - {"\\", 81}, - {"end", 93}, + {"lshift", 73}, + {"z", 74}, + {"x", 75}, + {"c", 76}, + {"v", 77}, + {"b", 78}, + {"n", 79}, + {"m", 80}, + {",", 81}, + {".", 82}, + {"/", 83}, + {"shift", 84}, + {"enter", 85}, + {"lctrl", 91}, + {"meta", 92}, + {"lalt", 93}, + {"space", 94}, + {"ralt", 95}, + {"fn", 96}, + {"rctrl", 98}, - {"caps", 4}, - {"a", 10}, - {"s", 16}, - {"d", 22}, - {"f", 28}, - {"g", 34}, - {"h", 40}, - {"j", 46}, - {"k", 52}, - {"l", 58}, - {";", 64}, - {"'", 70}, - {"enter", 82}, - {"pageup", 94}, + {"left", 99}, + {"down", 100}, + {"up", 101}, + {"right", 102}, + {"backspace", 103}, - {"lshift", 5}, - {"z", 11}, - {"x", 17}, - {"c", 23}, - {"v", 29}, - {"b", 35}, - {"n", 41}, - {"m", 47}, - {",", 53}, - {".", 59}, - {"/", 65}, - {"rshift", 71}, - {"up", 83}, - {"pagedown", 95}, + {"insert", 116}, + {"pageup", 118}, + {"delete", 119}, + {"pagedown", 121}, - {"lctrl", 6}, - {"lmeta", 12}, - {"lalt", 18}, - {"space", 36}, - {"ralt", 54}, - {"fn", 60}, - {"rctrl", 66}, - {"left", 72}, - {"down", 84}, - {"right", 96}, - - */ - } -}; + } + }; } diff --git a/include/main/keyboards/sk80/messages_sk80.h b/include/main/keyboards/sk80/messages_sk80.h index a166acf..0c0dc44 100644 --- a/include/main/keyboards/sk80/messages_sk80.h +++ b/include/main/keyboards/sk80/messages_sk80.h @@ -63,7 +63,8 @@ const unsigned char BULK_LED_FOOTER_MESSAGES[BULK_LED_FOOTER_MESSAGES_COUNT][MES 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - /*{ // These look like they're kicking off a new message type... + /* + { // These look like they're kicking off a new message type... 0x00, 0x04, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -158,7 +159,7 @@ const unsigned char BULK_LED_VALUE_MESSAGES[BULK_LED_VALUE_MESSAGES_COUNT][MESSA 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, // 0x25 == 37u 0x26, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, diff --git a/include/main/usb_functions.h b/include/main/usb_functions.h index fd4c58e..6cc6af3 100644 --- a/include/main/usb_functions.h +++ b/include/main/usb_functions.h @@ -1,6 +1,6 @@ #pragma once -#include #include +#include #include "misc.h" diff --git a/src/blink/blink.cpp b/src/blink/blink.cpp index 439c4c4..05f5358 100644 --- a/src/blink/blink.cpp +++ b/src/blink/blink.cpp @@ -75,6 +75,11 @@ int TurnKeyIds(char* key_ids, UINT8 n_keys, KeyValue onOrOff, KeyboardInfo keybo } extern "C" { + + void PrintMessagesInBufferA(const unsigned char* buffer, size_t message_count, size_t message_length) { + PrintMessagesInBuffer(buffer, message_count, message_length); + } + void HelloDll() { printf("Hello from the DLL!\n"); } diff --git a/src/blink/keyboards/sk80/sk80.cpp b/src/blink/keyboards/sk80/sk80.cpp index bad36ae..fed1f7a 100644 --- a/src/blink/keyboards/sk80/sk80.cpp +++ b/src/blink/keyboards/sk80/sk80.cpp @@ -28,15 +28,10 @@ namespace sk80::internal { throw("SK80 does not support keyIds greater than " + sk80::max_key_id); } - // assume 0x0f, 15, which is 4 * 15 + 1 = index:61 - // Also consider 0x10, 16, which is message_index:2 - - UINT8 n_keys_in_first_packet = 15; + UINT8 n_keys_in_first_packet = 16; UINT8 width_of_key = 4; - UINT8 message_index = (active_key - 1) / n_keys_in_first_packet; // when active_key = 1, 0 % 15 is zero, so 0 * 4 - UINT8 offset_to_message = ((active_key - 1) % 15) * width_of_key + 1; // when active_key = 16, 15 % 15 is zero, so 0 * width_of_key = 0 - if (message_index == 0) - offset_to_message += 4; // we'll count the first packet as zero indexed and everything will work out, but this register massaging is because they did their math in creative ways + UINT8 message_index = active_key / n_keys_in_first_packet; + UINT8 offset_to_message = (active_key % 16) * width_of_key + 1; // This allows for C++17 destructuring via the auto keyword return { static_cast(message_index), static_cast(offset_to_message) }; @@ -53,8 +48,8 @@ namespace sk80 { void SK80::SetBytesInValuePackets(unsigned char* messages_ptr, KeyValue key_value) { - // Cast the flat buffer to a 3x65 array - unsigned char (*messages)[sk80::MESSAGE_LENGTH] = reinterpret_cast(messages_ptr); + // A 9x65 array cast from the flat buffer + unsigned char (&messages)[sk80::BULK_LED_VALUE_MESSAGES_COUNT][sk80::MESSAGE_LENGTH] = *reinterpret_cast(messages_ptr); std::memcpy(messages, sk80::BULK_LED_VALUE_MESSAGES, sk80::BULK_LED_VALUE_MESSAGES_COUNT * sk80::MESSAGE_LENGTH); @@ -98,7 +93,7 @@ namespace sk80 { SendBufferToDevice(this->device_handle, messages, sk80::BULK_LED_VALUE_MESSAGES_COUNT, sk80::MESSAGE_LENGTH); //PrintMessagesInBuffer(*sk80::BULK_LED_FOOTER_MESSAGES, sk80::BULK_LED_FOOTER_MESSAGES_COUNT, sk80::MESSAGE_LENGTH); - SendBufferToDevice(this->device_handle, *sk80::BULK_LED_FOOTER_MESSAGES, sk80::BULK_LED_FOOTER_MESSAGES_COUNT, sk80::MESSAGE_LENGTH); + SendBufferToDeviceAndGetResp(this->device_handle, *sk80::BULK_LED_FOOTER_MESSAGES, sk80::BULK_LED_FOOTER_MESSAGES_COUNT, sk80::MESSAGE_LENGTH); } void SK80::SetKeyRGB(char key_id, unsigned char r, unsigned char g, unsigned char b) { diff --git a/src/demo/activities/cycle_keyids.cpp b/src/demo/activities/cycle_keyids.cpp index ae37f9d..12966e0 100644 --- a/src/demo/activities/cycle_keyids.cpp +++ b/src/demo/activities/cycle_keyids.cpp @@ -1,6 +1,10 @@ -#include +#include "cycle_keyids.h" + #include #include + +#include + #include "blink_loader.h" using std::cout; @@ -73,7 +77,7 @@ int CycleKeyIds(KeyboardInfo keyboard) { } if (GetAsyncKeyState(VK_SPACE) & 0x8000) { // print packet buffer - CallPrintMessagesInBuffer(messages_sent, 3, 65); + CallPrintMessagesInBuffer(messages_sent, keyboard.BULK_LED_VALUE_MESSAGES_COUNT, keyboard.MESSAGE_LENGTH); Sleep(200); } diff --git a/src/demo/activities/cycle_keyids.h b/src/demo/activities/cycle_keyids.h index 889765e..8e0ba48 100644 --- a/src/demo/activities/cycle_keyids.h +++ b/src/demo/activities/cycle_keyids.h @@ -1,4 +1,5 @@ #pragma once +#include "misc.h" namespace demo { diff --git a/src/demo/blink_loader.cpp b/src/demo/blink_loader.cpp index 85e3999..8bec061 100644 --- a/src/demo/blink_loader.cpp +++ b/src/demo/blink_loader.cpp @@ -73,7 +73,7 @@ void CallPrintMessagesInBuffer(unsigned char* buffer, size_t message_count, size return; } - char funcName[] = "PrintMessagesInBuffer"; + char funcName[] = "PrintMessagesInBufferA"; typedef void (*Func)(unsigned char* buffer, size_t message_count, size_t message_length); Func dll_func = GetFunction(&hModule, funcName); diff --git a/test/keyboard_sk80_test.cpp b/test/keyboard_sk80_test.cpp index 0306b45..0b5f632 100644 --- a/test/keyboard_sk80_test.cpp +++ b/test/keyboard_sk80_test.cpp @@ -44,7 +44,7 @@ namespace KeyboardSK80 int offset = 1; unsigned char messages[9][65]; - char active_key_ids[] = { 1, 13, 19, 20, 21 }; + char active_key_ids[] = { 1, 13, 19, 20, 21, 37 }; Keyboard keyboard_manager(kSK80); keyboard_manager.SetActiveKeyIds(active_key_ids, sizeof(active_key_ids)); @@ -90,6 +90,41 @@ namespace KeyboardSK80 EXPECT_EQ(messages[1][offset + 1 + 5 * 4], onCode); EXPECT_EQ(messages[1][offset + 2 + 5 * 4], onCode); EXPECT_EQ(messages[1][offset + 3 + 5 * 4], onCode); + + // `=` key, this should be on page 3 + i = 5; + EXPECT_EQ(messages[2][offset + 0 + 5 * 4], active_key_ids[i]); + EXPECT_EQ(messages[2][offset + 1 + 5 * 4], onCode); + EXPECT_EQ(messages[2][offset + 2 + 5 * 4], onCode); + EXPECT_EQ(messages[2][offset + 3 + 5 * 4], onCode); + } + + TEST(KeyboardSK80, SetBytesInPacket_KeyId121Works) { + unsigned char onCode = 0xff; + unsigned char offCode = 0x00; + int offset = 1; + + unsigned char messages[9][65]; + char active_key_ids[] = { 121 }; + + Keyboard keyboard_manager(kSK80); + keyboard_manager.SetActiveKeyIds(active_key_ids, sizeof(active_key_ids)); + + SK80* sk_80 = dynamic_cast(keyboard_manager.keyboard_spec); + + + sk_80->SetBytesInValuePackets(*messages, kOn); + + int i; + + // Escape key + i = 0; + offset = 1 + 9 * 4; + EXPECT_EQ(messages[7][offset + 0], active_key_ids[i]); + EXPECT_EQ(messages[7][offset + 1], onCode); + EXPECT_EQ(messages[7][offset + 2], onCode); + EXPECT_EQ(messages[7][offset + 3], onCode); + } TEST(KeyboardSK80, ItHasTheCorrectConstsAvailable) { @@ -101,16 +136,16 @@ namespace KeyboardSK80 EXPECT_EQ(abstr->BULK_LED_VALUE_MESSAGES_COUNT, 9); EXPECT_EQ(sk_80.MESSAGE_LENGTH, 65); EXPECT_EQ(abstr->MESSAGE_LENGTH, 65); - EXPECT_EQ(sk_80.keyname_keyid_mappings["tab"], 3); - EXPECT_EQ(abstr->keyname_keyid_mappings["tab"], 3); + EXPECT_EQ(sk_80.keyname_keyid_mappings["tab"], 37); + EXPECT_EQ(abstr->keyname_keyid_mappings["tab"], 37); EXPECT_EQ(sk_80.target_device_path[0], '\\'); EXPECT_EQ(abstr->target_device_path[0], '\\'); EXPECT_EQ(sk_80.device_info.vid, 0x05ac); EXPECT_EQ(abstr->device_info.vid, 0x05ac); EXPECT_EQ(sk_80.device_info.pid, 0x024f); EXPECT_EQ(abstr->device_info.pid, 0x024f); - EXPECT_EQ(sk_80.max_key_id, 79); - EXPECT_EQ(abstr->max_key_id, 79); + EXPECT_EQ(sk_80.max_key_id, 121); + EXPECT_EQ(abstr->max_key_id, 121); } }