Ejemplo n.º 1
0
 public override void SetMode(ModeCommand mode)
 {
     lock (_thread_interlock)
     {
         CommandQueue.Add(new ET232Command()
         {
             Command = CommandByte.write,
             Address = AddressByte.ModeOverride,
             Data    = ErosTek.ET232.Constants.ForceMode | (byte)mode.Mode,
             Retry   = true,
         });
         CommandQueue.Add(new ET232Command()
         {
             Command = CommandByte.write,
             Address = AddressByte.Pot_MA,
             Data    = mode.MA,
             Retry   = true,
         });
         draining_queue = true;
     }
 }
Ejemplo n.º 2
0
        public static void Poller(X.Gamepad gamepad,
                                  DeviceBase device,
                                  PanicDelegate DoPanic,
                                  List <RadioButton> controlmodeselections,
                                  NumericUpDown stick_sensitivity,
                                  NumericUpDown shoulder_sensitivity,
                                  NumericUpDown shoulder_floor,
                                  bool clear_to_send,
                                  ref bool A_button_debounce,
                                  ref bool B_button_debounce,
                                  ref bool X_button_debounce,
                                  ref bool Y_button_debounce)
        {
            if (gamepad == null)
            {
                return;
            }
            gamepad.Update();

            if (gamepad.X_down && !X_button_debounce)
            {
                X_button_debounce = true;
                DoPanic();
                return;
            }
            else
            {
                X_button_debounce = false;
            }

            RadioButton checked_input = controlmodeselections.FirstOrDefault(e => e.Checked);

            if (checked_input == null)
            {
                return;
            }

            if (gamepad.Y_down && !Y_button_debounce)
            {
                Y_button_debounce = true;
                int selidx = controlmodeselections.IndexOf(checked_input);
                selidx++;
                if (selidx >= controlmodeselections.Count)
                {
                    selidx = 0;
                }
                checked_input         = controlmodeselections[selidx];
                checked_input.Checked = true;
                return;
            }
            else if (gamepad.Y_up)
            {
                Y_button_debounce = false;
            }

            int shoulder_sensitivity_adjust = 0;

            if (gamepad.Dpad_Right_down)
            {
                shoulder_sensitivity_adjust = 1;
            }
            if (gamepad.Dpad_Left_down)
            {
                shoulder_sensitivity_adjust = -1;
            }
            if (shoulder_sensitivity_adjust != 0)
            {
                try
                {
                    shoulder_sensitivity.Value += shoulder_sensitivity_adjust;
                }
                catch (Exception) { }
            }

            int shoulder_floor_adjust = 0;

            if (gamepad.RBumper_down)
            {
                shoulder_floor_adjust = 1;
            }
            if (gamepad.LBumper_down)
            {
                shoulder_floor_adjust = -1;
            }
            if (shoulder_floor_adjust != 0)
            {
                try
                {
                    shoulder_floor.Value += shoulder_floor_adjust;
                }
                catch (Exception) { }
            }

            if (device == null || !device.IsReady || !clear_to_send)
            {
                return;
            }

            ModeCommand mode = null;

            if (gamepad.B_down && !B_button_debounce)
            {
                mode = new ModeCommand()
                {
                    Mode = (int)Intense.Mode,
                    MA   = Intense.StartingMA
                };
                B_button_debounce = true;
            }
            else if (gamepad.B_up)
            {
                B_button_debounce = false;
            }

            if (gamepad.A_down && !A_button_debounce)
            {
                mode = new ModeCommand()
                {
                    Mode = (int)Waves.Mode,
                    MA   = Waves.StartingMA
                };
                A_button_debounce = true;
            }
            else if (gamepad.A_up)
            {
                A_button_debounce = false;
            }

            if (mode != null)
            {
                device.SetMode(mode);
                return;
            }

            int           sensitivity, floor;
            LevelsCommand level = new LevelsCommand()
            {
                Mode = (ControlMode)checked_input.Tag
            };

            switch (level.Mode)
            {
            case ControlMode.remote:
                return;

            case ControlMode.absolute:
                //TODO: need to mathematically ensure this always winds up 0 <= x <= 255
                sensitivity = (int)shoulder_sensitivity.Value;
                floor       = (int)shoulder_floor.Value;
                level.A     = (int)Math.Sqrt((gamepad.LTrigger + floor) * sensitivity);
                level.B     = (int)Math.Sqrt((gamepad.RTrigger + floor) * sensitivity);
                break;

            case ControlMode.relative:
                sensitivity = (int)stick_sensitivity.Value;
                level.A     = (int)(gamepad.LStick_N.Y * sensitivity);
                level.B     = (int)(gamepad.RStick_N.Y * sensitivity);
                break;
            }
            if (gamepad.Dpad_Up_down)
            {
                level.MA = 1;
            }
            if (gamepad.Dpad_Down_down)
            {
                level.MA = -1;
            }

            device.SetLevels(level);
        }
Ejemplo n.º 3
0
 public override void SetMode(ModeCommand mode)
 {
     StateUpdatedCallback(this, (int)AddressByte.ModeOverride, mode.Mode);
     StateUpdatedCallback(this, (int)AddressByte.Pot_MA, mode.MA);
 }
Ejemplo n.º 4
0
 public abstract void SetMode(ModeCommand mode);
Ejemplo n.º 5
0
        public override void ThreadFunction()
        {
            ErrorCallback(this, "Network processing startup.", "", false);

            bool should_exit = false;

            byte[]         remote_bytes = Array.Empty <byte>();
            NetworkHeader  read_header  = null;
            Utf8JsonWriter jsonwriter;

            lock (_thread_interlock)
            {
                jsonwriter = new Utf8JsonWriter(DeviceStream);
                CommandQueue.Clear();
            }

            byte[] read_buffer = new byte[block_size];
            void DataReader()
            {
                try
                {
                    lock (_thread_interlock) DeviceStream.BeginRead(read_buffer, 0, read_buffer.Length, delegate(IAsyncResult ar)
                        {
                            try
                            {
                                lock (_thread_interlock)
                                {
                                    if (DeviceStream == null)
                                    {
                                        return;
                                    }
                                    int len = DeviceStream.EndRead(ar);
                                    int pos = remote_bytes.Length;
                                    Array.Resize(ref remote_bytes, pos + len);
                                    Buffer.BlockCopy(read_buffer, 0, remote_bytes, pos, len);
                                }
                            }
                            catch (Exception e)
                            {
                                bool exiting;
                                lock (_thread_interlock) exiting = _thread_end;
                                if (!exiting)
                                {
                                    ErrorCallback(this, "Network error.", e.Message, false);
                                }
                            }
                            DataReader();
                        }, null);
                }
                catch (Exception e)
                {
                    bool exiting;
                    lock (_thread_interlock) exiting = _thread_end;
                    if (!exiting)
                    {
                        ErrorCallback(this, "Network error.", e.Message, false);
                    }
                }
            }

            DataReader();

            while (!should_exit)
            {
                Thread.Yield();

                long consumed = 0;
                if (read_header == null)
                {
                    try
                    {
                        lock (_thread_interlock)
                        {
                            if (remote_bytes.Length > 0)
                            {
                                Utf8JsonReader jsonreader = new Utf8JsonReader(new ReadOnlySpan <byte>(remote_bytes));
                                read_header = JsonSerializer.Deserialize <NetworkHeader>(ref jsonreader);
                                consumed    = jsonreader.BytesConsumed;
                            }
                        }
                    }
                    catch (JsonException) { }
                }
                else
                {
                    CommandBase received_command = null;
                    try
                    {
                        lock (_thread_interlock)
                        {
                            if (remote_bytes.Length > 0)
                            {
                                Utf8JsonReader jsonreader = new Utf8JsonReader(new ReadOnlySpan <byte>(remote_bytes));
                                switch (read_header.ObjectType)
                                {
                                case TransmissionType.Nothing:
                                    break;

                                case TransmissionType.Ready:
                                    received_command = JsonSerializer.Deserialize <ReadyCommand>(ref jsonreader);
                                    break;

                                case TransmissionType.Panic:
                                    received_command = JsonSerializer.Deserialize <PanicCommand>(ref jsonreader);
                                    break;

                                case TransmissionType.Levels:
                                    received_command = JsonSerializer.Deserialize <LevelsCommand>(ref jsonreader);
                                    break;

                                case TransmissionType.Raw:
                                    received_command = JsonSerializer.Deserialize <RawCommand>(ref jsonreader);
                                    break;

                                case TransmissionType.Mode:
                                    received_command = JsonSerializer.Deserialize <ModeCommand>(ref jsonreader);
                                    break;

                                case TransmissionType.Response:
                                    received_command = JsonSerializer.Deserialize <DeviceResponse>(ref jsonreader);
                                    break;

                                case TransmissionType.Request:
                                    break;

                                case TransmissionType.Error:
                                    received_command = JsonSerializer.Deserialize <ErrorCommand>(ref jsonreader);
                                    break;
                                }
                                consumed = jsonreader.BytesConsumed;
                            }
                        }
                    }
                    catch (JsonException) { }

                    if (received_command != null)
                    {
                        switch (read_header.ObjectType)
                        {
                        case TransmissionType.Nothing:
                            break;

                        case TransmissionType.Ready:
                            QueueStateCallback(this, 0);
                            break;

                        case TransmissionType.Panic:
                            MassLevelSetCallback(this, 0, 0, 0, true);
                            ErrorCallback(this, "PANIC!", "Panic received from remote!", true);
                            break;

                        case TransmissionType.Levels:
                            LevelsCommand levels = (LevelsCommand)received_command;
                            LastA = levels.A;
                            LastB = levels.B;
                            MassLevelSetCallback(this, levels.A, levels.B, levels.MA, levels.Mode == ControlMode.absolute);
                            break;

                        case TransmissionType.Raw:
                            RawCommand raw = (RawCommand)received_command;
                            if (raw.Address == (int)AddressByte.Pot_A)
                            {
                                LastA = raw.Data;
                            }
                            if (raw.Address == (int)AddressByte.Pot_B)
                            {
                                LastB = raw.Data;
                            }
                            StateUpdatedCallback(this, raw.Address, raw.Data);
                            break;

                        case TransmissionType.Mode:
                            ModeCommand mode = (ModeCommand)received_command;
                            StateUpdatedCallback(this, (int)AddressByte.ModeOverride, mode.Mode);
                            StateUpdatedCallback(this, (int)AddressByte.Pot_MA, mode.MA);
                            break;

                        case TransmissionType.Request:
                            break;

                        case TransmissionType.Response:
                            DeviceResponse response = (DeviceResponse)received_command;
                            DataReturnedCallback(this, response.Address, response.Data);
                            double     current_unixtime = UnixTime.Current();
                            LevelEvent level            = new LevelEvent()
                            {
                                unixtime = current_unixtime
                            };
                            lock (_thread_interlock)
                            {
                                if (response.Address == (int)AddressByte.PulseAmp_A)
                                {
                                    level.level = (int)Math.Sqrt(LastA * response.Data);
                                    AmpHistoryA.Add(level);
                                }
                                if (response.Address == (int)AddressByte.PulseAmp_B)
                                {
                                    level.level = (int)Math.Sqrt(LastB * response.Data);
                                    AmpHistoryB.Add(level);
                                }
                            }
                            break;

                        case TransmissionType.Error:
                            ErrorCommand error = (ErrorCommand)received_command;
                            ErrorCallback(this, error.Error, error.Details, false);
                            break;
                        }
                        read_header = null;
                    }
                }

                if (consumed > 0)
                {
                    lock (_thread_interlock)
                    {
                        byte[] remaining = new byte[remote_bytes.Length - consumed];
                        Buffer.BlockCopy(remote_bytes, (int)consumed, remaining, 0, remaining.Length);
                        remote_bytes = remaining;
                    }
                }

                lock (_thread_interlock)
                {
                    if (CommandQueue.Count > 0)
                    {
                        CommandBase command = CommandQueue.First();
                        CommandQueue.RemoveAt(0);
                        NetworkHeader write_header = new NetworkHeader()
                        {
                            ObjectType = command.ObjectType
                        };
                        try
                        {
                            JsonSerializer.Serialize(jsonwriter, write_header, typeof(NetworkHeader));
                            jsonwriter.Flush();
                            jsonwriter.Reset();
                            switch (command.ObjectType)
                            {
                            case TransmissionType.Nothing:
                                break;

                            case TransmissionType.Ready:
                                JsonSerializer.Serialize(jsonwriter, (ReadyCommand)command, typeof(ReadyCommand));
                                break;

                            case TransmissionType.Panic:
                                JsonSerializer.Serialize(jsonwriter, (PanicCommand)command, typeof(PanicCommand));
                                break;

                            case TransmissionType.Levels:
                                JsonSerializer.Serialize(jsonwriter, (LevelsCommand)command, typeof(LevelsCommand));
                                break;

                            case TransmissionType.Raw:
                                JsonSerializer.Serialize(jsonwriter, (RawCommand)command, typeof(RawCommand));
                                break;

                            case TransmissionType.Mode:
                                JsonSerializer.Serialize(jsonwriter, (ModeCommand)command, typeof(ModeCommand));
                                break;

                            case TransmissionType.Request:
                                JsonSerializer.Serialize(jsonwriter, (RequestCommand)command, typeof(RequestCommand));
                                break;

                            case TransmissionType.Response:
                                JsonSerializer.Serialize(jsonwriter, (ResponseCommand)command, typeof(ResponseCommand));
                                break;

                            case TransmissionType.Error:
                                JsonSerializer.Serialize(jsonwriter, (ErrorCommand)command, typeof(ErrorCommand));
                                break;
                            }
                            jsonwriter.Flush();
                            jsonwriter.Reset();
                        }
                        catch (JsonException) { }
                        catch (IOException e) when(e.InnerException is SocketException)
                        {
                            _thread_end = true;
                            ErrorCallback(this, "Network error.", e.InnerException.Message, false);
                        }
                        catch (IOException e)
                        {
                            _thread_end = true;
                            ErrorCallback(this, "Network error.", e.Message, false);
                        }
                        catch (Exception e)
                        {
                            _thread_end = true;
                            ErrorCallback(this, "Network error.", e.Message, false);
                        }
                        if (CommandQueue.Count == 0 && command.ObjectType != TransmissionType.Ready)
                        {
                            CommandQueue.Add(new ReadyCommand());
                        }
                    }
                    should_exit = _thread_end;
                }
            }

            try
            {
                lock (_thread_interlock)
                {
                    if (DeviceStream != null)
                    {
                        DeviceStream.Close();
                        DeviceStream.Dispose();
                    }
                    DeviceStream = null;
                }
            }
            catch (Exception e)
            {
                ErrorCallback(this, "Network error.", e.Message, false);
            }

            ErrorCallback(this, "Network processing shutdown.", "", false);
        }
Ejemplo n.º 6
0
 public override void SetMode(ModeCommand mode)
 {
     lock (_thread_interlock) CommandQueue.Add(mode);
 }