Пример #1
0
        private static IHubProxy InitializeHubConnection(IReadOnlyConfiguration configuration, Action <string, int?, FunctionTypeEnum, bool, string, Action <string> > handler, out DisposalQueue toDispose, Action <string> logger)
        {
            toDispose = new DisposalQueue();

            var hubConnection = new HubConnection(configuration["Settings:WebAddress"],
                                                  new Dictionary <string, string>
            {
                {
                    configuration["Settings:SignalREngineFlagName"], true.ToString().ToLowerInvariant()
                }
            });

            hubConnection.StateChanged += change => logger($"InitializeHubConnection: StateChanged: '{change.OldState}' -> '{change.NewState}'!");

            hubConnection.JsonSerializer.Converters.Add(new NullConverter()); // handle NULLs

            var hubProxy = hubConnection.CreateHubProxy(configuration["Settings:SignalRHubName"]);

            toDispose.Enqueue(hubProxy.On <string, int?, FunctionTypeEnum, string>("sendMessage",
                                                                                   (clientID, moduleID, functionType, text)
                                                                                   => handler(clientID, moduleID, functionType, false, text, logger)));

            toDispose.Enqueue(hubProxy.On <string, int?, FunctionTypeEnum>("sendQuery",
                                                                           (clientID, moduleID, functionType)
                                                                           => handler(clientID, moduleID, functionType, true, null, logger)));

            try
            {
                hubConnection.Start().Wait();
            }
            catch (Exception e)
            {
                var message = $"InitializeHubConnection: ERROR:{Environment.NewLine}Exception '{typeof(Exception).Name}' occurred while initializing hub connection: {e.Message}.";
                if (e.InnerException != null)
                {
                    message += Environment.NewLine
                               + $"Inner exception '{e.InnerException.GetType().Name}': {e.InnerException.Message}.";
                }

                logger(message);

                toDispose = null;
                return(null);
            }

            logger($"InitializeHubConnection: Connection to hub started with ID '{hubConnection.ConnectionId}'!");

            toDispose.Enqueue(hubConnection);

            return(hubProxy);
        }
Пример #2
0
 /// <summary>
 ///     Relinquishes ownership of the lookup and adds it to the disposal queue.
 /// </summary>
 public void DisposeInBackground()
 {
     DisposalQueue.Enqueue(this);
 }
Пример #3
0
        public static int Main(string[] args)
        {
            ToConsole("Main: Initializing Serial Monitor..");

            var toDispose       = new DisposalQueue();
            var engineProcessID = FindSerialProcessID(Configuration, ToConsole);

            PiSensorNetDbContext.Initialize(Configuration.ConnectionString);

            //PiSensorNetDbContext.Logger = Console.Write;

            ToConsole("Main: Context initialized!");

            toDispose += Signal.Handle(SignalHandlers);

            Functionalities.Serial.Open();

            Functionalities.Pins.Setup(BroadcomPinNumberEnum.Gpio18, PinModeEnum.Input, PullUpModeEnum.Up);

            toDispose += Functionalities.Interrupts.SetupPolled(BroadcomPinNumberEnum.Gpio18, InterruptModeEnum.FallingEdge, SerialInterruptHandler);

            ToConsole("Main: Started!");

            while (!_doQuit)
            {
                WaitHandle.WaitOne(_readSerial == 0 ? -1 : 3);

                if (_readSerial > 0)
                {
                    --_readSerial;
                    if (ReadSerial(ReceivedMessages, Buffer, ToConsole))
                    {
                        ++_readSerial;
                        continue;
                    }

                    if (_readSerial > 0)
                    {
                        continue;
                    }
                }

                HandleReceivedMessages(engineProcessID, ReceivedMessages, Configuration, ToConsole);

                if (_pollMessagesToSend)
                {
                    _pollMessagesToSend = false;
                    PollMessagesToSend(MessagesToSend, Configuration, ToConsole);
                }

                _lastMessageSentID = SendMessage(MessagesToSend, _lastMessageSentID, Configuration, MessageBuilder, ToConsole);
            }

            ToConsole("Main: Stopping...");

            toDispose.Dispose();

            Functionalities.Interrupts.Remove(BroadcomPinNumberEnum.Gpio18);

            Functionalities.Serial.Flush();
            Functionalities.Serial.Close();

            ToConsole("Main: Stopped!");

            return(0);
        }
Пример #4
0
 private void LateUpdate()
 {
     DisposalQueue.Pulse();
 }
Пример #5
0
        public static int Main2(string[] args)
        {
            ToConsole("Main: Initializing Engine...");

            var recreate      = args.Any(i => String.Equals(i, "recreate", StringComparison.InvariantCultureIgnoreCase));
            var recreateOnly  = args.Any(i => String.Equals(i, "recreateOnly", StringComparison.InvariantCultureIgnoreCase));
            var standalone    = args.Any(i => String.Equals(i, "standalone", StringComparison.InvariantCultureIgnoreCase));
            var validateModel = args.Any(i => String.Equals(i, "validateModel", StringComparison.InvariantCultureIgnoreCase));

            standalone = standalone || recreate || recreateOnly || validateModel;

            int?serialProcessID = null;

            if (!standalone)
            {
                serialProcessID = FindSerialProcessID(Configuration, ToConsole);
            }

            var recreateDatabase = (recreate || recreateOnly) && !validateModel;

            PiSensorNetDbContext.Initialize(Configuration.ConnectionString, recreateDatabase);

            //PiSensorNetDbContext.Logger = Console.Write;

            if (validateModel)
            {
                PiSensorNetDbContext.CheckCompatibility(Configuration.ConnectionString);

                ToConsole("Main: Model validation finished, exiting!");

                return(0);
            }

            if (recreateOnly)
            {
                ToConsole("Main: Database recreated, exiting!");

                return(0);
            }

            if (!recreate && !standalone && args.Length > 0)
            {
                ToConsole($"Main: ERROR: Wrong arguments given: '{args.Join(" ")}'.");

                return(1);
            }

            ToConsole("Main: Context initialized!");

            BuildCache();

            //Demo(ModuleConfiguration, FunctionTypes, FunctionNames, FunctionHandlers, QueryableFunctionHandlers, TriggerSourceHandlers, TriggerDelegates, TriggerDependencyHandlers);
            //return 666;

            var toDispose = new DisposalQueue();
            var hubProxy  = InitializeHubConnection(Configuration, Configuration, InternalHandleMessage, ModuleAddresses, FunctionTypes, serialProcessID, toDispose, ToConsole);

            toDispose += Signal.Handle(SignalHandlers);

            var timer = new Timer(1000);

            timer.Elapsed += HandleTimerTick;

            timer.Start();

            ToConsole("Main: Started!");

            while (!_doQuit)
            {
                if (Constants.IsWindows)
                {
                    WaitHandle.WaitOne(1000);

                    using (var context = PiSensorNetDbContext.Connect(Configuration.ConnectionString))
                    {
                        _pollPackets = context.Packets
                                       .Where(i => i.State == PacketStateEnum.New)
                                       .Where(i => i.FunctionID.HasValue)
                                       .Any();

                        _pollPartialPackets = _pollPackets ||
                                              context.PartialPackets
                                              .AsNoTracking()
                                              .Where(i => i.State == PartialPacketStateEnum.New)
                                              .Any();
                    }
                }
                else
                {
                    WaitHandle.WaitOne();
                }

                if (_pollPartialPackets)
                {
                    _pollPartialPackets = false;

                    using (var context = PiSensorNetDbContext.Connect(Configuration.ConnectionString))
                    {
                        _pollPackets = MergePackets(context, Configuration, FunctionTypes, FunctionNames, ModuleAddresses, CacheModuleAddresses, ToConsole);

                        if (_pollPackets)
                        {
                            _pollPackets = false;

                            while (HandlePackets(context, Configuration, FunctionTypes, FunctionNames, FunctionHandlers, QueryableFunctionHandlers, TriggerSourceHandlers, TriggerDelegates, TriggerDependencyHandlers, serialProcessID, hubProxy, ToConsole))
                            {
                            }
                        }
                    }
                }

                HandleAbsoluteTimeTriggers(Configuration, TriggerSourceHandlers, TriggerDelegates, AbsoluteTimeTriggers, ToConsole, TriggerDependencyHandlers);
            }

            ToConsole("Main: Stopping...");

            timer.Stop();
            toDispose.Dispose();

            ToConsole("Main: Stopped!");

            return(0);
        }
Пример #6
0
        private static IHubProxy InitializeHubConnection(IReadOnlyConfiguration configuration, IpiSensorNetConfiguration moduleConfiguration, MessageHandler handler, IReadOnlyMap <string, int> moduleAddresses, IReadOnlyMap <FunctionTypeEnum, int> functionTypes, int?serialProcessID, DisposalQueue toDispose, Action <string> logger)
        {
            var hubConnection = new HubConnection(configuration["Settings:WebAddress"],
                                                  new Dictionary <string, string>
            {
                {
                    configuration["Settings:SignalREngineFlagName"], true.ToString().ToLowerInvariant()
                }
            });

            hubConnection.StateChanged += change => logger($"InitializeHubConnection: StateChanged: '{change.OldState}' -> '{change.NewState}'!");

            hubConnection.JsonSerializer.Converters.Add(new NullConverter()); // handle NULLs

            var hubProxy = hubConnection.CreateHubProxy(configuration["Settings:SignalRHubName"]);

            toDispose += hubProxy.On <string, int?, FunctionTypeEnum, string>("sendMessage",
                                                                              (clientID, moduleID, functionType, text)
                                                                              => handler(clientID, moduleID, functionType, false, text, moduleAddresses, moduleConfiguration, functionTypes, serialProcessID, hubProxy, logger));

            toDispose += hubProxy.On <string, int?, FunctionTypeEnum>("sendQuery",
                                                                      (clientID, moduleID, functionType)
                                                                      => handler(clientID, moduleID, functionType, true, null, moduleAddresses, moduleConfiguration, functionTypes, serialProcessID, hubProxy, logger));

            try
            {
                hubConnection.Start().Wait();
            }
            catch (Exception e)
            {
                logger($"InitializeHubConnection: ERROR: Exception occurred while initializing hub connection: {e.Message}.");

                return(null);
            }

            logger($"InitializeHubConnection: Connection to hub started with ID '{hubConnection.ConnectionId}'!");

            toDispose += hubConnection;

            return(hubProxy);
        }