/// <summary> /// Initializes a new instance of the <see cref="MainWindow"/> class. /// </summary> public MainWindow() : base(Gtk.WindowType.Toplevel) { Build(); cmdManager = new DestijlCommandManager(OnCommandReceivedEvent); // Init of image widget imageWidget = new ImageWidget(drawingAreaCamera); // Customize controls AdjustControls(); }
/// <summary> /// Initializes a new instance of the <see cref="MainWindow"/> class. /// </summary> public MainWindow() : base(Gtk.WindowType.Toplevel) { Build(); cmdManager = new DestijlCommandManager(OnCommandReceivedEvent); // Init of image widget imageWidget = new ImageWidget(drawingAreaCamera); // create new timer for battery request, every 10s batteryTimer = new System.Timers.Timer(10000.0); batteryTimer.Elapsed += OnBatteryTimerElapsed; // Customize controls AdjustControls(); }
/// <summary> /// Callback called when new message is received from server /// </summary> /// <param name="header">Header of message</param> /// <param name="data">Data of message</param> public void OnCommandReceivedEvent(string header, string data) { if (header == null) { // we have lost server ChangeState(SystemState.NotConnected); Gtk.Application.Invoke(delegate { MessagePopup(MessageType.Error, ButtonsType.Ok, "Server lost", "Server is down: disconnecting"); cmdManager.Close(); }); } // if we have received a valid message if (header != null) { #if DEBUG // print message content if (header.Length > 4) { Console.WriteLine("Bad header(" + header.Length + ")"); } #endif // Depending on message received (based on header), launch correponding action header = header.ToUpper(); switch (header) { case DestijlCommandList.ANSWER_TIMEOUT: case DestijlCommandList.ANSWER_COM_ERROR: Console.WriteLine("Communication lost with robot"); Gtk.Application.Invoke(delegate { MessagePopup(MessageType.Error, ButtonsType.Ok, "Robot lost", "Communication with robot lost !"); }); ChangeState(SystemState.ServerConnected); break; case DestijlCommandList.ROBOT_BATTERY_LEVEL: string batLevel = ""; switch (data[0]) { case '2': batLevel = "High"; break; case '1': batLevel = "Low"; break; case '0': batLevel = "Empty"; break; default: batLevel = "Invalid value"; break; } Gtk.Application.Invoke(delegate { labelBatteryLevel.Text = batLevel; }); break; case DestijlCommandList.CAMERA_IMAGE: imageReceivedCounter++; byte[] image = new byte[2]; try { image = Convert.FromBase64String(data); } catch (FormatException) { badImageReceivedCounter++; Console.WriteLine("Unable to convert from base64 "); } try { imageWidget.ShowImage(image); } catch (GLib.GException) { badImageReceivedCounter++; #if DEBUG Console.WriteLine("Bad Image: " + badImageReceivedCounter + " / " + imageReceivedCounter + " (" + badImageReceivedCounter * 100 / imageReceivedCounter + "%)"); #endif } break; case DestijlCommandList.CAMERA_POSITION: imageWidget.Position = DestijlCommandManager.DecodePosition(data); break; default: Console.WriteLine("Untreated message from supervisor: " + header + ": " + data); break; } } }