Пример #1
0
        //--------------------------------------------------------Constructor:----------------------------------------------------------------\\
        #region --Constructors--


        #endregion
        //--------------------------------------------------------Set-, Get- Methods:---------------------------------------------------------\\
        #region --Set-, Get- Methods--


        #endregion
        //--------------------------------------------------------Misc Methods:---------------------------------------------------------------\\
        #region --Misc Methods (Public)--
        public override async Task CalcAndSendResponseAsync(List <byte> serialReadCache, OnewheelBoard onewheel)
        {
            byte[] challenge = serialReadCache.ToArray();
            byte[] response  = CalcResponse(challenge);

            await onewheel.WriteBytesAsync(OnewheelCharacteristicsCache.CHARACTERISTIC_UART_SERIAL_WRITE, response);

            Logger.Info("Sent Gemini unlock response to Onewheel challenge.");
        }
Пример #2
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.");
            });
        }
Пример #3
0
        private async Task UpdateLightLevelAsync()
        {
            OnewheelBoard board = OnewheelConnectionHelper.INSTANCE.GetOnewheel();

            if (board is null)
            {
                return;
            }

            try
            {
                byte[] data = { WhiteValue, RedValue };
                await board.WriteBytesAsync(Uuid, data);

                Logger.Info("Updated " + Description + " to " + WhiteValue + " and " + RedValue);
            }
            catch (Exception e)
            {
                Logger.Error("Failed to update light level!", e);
            }
        }