#include #include #include #include "exports.h" LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); void LoadSetup(); char* szAppName = "x10"; char* szVersion = "x10 v1.0 (MrJukes)"; HINSTANCE hInstance; HWND hwndMain, hwndParent; char lsdir[256] = ""; int msgs[] = {LM_GETREVID, 0}; void BangX10(HWND caller, const char* args) { // !X10 A 2 On char token1[4096], token2[4096], token3[4096], token4[4096], extra_text[4096]; char* tokens[3]; int count; tokens[0] = token1; tokens[1] = token2; tokens[2] = token3; tokens[3] = token4; token1[0] = token2[0] = token3[0] = token4[0] = extra_text[0] = '\0'; count = LCTokenize(args, tokens, 4, extra_text); if (count >= 3) { unsigned char buffer[10] = ""; unsigned char rbuffer[10] = ""; unsigned long ret; HANDLE hCom; DCB dcb; BOOL fSuccess; char *pcCommPort = "COM2"; hCom = CreateFile(pcCommPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hCom == INVALID_HANDLE_VALUE) return; fSuccess = GetCommState(hCom, &dcb); if (!fSuccess) return; dcb.BaudRate = CBR_4800; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) return; int attempts=0; while (1) { buffer[0] = 0x04; if (*token1 == 'A') buffer[1] = 0x60; else if (*token1 == 'B') buffer[1] = 0xE0; else if (*token1 == 'C') buffer[1] = 0x20; else if (*token1 == 'D') buffer[1] = 0xA0; else if (*token1 == 'E') buffer[1] = 0x10; else if (*token1 == 'F') buffer[1] = 0x90; else if (*token1 == 'G') buffer[1] = 0x50; else if (*token1 == 'H') buffer[1] = 0xD0; else if (*token1 == 'I') buffer[1] = 0x70; else if (*token1 == 'J') buffer[1] = 0xF0; else if (*token1 == 'K') buffer[1] = 0x30; else if (*token1 == 'L') buffer[1] = 0xB0; else if (*token1 == 'M') buffer[1] = 0x00; else if (*token1 == 'N') buffer[1] = 0x80; else if (*token1 == 'O') buffer[1] = 0x40; else if (*token1 == 'P') buffer[1] = 0xC0; if (!strcmp(token2, "1")) buffer[1] |= 0x06; else if (!strcmp(token2, "2")) buffer[1] |= 0x0E; else if (!strcmp(token2, "3")) buffer[1] |= 0x02; else if (!strcmp(token2, "4")) buffer[1] |= 0x0A; else if (!strcmp(token2, "5")) buffer[1] |= 0x01; else if (!strcmp(token2, "6")) buffer[1] |= 0x09; else if (!strcmp(token2, "7")) buffer[1] |= 0x05; else if (!strcmp(token2, "8")) buffer[1] |= 0x0D; else if (!strcmp(token2, "9")) buffer[1] |= 0x07; else if (!strcmp(token2, "10")) buffer[1] |= 0x0F; else if (!strcmp(token2, "11")) buffer[1] |= 0x03; else if (!strcmp(token2, "12")) buffer[1] |= 0x0B; else if (!strcmp(token2, "13")) buffer[1] |= 0x00; else if (!strcmp(token2, "14")) buffer[1] |= 0x08; else if (!strcmp(token2, "15")) buffer[1] |= 0x04; else if (!strcmp(token2, "16")) buffer[1] |= 0x0C; buffer[2] = '\0'; WriteFile(hCom, &buffer, 2, &ret, NULL); while (ReadFile(hCom, &rbuffer, 10, &ret, NULL)) { if (ret) break; memset(&rbuffer, 0, sizeof(rbuffer)); } if (rbuffer[0] == ((buffer[0] + buffer[1])&0xFF)) break; else if (rbuffer[0] == 0x5a) { buffer[0] = 0xc3; buffer[2] = '\0'; WriteFile(hCom, &buffer, 1, &ret, NULL); } if (attempts++ > 5) return; } attempts=0; while (1) { buffer[0] = 0x06; if (*token1 == 'A') buffer[1] = 0x60; else if (*token1 == 'B') buffer[1] = 0xE0; else if (*token1 == 'C') buffer[1] = 0x20; else if (*token1 == 'D') buffer[1] = 0xA0; else if (*token1 == 'E') buffer[1] = 0x10; else if (*token1 == 'F') buffer[1] = 0x90; else if (*token1 == 'G') buffer[1] = 0x50; else if (*token1 == 'H') buffer[1] = 0xD0; else if (*token1 == 'I') buffer[1] = 0x70; else if (*token1 == 'J') buffer[1] = 0xF0; else if (*token1 == 'K') buffer[1] = 0x30; else if (*token1 == 'L') buffer[1] = 0xB0; else if (*token1 == 'M') buffer[1] = 0x00; else if (*token1 == 'N') buffer[1] = 0x80; else if (*token1 == 'O') buffer[1] = 0x40; else if (*token1 == 'P') buffer[1] = 0xC0; if (!_strcmpi(token3, "On")) buffer[1] |= 0x02; else if (!_strcmpi(token3, "Off")) buffer[1] |= 0x03; else if (!_strcmpi(token3, "Dim")) { buffer[0] |= 0x0B; buffer[1] |= 0x04; } buffer[2] = '\0'; WriteFile(hCom, &buffer, 2, &ret, NULL); while (ReadFile(hCom, &rbuffer, 10, &ret, NULL)) { if (ret) break; memset(&rbuffer, 0, sizeof(rbuffer)); } if (rbuffer[0] == ((buffer[0] + buffer[1])&0xFF)) break; if (attempts++ > 5) return; } buffer[0] = 0x00; buffer[1] = '\0'; WriteFile(hCom, &buffer, 1, &ret, NULL); while (ReadFile(hCom, &rbuffer, 10, &ret, NULL)) { if (ret) break; memset(&rbuffer, 0, sizeof(rbuffer)); } CloseHandle(hCom); } } void LoadSetup() { AddBangCommand("!X10", BangX10); } int initModuleEx(HWND parent, HINSTANCE dllInst, LPCSTR szPath) { WNDCLASS wc; strcpy(lsdir, szPath); hwndParent = parent; hInstance = dllInst; memset(&wc,0,sizeof(wc)); wc.lpfnWndProc = WndProc; // our window procedure wc.hInstance = dllInst; // hInstance of DLL wc.lpszClassName = szAppName; // our window class name if (!RegisterClass(&wc)) { MessageBox(parent, "Error: Could not register window class", szAppName, MB_OK | MB_ICONERROR); return 1; } LoadSetup(); hwndMain = CreateWindowEx(WS_EX_TOOLWINDOW, szAppName, szAppName, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, 0, 0, NULL, NULL, dllInst, NULL); if (!hwndMain) return 1; SendMessage(hwndParent, LM_REGISTERMESSAGE, (WPARAM)hwndMain, (LPARAM)msgs); return 0; } int quitModule(HINSTANCE dll) { RemoveBangCommand("!X10"); SendMessage(hwndParent, LM_UNREGISTERMESSAGE, (WPARAM)hwndMain, (LPARAM)msgs); DestroyWindow(hwndMain); UnregisterClass(szAppName, dll); return 0; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case LM_GETREVID: { LPSTR buf = (LPSTR)(lParam); strcpy(buf, szVersion); return strlen(buf); } break; } return DefWindowProc(hwnd,msg, wParam,lParam); }