예제 #1
0
        public static R7GenericDeviceParameter ToR7(this int parameter)
        {
#if ANDROID
            return(R7GenericDeviceParameter.Values().SingleOrDefault(x => x.Ordinal() == parameter));
#elif IOS
            return((R7GenericDeviceParameter)parameter);
#endif
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private Task <bool> WaitForParameterChanged(R7GenericDeviceParameter parameter, int value, bool throwOnError = false)
        {
            return(Task.Run(() =>
            {
                try
                {
                    var current = ConnectedDevice.Parameters.SingleOrDefault(x => x.Id == parameter.FromR7());

                    if (current == null)
                    {
                        throw new Exception();
                    }

                    //if (Convert.ToInt32(current.CachedValue) == value)
                    //return true;

                    AutoResetEvent r = new AutoResetEvent(false);

                    EventHandler <ParameterChangedEventArgs> handler = (s, e) =>
                    {
                        if (e.Parameter.Id.ToR7().EnumToInt() == parameter.EnumToInt())
                        {
                            r.Set();
                        }
                    };

                    try
                    {
                        ConnectedDevice.ParameterChanged += handler;
                        r.WaitOne(TimeSpan.FromSeconds(10));

                        var @new = ConnectedDevice.Parameters.SingleOrDefault(x => x.Id == parameter.FromR7());

                        if (Convert.ToInt32(@new.CachedValue) != value)
                        {
                            throw new Exception();
                        }

                        return true;
                    }
                    finally
                    {
                        ConnectedDevice.ParameterChanged -= handler;
                    }
                }
                catch (Exception e)
                {
                    if (throwOnError)
                    {
                        throw e;
                    }

                    return false;
                }
            }));
        }
예제 #3
0
        public static R7GenericDeviceParameter ToR7(this Parameter parameter)
        {
            try
            {
#if ANDROID
                return(R7GenericDeviceParameter.Values().SingleOrDefault(x => x.Ordinal() == (int)parameter));
#elif IOS
                return((R7GenericDeviceParameter)Enum.Parse(typeof(R7GenericDeviceParameter), parameter.ToString()));
#endif
            }
            catch (Exception e)
            {
                Debugger.Break();
                throw;
            }
        }
예제 #4
0
        public static Parameter FromR7(this R7GenericDeviceParameter parameter)
        {
            try
            {
#if ANDROID
                if (!Enum.IsDefined(typeof(Parameter), (int)parameter.Ordinal()))
                {
                    throw new Exception($"Specified value {parameter.Ordinal()} not defined in enum `{nameof(Parameter)}`");
                }

                return((Parameter)(int)parameter.Ordinal());
#elif IOS
                return((Parameter)Enum.Parse(typeof(Parameter), parameter.ToString(), ignoreCase: true));
#endif
            }
            catch (Exception e)
            {
                ///Не нашелся параметр в "нашем" энаме
                throw;
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        private Task <bool> WaitForParameterAny(R7GenericDeviceParameter parameter, bool throwOnError = false)
        {
            return(Task.Run(() =>
            {
                try
                {
                    var current = comms.CurrentDevice.ParameterForIdentifier(parameter.EnumToInt())?.CachedValue;


                    if (current != 999 &&
                        current != 255
#if ANDROID
                        && current != -1
#endif
                        )
                    {
                        return true;
                    }

                    AutoResetEvent r = new AutoResetEvent(false);

                    EventHandler <ParameterChangedEventArgs> handler = (s, e) =>
                    {
                        if (e.Parameter.Id.ToR7().EnumToInt() == parameter.EnumToInt())
                        {
                            r.Set();
                        }
                    };

                    EventHandler <DeviceParameter> handler1 = (s, e) =>
                    {
                        if (e.Identifier.ToR7().EnumToInt() == parameter.EnumToInt())
                        {
                            r.Set();
                        }
                    };

                    EventHandler <LockStatusUpdatedEventArgs> handler2 = (s, e) =>
                    {
                        if (e.New != LockState.Unlocked)
                        {
                            r.Set();
                        }
                    };

                    try
                    {
                        __DeviceParameterUpdated += handler1;
                        ConnectedDevice.ParameterChanged += handler;
                        ConnectedDevice.DeviceLockStatusUpdated += handler2;
                        r.WaitOne(TimeSpan.FromSeconds(10));

                        var @new = comms.CurrentDevice.ParameterForIdentifier(parameter.EnumToInt())?.CachedValue;

                        if (@new == 999 ||
                            @new == 255
#if ANDROID
                            || @new == -1
#endif
                            )
                        {
                            if (device.LockStatus == LockState.Locked)
                            {
                                throw new DeviceIsLockedException();
                            }

                            throw new Exception();
                        }


                        return true;
                    }
                    finally
                    {
                        __DeviceParameterUpdated -= handler1;
                        ConnectedDevice.ParameterChanged -= handler;
                        ConnectedDevice.DeviceLockStatusUpdated -= handler2;
                    }
                }
                catch (Exception e)
                {
                    if (throwOnError)
                    {
                        throw e;
                    }

                    return false;
                }
            }));
        }