การบิลด์เฟิร์มแวร์จากซอร์สโค้ด
หากคุณต้องการเปลี่ยนแปลงคีย์แมปของคีย์บอร์ด หรือเพิ่มการรองรับคีย์บอร์ดใหม่ให้กับ SignalRGB QMK Protocol คุณจะต้องบิลด์จากซอร์สโค้ด
ขั้นตอนการบิลด์จากซอร์สโค้ด:
- ดาวน์โหลด QMK MSYS จากที่นี่และติดตั้ง

เปิด QMK MSYS แล้วทำ git clone ของ QMK fork / ซอร์สที่คุณต้องการ (อาจเป็น QMK Mainline หรือ SonixQMK)
จากนั้นคุณจะต้องเพิ่ม submodule ของ SignalRGB Protocol ลงในซอร์สของ fork ที่คุณใช้บิลด์:
// cd to your source fork you will be compiling against in the terminal (QMK_MSYS, bash, etc)git submodule add https://github.com/SRGBmods/QMK_Community_Module modules/signalrgbgit submodule update --init --recursive- วางคำสั่งทั้งสองข้างต้นลงในหน้าต่างเทอร์มินัล (QMK_MSYS, bash ฯลฯ)
- คุณจะต้องเพิ่มไฟล์ keymap.json ที่มีเนื้อหาต่อไปนี้ไว้ในไดเรกทอรีแบรนด์คีย์บอร์ดของคุณ:
{ "modules": [ "signalrgb" ]}หมายเหตุ: ให้แทนที่ KEYBOARD BRAND ด้วยแบรนด์คีย์บอร์ดของคุณ, MODEL ด้วยรุ่นคีย์บอร์ด และแทนที่ KM ด้วยประเภทคีย์แมป (default / via / keychron / ฯลฯ)
ประเภทคีย์แมป:
- default: คีย์แมปที่คุณจะใช้หากไม่ได้คอมไพล์สำหรับ VIA
- via: คีย์แมปที่คุณใช้หากคอมไพล์สำหรับ VIA (คุณควรลองแบบนี้ก่อน - คุณสามารถหาคีย์แมป via ของคุณได้ที่นี่)

- หากคอมไพล์เฟิร์มแวร์ไม่สำเร็จ ให้เข้าร่วม Discord และขอความช่วยเหลือในช่อง QMK
เมื่อคุณคอมไพล์เฟิร์มแวร์เสร็จแล้ว คุณจะต้องแฟลชเฟิร์มแวร์ลงในคีย์บอร์ดของคุณ
- คุณจะต้องค้นหาวิธีแฟลชสำหรับคีย์บอร์ดของคุณทางออนไลน์ เนื่องจากวิธีแฟลชแตกต่างกันไปในแต่ละคีย์บอร์ด
- หลังจากแฟลชคีย์บอร์ดแล้ว คุณต้องแก้ไขปลั๊กอินคีย์บอร์ดด้านล่างเพื่อให้ SignalRGB ทำงานกับคีย์บอร์ดของคุณได้
- หลังจากดาวน์โหลดปลั๊กอินคีย์บอร์ดด้านบนแล้ว ให้เปิดด้วยโปรแกรมแก้ไขข้อความ
export function Name() { return "QMK Keyboard"; }export function Version() { return "X.X.X"; }export function VendorId() { return 0x0000; }export function ProductId() { return 0x0000; }export function Publisher() { return "WhirlwindFX"; }export function Size() { return [14, 5]; }export function DefaultPosition(){return [10, 100]; }export function DefaultScale(){return 8.0;}/* globalshutdownColor:readonlyLightingMode:readonlyforcedColor:readonly*/export function ControllableParameters(){ return [ {"property":"shutdownColor", "group":"lighting", "label":"Shutdown Color", "min":"0", "max":"360", "type":"color", "default":"009bde"}, {"property":"LightingMode", "group":"lighting", "label":"Lighting Mode", "type":"combobox", "values":["Canvas", "Forced"], "default":"Canvas"}, {"property":"forcedColor", "group":"lighting", "label":"Forced Color", "min":"0", "max":"360", "type":"color", "default":"009bde"}, ];}- หลังจากเปิดปลั๊กอินคีย์บอร์ดแล้ว คุณจะเห็นหน้าจอคล้ายกับด้านบน
- คุณจะต้องกรอกข้อมูลในบางฟิลด์ โดยเริ่มจากฟิลด์ Name
- ฟิลด์ Name ต้องกรอกด้วยชื่อของคีย์บอร์ดที่คุณพัฒนาเฟิร์มแวร์ให้
export function Name() { return "Massdrop CTRL QMK Keyboard"; }- ถัดไป เราต้องกรอก VendorId ของคีย์บอร์ด
- หากต้องการหา VendorId ของคีย์บอร์ด ให้เปิด SignalRGB
- จากนั้นคลิกไอคอนรูปเฟืองการตั้งค่าที่มุมล่างซ้าย

จากนั้นคลิก ข้อมูลอุปกรณ์

จากนั้นค้นหาคีย์บอร์ดของคุณ และจด VendorID และ ProductID ไว้


ตอนนี้ให้กรอกฟิลด์ VendorId และ ProductId ด้วยค่าเหล่านี้
export function Name() { return "Massdrop CTRL QMK Keyboard"; }export function VendorId() { return 0x04d8; }export function ProductId() { return 0xEED2; }- ฟิลด์ถัดไปที่ต้องกรอกคือฟิลด์ Publisher ในฟิลด์ Publisher คุณสามารถใส่ชื่อ ชื่อผู้ใช้ หรือแฮนเดิลของคุณได้
export function Name() { return "Massdrop CTRL QMK Keyboard"; }export function VendorId() { return 0x04d8; }export function ProductId() { return 0xEED2; }export function Publisher() { return "WhirlwindFX"; }- ตอนนี้เรากรอกฟิลด์เสร็จแล้ว และจะไปต่อที่อาร์เรย์
มีอาร์เรย์ 3 ตัวที่ต้องแก้ไข ได้แก่ vKeys, vKeynames และ vKeyPositions

- อาร์เรย์ vKeys จับคู่แต่ละปุ่มของคีย์บอร์ดกับตำแหน่งภายใน RGBData ที่ส่งไปยังคีย์บอร์ด
- อาร์เรย์ vKeyNames บอกเราว่าปุ่มใดตรงกับแต่ละ vKey และ vKeyPosition
- อาร์เรย์ vKeyPositions บอก SignalRGB ว่าแต่ละปุ่มบนคีย์บอร์ดอยู่ในตำแหน่งใด
- ขั้นแรก ให้เปลี่ยนอาร์เรย์ vKeyNames ให้ตรงกับคีย์บอร์ดของคุณ
- หมายความว่าคุณต้องจัดเรียง vKeyNames ใหม่ให้ตรงกับคีย์บอร์ดของคุณ
- ในกรณีของเรา เราต้องลบบางปุ่มออกและจัดเรียงปุ่มที่เหลือใหม่ เนื่องจากบอร์ดของเราเป็นบอร์ด TKL

จากนั้นอัปเดตอาร์เรย์ vKeyPositions ในลักษณะเดียวกับที่อัปเดตอาร์เรย์ vKeyNames

สุดท้าย อัปเดตอาร์เรย์ vKeys ให้ตรงกับอาร์เรย์ vKeyNames และ vKeysPositions

- ตอนนี้ให้บันทึกไฟล์ปลั๊กอินของคุณไว้ที่ %userprofile%/Documents/WhirlwindFX/plugins แล้วรีสตาร์ท SignalRGB
- คีย์บอร์ดของคุณควรเริ่มสว่างและตอบสนองกับ SignalRGB
หากคีย์บอร์ดไม่สว่างหรือไม่ตอบสนองกับ SignalRGB อย่างถูกต้อง:
หัวข้อที่มีชื่อว่า “หากคีย์บอร์ดไม่สว่างหรือไม่ตอบสนองกับ SignalRGB อย่างถูกต้อง:”- ไปที่หน้า อุปกรณ์ ใน SignalRGB

- ถัดไป ไปที่คีย์บอร์ดของคุณ แล้วคลิกไอคอนรูปเฟืองการตั้งค่า

- จากนั้นคลิกสวิตช์ แสดงคอนโซล

- ในคอนโซลควรมี Device Total LED Count ให้เปรียบเทียบ Device Total LED Count นั้นกับจำนวน LED ที่คุณกำหนดไว้
- ในกรณีของเรา มี LED ทั้งหมด 119 ดวง
หากจำนวน LED ตรงกับจำนวน vKeys ที่คุณมี:
หัวข้อที่มีชื่อว่า “หากจำนวน LED ตรงกับจำนวน vKeys ที่คุณมี:”- ตรวจสอบให้แน่ใจว่าฟิลด์ Size ของปลั๊กอินมีค่ามากกว่าพิกัด LED สูงสุดของคุณ 1 ในแต่ละทิศทาง:
- ในกรณีของเรา LED ที่อยู่ไกลที่สุดอยู่ที่ตำแหน่ง [17,6] ดังนั้นฟิลด์ Size ของเราต้องเป็น [18,7]
export function Size() { return [18, 7]; }หากจำนวน LED ไม่ตรงกับจำนวน vKeys ที่คุณมี:
หัวข้อที่มีชื่อว่า “หากจำนวน LED ไม่ตรงกับจำนวน vKeys ที่คุณมี:”- คุณจะต้องเพิ่ม vKeys, vKeyPositions และ vKeyNames ให้ตรงกับจำนวน LED ทั้งหมด
- ในกรณีของเรา อุปกรณ์มี LED 119 ดวง เราจึงต้องเพิ่ม LED อีก 32 ดวงสำหรับไฟใต้คีย์บอร์ด (underglow)



- หากจำนวน vKeys ตรงกับจำนวน LED ทั้งหมดและกำหนดขนาดอุปกรณ์ถูกต้องแล้ว แต่ LED ถูกจับคู่ไม่ถูกต้อง:
- เข้าร่วม Discord และขอความช่วยเหลือในช่อง QMK
วิธีแก้ไข LED แสดงสถานะ (CAPSLOCK, NUMLOCK, SCROLL-LOCK) ที่กะพริบเมื่อ SignalRGB และปุ่มทำงานอยู่
หัวข้อที่มีชื่อว่า “วิธีแก้ไข LED แสดงสถานะ (CAPSLOCK, NUMLOCK, SCROLL-LOCK) ที่กะพริบเมื่อ SignalRGB และปุ่มทำงานอยู่”ขั้นตอนนี้ค่อนข้างซับซ้อน เนื่องจากคุณต้องทราบค่า Index ของไฟแสดงสถานะ (CAPS, NUM, SCROLL) ล่วงหน้า (โดยทั่วไปสามารถหาได้ในไฟล์ subtype ของอุปกรณ์ ansi/iso หรือโดยตรงใน <keyboard_name.c> ให้มองหา g_led_config แล้วจับคู่ index กับปุ่มที่มันแทนด้วยสายตา หรือเมื่อปลั๊กอิน SignalRGB ของคุณทำงานแล้ว คุณสามารถดู ID จากที่นั่นแล้วคอมไพล์ใหม่พร้อมการแก้ไขนี้ได้!)

เมื่อคุณทราบค่าข้างต้นแล้ว จำเป็นต้องแก้ไขเล็กน้อยใน signalrgb.c หรือ via.c ขึ้นอยู่กับการบิลด์เฟิร์มแวร์ของคุณ ให้แทนที่ CAPSLOCK_LED_INDEX, NUM_LOCK_LED_INDEX หรือ SCROLL_LOCK_LED_INDEX ด้วยค่า index ของคีย์บอร์ดของคุณ
ดังนั้นหาก Index ของ CAPS_LOCK คือ 61 บรรทัดนี้:
if ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) {จะกลายเป็นบรรทัดนี้:
if ((index + i) == 61 && hostkeyboard led_state().caps_lock) {ตัวอย่างโค้ดฉบับเต็มมีดังนี้ (โค้ดนี้จะแทนที่ฟังก์ชัน “led_streaming” นี้ทั้งหมด):
void led_streaming(uint8_t *data) //Stream data from HID Packets to Keyboard.{ uint8_t index = data[1]; uint8_t numberofleds = data[2];
if(numberofleds >= 10) { packet[1] = DEVICE_ERROR_LEDS; raw_hid_send(packet,32); return; }
for (uint8_t i = 0; i < numberofleds; i++) { uint8_t offset = (i * 3) + 3; uint8_t r = data[offset]; uint8_t g = data[offset + 1]; uint8_t b = data[offset + 2];
/* ONLY USE ONE OF THESE */ /* Remove the // from the beginning of the line you wish to use and update the INDEX accordingly */
/* This is for all three CAPS, NUM, and SCROLL LOCKS */ // if ( ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) || ((index + i) == NUM_LOCK_LED_INDEX && host_keyboard_led_state().num_lock) || ((index + i) == SCROLL_LOCK_LED_INDEX && host_keyboard_led_state().scroll_lock)) {
/* This is for CAPS and NUM LOCK */ // if ( ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) || ((index + i) == NUM_LOCK_LED_INDEX && host_keyboard_led_state().num_lock)) {
/* This is for CAPS LOCK */ // if ((index + i) == CAPS_LOCK_LED_INDEX && host_keyboard_led_state().caps_lock) {
/* This is for NUM LOCK */ // if ((index + i) == NUM_LOCK_LED_INDEX && host_keyboard_led_state().num_lock) {
/* ONLY USE ONE OF THE ABOVE */
rgb_matrix_set_color(index + i, 255, 255, 255); } else { rgb_matrix_set_color(index + i, r, g, b); } }}** เข้าร่วม Discord และขอความช่วยเหลือในช่อง QMK custom-builds หากคุณพบปัญหาใด ๆ กับคำแนะนำข้างต้น!**