private byte[] GetCommonData(MsulEmulationParametersViewModel ViewModel)
        {
            using (var ms = new MemoryStream())
            {
                var writer = new BinaryWriter(ms);

                writer.Write((Byte)1);
                writer.Write((Byte)1);
                writer.Write((Byte)ViewModel.Carriages.Count);
                writer.Write((UInt32)(ViewModel.Time - _zeroTime).TotalSeconds);
                writer.Write((UInt16)ViewModel.TrainNumber);
                writer.Write((Byte)ViewModel.Speed);
                writer.Write(EncodeTemperature(ViewModel.OutdoorTemperature));
                writer.Write((Int32)(ViewModel.Position.Longitude.Value / LatitudeFactor));
                writer.Write((Int32)(ViewModel.Position.Latitude.Value / LatitudeFactor));
                writer.Write((Int16)ViewModel.Altitude);
                writer.Write((Byte)10);
                writer.Write((Byte)((ViewModel.EmergencyStop ? 1 : 0) << 0 |
                                    (ViewModel.LeftDoorLocked ? 0 : 1) << 1 |
                                    (ViewModel.RightDoorLocked ? 0 : 1) << 2 |
                                    (ViewModel.LeftDoorOpened ? 1 : 0) << 3 |
                                    (ViewModel.RightDoorOpened ? 1 : 0) << 4 |
                                    (ViewModel.LightOn ? 1 : 0) << 5));
                writer.Write((Byte)1);
                return ms.ToArray();
            }
        }
 public IObservable<MsulMessage> EmulationSource(MsulEmulationParametersViewModel EmulationParameters)
 {
     return
         EmulationParameters.Changed
                            .Merge(EmulationParameters.Carriages.Select(cvm => cvm.Changed).Merge())
                            .Select(_ => _messageEncoder.GetMessage(EmulationParameters))
                            .StartWith(_messageEncoder.GetMessage(EmulationParameters));
 }
 public MsulMessage GetMessage(MsulEmulationParametersViewModel ViewModel)
 {
     return new MsulMessage(GetCommonData(ViewModel),
                            ViewModel.Carriages.Select(GetCarriageData).ToList());
 }