public MachinaBridgeWindow() { InitializeComponent(); dc = new BoundContent(this); DataContext = dc; uiContext = SynchronizationContext.Current; _maxLogLevel = Machina.LogLevel.VERBOSE; Logger.CustomLogging += Logger_CustomLogging; Logger.Info("Machina Bridge: " + Version + "; Core: " + Robot.Version); InitializeWebSocketServer(); // Handle pasting text on the input DataObject.AddPastingHandler(InputBlock, InputBlock_Paste); #if DEBUG var item = combo_LogLevel.Items.GetItemAt(5) as ComboBoxItem; item.IsSelected = true; #endif }
protected override void OnOpen() { //base.OnOpen(); //Console.WriteLine(" BRIDGE: opening bridge"); _clientName = Context.QueryString["name"]; _parent._connectedClients.Add(_clientName); //_parent.UpdateClientBox(); _parent.uiContext.Post(x => { _parent.UpdateClientBox(); }, null); Logger.Info("Client \"" + _clientName + "\" connected..."); }
private bool InitializeWebSocketServer() { if (!ParseWebSocketURL()) { Logger.Error("Invalid WebSocket URL \"" + txtbox_WSServerURL.Text + "\"; try something like \"ws://127.0.0.1/Bridge\""); return(false); } if (wssv != null && wssv.IsListening) { StopWebSocketServer(); } wssv = new WebSocketServer(wssvURL); wssv.AddWebSocketService(wssvBehavior, () => new BridgeBehavior(bot, this)); // @TODO: add a check here if the port is in use, and try a different port instead try { wssv.Start(); } catch { Logger.Error("Default websocket server is not available, please enter a new one manually..."); return(false); } if (wssv.IsListening) { //Machina.Logger.Info($"Listening on port {wssv.Port}, and providing WebSocket services:"); //foreach (var path in wssv.WebSocketServices.Paths) Machina.Logger.Info($"- {path}"); Logger.Info("Waiting for incoming connections on " + (wssvURL + wssvBehavior)); } return(true); //lbl_ServerURL.Content = wssvURL + wssvBehavior; }
internal void DownloadDrivers() { Logger.Info("Downloading Machina Drivers for " + _robotBrand + " robot on " + txtbox_IP.Text + ":" + txtbox_Port.Text); // Create a fake robot not to interfere with the main one Robot driverBot = Robot.Create(_robotName, _robotBrand); driverBot.ControlMode(ControlType.Online); var parameters = new Dictionary <string, string>() { { "HOSTNAME", txtbox_IP.Text }, { "PORT", txtbox_Port.Text } }; var files = driverBot.GetDeviceDriverModules(parameters); // Clear temp folder string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "machina_modules"); //https://stackoverflow.com/a/1288747/1934487 System.IO.DirectoryInfo di = new DirectoryInfo(path); if (di.Exists) { Logger.Debug("Clearing " + path); foreach (FileInfo file in di.GetFiles()) { Logger.Debug("Deleting " + file.FullName); file.Delete(); } foreach (DirectoryInfo dir in di.GetDirectories()) { Logger.Debug("Deleting " + dir.FullName); dir.Delete(true); } } else { di.Create(); Logger.Debug("Created " + path); } // Save temp files foreach (var pair in files) { string filename = pair.Key; string content = pair.Value; string filepath = System.IO.Path.Combine(path, filename); try { System.IO.File.WriteAllText(filepath, content, Encoding.ASCII); } catch { Logger.Error("Could not save " + filename + " to " + filepath); Logger.Error("Could not download drivers"); return; } Logger.Debug("Saved module to " + filepath); } // Zip the file string zipPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "machina_modules.zip"); System.IO.FileInfo fi = new FileInfo(zipPath); if (fi.Exists) { fi.Delete(); Logger.Debug("Deleted previous " + zipPath); } ZipFile.CreateFromDirectory(path, zipPath); Logger.Debug("Zipped files to " + zipPath); // Prompt file save dialog: https://www.wpf-tutorial.com/dialogs/the-savefiledialog/ SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Zip file (*.zip)|*.zip"; saveFileDialog.DefaultExt = "zip"; saveFileDialog.AddExtension = true; saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); saveFileDialog.FileName = "machina_modules.zip"; if (saveFileDialog.ShowDialog() == true) { fi = new FileInfo(saveFileDialog.FileName); if (fi.Exists) { fi.Delete(); Logger.Debug("Deleted previous " + saveFileDialog.FileName); } File.Copy(zipPath, saveFileDialog.FileName); Logger.Debug("Copied " + zipPath + " to " + saveFileDialog.FileName); Logger.Info("Drivers saved to " + saveFileDialog.FileName); } }
/// <summary> /// Initialize WebSocket communication infrastructure /// </summary> /// <returns></returns> private bool InitializeWebSocketServer() { // Close previous instances, if applicable if (wssv != null && wssv.IsListening) { StopWebSocketServer(); } if (wscl != null && wscl.IsAlive) { StopWebSocketClient(); } wsURL = txtbox_WSServerURL.Text; _authkey = psswrdbox_Key.Password; // Check if given URL is a valid Machina Server try { Logger.Verbose("Trying connection to Machina Server on " + wsURL); // Add relevant auth info as query parameters string fullURL = $"{wsURL}?name={_robotName}&client=machina-bridge&authkey={_authkey}"; // Establish connection wscl = new WebSocket(fullURL); wscl.OnOpen += Wscl_OnOpen; wscl.OnMessage += Wscl_OnMessage; wscl.OnClose += Wscl_OnClose; wscl.OnError += Wscl_OnError; wscl.Connect(); //wscl.Send("hello from Bridge"); if (wscl.IsAlive) { Logger.Info("Successful connection to Machina Remote Server on " + wsURL); } else { throw new Exception(); } } catch { Logger.Verbose("Could not connect to existing Machina Server, initializing locally..."); // Check validity of URL if (!ParseWebSocketURL()) { Logger.Error("Invalid WebSocket URL \"" + txtbox_WSServerURL.Text + "\"; try something like \"ws://127.0.0.1/Bridge\""); return(false); } wssv = new WebSocketServer(wsURL); wssv.AddWebSocketService(wssvBehavior, () => new WSServerBehavior(bot, this)); // @TODO: add a check here if the port is in use, and try a different port instead try { wssv.Start(); } catch { Logger.Error("Default websocket server is not available, please enter a new one manually..."); return(false); } if (wssv.IsListening) { //Machina.Logger.Info($"Listening on port {wssv.Port}, and providing WebSocket services:"); //foreach (var path in wssv.WebSocketServices.Paths) Machina.Logger.Info($"- {path}"); Logger.Verbose("Successful initialization of Machina Local Server on " + wsURL); Logger.Info("Waiting for incoming connections on Machina Local Server " + (wsURL + wssvBehavior)); } } return(true); //lbl_ServerURL.Content = wssvURL + wssvBehavior; }