private void cBGPEnable_CheckedChanged(object sender, EventArgs e) { if (cBGPEnable.Checked) { try { ControlGamePad.Initialize(); } catch { } } }
private void timer1_Tick(object sender, EventArgs e) { try { ControlGamePad.gamePad.Poll(); var datas = ControlGamePad.gamePad.GetBufferedData(); foreach (var state in datas) { lblgp.Text = state.Offset + " Value: " + state.Value.ToString(); processGamepad(state); } } catch { try { ControlGamePad.Initialize(); timer1.Interval = 200; } catch { timer1.Interval = 5000; } } }
private void processGamePadNew() { string command = ""; try { if (ControlGamePad.gamePad != null) { ControlGamePad.gamePad.Poll(); var datas = ControlGamePad.gamePad.GetBufferedData(); if (datas.Length > 0) // no trigger if no change in data { bool doJog = false; var property = Properties.Settings.Default; foreach (var state in datas) { string offset = state.Offset.ToString(); // execute gPButtonsx strings int value = state.Value; if ((value > 0) && (offset.IndexOf("Buttons") >= 0)) // Buttons { try { command = Properties.Settings.Default["gamePad" + offset].ToString(); // gP if (command.IndexOf('#') >= 0) { processSpecialCommands(command); } else { processCommands(command); } } catch (Exception) { } return; } else if (offset.IndexOf("PointOfViewControllers0") >= 0) { command = ""; if (value == 0) { command = Properties.Settings.Default.gamePadPOVC00; } // up else if (value == 4500) { command = Properties.Settings.Default.gamePadPOVC01; } // up-right else if (value == 9000) { command = Properties.Settings.Default.gamePadPOVC02; } // right else if (value == 13500) { command = Properties.Settings.Default.gamePadPOVC03; } // down-right else if (value == 18000) { command = Properties.Settings.Default.gamePadPOVC04; } // down else if (value == 22500) { command = Properties.Settings.Default.gamePadPOVC05; } // down-left else if (value == 27000) { command = Properties.Settings.Default.gamePadPOVC06; } // left else if (value == 31500) { command = Properties.Settings.Default.gamePadPOVC07; } // up-left if (command.IndexOf('#') >= 0) { processSpecialCommands(command); } else { processCommands(command); } } else if ((offset == "X") || (offset == "Y") || (offset == "Z") || (offset == "RotationZ")) { doJog = true; if (!gamePadValue.ContainsKey(offset)) // just keep latest value { gamePadValue.Add(offset, value); } else { gamePadValue[offset] = value; } } } // end foreach if (doJog) { // execute analog joystick https://github.com/gnea/grbl/wiki/Grbl-v1.1-Jogging#joystick-implementation gamePadSendString = ""; float maxSpeed = 0, maxValue = 0, minAxisSteps = 1000; // max. feed rate on axis int jval, jdir, invert = 1; int center = 32767, deadzone = 1000; center = (int)Properties.Settings.Default.gamePadAnalogOffset; deadzone = (int)Properties.Settings.Default.gamePadAnalogDead; string axis = "X"; foreach (var item in gamePadValue.Where(kvp => Math.Abs(kvp.Value - center) <= deadzone).ToList()) { gamePadValue.Remove(item.Key); } // if value within deadzone, nothing to do foreach (string key in gamePadValue.Keys) // find maxima, keep values as long as they are not < limit { jval = Math.Abs(gamePadValue[key] - center); if ((gamePadValue[key] <= 0) || (gamePadValue[key] >= 65535)) { jval = 32767; } maxValue = Math.Max(maxValue, jval); axis = gamePadGetAssignedAxis(key); maxSpeed = Math.Max(maxSpeed, grbl.getSetting(110 + getGrblSetupOffset(axis))); minAxisSteps = Math.Min(minAxisSteps, grbl.getSetting(100 + getGrblSetupOffset(axis))); } if (maxValue > deadzone) // send move-command if any value is > limit; otherwise send jog-cancel { float feedRate = maxSpeed * (maxValue - deadzone) / (32767f - deadzone); float minFeedRate = 1800 / minAxisSteps; if (feedRate < minFeedRate) { feedRate = 1.1f * 1800 / minAxisSteps; // 10% above minimum speed } float stepWidth; bool justOneAxis = (gamePadValue.Keys.Count <= 1); foreach (string key in gamePadValue.Keys) { jdir = Math.Sign(gamePadValue[key] - center); jval = Math.Abs(gamePadValue[key] - center); if ((gamePadValue[key] <= 0) || (gamePadValue[key] >= 65535)) { jval = 32767; } axis = gamePadGetAssignedAxis(key); invert = gamePadGetAssignedDir(key); // step width must be a bit longer to avoid finishing move within timer-interval stepWidth = 1.2f * feedRate * jdir * invert * gamePadTimer.Interval / 60000; // s = v * dt 20% longer stepWidth *= jval / maxValue; if (justOneAxis && (jval <= (int)Properties.Settings.Default.gamePadAnalogMinimum)) { gamePadSendString += string.Format("{0}{1:0.000}", axis, Properties.Settings.Default.gamePadAnalogMinStep); feedRate = (float)Properties.Settings.Default.gamePadAnalogMinFeed; gamePadTimer.Interval = 200; } else { gamePadSendString += string.Format("{0}{1:0.000}", axis, stepWidth); gamePadTimer.Interval = 50; } } if (_serial_form.getFreeBuffer() >= 99) { gamePadSendString = "G91" + gamePadSendString; if (grbl.isMarlin) { gamePadSendString += ";"; } gamePadSendString += string.Format("F{0:0}", feedRate); sendCommands(gamePadSendString.Replace(",", "."), true); } } else { sendRealtimeCommand(133); // Stop jogging gamePadSendString = ""; } } } // end if datalength else { // if (datas.Length > 0) if ((gamePadSendString.Length > 0) && (_serial_form.getFreeBuffer() >= 99)) // keep sending commands if joystick is still on full speed { sendCommands(gamePadSendString.Replace(",", "."), true); } } } else { // if (ControlGamePad.gamePad == null) try { ControlGamePad.Initialize(); gamePadTimer.Interval = 50; } catch { gamePadTimer.Interval = 5000; } } } catch // ControlGamePad.gamePad failed { try { ControlGamePad.Initialize(); gamePadTimer.Interval = 50; } catch { gamePadTimer.Interval = 5000; } } }