Skip to content

Commit

Permalink
adds an additional messaging for S-K80 which seems to allow the keeb …
Browse files Browse the repository at this point in the history
…to enter custom LED mode
  • Loading branch information
TheNotary committed Sep 13, 2024
1 parent a8cf41b commit b0cadea
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 52 deletions.
23 changes: 16 additions & 7 deletions include/main/keyboards/sk80/messages_sk80.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,10 @@ 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...
};

const unsigned char FOLLOWUP_HEADER_MESSAGES[BULK_LED_HEADER_MESSAGES_COUNT][MESSAGE_LENGTH] = {
{ // These look like they're kicking off a new message type... something about making sure the keyboard is in custom mode or something?
0x00,
0x04, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Expand All @@ -75,7 +77,7 @@ 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
},
{ // I really think this was setting us up to set overall brightness or something great...
{
0x00,
0x04, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Expand All @@ -86,7 +88,11 @@ 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
},
{ // This one is some kind of payload packet, not a header
};

// Observed when setting a key to white which happens to be identical when setting the key to off
const unsigned char FOLLOWUP_PAYLOAD_MESSAGE[1][MESSAGE_LENGTH] = {
{
0x00,
0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0xaa, 0x55,
Expand All @@ -97,7 +103,11 @@ 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
},
{ // And heres an absolute footer message pair
};

const unsigned char FOLLOWUP_FOOTER_MESSAGES[BULK_LED_FOOTER_MESSAGES_COUNT][MESSAGE_LENGTH] = {
{
0x00,
0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Expand All @@ -108,6 +118,7 @@ const unsigned char BULK_LED_FOOTER_MESSAGES[BULK_LED_FOOTER_MESSAGES_COUNT][MES
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
},
{
0x00,
0x04, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Expand All @@ -117,11 +128,9 @@ 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
}
*/
};



// Format:
// 65 bytes per packet
// 16 keys per packet
Expand Down
8 changes: 7 additions & 1 deletion src/blink/keyboards/sk80/sk80.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,15 @@ void SK80::SetKeysOnOff(KeyValue key_value, unsigned char* messages) {
this->SetBytesInValuePackets(messages, key_value);
//PrintMessagesInBuffer(messages, sk80::BULK_LED_VALUE_MESSAGES_COUNT, sk80::MESSAGE_LENGTH);
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);
SendBufferToDeviceAndGetResp(this->device_handle, *sk80::BULK_LED_FOOTER_MESSAGES, sk80::BULK_LED_FOOTER_MESSAGES_COUNT, sk80::MESSAGE_LENGTH);

// This fixes it if I run it the first time, but the second time it fails.... does it allow light to go off if it's different???? grrr... complicated...
// Send that weird follow up packet that makes sure the keyboard is in custom LED lighting mode or something
SendBufferToDeviceAndGetResp(this->device_handle, *sk80::FOLLOWUP_HEADER_MESSAGES, 2, sk80::MESSAGE_LENGTH);
SendBufferToDevice(this->device_handle, *sk80::FOLLOWUP_PAYLOAD_MESSAGE, 1, sk80::MESSAGE_LENGTH);
SendBufferToDeviceAndGetResp(this->device_handle, *sk80::FOLLOWUP_FOOTER_MESSAGES, 2, sk80::MESSAGE_LENGTH);
}

void SK80::SetKeyRGB(char key_id, unsigned char r, unsigned char g, unsigned char b) {
Expand Down
5 changes: 3 additions & 2 deletions test/keyboard_rk84_test.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <gtest/gtest.h>

#include "../include/main/keyboard.h"
#include <keyboards/rk84/rk84.h>

Expand All @@ -21,14 +22,14 @@ namespace KeyboardRK84
rk_84 = dynamic_cast<RK84*>(keyboard_manager.keyboard_spec);
}

void SetUpWithKeyIds(const char* active_key_ids, size_t key_ids_count) {
void SetUpWithKeyIds(const char* active_key_ids, UINT8 key_ids_count) {
keyboard_manager.SetActiveKeyIds(active_key_ids, key_ids_count);
}
};

TEST_F(KeyboardRK84Test, SetBytesInPacket_RK84WillStopAtNullKeyIds) {
char active_key_ids[] = { 0x01, 0x02, 0x00, 0x03 };
SetUpWithKeyIds(active_key_ids, std::size(active_key_ids));
SetUpWithKeyIds(active_key_ids, sizeof(active_key_ids));

rk_84->SetBytesInValuePackets(*messages, kOn);

Expand Down
85 changes: 43 additions & 42 deletions test/keyboard_sk80_test.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <gtest/gtest.h>

#include "../include/main/keyboard.h"
#include <keyboards/sk80/sk80.h>

Expand All @@ -21,52 +22,52 @@ namespace KeyboardSK80
sk_80 = dynamic_cast<SK80*>(keyboard_manager.keyboard_spec);
}

void SetUpWithKeyIds(const char* active_key_ids, size_t key_ids_count) {
void SetUpWithKeyIds(const char* active_key_ids, UINT8 key_ids_count) {
keyboard_manager.SetActiveKeyIds(active_key_ids, key_ids_count);
}
};

TEST_F(KeyboardSK80Test, SetBytesInPacket_SK80WillStopAtNullKeyIds) {
char active_key_ids[] = { 0x01, 0x02, 0x00, 0x03 };
SetUpWithKeyIds(active_key_ids, std::size(active_key_ids));

sk_80->SetBytesInValuePackets(*messages, kOn);

int header_offset = 1;
int i, key_offset;

// escape key should be on
i = 0;
key_offset = 4; // key_id * 4 for the first page...
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], onCode);

// f1 key should be on
i = 1;
key_offset = 8;
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], onCode);

// The null key should always be off
i = 2;
key_offset = 0;
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], offCode);

// f2 key should be off. Even though f2, 0x03 is set in active_key_ids, active_key_ids was null terminated at index 2
i = 3;
key_offset = 12;
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], offCode);
}
TEST_F(KeyboardSK80Test, SetBytesInPacket_SK80WillStopAtNullKeyIds) {
char active_key_ids[] = { 0x01, 0x02, 0x00, 0x03 };
SetUpWithKeyIds(active_key_ids, sizeof(active_key_ids));

sk_80->SetBytesInValuePackets(*messages, kOn);

int header_offset = 1;
int i, key_offset;

// escape key should be on
i = 0;
key_offset = 4; // key_id * 4 for the first page...
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], onCode);

// f1 key should be on
i = 1;
key_offset = 8;
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], onCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], onCode);

// The null key should always be off
i = 2;
key_offset = 0;
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], offCode);

// f2 key should be off. Even though f2, 0x03 is set in active_key_ids, active_key_ids was null terminated at index 2
i = 3;
key_offset = 12;
EXPECT_EQ(messages[0][header_offset + key_offset + 0], active_key_ids[i]);
EXPECT_EQ(messages[0][header_offset + key_offset + 1], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 2], offCode);
EXPECT_EQ(messages[0][header_offset + key_offset + 3], offCode);
}

TEST_F(KeyboardSK80Test, SetBytesInPacket_PutsVariousKeysInExpectedSpots) {
char active_key_ids[] = { 1, 13, 19, 20, 21, 37 };
Expand Down
1 change: 1 addition & 0 deletions test/keyboard_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ namespace KeyboardTest
EXPECT_TRUE(was_reasonable);

// Only do this if an KEYBOARD_ATTACHED is set to 1
#pragma warning(disable: 4996) // disables a lint complaint, tests can call getenv without it being a risk in deployment
const char* keyboardAttachedEnv = std::getenv("KEYBOARD_ATTACHED");
if (keyboardAttachedEnv != nullptr && std::string(keyboardAttachedEnv) == "1")
EXPECT_EQ(list.size(), 1);
Expand Down

0 comments on commit b0cadea

Please sign in to comment.