public static void Register(BluetoothWT32 wt32) { if (client != null) { throw new Exception("InternalCommunications already registered."); } client = wt32; var wt32Parser = new MessageParser(); wt32Parser.MessageReceived += m => { if (m is InternalMessage) { ProcessInternalMessage((InternalMessage)m); } else { Manager.EnqueueMessage(m); } }; wt32.BTCommandReceived += (s, l, c) => { if (l == wt32.SPPLink) { try { wt32Parser.Parse(c); } catch (Exception ex) { Logger.Error(ex, "iBus from WT32", "BT <"); } } }; Manager.AfterMessageReceived += (m) => { if (HasConnection) { try { wt32.SendCommand(m.Message.Packet, wt32.SPPLink, "iBus data"); } catch (Exception ex) { Logger.Error(ex, "iBus to WT32", "> BT"); } } }; }
static void Init() { LED = new OutputPort(Pin.LED, false); #region Settings var sd = GetRootDirectory(); var settings = Settings.Init(sd != null ? sd + @"\imBMW.ini" : null); var log = settings.Log || settings.LogToSD; Localization.SetCurrent(settings.Language); Features.Comfort.AutoLockDoors = settings.AutoLockDoors; Features.Comfort.AutoUnlockDoors = settings.AutoUnlockDoors; Features.Comfort.AutoCloseWindows = settings.AutoCloseWindows; Features.Comfort.AutoCloseSunroof = settings.AutoCloseSunroof; Logger.Info("Preferences inited"); #if DEBUG log = true; #else // already inited in debug mode if (settings.Log) { Logger.Logged += Logger_Logged; Logger.Info("Logger inited"); } #endif if (settings.LogToSD && sd != null) { FileLogger.Init(sd + @"\Logs", () => { VolumeInfo.GetVolumes()[0].FlushAll(); }); } Logger.Info(version); SettingsScreen.Instance.Status = version.Length > 11 ? version.Replace(" ", "") : version; #endregion #region iBus Manager // Create serial port to work with Melexis TH3122 //ISerialPort iBusPort = new SerialPortEcho(); ISerialPort iBusPort = new SerialPortTH3122(Serial.COM3, Pin.TH3122SENSTA, true); Logger.Info("TH3122 serial port inited"); /*InputPort jumper = new InputPort((Cpu.Pin)FEZ_Pin.Digital.An7, false, Port.ResistorMode.PullUp); if (!jumper.Read()) { Logger.Info("Jumper installed. Starting virtual COM port"); // Init hub between iBus port and virtual USB COM port ISerialPort cdc = new SerialPortCDC(USBClientController.StandardDevices.StartCDC_WithDebugging(), 0, iBus.Message.PacketLengthMax); iBusPort = new SerialPortHub(iBusPort, cdc); Logger.Info("Serial port hub started"); }*/ iBus.Manager.Init(iBusPort); Logger.Info("iBus manager inited"); #endregion #region iBus IO logging Message sent1 = null, sent2 = null; // light "buffer" for last 2 messages bool isSent1 = false; iBus.Manager.BeforeMessageReceived += (e) => { LED.Write(Busy(true, 1)); }; iBus.Manager.AfterMessageReceived += (e) => { LED.Write(Busy(false, 1)); if (!log) { return; } // Show only messages which are described if (e.Message.Describe() == null) { return; } // Filter CDC emulator messages echoed by iBus //if (e.Message.SourceDevice == iBus.DeviceAddress.CDChanger) { return; } if (e.Message.SourceDevice != DeviceAddress.Radio && e.Message.DestinationDevice != DeviceAddress.Radio && e.Message.SourceDevice != DeviceAddress.GraphicsNavigationDriver && e.Message.SourceDevice != DeviceAddress.Diagnostic && e.Message.DestinationDevice != DeviceAddress.Diagnostic) { //return; } var logIco = "< "; if (e.Message.ReceiverDescription == null) { if (sent1 != null && sent1.Data.Compare(e.Message.Data)) { e.Message.ReceiverDescription = sent1.ReceiverDescription; logIco = "<E"; } else if (sent2 != null && sent2.Data.Compare(e.Message.Data)) { e.Message.ReceiverDescription = sent2.ReceiverDescription; logIco = "<E"; } } if (settings.LogMessageToASCII) { Logger.Info(e.Message.ToPrettyString(true, true), logIco); } else { Logger.Info(e.Message, logIco); } /*if (e.Message.ReceiverDescription == null) { Logger.Info(ASCIIEncoding.GetString(e.Message.Data)); }*/ //Logger.Info(e.Message.PacketDump); }; iBus.Manager.BeforeMessageSent += (e) => { LED.Write(Busy(true, 2)); }; iBus.Manager.AfterMessageSent += (e) => { LED.Write(Busy(false, 2)); if (!log) { return; } Logger.Info(e.Message, " >"); if (isSent1) { sent1 = e.Message; } else { sent2 = e.Message; } isSent1 = !isSent1; }; Logger.Info("iBus manager events subscribed"); #endregion #region Set iPod or Bluetooth as AUX or CDC-emulator for Bordmonitor or Radio // //Bordmonitor.ReplyToScreenUpdates = true; //settings.MenuMode = MenuMode.RadioCDC; //settings.MediaShield = "WT32"; //settings.BluetoothPin = "1111"; // BluetoothWT32 wt32; if (settings.MediaShield == "WT32") { wt32 = new BluetoothWT32(Serial.COM2, Settings.Instance.BluetoothPin); player = wt32; InternalCommunications.Register(wt32); byte gain = 0; Button.OnPress(Pin.Di14, () => wt32.SetMicGain((byte)(++gain % 16))); } else { player = new BluetoothOVC3860(Serial.COM2, sd != null ? sd + @"\contacts.vcf" : null); //player = new iPodViaHeadset(Pin.PC2); } // //player.IsCurrentPlayer = true; //player.PlayerHostState = PlayerHostState.On; // MediaEmulator emulator; if (settings.MenuMode != Tools.MenuMode.RadioCDC || Manager.FindDevice(DeviceAddress.OnBoardMonitor)) { if (player is BluetoothWT32) { ((BluetoothWT32)player).NowPlayingTagsSeparatedRows = true; } if (settings.MenuMode == Tools.MenuMode.BordmonitorCDC) { emulator = new CDChanger(player); if (settings.NaviVersion == NaviVersion.MK2) { Localization.Current = new RadioLocalization(); SettingsScreen.Instance.CanChangeLanguage = false; } } else { emulator = new BordmonitorAUX(player); } Bordmonitor.NaviVersion = settings.NaviVersion; BordmonitorMenu.FastMenuDrawing = settings.NaviVersion == NaviVersion.MK4; //MenuScreen.MaxItemsCount = 6; BordmonitorMenu.Init(emulator); Logger.Info("Bordmonitor menu inited"); } else { Localization.Current = new RadioLocalization(); SettingsScreen.Instance.CanChangeLanguage = false; MultiFunctionSteeringWheel.EmulatePhone = true; Radio.HasMID = Manager.FindDevice(DeviceAddress.MultiInfoDisplay); var menu = RadioMenu.Init(new CDChanger(player)); menu.TelephoneModeForNavigation = settings.MenuMFLControl; Logger.Info("Radio menu inited" + (Radio.HasMID ? " with MID" : "")); } ShieldLED = new OutputPort(Pin.Di10, false); player.IsPlayingChanged += (p, s) => { ShieldLED.Write(s); RefreshLEDs(); }; player.StatusChanged += (p, s, e) => { if (e == PlayerEvent.IncomingCall && !p.IsEnabled) { InstrumentClusterElectronics.Gong1(); } }; Logger.Info("Player events subscribed"); #endregion /*blinkerTimer = new Timer((s) => { if (InstrumentClusterElectronics.CurrentIgnitionState == IgnitionState.Off && !blinkerOn) { return; } blinkerOn = !blinkerOn; RefreshLEDs(); }, null, 0, 3000);*/ RefreshLEDs(); // //var ign = new Message(DeviceAddress.InstrumentClusterElectronics, DeviceAddress.GlobalBroadcastAddress, "Ignition ACC", 0x11, 0x01); //Manager.EnqueueMessage(ign); //Manager.AddMessageReceiverForDestinationDevice(DeviceAddress.InstrumentClusterElectronics, m => //{ // if (m.Data.Compare(0x10)) // { // Manager.EnqueueMessage(ign); // } //}); //var b = Manager.FindDevice(DeviceAddress.Radio); // LED.Write(true); Thread.Sleep(50); LED.Write(false); Logger.Info("LED blinked - inited"); }