본문 바로가기

IT/제품리뷰

커간지 CORSAIR STRAFE 기계식 키보드 LED 커스터마이징

반응형

커세어 스트레이프(COSAIR STRAFE)를 사용하면서 시도한 작업입니다.

커세어에서는 Cosair Utility Engine(CUE)와 함께 SDK를 제공합니다.

SDK를 통해 LED를 커스터마이징하는 방법입니다.

아래의 링크를 통해서 SDK를 다운로드합니다.

http://www.corsair.com/en-us/support/downloads

Gaming Keyboards를 선택하고 Corsair CUE SDK를 다운로드합니다.

압축을 풀면 내부에 라이브러리와 문서, 샘플 등을 확인할 수 있습니다.

샘플 코드를 참조해서 커스터마이징한 코드입니다.

#include "stdafx.h"
#include <windows.h>
#include <vector>
#include <algorithm>
#include <thread>
#include "include\CUESDK.h"

std::vector<CorsairLedPosition> getAvailableKeys()
{
	auto posVector = std::vector<CorsairLedPosition>();

	// Get Available Keys
	for (auto deviceIndex = 0; deviceIndex < CorsairGetDeviceCount(); deviceIndex++)
	{
		if (CDT_Keyboard == CorsairGetDeviceInfo(deviceIndex)->type)
		{
			auto ledPositions = CorsairGetLedPositions();
			if (ledPositions)
			{
				for (auto i = 0; i < ledPositions->numberOfLed; i++)
				{
					posVector.push_back(ledPositions->pLedPosition[i]);
				}
			}
		}
	}

	return posVector;
}

std::vector<CorsairLedColor> sortbyPosition(const std::vector<CorsairLedPosition>& orgposVector)
{
	auto colorVector = std::vector<CorsairLedColor>();
	auto posVector = orgposVector;

	// Sort by Top Position
	std::sort(posVector.begin(), posVector.end(), [](auto& a, auto& b) -> bool
	{
		return a.top < b.top;
	});

	// Sort by Left Position
	std::vector<std::vector<CorsairLedPosition>> sortedKeyList;
	std::vector<CorsairLedPosition> lineList;
	double prevTop = posVector[0].top;
	int index = 0;
	bool bFirst = true;

	// Separate Each Line
	for (auto key : posVector)
	{
		if (prevTop != key.top)
		{
			if (true == bFirst)
			{
				bFirst = false;
				lineList.clear();
			}
			else
			{
				sortedKeyList.push_back(lineList);
				lineList.clear();
			}
		}
		lineList.push_back(key);
		prevTop = key.top;
		++index;
	}
	sortedKeyList.push_back(lineList);

	// Convert to CorsairLedColor
	index = 0;
	for (auto& line : sortedKeyList)
	{
		if (0 == index % 2)
		{
			std::sort(line.begin(), line.end(), [](auto& a, auto& b) -> bool
			{
				return a.left < b.left;
			});
		}
		else
		{
			std::sort(line.rbegin(), line.rend(), [](auto& a, auto& b) -> bool
			{
				return a.left < b.left;
			});
		}
		++index;

		for (auto& key : line)
		{
			colorVector.push_back(CorsairLedColor{ key.ledId, 0, 0, 0 });
		}
	}
	return colorVector;
}

int main()
{
	CorsairPerformProtocolHandshake();

	auto allKeyList = getAvailableKeys();
	auto KeyList = sortbyPosition(allKeyList);

	while (!GetAsyncKeyState(VK_ESCAPE))
	{
		for (auto& key : KeyList)
		{
			key.g = (0 == key.g) ? 255 : 0;
			CorsairSetLedsColors(1, &key);

			std::this_thread::sleep_for(std::chrono::milliseconds(100));
		}
	}

	return 0;
}

간단하게 'ㄹ'자 형태로 상단에서 하단까지 LED가 켜졌다가 꺼지는 코드입니다.

ESC를 누르면 프로그램이 종료됩니다.

다양한 방식으로 LED를 커스터마이징 할 수 있을 것으로 보입니다.

다음과 같은 형태로 LED가 점멸됩니다.

여러 방법으로 응용이 가능할 것 같습니다.

SDK 제공으로 소소한 재미를 느낄 수 있었습니다.

아래 첨부를 다운로드 받으면 샘플 프로그램을 직접 실행할 수 있습니다.

CorsairLED.zip

직접 실행해보시기 바랍니다.

반응형