Exemplo n.º 1
0
        private void RefreshStatus()
        {
            CriteriaRow.ResetAll();

            // Clear the main container
            contentRow.CloseAllChildren();

            // Regen and refresh the troubleshooting criteria
            var printerNameLabel = new TextWidget(string.Format("{0}:", "Connection Troubleshooting".Localize()), 0, 0, labelFontSize)
            {
                TextColor = theme.TextColor,
                Margin    = new BorderDouble(bottom: 10)
            };

#if __ANDROID__
            IUsbSerialPort serialPort = FrostedSerialPort.LoadSerialDriver(null);

#if ANDROID7
            // Filter out the built-in 002 device and select the first item from the list
            // On the T7 Android device, there is a non-printer device always registered at usb/002/002 that must be ignored
            UsbDevice usbPrintDevice = usbManager.DeviceList.Values.Where(d => d.DeviceName != "/dev/bus/usb/002/002").FirstOrDefault();
#else
            UsbDevice usbPrintDevice = usbManager.DeviceList.Values.FirstOrDefault();
#endif

            UsbStatus usbStatus = new UsbStatus()
            {
                IsDriverLoadable   = (serialPort != null),
                HasUsbDevice       = true,
                HasUsbPermission   = false,
                AnyUsbDeviceExists = usbPrintDevice != null
            };

            if (!usbStatus.IsDriverLoadable)
            {
                usbStatus.HasUsbDevice = usbPrintDevice != null;

                if (usbStatus.HasUsbDevice)
                {
                    // TODO: Testing specifically for UsbClass.Comm seems fragile but no better alternative exists without more research
                    usbStatus.UsbDetails = new UsbDeviceDetails()
                    {
                        ProductID   = usbPrintDevice.ProductId,
                        VendorID    = usbPrintDevice.VendorId,
                        DriverClass = usbManager.DeviceList.Values.First().DeviceClass == Android.Hardware.Usb.UsbClass.Comm ? "cdcDriverType" : "ftdiDriverType"
                    };
                    usbStatus.Summary = string.Format("No USB device definition found. Click the 'Fix' button to add an override for your device ", usbStatus.UsbDetails.VendorID, usbStatus.UsbDetails.ProductID);
                }
            }

            usbStatus.HasUsbPermission = usbStatus.IsDriverLoadable && FrostedSerialPort.HasPermissionToDevice(serialPort);

            contentRow.AddChild(printerNameLabel);

            contentRow.AddChild(new CriteriaRow(
                                    "USB Connection",
                                    "Retry",
                                    "No USB device found. Check and reseat cables and try again",
                                    usbStatus.AnyUsbDeviceExists,
                                    () => UiThread.RunOnIdle(RefreshStatus),
                                    theme));

            contentRow.AddChild(new CriteriaRow(
                                    "USB Driver",
                                    "Fix",
                                    usbStatus.Summary,
                                    usbStatus.IsDriverLoadable,
                                    () =>
            {
                string overridePath         = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "usboverride.local");
                UsbDeviceDetails usbDetails = usbStatus.UsbDetails;
                File.AppendAllText(overridePath, string.Format("{0},{1},{2}\r\n", usbDetails.VendorID, usbDetails.ProductID, usbDetails.DriverClass));

                UiThread.RunOnIdle(() => RefreshStatus());
            },
                                    theme));

            contentRow.AddChild(new CriteriaRow(
                                    "USB Permission",
                                    "Request Permission",
                                    "Click the 'Request Permission' button to gain Android access rights",
                                    usbStatus.HasUsbPermission,
                                    () =>
            {
                if (checkForPermissionTimer == null)
                {
                    checkForPermissionTimer = new System.Threading.Timer((state) =>
                    {
                        if (FrostedSerialPort.HasPermissionToDevice(serialPort))
                        {
                            UiThread.RunOnIdle(this.RefreshStatus);
                            checkForPermissionTimer.Dispose();
                        }
                    }, null, 200, 200);
                }

                FrostedSerialPort.RequestPermissionToDevice(serialPort);
            },
                                    theme));
#endif
            connectToPrinterRow = new CriteriaRow(
                "Connect to Printer".Localize(),
                "Connect".Localize(),
                "Click the 'Connect' button to retry the original connection attempt".Localize(),
                false,
                () => printer.Connection.Connect(),
                theme);

            contentRow.AddChild(connectToPrinterRow);

            if (CriteriaRow.ActiveErrorItem != null)
            {
                var errorText = new FlowLayoutWidget()
                {
                    Padding = new BorderDouble(0, 15)
                };

                errorText.AddChild(
                    new TextWidget(CriteriaRow.ActiveErrorItem.ErrorText)
                {
                    TextColor = theme.PrimaryAccentColor
                });

                contentRow.AddChild(errorText);
            }
        }
		private void RefreshStatus()
		{
			CriteriaRow.ResetAll();

			// Clear the main container
			contentRow.CloseAllChildren();

			// Regen and refresh the troubleshooting criteria
			TextWidget printerNameLabel = new TextWidget(string.Format ("{0}:", "Connection Troubleshooting".Localize()), 0, 0, labelFontSize);
			printerNameLabel.TextColor = ActiveTheme.Instance.PrimaryTextColor;
			printerNameLabel.Margin = new BorderDouble(bottom: 10);

#if __ANDROID__
			IUsbSerialPort serialPort = FrostedSerialPort.LoadSerialDriver(null);

#if ANDROID7
			// Filter out the built-in 002 device and select the first item from the list
			// On the T7 Android device, there is a non-printer device always registered at usb/002/002 that must be ignored
			UsbDevice usbPrintDevice = usbManager.DeviceList.Values.Where(d => d.DeviceName != "/dev/bus/usb/002/002").FirstOrDefault();
#else
			UsbDevice usbPrintDevice = usbManager.DeviceList.Values.FirstOrDefault();
#endif

			UsbStatus usbStatus = new UsbStatus () {
				IsDriverLoadable = (serialPort != null),
				HasUsbDevice = true,
				HasUsbPermission = false,
				AnyUsbDeviceExists = usbPrintDevice != null
			};

			if (!usbStatus.IsDriverLoadable)
			{
				usbStatus.HasUsbDevice = usbPrintDevice != null;

				if (usbStatus.HasUsbDevice) {
					// TODO: Testing specifically for UsbClass.Comm seems fragile but no better alternative exists without more research
					usbStatus.UsbDetails = new UsbDeviceDetails () {
						ProductID = usbPrintDevice.ProductId,
						VendorID = usbPrintDevice.VendorId,
						DriverClass = usbManager.DeviceList.Values.First ().DeviceClass == Android.Hardware.Usb.UsbClass.Comm ? "cdcDriverType" : "ftdiDriverType"
					};
					usbStatus.Summary = string.Format ("No USB device definition found. Click the 'Fix' button to add an override for your device ", usbStatus.UsbDetails.VendorID, usbStatus.UsbDetails.ProductID);
				}
			}

			usbStatus.HasUsbPermission = usbStatus.IsDriverLoadable && FrostedSerialPort.HasPermissionToDevice(serialPort);

			contentRow.AddChild(printerNameLabel);

			contentRow.AddChild(new CriteriaRow(
				"USB Connection", 
				"Retry",
				"No USB device found. Check and reseat cables and try again",
				usbStatus.AnyUsbDeviceExists, 
				() => UiThread.RunOnIdle(RefreshStatus)));

			contentRow.AddChild(new CriteriaRow(
				"USB Driver", 
				"Fix",
				usbStatus.Summary,
				usbStatus.IsDriverLoadable, 
				() => { 
					string overridePath = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "usboverride.local");
					UsbDeviceDetails usbDetails = usbStatus.UsbDetails;
					File.AppendAllText(overridePath, string.Format("{0},{1},{2}\r\n", usbDetails.VendorID, usbDetails.ProductID, usbDetails.DriverClass));

					UiThread.RunOnIdle(() => RefreshStatus());
				}));

			contentRow.AddChild(new CriteriaRow(
				"USB Permission", 
				"Request Permission",
				"Click the 'Request Permission' button to gain Android access rights",
				usbStatus.HasUsbPermission , 
				() => { 

					if(checkForPermissionTimer == null)
					{
						checkForPermissionTimer = new System.Threading.Timer((state) => {

							if(FrostedSerialPort.HasPermissionToDevice(serialPort))
							{
								UiThread.RunOnIdle(this.RefreshStatus);
								checkForPermissionTimer.Dispose();
							}
						}, null, 200, 200);
					}

					FrostedSerialPort.RequestPermissionToDevice(serialPort);
				}));

#endif
			connectToPrinterRow = new CriteriaRow(
				"Connect to Printer",
				"Connect",
				"Click the 'Connect' button to retry the original connection attempt",
				false,
				() => PrinterConnectionAndCommunication.Instance.ConnectToActivePrinter());

			contentRow.AddChild(connectToPrinterRow);

			if (CriteriaRow.ActiveErrorItem != null) {

				FlowLayoutWidget errorText = new FlowLayoutWidget () {
					Padding = new BorderDouble (0, 15)
				};

				errorText.AddChild(new TextWidget(CriteriaRow.ActiveErrorItem.ErrorText) {
					TextColor = ActiveTheme.Instance.PrimaryAccentColor
				});

				contentRow.AddChild(errorText);
			}
		}