Exemplo n.º 1
0
        private async void InitSockerBot()
        {
            var hostNames    = NetworkInformation.GetHostNames();
            var computerName = hostNames.FirstOrDefault(name => name.Type == HostNameType.DomainName)?.DisplayName ?? "???";



            var pin = await LagoVista.Core.PlatformSupport.Services.Storage.GetKVPAsync <string>("PIN");

            if (String.IsNullOrEmpty(pin))
            {
                var rnd = new Random();
                pin = rnd.Next(1000, 9999).ToString();
                await LagoVista.Core.PlatformSupport.Services.Storage.StoreKVP("PIN", pin);
            }

            Debug.WriteLine("========================================");
            Debug.WriteLine("NOTE: NOTE: NOTE: Your PIN is: " + pin);
            Debug.WriteLine("========================================");

            _logger = new Loggers.DebugLogger();

            switch (AnalyticsInfo.VersionInfo.DeviceFamily)
            {
            case "Windows.IoT":
                var ports = (await LagoVista.Core.PlatformSupport.Services.DeviceManager.GetSerialPortsAsync());
                if (ports.Count == 0)
                {
                    throw new Exception("Could not find any serial ports, a serial port is required.");
                }
                else if (ports.Count > 1)
                {
                    throw new Exception("Found more than one serial port, please add additional logic to select the serial port the mBot is connected to.");
                }

                var serialPortChannel = new SerialPortChannel(ports.First().Id, _logger);
                await serialPortChannel.ConnectAsync();

                _tankBot       = new mBlockTankBot(serialPortChannel, _logger, pin);
                _sensorManager = new SensorManager();
                await _sensorManager.InitAsync();

                _sensorManager.Start();

                break;

            case "Windows.Desktop":
                _tankBot = new SimulatedSoccerBot();

                break;
            }

            ConnectionManager.Start(computerName, _tankBot, _logger, _sensorManager, Constants.WebListenerPort, Constants.TCPListenPort, Constants.UPNPListenPort);
        }
Exemplo n.º 2
0
        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;

            // setup font styling of terminal control
            terminalControl1.Font = new Font(ConfigurationManager.AppSettings["TerminalFont"], Convert.ToSingle(ConfigurationManager.AppSettings["TerminalFontSize"]), FontStyle.Bold);

            // create a new Serial port object
            _serialPort = new SerialPortChannel(_comPort, _baudRate);

            // bind the Serial port instance to the terminal console
            terminalControl1.Bind(_serialPort);

            // execute any pre-defined command
            Scripting scripting = terminalControl1.Scripting;

            scripting.Send("\r");
            if (!String.IsNullOrEmpty(_command))
            {
                scripting.Send(_command + "\r");
            }

            _initialized = true;
        }
        public static IServiceCollection AddHardware(this IServiceCollection serviceCollection)
        {
            return(serviceCollection
                   .AddCompositeDispenser((sp) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                if (kioskSettings.Dispenser.Mode == OptionUseCase.Off)
                {
                    return null;
                }

                return new CompositeDispenserBuilder()
                .AddStrategy(sp.GetRequiredService <IDispensingStrategy>())
                .AddDispensers(() =>
                               kioskSettings.Dispenser.SlaveMachines.Select(x =>
                {
                    if (x.Model.Equals("VisionEsPlus", StringComparison.InvariantCultureIgnoreCase))
                    {
                        VisionEsPlusSettings settings = new VisionEsPlusSettings
                        {
                            PortNumber = (ushort)x.Port,
                            Address = x.Address,
                            IpAddress = x.IpAddress
                        };

                        ICommunicationChannel channel = null;

                        if (kioskSettings.Dispenser.Mode != OptionUseCase.Off)
                        {
                            switch (x.Protocol)
                            {
                            case Utils.Common.Enum.CommunicationProtocol.Serial:
                                channel = new SerialPortChannel(settings.PortNumber, settings.BaudRate, settings.Timeout, settings.CommandsSendDelay);
                                break;

                            case Utils.Common.Enum.CommunicationProtocol.TCP:
                                channel = new TcpChannel(settings.IpAddress, settings.PortNumber);
                                break;

                            default:
                                break;
                            }
                        }

                        return new VisionEsPlusVendingMachine(x.Number.ToString(), new VisionEsPlus(channel, settings));
                    }
                    else
                    {
                        throw new ArgumentException("Unknown dispenser model");
                    }
                })
                               ).Build();
            })
                   .AddLayout((sp) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                if (kioskSettings.Dispenser.Mode == OptionUseCase.Off)
                {
                    return null;
                }

                ILayoutBuilder layoutBuilder = new LayoutBuilder();

                if (kioskSettings.Dispenser.SlaveMachines.Any(x => !x.Number.HasValue || x.Number == 0))
                {
                    throw new ArgumentException("Machine number is mandatory");
                }

                kioskSettings.Dispenser.SlaveMachines.ToList().ForEach(x =>
                {
                    if (x.Model.Equals("VisionEsPlus", StringComparison.InvariantCultureIgnoreCase))
                    {
                        // TODO: Refactor this stub
                        if (x.Number == 1)
                        {
                            layoutBuilder.AddMachine <VisionEspMachine, VisionEspTray, VisionEspBelt>(x.Number.Value)
                            .AddTray(11)
                            .AddBelt(2).CommitTray()
                            .AddTray(18)
                            .AddBelt(0).AddBelt(1).AddBelt(2).AddBelt(3).AddBelt(4).AddBelt(5).CommitTray().CommitMachine();
                        }

                        if (x.Number == 2)
                        {
                            layoutBuilder.AddMachine <VisionEspMachine, VisionEspTray, VisionEspBelt>(x.Number.Value)
                            .AddTray(11)
                            .AddBelt(0).AddBelt(1).AddBelt(2).AddBelt(3).AddBelt(4).CommitTray().CommitMachine();
                        }
                    }
                    else
                    {
                        throw new ArgumentException("Unknown dispenser model");
                    }
                });

                return layoutBuilder.Build();
            })
                   .AddCashPayment((sp, cs) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                IEnumerable <ICashDeviceAdapter> cashDevices = null;

                switch (kioskSettings.Cashbox.Mode)
                {
                case OptionUseCase.Emulation:
                    cashDevices = new ICashDeviceAdapter[] {
                        new MockBillAcceptor(sp.GetRequiredService <ICurrencyConverter>(), (s) => {
                            s.IssueIndex = 1;
                            s.BaseCurrency = kioskSettings.BaseCurrency;                                                                                // Stub
                            s.BillsToReceive = new Money[] { Money.Create(100, CurrencyCode.USDollar), Money.Create(500, CurrencyCode.RussianRouble) }; // Stub
                            s.BillsToGiveChange = new Money[] { Money.Create(50, CurrencyCode.RussianRouble), Money.Create(1, CurrencyCode.USDollar) }; // Stub
                        })
                    };
                    break;

                case OptionUseCase.Off:
                    cashDevices = null;
                    break;

                case OptionUseCase.On:
                    // ...
                    break;
                }

                cs.CashDevices = cashDevices;

                return cs;
            })
                   .AddEcommerce((sp, es) =>
            {
                KioskSettings kioskSettings = sp.GetRequiredService <KioskSettings>();

                foreach (var provider in kioskSettings.ECommerceSettings.PaymentProviders)
                {
                    switch (provider.Source)
                    {
                    case PaymentSource.UVS:
                        if (kioskSettings.ECommerceSettings.Mode == OptionUseCase.Emulation)
                        {
                            es.Add(new UvsMockEcommerceService(sp.GetRequiredService <ICurrencyConverter>(), (settings) => { settings.BaseCurrency = kioskSettings.BaseCurrency; }));
                        }
                        else if (kioskSettings.ECommerceSettings.Mode == OptionUseCase.On)
                        {
                            // ...
                        }
                        break;

                    default:
                        throw new ArgumentException("Invalid ecommerce source");
                    }
                }

                return es;
            })
                   .AddEventMediation((sp, broker) =>
            {
                broker.AppendProducer(sp.GetRequiredService <IPaymentProvider>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <ICashPaymentService>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <ICompositeDispenser>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <IStorageService>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <IAttendant>() as IEventProducer);
                broker.AppendProducer(sp.GetRequiredService <ISlipService>() as IEventProducer);
            })
                   .AddSingleton((sp) => new EventConsumer()
                                 .AppendWriter <IPaymentProvider>(new EventWriter <IPaymentProvider>(sp.GetRequiredService <ILogger <IPaymentProvider> >()))
                                 .AppendWriter <ICashPaymentService>(new EventWriter <ICashPaymentService>(sp.GetRequiredService <ILogger <ICashPaymentService> >()))
                                 .AppendWriter <ICompositeDispenser>(new EventWriter <ICompositeDispenser>(sp.GetRequiredService <ILogger <ICompositeDispenser> >()))
                                 .AppendWriter <IStorageService>(new EventWriter <IStorageService>(sp.GetRequiredService <ILogger <IStorageService> >()))
                                 .AppendWriter <IAttendant>(new EventWriter <IAttendant>(sp.GetRequiredService <ILogger <IAttendant> >()))
                                 .AppendWriter <ISlipService>(new EventWriter <ISlipService>(sp.GetRequiredService <ILogger <ISlipService> >()))));
        }
        void connectChannel(int retries = 20)
        {
            hasUiUpdate = true;
            Text_       = "Disconnected";
            try
            {
                string address = debugChannelAddressesCB.Text.ToUpper();
                if (OnVirtualChannelCheck != null)
                {
                    if (OnVirtualChannelCheck(address))
                    {
                        Text_ = debugChannelAddressesCB.Text;
                        connectB_ForeColor = Color.Green;
                        connectB_Text      = "Disconnect";
                        Connected?.Invoke(this, new EventArgs());
                        VirutualChannelConnected?.Invoke(address);
                        return;
                    }
                }
                if (address.Contains(".") || address == "LOCALHOST")
                {
                    Channel = new SocketChannel(address);
                }
                else
                {
                    if (!address.StartsWith("COM"))
                    {
                        address = address.Substring(address.IndexOf("(") + 1);
                        address = address.Substring(0, address.IndexOf(")"));
                    }
                    if (baudRatesCB.Text == "")
                    {
                        baudRatesCB.Text = "115200";
                    }
                    Channel                = new SerialPortChannel(address, Convert.ToInt32(baudRatesCB.Text));
                    Channel.DtrEnable      = dtrCB.Checked;
                    Channel.ReadBufferSize = 1024 * 1024 * 10;
                }
                Channel.Open();
                PortAddress = address;
                Connected?.Invoke(this, new EventArgs());
                connectB_Text = "Disconnect";

                Text_ = debugChannelAddressesCB.Text;
                connectB_ForeColor  = Color.Green;
                spPollTimer.Enabled = true;
            }
            catch (Exception ex)
            {
                if (retries > 0)
                {
                    connectB.ForeColor = Color.Orange;
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(500);
                    connectChannel(retries - 1);
                    return;
                }
                MessageBox.Show("Could not open the channel.");
                Channel            = null;
                connectB.Text      = "Connect";
                connectB.ForeColor = Color.Red;
            }
        }