/// <summary> /// Asynchronously reads the display name of the device. /// </summary> /// <returns> /// A task that represents the asynchronous read operation. The value of the <see cref="Task{TResult}.Result"/> /// parameter contains the name of the device. /// </returns> public async Task <string> ReadDeviceNameAsync() { var deviceName = await CommandAsync(HarpCommand.ReadByte(Registers.DeviceName)); var namePayload = deviceName.GetPayload(); var count = Array.IndexOf(namePayload.Array, (byte)0, namePayload.Offset, namePayload.Count) - namePayload.Offset; return(Encoding.ASCII.GetString(namePayload.Array, namePayload.Offset, count)); }
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()); }
/// <summary> /// Asynchronously reads the value of an 8-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 <byte> ReadByteAsync(int address) { var reply = await CommandAsync(HarpCommand.ReadByte(address)); return(reply.GetPayloadByte()); }