Пример #1
0
        //--------------------------------------------------------Misc Methods:---------------------------------------------------------------\\
        #region --Misc Methods (Public)--
        /// <summary>
        /// Starts a new Task, requests the firmware revision and starts the unlock process.
        /// </summary>
        public void Start()
        {
            Task.Run(async() =>
            {
                Logger.Info("Requesting firmware revision for Gemini unlock...");
                byte[] data = await ONEWHEEL.ReadBytesAsync(OnewheelCharacteristicsCache.CHARACTERISTIC_FIRMWARE_REVISION);
                if (data is null || data.Length < 2)
                {
                    Logger.Info("Unlock failed - Gemini firmware does not match: " + (data is null ? "null" : Utils.ByteArrayToHexString(data)));
                }
                firmwareRevision = BitConverter.ToUInt16(data, 0);

                // Get the correct unlock mechanism based on the received firmware revision:
                if (firmwareRevision < 4100) // Andromeda
                {
                    Logger.Info("Received firmware revision (" + firmwareRevision + "). No unlock required.");
                    return;
                }
                else if (firmwareRevision < 4200) // Gemini
                {
                    unlock = new DefaultGeminiUnlock();
                    Logger.Info("Received firmware revision (" + firmwareRevision + ") for default Gemini unlock.");
                }
                else  // New Gemini and Pint
                {
                    unlock = new PintGeminiUnlock();
                    Logger.Info("Received firmware revision (" + firmwareRevision + ") for Pint Gemini unlock.");
                }

                // Start the process by subscribing to the serial read characteristic:
                bool result = await ONEWHEEL.SubscribeToCharacteristicAsync(OnewheelCharacteristicsCache.CHARACTERISTIC_UART_SERIAL_READ);
                if (!result)
                {
                    Logger.Error("Failed to unlock Onewheel - subscribe to serial read failed.");
                    return;
                }

                // Send the firmware revision back to trigger the first challenge:
                await ONEWHEEL.WriteBytesAsync(OnewheelCharacteristicsCache.CHARACTERISTIC_FIRMWARE_REVISION, data);
                Logger.Debug("Sent Gemini unlock firmware revision.");
            });
        }