IT/제품리뷰

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

psychoria 2016. 2. 6. 16:30
반응형

커세어 스트레이프(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

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

반응형