Esempio n. 1
0
        static IObservable <string> GetDeviceName(string portName, LedState ledState, LedState visualIndicators, EnableType heartbeat)
        {
            return(Observable.Create <string>(observer =>
            {
                var transport = default(SerialTransport);
                var writeOpCtrl = HarpCommand.OperationControl(DeviceState.Standby, ledState, visualIndicators, heartbeat, EnableType.Enable, false);
                var cmdReadWhoAmI = HarpCommand.ReadUInt16(Registers.WhoAmI);
                var cmdReadMajorHardwareVersion = HarpCommand.ReadByte(Registers.HardwareVersionHigh);
                var cmdReadMinorHardwareVersion = HarpCommand.ReadByte(Registers.HardwareVersionLow);
                var cmdReadMajorFirmwareVersion = HarpCommand.ReadByte(Registers.FirmwareVersionHigh);
                var cmdReadMinorFirmwareVersion = HarpCommand.ReadByte(Registers.FirmwareVersionLow);
                var cmdReadTimestampSeconds = HarpCommand.ReadUInt32(Registers.TimestampSecond);
                var cmdReadDeviceName = HarpCommand.ReadByte(Registers.DeviceName);
                var cmdReadSerialNumber = HarpCommand.ReadUInt16(Registers.SerialNumber);

                var whoAmI = 0;
                var timestamp = 0u;
                var hardwareVersionHigh = 0;
                var hardwareVersionLow = 0;
                var firmwareVersionHigh = 0;
                var firmwareVersionLow = 0;
                var serialNumber = default(ushort?);
                var messageObserver = Observer.Create <HarpMessage>(
                    message =>
                {
                    switch (message.Address)
                    {
                    case Registers.OperationControl:
                        transport.Write(cmdReadWhoAmI);
                        transport.Write(cmdReadMajorHardwareVersion);
                        transport.Write(cmdReadMinorHardwareVersion);
                        transport.Write(cmdReadMajorFirmwareVersion);
                        transport.Write(cmdReadMinorFirmwareVersion);
                        transport.Write(cmdReadTimestampSeconds);
                        transport.Write(cmdReadSerialNumber);
                        transport.Write(cmdReadDeviceName);
                        break;

                    case Registers.WhoAmI: whoAmI = message.GetPayloadUInt16(); break;

                    case Registers.HardwareVersionHigh: hardwareVersionHigh = message.GetPayloadByte(); break;

                    case Registers.HardwareVersionLow: hardwareVersionLow = message.GetPayloadByte(); break;

                    case Registers.FirmwareVersionHigh: firmwareVersionHigh = message.GetPayloadByte(); break;

                    case Registers.FirmwareVersionLow: firmwareVersionLow = message.GetPayloadByte(); break;

                    case Registers.TimestampSecond: timestamp = message.GetPayloadUInt32(); break;

                    case Registers.SerialNumber: if (!message.Error)
                        {
                            serialNumber = message.GetPayloadUInt16();
                        }
                        break;

                    case Registers.DeviceName:
                        var deviceName = nameof(Device);
                        if (!message.Error)
                        {
                            var namePayload = message.GetPayload();
                            deviceName = Encoding.ASCII.GetString(namePayload.Array, namePayload.Offset, namePayload.Count);
                        }
                        Console.WriteLine("Serial Harp device.");
                        if (!serialNumber.HasValue)
                        {
                            Console.WriteLine($"WhoAmI: {whoAmI}");
                        }
                        else
                        {
                            Console.WriteLine($"WhoAmI: {whoAmI}-{serialNumber:x4}");
                        }
                        Console.WriteLine($"Hw: {hardwareVersionHigh}.{hardwareVersionLow}");
                        Console.WriteLine($"Fw: {firmwareVersionHigh}.{firmwareVersionLow}");
                        Console.WriteLine($"Timestamp (s): {timestamp}");
                        Console.WriteLine($"DeviceName: {deviceName}");
                        Console.WriteLine();
                        observer.OnNext(deviceName);
                        observer.OnCompleted();
                        break;

                    default:
                        break;
                    }
                },
                    observer.OnError,
                    observer.OnCompleted);
                transport = new SerialTransport(portName, messageObserver);
                transport.IgnoreErrors = true;
                transport.Open();

                transport.Write(writeOpCtrl);
                return transport;
            }).Timeout(TimeSpan.FromMilliseconds(500))
                   .OnErrorResumeNext(Observable.Return(nameof(Device)))
                   .SubscribeOn(Scheduler.Default)
                   .FirstAsync());
        }
Esempio n. 2
0
        /// <summary>
        /// Asynchronously reads the value of a 16-bit unsigned integer register with
        /// the specified address.
        /// </summary>
        /// <param name="address">The address of the register to read.</param>
        /// <returns>
        /// A task that represents the asynchronous read operation. The value of the <see cref="Task{TResult}.Result"/>
        /// parameter contains the value of the register.
        /// </returns>
        public async Task <ushort> ReadUInt16Async(int address)
        {
            var reply = await CommandAsync(HarpCommand.ReadUInt16(address));

            return(reply.GetPayloadUInt16());
        }