private void cBGPEnable_CheckedChanged(object sender, EventArgs e)
 {
     if (cBGPEnable.Checked)
     {
         try { ControlGamePad.Initialize(); }
         catch { }
     }
 }
Exemple #2
0
 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; }
     }
 }
Exemple #3
0
      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; }
          }
      }