unsigned int MainWindow::handleDataEvent(unsigned char *pData, unsigned int deviceID, unsigned int error) { unsigned int result; char dataStr[256]; sprintf(dataStr, "%02x %02x %02x %02x -- %02x %02x %02x %02x -- %02x %02x %02x %02x", pData[0], pData[1], pData[2], pData[3], pData[4], pData[5], pData[6], pData[7], pData[8], pData[9], pData[10], pData[11]); // Append it to the end of the output box. This is done using a signal // which is connected to the output box because this function is // called from a different thread than the GUI is on. emit append(dataStr); // The output buffer unsigned char buffer[80]; memset(buffer, 0, sizeof(buffer)); //for Keyboard Reflect, if ((pData[3]&1) && keyboard==true) { //Sends keyboard commands as a native keyboard //Before pressing 1st key activate a Notepad or other text capturing application to see the results: Abcd buffer[0]=0; buffer[1]=201; buffer[2]=2; //modifiers Bit 1=Left Ctrl, bit 2=Left Shift, bit 3=Left Alt, bit 4=Left Gui, bit 5=Right Ctrl, bit 6=Right Shift, bit 7=Right Alt, bit 8=Right Gui. buffer[3]=0; //always 0 buffer[4]=0x04; //1st hid code a, down buffer[5]=0; //2nd hid code buffer[6]=0; //3rd hid code buffer[7]=0; //4th hid code buffer[8]=0; //5th hid code buffer[9]=0; //6th hid code result = WriteData(handle, buffer); if (result != 0) { emit messageBox("Write Error", "Unable to write to Device."); } buffer[0]=0; buffer[1]=201; buffer[2]=0; //modifiers Bit 1=Left Ctrl, bit 2=Left Shift, bit 3=Left Alt, bit 4=Left Gui, bit 5=Right Ctrl, bit 6=Right Shift, bit 7=Right Alt, bit 8=Right Gui. buffer[3]=0; //always 0 buffer[4]=0; //1st hid code a up buffer[5]=0x05; //2nd hid code b down buffer[6]=0x06; //3rd hid code c down buffer[7]=0x07; //4th hid code d down buffer[8]=0; //5th hid code buffer[9]=0; //6th hid code result = WriteData(handle, buffer); if (result != 0) { emit messageBox("Write Error", "Unable to write to Device."); } buffer[0]=0; buffer[1]=201; buffer[2]=0; //modifiers Bit 1=Left Ctrl, bit 2=Left Shift, bit 3=Left Alt, bit 4=Left Gui, bit 5=Right Ctrl, bit 6=Right Shift, bit 7=Right Alt, bit 8=Right Gui. buffer[3]=0; //always 0 buffer[4]=0; //1st hid code buffer[5]=0; //2nd hid code b up buffer[6]=0; //3rd hid code c up buffer[7]=0; //4th hid code d up buffer[8]=0; //5th hid code buffer[9]=0; //6th hid code result = WriteData(handle, buffer); if (result != 0) { emit messageBox("Write Error", "Unable to write to Device."); } keyboard=false; } //for Mouse Reflect, must be in PID #1 to function if (mouseon) { bool progsw = pData[3] & 1; if (progsw && !lastprogsw) //key down { memset(buffer, 0, sizeof(buffer)); buffer[0]=0; buffer[1]=203; //play with these values to get various mouse functions; clicks, motion, scroll buffer[2]=1; //buttons 1=left, 2=right, 4=center, 8=XButton1 (browser back on my mouse), 16=XButton2 buffer[3]=0; //X 128=0 no motion, 1-127 is right, 255-129=left, finest inc (1 and 255) to coarsest (127 and 129) buffer[4]=0; //Y 128=0 no motion, 1-127 is down, 255-129=up, finest inc (1 and 255) to coarsest (127 and 129) buffer[5]=0; //wheel X buffer[6]=0; //wheel Y 128=0 no motion, 1-127 is up, 255-129=down, finest inc (1 and 255) to coarsest (127 and 129) result = WriteData(handle, buffer); if (result != 0) { emit messageBox("Write Error", "Unable to write to Device."); } } else if (!progsw && lastprogsw==true) //key up { //send ups buffer[0]=0; buffer[1]=203; //play with these values to get various mouse functions; clicks, motion, scroll buffer[2]=0; //buttons 1=left, 2=right, 4=center, 8=XButton1 (browser back on my mouse), 16=XButton2 buffer[3]=0; //X 128=0 no motion, 1-127 is right, 255-129=left, finest inc (1 and 255) to coarsest (127 and 129) buffer[4]=0; //Y 128=0 no motion, 1-127 is down, 255-129=up, finest inc (1 and 255) to coarsest (127 and 129) buffer[5]=0; //wheel X buffer[6]=0; //wheel Y 128=0 no motion, 1-127 is up, 255-129=down, finest inc (1 and 255) to coarsest (127 and 129) result = WriteData(handle, buffer); if (result != 0) { emit messageBox("Write Error", "Unable to write to Device."); } } lastprogsw=progsw; } if (joystick) { // Open up the game controller control panel to test these features, // after clicking this button go and make active the control panel // properties and change will occur available for PID #2 only. // In this example, the first 4 buttons on the device will // correspond to the first 4 buttons of the joystick. unsigned char buttons = ((pData[3] & 0x1) << 0) | ((pData[4] & 0x1) << 1) | ((pData[5] & 0x1) << 2) | ((pData[6] & 0x1) << 3); printf("Buttons %02hhx\n", buttons); unsigned int result; unsigned char buffer[80]; memset(buffer, 0, sizeof(buffer)); buffer[0]=0; buffer[1]=202; buffer[2]=128; // X, 0 to 127 from center to right, 255 to 128 from center to left buffer[3]=128; // Y, 0 to 127 from center down, 255 to 128 from center up buffer[4]=128; // Z rot, 0 to 127 from center down, 255 to 128 from center up buffer[5]=128; // Z, 0 to 127 from center down, 255 to 128 from center up buffer[6]=128; // Slider, 0 to 127 from center down, 255 to 128 from center up buffer[7]=buttons; // Game buttons as bitmap, bit 1= game button 1, bit 2=game button 2, etc., all buttons on buffer[8]=0; // Game buttons as bitmap, bit 1= game button 1, bit 2=game button 2, etc., all buttons on buffer[9]=0; // Game buttons as bitmap, bit 1= game button 1, bit 2=game button 2, etc., all buttons on buffer[10]=0; // Game buttons as bitmap, bit 1= game button 1, bit 2=game button 2, etc., all buttons on buffer[11]=0; buffer[12]=1; // Hat, 0 to 7 clockwise, 8=no hat result = WriteData(handle, buffer); if (result != 0) { QMessageBox::critical(this, "Write Error", "Unable to write to Device."); } } // Error handling if (error == PIE_HID_READ_INVALID_HANDLE) { CleanupInterface(handle); output_box->append("Device Disconnected"); } return true; }
DWORD WINAPI Execute(LPDWORD data) { int i, linenumber; char line[256], buf[256], logbuf[100], *prog; BOOL error = FALSE; obj = NULL; light = NULL; ULONG arg[MAXARGS]; InitInterface(); for (i = 0; i < MAXARGS; i++) arg[i] = NULL; prog = ((THREAD_DATA *)data)->szProg; pDisplay = ((THREAD_DATA *)data)->pDisplay; strcpy(szIncludePath, ""); strcpy(szPicturePath, ""); linenumber = 0; nIncludeDepth = 0; while ((*prog || nIncludeDepth > 0) && !error) { GetLine(&prog, line, &linenumber); // read command first if (!Scan(line, buf, arg)) { i = 0; // find command in list while (commands[i].name && stricmp(buf, commands[i].name)) i++; // call corresponding function with "arg" as argument if (commands[i].func) error = commands[i].func(arg); else error = ERROR_UNKNOWNCOM; for (i = 0; i < MAXARGS; i++) { if (arg[i]) delete (ULONG *)arg[i]; arg[i] = NULL; } if (error) { if (nIncludeDepth) { sprintf(logbuf, "In include file: \"%s\"", Includefile[nIncludeDepth].name); pDisplay->Log(logbuf); linenumber = Includefile[nIncludeDepth].linenumber; } sprintf(logbuf, "Error executing command in line %i", linenumber); pDisplay->Log(logbuf); pDisplay->Log(line); GetError(logbuf, error); pDisplay->Log(logbuf); } } } if (error) { pDisplay->Log("Error occurred"); pDisplay->Log("Cancel execution"); // close open include files while (nIncludeDepth > 0) { if (Includefile[nIncludeDepth].hFile) fclose(Includefile[nIncludeDepth].hFile); nIncludeDepth--; } } else { if (pDisplay->CheckCancel()) pDisplay->Log("Execution canceled"); else pDisplay->Log("Execution successful"); } CleanupInterface(); /*rsiCleanup(rc); rsiExit();*/ return TRUE; }