#include "../hooks/gui.h" #include "_devices.h" /* [0] = e0 [1] = dest? [2] = dst? [3] = length [4] = op code [...] length-1 bytes [.] = sum [0] = e0 [2] = dst? [1] = dest? [3] = length [4] = status [5] = op [6] = report [...] [.] = sum OP codes: 3c: FUN_005735c0 (1) 10: FUN_00580c00 (1) 7c: FUN_00580c00 (2) 3c: FUN_00580c00 (1) 39: FUN_00580c00 (4) 3b: FUN_00580c00 (1) 31: FUN_00581350 (5) 32: FUN_005813b0 (8) 33: FUN_00581430 (8) -> something at [16]?? 39: FUN_005814b0 (4) 3f: FUN_00581220 (7) 7b: FUN_005812a0 (3) 7c: FUN_00581310 (2) 01: was this just an error? 10: 31: Set button. [button] [r] [g] [b] 0-7 = buttons 8 = woofer 9 = center 32: Set multiple. [00] [idx hi] [idx lo] [r] [g] [b] 33: Fade multiple?. [09] [?] [?] [r] [g] [b] 39: Set body light. [intensity] [-] [-] 3b: 3c: Commit? 3f: 7c: 7b: initial setup: 7c 0-7, 32, 3c, 39, 3f, 3b */ unsigned char COLOURS[10][3]; double positions[10][2] = { { 0.337963, 0.470833 }, { 0.469444, 0.619792 }, { 0.469444, 0.828125 }, { 0.337037, 0.977083 }, { 0.152778, 0.976042 }, { 0.020370, 0.828125 }, { 0.020370, 0.618750 }, { 0.151852, 0.472917 }, { 0.5, 0.75 }, { 0.5, 0.5 }, }; typedef struct rs232c_recv_head { BYTE sync; BYTE src; BYTE dst; BYTE length; BYTE op; } rs232c_recv_head_t; BYTE extra[0xff]; static DWORD WINAPI led_bd_thread(com_device_t* dev) { log_warning("led_bd", "%ls woke up", dev->com->wName); while (1) { rs232c_recv_head_t head; if (comdev_available(dev) < sizeof head) { // Sleep(100); continue; } comdev_read(dev, (unsigned char*)&head, sizeof head); comdev_read(dev, extra, head.length); // log_info("led_bd", "Bound %02x->%02x", head.src, head.dst); switch (head.op) { case 0x01: log_warning("led_bd", "01"); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x01\x01\x18", 8); // syn dst src len sts op. rep chk break; case 0x10: log_warning("led_bd", "10"); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x10\x01\x27", 8); // syn dst src len sts op. rep chk break; case 0x31: COLOURS[extra[0]][0] = extra[1]; COLOURS[extra[0]][1] = extra[2]; COLOURS[extra[0]][2] = extra[3]; log_warning("led_bd", "31: %02x = (%02x %02x %02x)", extra[0], extra[1], extra[2], extra[3]); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x31\x01\x48", 8); // syn dst src len sts op. rep chk break; case 0x32: log_warning("led_bd", "32: %02x %02x %02x %02x %02x %02x %02x", extra[0], extra[1], extra[2], extra[3], extra[4], extra[5], extra[6], extra[7]); for (unsigned char i = extra[2] - 1; i < extra[1]; i++) { COLOURS[i][0] = extra[3]; COLOURS[i][1] = extra[4]; COLOURS[i][2] = extra[5]; } comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x32\x01\x49", 8); // syn dst src len sts op. rep chk break; case 0x33: log_warning("led_bd", "33: %02x %02x %02x %02x %02x %02x %02x", extra[0], extra[1], extra[2], extra[3], extra[4], extra[5], extra[6], extra[7]); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x33\x01\x4a", 8); // syn dst src len sts op. rep chk COLOURS[extra[0]][0] = extra[extra[5]]; COLOURS[extra[0]][1] = extra[extra[6]]; COLOURS[extra[0]][2] = extra[extra[7]]; break; case 0x39: log_warning("led_bd", "39: %02x %02x %02x", extra[0], extra[1], extra[2]); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x39\x01\x50", 8); // syn dst src len sts op. rep chk COLOURS[9][0] = extra[0]; COLOURS[9][1] = extra[0]; COLOURS[9][2] = extra[0]; break; case 0x3b: log_warning("led_bd", "3b"); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x3b\x01\x52", 8); // syn dst src len sts op. rep chk break; case 0x3c: log_warning("led_bd", "3c (I am %ls)", dev->com->wName); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x3c\x01\x53", 8); // syn dst src len sts op. rep chk break; case 0x3f: log_warning("led_bd", "3f: %02x %02x %02x %02x %02x %02x", extra[0], extra[1], extra[2], extra[3], extra[4], extra[5], extra[6]); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x3f\x01\x56", 8); // syn dst src len sts op. rep chk break; case 0x7c: // extra[0] goes from 0 to 7 // Could this be some sort of calibration for the buttons? log_warning("led_bd", "7c: %02x", extra[0]); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x04\x01\x7c\x01\x00\x94", 9); // \/ causes 7b to be used // comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x04\x01\x7c\x01\x10\xa4", 9); // syn dst src len sts op. rep --- chk break; case 0x7b: log_warning("led_bd", "7b: %02x %02x %02x", extra[0], extra[1], extra[2]); comdev_write(dev, (unsigned char*)"\xe0\x01\x11\x03\x01\x7b\x01\x92", 8); // syn dst src len sts op. rep chk break; default: log_error("led_bd", "Unknown op %02x (%d)", head.op, head.length - 1); break; } } } static DWORD WINAPI led_null_thread(com_device_t* dev) { while (1) Sleep(10000000); } void led_overlay(IDirect3DDevice9* dev) { ShowCursor(true); D3DDEVICE_CREATION_PARAMETERS cparams; RECT rect; dev->lpVtbl->GetCreationParameters(dev, &cparams); GetClientRect(cparams.hFocusWindow, &rect); if (GetAsyncKeyState(VK_LBUTTON) & 1) { POINT cursor; GetCursorPos(&cursor); // log_info("led_overlay", "x: %d, y: %d", cursor.x, cursor.y); // log_info("led_overlay", "x%: %f, y%: %f", (float)cursor.x / (float)rect.right, // (float)(cursor.y - 26) / (float)rect.bottom); } for (unsigned char i = 0; i < 10; i++) { int x = (int)(rect.right * positions[i][0]); int y = (int)(rect.bottom * positions[i][1]); draw_rect(dev, x - 25, y - 25, 50, 50, COLOURS[i][0], COLOURS[i][1], COLOURS[i][2]); } } void install_led_bd() { register_gui_hook(&led_overlay); com_device_t* com5 = new_com_device(5); com_device_thread(com5, led_null_thread); com_device_t* leds_1p = new_com_device(6); com_device_thread(leds_1p, led_bd_thread); com_device_t* com7 = new_com_device(7); com_device_thread(com7, led_null_thread); com_device_t* leds_2p = new_com_device(8); com_device_thread(leds_2p, led_bd_thread); }