Beispiel #1
0
        private async void Run()
        {
            Console.WriteLine("Client Start");

            var connection = new SignalRConnection();

            IClientLogger myLogger          = new ClientConsoleLogger();
            var           connectionOptions = new ConnectionOptions("http://127.0.0.1:15117/signalr", myLogger);
            await connection.Connect(connectionOptions);

            var requestReceiver = new RequestReceiver(connection);
            var requestExecutor = new RequestExecutor(connection);

            do
            {
                var response = await requestReceiver.ReadAsync <TestResponse>(new TestRequest { Test = "Hello Server!" });

                requestExecutor.Execute(new MyRequest {
                    Hessage = "Hello Server with responseless request"
                });
                Console.WriteLine(response.Text);
            } while (true);

            Console.WriteLine("Client End");
        }
        public IActionResult RemoveConnection([FromBody] SignalRConnection con)
        {
            var result = _signalrSev.RemoveConnections(con);

            if (result > 0)
            {
                return(Ok(new { Status = "Success" }));
            }
            return(Ok(new { Status = "Failed" }));
        }
        public IActionResult AddNewConnection([FromBody] SignalRConnection con)
        {
            var result = _signalrSev.AddNewConnections(con);

            if (!string.IsNullOrEmpty(result))
            {
                return(Ok(new { Status = "Success" }));
            }
            return(Ok(new { Status = "Failed" }));
        }
Beispiel #4
0
        public void SendMediaState(MediaStateMessage message = null)
        {
            var mediaState = message ?? new MediaStateMessage
            {
                SongId = this.CurrentMedia?.Id,
                State  = (PlayState)(int)_windowsMediaPlayer.playState
            };

            SignalRConnection.Notify(new Message <MediaStateMessage>(mediaState, MessageType.MediaStateMessage));
        }
        private async Task SignalRConnection_Closed(Exception arg)
        {
            Log.Information("SignalR connection is closed");
            await SignalRConnection.StopAsync();

            // unsubscribe so we don't have many many concurrent subscriptions to the same event for each
            // time we try to subscribe in TryOpenSignalRConnection()
            SignalRConnection.Closed -= SignalRConnection_Closed;

            OpenSignalRConnection();
        }
 private async Task OutputMessage(string message)
 {
     try
     {
         await SignalRConnection.InvokeAsync("Broadcast", Identifier, message);
     }
     catch (Exception ex)
     {
         Log.Error(String.Format("Failed sending message to SignalR Hub: {0}", ex.Message));
     }
 }
        private async Task TryOpenSignalRConnection()
        {
            Log.Information("Starting SignalR connection ...");

            // this will throw an exception if it doesn't work and will be picked up by Polly's single exception type - Policy.Handle<Exception>()
            await SignalRConnection.StartAsync();

            // subscribe to the closed event
            SignalRConnection.Closed += SignalRConnection_Closed;

            Log.Information("SignalR connection established!");
        }
Beispiel #8
0
        private void NotifyAll(object sender, System.Timers.ElapsedEventArgs e)
        {
            lock (waiters)
            {
                if (waiters.Count == 0)
                {
                    return;
                }

                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var session in sessions)
                {
                    var dsession = session as IDictionary <string, object>;
                    if (!dsession.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var filtered = StructureGraph.Instance.Filter(waiters, Guid.Parse((string)session.userId));

                    if (filtered.Any())
                    {
                        dynamic notifyMsg = Helper.BuildMessage("ListUpdate");
                        Dictionary <Guid, int> filteredWhithState = new Dictionary <Guid, int>();
                        foreach (var id in filtered)
                        {
                            if (waitersState.ContainsKey(id))
                            {
                                filteredWhithState.Add(id, waitersState[id]);
                            }
                        }
                        notifyMsg.body.ids          = filtered.ToArray();
                        notifyMsg.body.idswithstate = filteredWhithState.ToArray();
                        //log.Debug(string.Format("уведомление по {0} объектам для сессии {1}", filtered.Count(), session.id));
                        try
                        {
                            var connectionId = dsession[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                            SignalRConnection.RaiseEvent(notifyMsg, connectionId);
                        }
                        catch (Exception ex)
                        {
                            log.Error("Не смог отправить по signalR", ex);
                        }
                    }
                }
                waiters.Clear();
                waitersState.Clear();
            }
        }
Beispiel #9
0
        public void Shutdown()
        {
            if (_watcher != null)
            {
                _watcher.Created -= new FileSystemEventHandler(onWatcherCreated);
                _watcher.Changed -= new FileSystemEventHandler(onWatcherChanged);
                _watcher.Dispose();
                _watcher = null;

                _deleteWatcher.Deleted -= new FileSystemEventHandler(onWatcherDeleted);
                _deleteWatcher.Dispose();
                _deleteWatcher = null;
            }
            SignalRConnection.Stop();
            signalRThread.Abort();
        }
Beispiel #10
0
 public Client()
 {
     signalR    = new SignalRConnection(this);
     jsonOption = new JsonSerializerOptions {
         PropertyNameCaseInsensitive = true
     };
     commandHandler = new Dictionary <string, Action <string[]> >();
     commandHandler.Add("listplayer", ListPlayer);
     commandHandler.Add("login", Login);
     commandHandler.Add("listroom", ListRoom);
     commandHandler.Add("join", JoinRoom);
     commandHandler.Add("create", CreateRoom);
     commandHandler.Add("logout", Logout);
     commandHandler.Add("info", ShowMyInfo);
     commandHandler.Add("setup", SendStartGame);
     commandHandler.Add("attack", Attack);
 }
Beispiel #11
0
        public override Task OnConnected()
        {
            var userId = Context.User.Identity.GetUserId();

            if (userId != null)
            {
                using (var db = new ApplicationDbContext())
                {
                    var connId = this.Context.ConnectionId;
                    var conn   = db.Connections.Find(connId);
                    if (conn == null)
                    {
                        conn = new SignalRConnection
                        {
                            ConnectionID = connId,
                            Connected    = true,
                            ConnectAt    = DateTime.Now,
                            UserId       = userId,
                            UserAgent    = Context.Request.Headers["User-Agent"],
                        };
                        db.Connections.Add(conn);
                    }
                    else
                    {
                        if (!conn.Connected)
                        {
                            conn.Connected = true;
                        }
                    }
                    conn.AppCreationTime = Context.Headers["x-creation-time"];
                    conn.AppName         = Context.Headers["x-name"];
                    conn.AppVersion      = Context.Headers["x-version"];
                    conn.OSVersion       = Context.Headers["x-os-version"];
                    conn.IEVersion       = Context.Headers["x-ie-version"];
                    conn.RuntimeVersion  = Context.Headers["x-runtime-version"];
                    db.SaveChanges();
                }
            }
            // Add your own code here.
            // For example: in a chat application, record the association between
            // the current connection ID and user name, and mark the user as online.
            // After the code in this method completes, the client is informed that
            // the connection is established; for example, in a JavaScript client,
            // the start().done callback is executed.
            return(base.OnConnected());
        }
Beispiel #12
0
        public void NotifyAll(dynamic message)
        {
            var sessions = CacheRepository.Instance.GetSessions();

            foreach (var session in sessions)
            {
                var bag = session as IDictionary <string, object>;
                if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                {
                    //log.Debug(string.Format("сессия {0} не содержит сигналр подписки", session.id));
                    continue;
                }
                //log.Debug(string.Format("отправка логов {0} шт, сессия {1}", filtered.Count, session.id));

                var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                SignalRConnection.RaiseEvent(message, connectionId);
            }
        }
Beispiel #13
0
 public IActionResult HubInfo(
     [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "hubInfo")] HttpRequest req,
     [SignalRConnectionInfo(HubName = "gab19")] SignalRConnectionInfo connectionInfo)
 {
     try
     {
         var connection = new SignalRConnection
         {
             Url         = connectionInfo.Url,
             AccessToken = connectionInfo.AccessToken
         };
         return(new OkObjectResult(Result.Ok(connection)));
     }
     catch (Exception e)
     {
         var error = $"{e.Message}\n\r{e.StackTrace}";
         log.Error(error);
         return(new OkObjectResult(Result.Fail <List <MeetingRoom> >(error)));
     }
 }
Beispiel #14
0
        private void OnWatchdogReset(object sender, ElapsedEventArgs e)
        {
            try
            {
                dynamic head = new ExpandoObject();
                head.what = "ping";
                dynamic body    = new ExpandoObject();
                dynamic message = new ExpandoObject();
                message.head = head;
                message.body = body;
                //
                var sessions = CacheRepository.Instance.GetSessions();
                if (sessions == null)
                {
                    throw new Exception("не удалось получить список сессий");
                }

                int count = 0;
                foreach (var sess in sessions)
                {
                    var bag = sess as IDictionary <string, object>;
                    if (bag == null)
                    {
                        continue;
                    }
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID) || bag[SignalRConnection.SIGNAL_CONNECTION_ID] == null)
                    {
                        continue;
                    }
                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(message, connectionId);
                    count++;
                }
                logger.Trace("Пинг отправлен по {0} из {1} сессий", count, sessions.Count());
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Ошибка при отправке пинга: {0}", ex.Message);
            }
        }
        public void ConnectUser(string connectionId)
        {
            var username = User.Identity.IsAuthenticated ? User.Identity.Name : null;

            var signalRConnection = _uiContext.SignalRConnections
                                    .SingleOrDefault(x => x.ConnectionId == connectionId);

            if (signalRConnection == null)
            {
                signalRConnection = new SignalRConnection
                {
                    ConnectionId = connectionId,
                    SessionId    = Session.SessionID,
                    Username     = username
                };
                _uiContext.SignalRConnections.Add(signalRConnection);
            }
            else
            {
                signalRConnection.Username = username;
            }

            _uiContext.SaveChanges();
        }
 public LocalRemoteServiceBase(string apiAddress, SignalRConnection signalRConnection)
 {
     this.apiAddress        = apiAddress;
     this.signalRConnection = signalRConnection;
 }
        public void Handle(IEnumerable <Domain.Entities.DataRecord> records, Guid userId)
        {
            var logs = records.Where(r => r.Type == "LogMessage");

            if (!logs.Any())
            {
                return;
            }

            var sessions = CacheRepository.Instance.GetSessions();

            //log.Debug(string.Format("извлекли {0} сессии", sessions.Count()));
            //уведомление об изменениях



            sessions.ToList().ForEach(session =>
            {
                try
                {
                    var bag = session as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        return;
                    }
                    if (!bag.ContainsKey("logSubscriber"))
                    {
                        return;
                    }

                    var ids = (List <dynamic>)session.logSubscriber;
                    if (ids == null || !ids.Any())
                    {
                        return;
                    }

                    var usrId = Guid.Parse(session.userId.ToString());

                    var filtered = new List <dynamic>();
                    foreach (var record in logs.GroupBy(r => r.ObjectId))
                    {
                        for (var j = 0; j < ids.Count(); j++)
                        {
                            var tube    = ids[j];
                            var neights = new List <dynamic>();
                            if ((tube as IDictionary <string, object>).ContainsKey("neighbours"))
                            {
                                neights = (List <dynamic>)tube.neighbours;
                            }
                            else
                            {
                                log.Debug(string.Format("сессия {0}, tube={1}", session.id, tube));
                            }

                            if (neights.Contains(record.Key.ToString()))
                            {
                                foreach (var rec in record)
                                {
                                    dynamic msg = new ExpandoObject();
                                    msg.id      = rec.ObjectId;
                                    msg.date    = rec.Date;
                                    msg.tubeId  = tube.tubeId;
                                    msg.@object = rec.ObjectId;
                                    msg.message = rec.S1;
                                    //msg.name = NamesCache.Instance.GetName(rec.ObjectId, usrId);
                                    msg.name = nameByOjectId(rec.ObjectId, usrId);
                                    filtered.Add(msg);
                                }
                            }
                            else
                            {
                                //log.Debug(string.Format("запись с objid {0} не сидит в сессии {1}", record.Key, session.id));
                            }
                        }
                    }



                    dynamic logsMessage       = Helper.BuildMessage("log");
                    logsMessage.body.messages = filtered.ToArray();

                    //log.Debug(string.Format("отправка логов {0} шт, сессия {1}", filtered.Count, session.id));

                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(logsMessage, connectionId);
                }
                catch (Exception ex)
                {
                    log.Error(string.Format("сессия {0} битая", session.id), ex);
                }
            });
        }
Beispiel #18
0
        public async Task <dynamic> Handle(dynamic session, dynamic message)
        {
            string what   = message.head.what;
            var    userId = Guid.Parse(session.userId.ToString());

            if (what == "node-states")
            {
                foreach (var state in message.body.states)
                {
                    Guid nodeId = Guid.Parse(state.nodeId.ToString());
                    var  cache  = Data.CacheRepository.Instance.GetCache(nodeId);
                    if (cache == null)
                    {
                        cache = new ExpandoObject();
                    }
                    cache.State = state;
                    Data.CacheRepository.Instance.SaveCache(nodeId, cache);
                    Data.RowsCache.Instance.UpdateState(state, nodeId, userId);
                    Carantine.Instance.Push(nodeId, (int)state.code);
                }
            }
            if (what == "node-get-astronomTimer")
            {
                var     answer = Helper.BuildMessage(what);
                Guid    id     = Guid.Parse(message.body.objectId.ToString());
                dynamic tube   = StructureGraph.Instance.GetTube(id, userId);

                var dtube = tube as IDictionary <string, object>;

                if (dtube.ContainsKey("coordinates"))
                {
                    answer.body.coordinates = (string)tube.coordinates;
                }
                if (dtube.ContainsKey("afterBeforeSunSetRise"))
                {
                    answer.body.afterBeforeSunSetRise = (string)tube.afterBeforeSunSetRise;
                }
                if (dtube.ContainsKey("utc"))
                {
                    answer.body.utc = (string)tube.utc;
                }
                return(answer);
            }
            if (what == "node-update-astronomTimer")
            {
                string coordinates           = (string)message.body.coordinates;
                string utc                   = (string)message.body.utc;
                string afterBeforeSunSetRise = (string)message.body.afterBeforeSunSetRise;
                Guid   objectId              = Guid.Parse((string)message.body.objectId);
                StructureGraph.Instance.UpdateLightControlsAstronTimersValues(coordinates, utc, afterBeforeSunSetRise, objectId);
                var ans = Helper.BuildMessage(what);
                return(ans);
            }
            if (what == "node-controller-data")
            {
                dynamic control  = (dynamic)message.body.control;
                var     dcontrol = control as IDictionary <string, object>;
                Guid    objectId = Guid.Parse((string)message.body.objectId);
                //для освещения
                if (dcontrol.ContainsKey("controllerData"))
                {
                    string controllerData = (string)control.controllerData;
                    Data.RowsCache.Instance.UpdateControllerData(controllerData, objectId, userId);
                    Carantine.Instance.Push(objectId);
                }
                if (dcontrol.ContainsKey("lightV2Config"))
                {
                    string strConfig = (string)control.lightV2Config;
                    StructureGraph.Instance.UpdateControlConfig(strConfig, objectId); //strConfig
                    var ans = Helper.BuildMessage(what);
                    return(ans);
                }
                if (dcontrol.ContainsKey("controllerConfig"))
                {
                    string strConfig = (string)control.controllerConfig;
                    StructureGraph.Instance.UpdateControlConfig(strConfig, objectId); //strConfig
                    var ans = Helper.BuildMessage(what);
                    return(ans);
                }
            }
            if (what == "node-config")
            {
            }
            if (what == "node-events")
            {
                int  events   = Convert.ToInt32(message.body.events);
                Guid objectId = Guid.Parse((string)message.body.objectId);
                Data.RowsCache.Instance.UpdateEvents(events, objectId, userId);
                Carantine.Instance.Push(objectId);
            }
            if (what == "node-watertower")
            {
                float max         = Convert.ToSingle(message.body.max);
                float min         = Convert.ToSingle(message.body.min);
                int   controlMode = Convert.ToInt32(message.body.controlMode);
                Guid  objectId    = Guid.Parse((string)message.body.objectId);
                StructureGraph.Instance.UpdateWaterTowenParametr(min, max, controlMode, objectId);
                List <dynamic> rules       = new List <dynamic>();
                var            connections = StructureGraph.Instance.GetNeightbours(objectId, userId);
                foreach (var connection in connections)
                {
                    dynamic ruleConnection = new ExpandoObject();
                    ruleConnection.action       = "upd";
                    ruleConnection.target       = "node";
                    ruleConnection.content      = new ExpandoObject();
                    ruleConnection.content.id   = connection.id;
                    ruleConnection.content.body = connection;
                    ruleConnection.content.type = (string)connection.type;
                    rules.Add(ruleConnection);
                }
                var     area     = StructureGraph.Instance.GetArea(objectId, userId);
                dynamic ruleArea = new ExpandoObject();
                ruleArea.action       = "upd";
                ruleArea.target       = "node";
                ruleArea.content      = new ExpandoObject();
                ruleArea.content.id   = area.id;
                ruleArea.content.body = area;
                ruleArea.content.type = "Area";
                rules.Add(ruleArea);
                var     tube     = StructureGraph.Instance.GetTube(objectId, userId);
                dynamic ruleTube = new ExpandoObject();
                ruleTube.action       = "upd";
                ruleTube.target       = "node";
                ruleTube.content      = new ExpandoObject();
                ruleTube.content.id   = tube.id;
                ruleTube.content.body = tube;
                ruleTube.content.type = "Tube";
                rules.Add(ruleTube);
                var sessions = CacheRepository.Instance.GetSessions();
                sessions.AsParallel().ForAll(s =>
                {
                    var ds = s as IDictionary <string, object>;
                    if (ds == null || !ds.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID) || ds[SignalRConnection.SIGNAL_CONNECTION_ID] == null)
                    {
                        return;
                    }

                    Guid uId       = Guid.Parse(s.userId.ToString());
                    dynamic msg    = Helper.BuildMessage("changes");
                    msg.body.rules = new List <dynamic>();
                    foreach (var rule in rules)
                    {
                        dynamic content = rule.content;
                        Guid id         = Guid.Empty;
                        id = Guid.Parse(content.id.ToString());
                        if (id != Guid.Empty && StructureGraph.Instance.CanSee(id, uId))
                        {
                            msg.body.rules.Add(rule);
                        }
                    }
                    if (msg.body.rules.Count > 0)
                    {
                        var connectionId = ds[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                        SignalRConnection.RaiseEvent(msg, connectionId);
                    }
                });
                return(Helper.BuildMessage(what));
            }
            if (what == "node-get-light-control-config")
            {
                var      answer             = Helper.BuildMessage(what);
                string[] lightControlMetod  = new string[4];
                int[]    lightBeforeSunRise = new int[4];

                int[,] afterSunSetAndBeforeSunRise = new int[4, 2];

                dynamic[,] lightSheduleOn = new dynamic[4, 2];

                dynamic[,] lightSheduleOff = new dynamic[4, 2];

                DateTime dt1970         = new DateTime(1970, 1, 1, 0, 0, 0);
                DateTime dt1970With1sec = new DateTime(1970, 1, 1, 0, 0, 1);

                Guid    id   = Guid.Parse(message.body.objectId.ToString());
                dynamic tube = StructureGraph.Instance.GetTube(id, userId);

                var dtube = tube as IDictionary <string, object>;

                if (dtube.ContainsKey("strConfig"))
                {
                    string      strConfig   = (string)tube.strConfig;
                    var         bytesConfig = strConfig.Split('-').Select(x => byte.Parse(x, NumberStyles.HexNumber)).ToArray();
                    LightConfig conf        = StructsHelper.Instance.setBytesFromConfig <LightConfig>(bytesConfig, new LightConfig());

                    //Celestial cel = Celestial.CalculateCelestialTimes(Convert.ToInt32(conf.u32lat)+0, Convert.ToInt32(conf.u32lon), new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
                    //DateTime sunRiseUTC = cel.SunRise.Value;
                    //DateTime sunSetUTC = cel.SunSet.Value;
                    //DateTime lightAstronomOn = sunRiseUTC.AddHours(Convert.ToInt32(conf.u8timeDiff));
                    //DateTime lightAstronomOff = sunSetUTC.AddHours(Convert.ToInt32(conf.u8timeDiff));

                    lightControlMetod[0] = (conf.ligthtChannels1.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels1.u8ControlMode);
                    lightControlMetod[1] = (conf.ligthtChannels2.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels2.u8ControlMode);
                    lightControlMetod[2] = (conf.ligthtChannels3.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels3.u8ControlMode);
                    lightControlMetod[3] = (conf.ligthtChannels4.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels4.u8ControlMode);

                    afterSunSetAndBeforeSunRise[0, 0] = (conf.ligthtChannels1.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels1.u8afterSunSet);
                    afterSunSetAndBeforeSunRise[1, 0] = (conf.ligthtChannels2.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels2.u8afterSunSet);
                    afterSunSetAndBeforeSunRise[2, 0] = (conf.ligthtChannels3.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels3.u8afterSunSet);
                    afterSunSetAndBeforeSunRise[3, 0] = (conf.ligthtChannels4.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels4.u8afterSunSet);

                    afterSunSetAndBeforeSunRise[0, 1] = (conf.ligthtChannels1.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels1.u8beforeSunRise);
                    afterSunSetAndBeforeSunRise[1, 1] = (conf.ligthtChannels2.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels2.u8beforeSunRise);
                    afterSunSetAndBeforeSunRise[2, 1] = (conf.ligthtChannels3.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels3.u8beforeSunRise);
                    afterSunSetAndBeforeSunRise[3, 1] = (conf.ligthtChannels4.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels4.u8beforeSunRise);

                    lightSheduleOn[0, 0] = conf.ligthtChannels1.on1;
                    lightSheduleOn[1, 0] = conf.ligthtChannels2.on1;
                    lightSheduleOn[2, 0] = conf.ligthtChannels3.on1;
                    lightSheduleOn[3, 0] = conf.ligthtChannels4.on1;
                    lightSheduleOn[0, 1] = conf.ligthtChannels1.on2;
                    lightSheduleOn[1, 1] = conf.ligthtChannels2.on2;
                    lightSheduleOn[2, 1] = conf.ligthtChannels3.on2;
                    lightSheduleOn[3, 1] = conf.ligthtChannels4.on2;

                    lightSheduleOff[0, 0] = conf.ligthtChannels1.off1;
                    lightSheduleOff[1, 0] = conf.ligthtChannels2.off1;
                    lightSheduleOff[2, 0] = conf.ligthtChannels3.off1;
                    lightSheduleOff[3, 0] = conf.ligthtChannels4.off1;
                    lightSheduleOff[0, 1] = conf.ligthtChannels1.off2;
                    lightSheduleOff[1, 1] = conf.ligthtChannels2.off2;
                    lightSheduleOff[2, 1] = conf.ligthtChannels3.off2;
                    lightSheduleOff[3, 1] = conf.ligthtChannels4.off2;

                    answer.body.strConfig                   = strConfig;
                    answer.body.lightControlMetod           = lightControlMetod;
                    answer.body.afterSunSetAndBeforeSunRise = afterSunSetAndBeforeSunRise;

                    answer.body.lightSheduleOn  = lightSheduleOn;
                    answer.body.lightSheduleOff = lightSheduleOff;
                }
                return(answer);
            }

            if (what == "node-get-matrix-terminal-config")
            {
                var answer = Helper.BuildMessage(what);

                Guid    id   = Guid.Parse(message.body.objectId.ToString());
                dynamic node = StructureGraph.Instance.GetNodeById(id);

                var dnode = node as IDictionary <string, object>;

                if (dnode.ContainsKey("config"))
                {
                    string strConfig          = (string)node.config;
                    var    bytesConfig        = strConfig.Split('-').Select(x => byte.Parse(x, NumberStyles.HexNumber)).ToArray();
                    MatrixTerminalConfig conf = StructsHelper.Instance.setBytesFromConfig <MatrixTerminalConfig>(bytesConfig, new MatrixTerminalConfig());
                    answer.body.config = conf;

                    List <dynamic> listProfile = new List <dynamic>();
                    List <string>  listApnName = new List <string>();
                    foreach (var profile in conf.profile)
                    {
                        dynamic profileTmp = new ExpandoObject();
                        string  ipPort     = StructsHelper.Instance.ParseStringFromBytes(profile.ip_port);

                        profileTmp.ip   = (ipPort.Contains(':')) ? ipPort.Split(':')[0] : ipPort;
                        profileTmp.port = (ipPort.Contains(':')) ? ipPort.Split(':')[1] : "";
                        listProfile.Add(profileTmp);
                    }
                    foreach (var apnName in conf.apnName)
                    {
                        listApnName.Add(StructsHelper.Instance.ParseStringFromBytes(apnName.APN));
                    }
                    answer.body.profiles  = listProfile;
                    answer.body.APNs      = listApnName;
                    answer.body.strConfig = strConfig;
                }
                return(answer);
            }

            if (what == "node-value")
            {
                double   value = (double)message.body.indication;
                string   valueUnitMeasurement = (string)message.body.indicatioUnitMeasurement;
                DateTime date     = DateTime.Parse(message.body.date.ToString());
                Guid     objectId = Guid.Parse((string)message.body.objectId);
                Data.RowsCache.Instance.UpdateValue(value, valueUnitMeasurement, date, objectId, userId);
                Carantine.Instance.Push(objectId);
            }
            if (what == "node-save")
            {
                //var node = message.body.node;
                //Data.StructureGraph.Instance.SaveNode(node.type.ToString(), node, Guid.Parse((string)session.User.id));
            }

            if (what == "nodes-save")
            {
                var nodes  = message.body.nodes;
                var tokens = new List <dynamic>();
                foreach (var node in nodes)
                {
                    var token = node;
                    token.userId = userId;
                    tokens.Add(token);
                }

                Data.NodeBackgroundProccessor.Instance.AddTokens(tokens);
                return(Helper.BuildMessage(what));
            }

            if (what == "node-poll-server")
            {
                string serverName = message.body.serverName;
                var    server     = StructureGraph.Instance.GetPollServer(serverName);
                var    ans        = Helper.BuildMessage(what);
                ans.body.server = StructureGraph.Instance.GetServer(serverName, Guid.Parse((string)session.userId));
                return(ans);
            }

            if (what == "nodes-poll-branch")
            {
                string serverName = message.body.serverName;
                var    server     = StructureGraph.Instance.GetPollServer(serverName);
                var    ans        = Helper.BuildMessage(what);
                ans.body.server = server;//StructureGraph.Instance.GetServer(serverName, Guid.Parse((string)session.userId));
                return(ans);
            }

            return(Helper.BuildMessage(what));
        }
Beispiel #19
0
        public async Task <dynamic> Handle(dynamic session, dynamic message)
        {
            string what   = message.head.what;
            Guid   userId = Guid.Parse(session.userId.ToString());

            if (what == "rows-cache-update")
            {
                RowsCache.Instance.Update(userId);
                var ans = Helper.BuildMessage(what);
                return(ans);
            }

            if (what == "rows-get-2")
            {
                var filter = message.body.filter;

                var rows = RowsCache.Instance.Get(filter, userId);
                var ans  = Helper.BuildMessage(what);
                ans.body = rows;
                return(ans);
            }

            if (what == "rows-get-3")
            {
                var filter = message.body.filter;

                var rows = RowsCache.Instance.Get(filter, userId);
                var ans  = Helper.BuildMessage(what);
                ans.body.ids = (rows.rows as IEnumerable <dynamic>).Select(r => r.id).ToArray();
                return(ans);
            }

            if (what == "rows-get-4")
            {
                var ids = new List <Guid>();
                foreach (var id in message.body.ids)
                {
                    ids.Add(Guid.Parse(id.ToString()));
                }

                var rows = RowsCache.Instance.Get(ids, userId);
                var ans  = Helper.BuildMessage(what);
                ans.body.rows = rows;
                return(ans);
            }

            if (what == "rows-get-light")
            {
                var ids = new List <Guid>();
                foreach (var id in message.body.ids)
                {
                    ids.Add(Guid.Parse(id.ToString()));
                }

                var rows = RowsCache.Instance.Get(ids, userId);
                var sw   = new Stopwatch();

                var datas = new List <dynamic>();
                var data0 = new List <dynamic>();

                var records = RecordsDecorator.Decorate(ids.ToArray(), DateTime.Now.AddMinutes(-20), DateTime.Now.AddHours(1), "Current", new Guid());

                foreach (var id in ids)
                {
                    data0.Clear();
                    foreach (var group in records.Where(r => r.ObjectId == id).GroupBy(r => r.Date))
                    {
                        dynamic rec = new ExpandoObject();
                        rec.date     = group.Key;
                        rec.objectId = id;
                        var drec = rec as IDictionary <string, object>;
                        foreach (var record in group)
                        {
                            var unit = record.S2;
                            var val  = record.D1;

                            var name = record.S1.Replace(".", "").Replace(" ", "");
                            if (!drec.ContainsKey(name))
                            {
                                drec.Add(name, val);
                            }
                        }
                        data0.Add(rec);
                    }
                    if (data0.Count > 0)
                    {
                        datas.Add(data0[data0.Count - 1]);
                    }
                }
                foreach (var row in rows)
                {
                    foreach (var data in datas)
                    {
                        if (row.id == data.objectId)
                        {
                            row.dataLight = data;
                        }
                    }
                }
                var ans = Helper.BuildMessage(what);

                ans.body.rows = rows;
                return(ans);
            }
            if (what == "rows-get")
            {
                var sw = new Stopwatch();

                var result = new List <dynamic>();

                var ids = new List <Guid>();
                sw.Start();
                foreach (var raw in message.body.ids)
                {
                    var id = Guid.Parse((string)raw);

                    //log.Debug(string.Format("рассматривается строка {0}", id));
                    //check for cache
                    var cachedRow = CacheRepository.Instance.Get("row", id);
                    //var cachedRow = CacheRepository.Instance.GetLocal("row", id);
                    if (cachedRow == null)
                    {
                        //log.Debug(string.Format("строка {0} НЕ найдена в кеше", id));
                        ids.Add(id);
                    }
                    else
                    {
                        //log.Debug(string.Format("строка {0} найдена в кеше", id));

                        var cache = CacheRepository.Instance.Get("cache", id);
                        //var cache = CacheRepository.Instance.GetLocal("cache", id);
                        cachedRow.cache = cache;

                        result.Add(cachedRow);
                    }
                }
                sw.Stop();
                log.Debug(string.Format("поиск в кеше {0} мс", sw.ElapsedMilliseconds));

                sw.Restart();
                if (ids.Any())
                {
                    IEnumerable <dynamic> res = StructureGraph.Instance.GetRows(ids, Guid.Parse(session.userId));

                    foreach (var r in res)
                    {
                        var id = Guid.Parse(r.id.ToString());
                        //log.Debug(string.Format("строка {0} записана в кеш", id));
                        CacheRepository.Instance.Set("row", id, r);
                        var cache = CacheRepository.Instance.Get("cache", id);
                        //CacheRepository.Instance.SetLocal("row", id, r);
                        //var cache = CacheRepository.Instance.GetLocal("cache", id);
                        r.cache = cache;
                        result.Add(r);
                    }
                }
                log.Debug(string.Format("поиск в базе {0} мс", sw.ElapsedMilliseconds));

                var answer = Helper.BuildMessage(what);
                answer.body.rows = result;
                return(answer);
            }

            if (what == "row-get-devices")
            {
                var devices = StructureGraph.Instance.GetDevices();
                var answer  = Helper.BuildMessage(what);
                answer.body.devices = devices;
                return(answer);
            }

            if (what == "row-get-for-edit")
            {
                var tubeId = message.body.id;

                //StructureGraph.Instance
            }

            if (what == "row-save-row")
            {
                foreach (var change in message.body.changes)
                {
                    if (change.mode == "add")
                    {
                        if (change.type == "node")
                        {
                            StructureGraph.Instance.SaveNode(change.entity);
                        }
                        else
                        {
                            StructureGraph.Instance.Merge(change.entity.start, change.entity.end, change.entity, change.entity.type);
                        }
                    }
                    if (change.mode == "upd")
                    {
                        if (change.type == "node")
                        {
                            StructureGraph.Instance.SaveNode(change.entity);
                        }
                        else
                        {
                            StructureGraph.Instance.Merge(change.entity.start, change.entity.end, change.entity, change.entity.type);
                        }
                    }
                    if (change.mode == "del")
                    {
                        if (change.type == "relation")
                        {
                            StructureGraph.Instance.Break(change.entity.start, change.entity.end);
                        }
                    }
                }

                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    var bag = sess as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }

                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(message, connectionId);
                }

                var answer = Helper.BuildMessage(what);
                return(answer);
            }

            if (what == "rows-get-ids")
            {
                string filter = message.body.filter.text;
                //var groups = (message.body.filter.groups as IEnumerable<string>).Select(i=>Guid.Parse(i)).ToArray();
                var groups = new List <Guid>();
                foreach (var gid in message.body.filter.groups)
                {
                    groups.Add(Guid.Parse(gid.ToString()));
                }
                dynamic res    = StructureGraph.Instance.GetRowIds(filter, groups.ToArray(), userId);
                var     answer = Helper.BuildMessage(what);
                answer.body.ids = res;
                return(answer);
            }

            if (what == "rows-for-server")
            {
                string serverName = message.body.serverName;

                var ans = Helper.BuildMessage(what);
                ans.body.server = StructureGraph.Instance.GetServer(serverName, userId);
                return(ans);
            }

            if (what == "row-get-card")
            {
                Guid rowId = Guid.Parse(message.body.rowId.ToString());

                var abnormals = Data.Cache.Instance.GetLastRecords("Abnormal", new Guid[] { rowId });
                var currents  = Data.Cache.Instance.GetLastRecords("Current", new Guid[] { rowId });
                var constants = Data.Cache.Instance.GetLastRecords("Constant", new Guid[] { rowId });

                var dayDate = Data.Cache.Instance.GetLastDate("Day", rowId);
                var days    = (dayDate != DateTime.MinValue) ? Data.RecordsDecorator.Decorate(new[] { rowId }, dayDate, dayDate, "Day", userId).Where(d => d.Date == dayDate) : null;

                dynamic ans = Helper.BuildMessage(what);

                try
                {
                    var fr  = StructureGraph.Instance.GetRows(new Guid[] { rowId }, userId).FirstOrDefault();
                    var dfr = (fr as IDictionary <string, object>);

                    if (dfr.ContainsKey("Area") && (fr.Area is IEnumerable <dynamic>) && (fr.Area as IEnumerable <object>).Any() && (fr.Area[0] is IDictionary <string, object>))
                    {
                        var obj  = fr.Area[0];
                        var dobj = fr.Area[0] as IDictionary <string, object>;
                        ans.body.addr    = dobj.ContainsKey("name")? obj.name : "";
                        ans.body.number  = dobj.ContainsKey("number") ? obj.number : "";
                        ans.body.address = dobj.ContainsKey("address") ? obj.address : "";
                    }

                    if (dfr.ContainsKey("Device") && (fr.Device is IEnumerable <dynamic>) && (fr.Device as IEnumerable <object>).Any() && (fr.Device[0] is IDictionary <string, object>))
                    {
                        var obj  = fr.Device[0];
                        var dobj = fr.Device[0] as IDictionary <string, object>;
                        ans.body.dev = dobj.ContainsKey("name") ? obj.name : "";
                    }


                    if (dfr.ContainsKey("CsdConnection") && (fr.CsdConnection is IEnumerable <dynamic>) && (fr.CsdConnection as IEnumerable <object>).Any() && (fr.CsdConnection[0] is IDictionary <string, object>))
                    {
                        var obj  = fr.CsdConnection[0];
                        var dobj = fr.CsdConnection[0] as IDictionary <string, object>;
                        ans.body.phone = dobj.ContainsKey("phone") ? obj.phone : "";
                    }
                }
                catch (Exception exx)
                {
                }


                if (message.body.matrixId != "undefined")
                {
                    Guid matrixId   = Guid.Parse(message.body.matrixId.ToString());
                    var  signalDate = Data.Cache.Instance.GetLastDate("MatrixSignal", matrixId);
                    var  signal     = Data.Cache.Instance.GetRecords(signalDate, signalDate, "MatrixSignal", new Guid[] { matrixId });
                    ans.body.signal = signal.Select(c =>
                    {
                        dynamic d = new ExpandoObject();
                        d.date    = c.Date;
                        d.level   = c.D1;
                        return(d);
                    });
                }

                ans.body.currents = currents.Select(c =>
                {
                    dynamic d    = new ExpandoObject();
                    d.date       = c.Date;
                    d.serverDate = c.Dt1;
                    d.name       = c.S1;
                    d.unit       = c.S2;
                    d.value      = c.D1;
                    return(d);
                });
                ans.body.constants = constants.Select(c =>
                {
                    dynamic d = new ExpandoObject();
                    d.name    = c.S1;
                    d.value   = c.S2;
                    return(d);
                });
                ans.body.days = days == null ? new List <dynamic> {
                } : days.Select(c =>
                {
                    dynamic d = new ExpandoObject();
                    d.date    = c.Date;
                    d.name    = c.S1;
                    d.unit    = c.S2;
                    d.value   = c.D1;
                    return(d);
                });
                ans.body.abnormals = abnormals.Select(c =>
                {
                    dynamic d = new ExpandoObject();
                    d.date    = c.Date;
                    d.name    = c.S1;
                    return(d);
                });
                return(ans);
            }

            if (what == "row-get-card-before20190201")
            {
                Guid rowId = Guid.Parse(message.body.rowId.ToString());

                var abnormals = Data.Cache.Instance.GetLastRecords("Abnormal", new Guid[] { rowId });
                var currents  = Data.Cache.Instance.GetLastRecords("Current", new Guid[] { rowId });
                var constants = Data.Cache.Instance.GetLastRecords("Constant", new Guid[] { rowId });

                var dayDate = Data.Cache.Instance.GetLastDate("Day", rowId);
                var days    = (dayDate != DateTime.MinValue) ? Data.RecordsDecorator.Decorate(new[] { rowId }, dayDate, dayDate, "Day", userId).Where(d => d.Date == dayDate) : null;

                dynamic ans = Helper.BuildMessage(what);

                try
                {
                    var fr  = StructureGraph.Instance.GetRows(new Guid[] { rowId }, userId).FirstOrDefault();
                    var dfr = (fr as IDictionary <string, object>);

                    if (dfr.ContainsKey("Area") && (fr.Area is IEnumerable <dynamic>) && (fr.Area as IEnumerable <object>).Any() && (fr.Area[0] is IDictionary <string, object>))
                    {
                        var obj  = fr.Area[0];
                        var dobj = fr.Area[0] as IDictionary <string, object>;
                        ans.body.addr    = dobj.ContainsKey("name") ? obj.name : "";
                        ans.body.number  = dobj.ContainsKey("number") ? obj.number : "";
                        ans.body.address = dobj.ContainsKey("address") ? obj.address : "";
                    }

                    if (dfr.ContainsKey("Device") && (fr.Device is IEnumerable <dynamic>) && (fr.Device as IEnumerable <object>).Any() && (fr.Device[0] is IDictionary <string, object>))
                    {
                        var obj  = fr.Device[0];
                        var dobj = fr.Device[0] as IDictionary <string, object>;
                        ans.body.dev = dobj.ContainsKey("name") ? obj.name : "";
                    }


                    if (dfr.ContainsKey("CsdConnection") && (fr.CsdConnection is IEnumerable <dynamic>) && (fr.CsdConnection as IEnumerable <object>).Any() && (fr.CsdConnection[0] is IDictionary <string, object>))
                    {
                        var obj  = fr.CsdConnection[0];
                        var dobj = fr.CsdConnection[0] as IDictionary <string, object>;
                        ans.body.phone = dobj.ContainsKey("phone") ? obj.phone : "";
                    }
                }
                catch (Exception exx)
                {
                }


                if (message.body.matrixId != "undefined")
                {
                    Guid matrixId   = Guid.Parse(message.body.matrixId.ToString());
                    var  signalDate = Data.Cache.Instance.GetLastDate("MatrixSignal", matrixId);
                    var  signal     = Data.Cache.Instance.GetRecords(signalDate, signalDate, "MatrixSignal", new Guid[] { matrixId });
                    ans.body.signal = signal.Select(c =>
                    {
                        dynamic d = new ExpandoObject();
                        d.date    = c.Date;
                        d.level   = c.D1;
                        return(d);
                    });
                }

                ans.body.currents = currents.Select(c =>
                {
                    dynamic d    = new ExpandoObject();
                    d.date       = c.Date;
                    d.serverDate = c.Dt1;
                    d.name       = c.S1;
                    d.unit       = c.S2;
                    d.value      = c.D1;
                    return(d);
                });
                ans.body.constants = constants.Select(c =>
                {
                    dynamic d = new ExpandoObject();
                    d.name    = c.S1;
                    d.value   = c.S2;
                    return(d);
                });
                ans.body.days = days == null ? new List <dynamic> {
                } : days.Select(c =>
                {
                    dynamic d = new ExpandoObject();
                    d.date    = c.Date;
                    d.name    = c.S1;
                    d.unit    = c.S2;
                    d.value   = c.D1;
                    return(d);
                });
                ans.body.abnormals = abnormals.Select(c =>
                {
                    dynamic d = new ExpandoObject();
                    d.date    = c.Date;
                    d.name    = c.S1;
                    return(d);
                });
                return(ans);
            }
            return(Helper.BuildMessage(what));
        }
Beispiel #20
0
        public async Task <dynamic> Handle(dynamic session, dynamic message)
        {
            string what   = message.head.what;
            var    userId = Guid.Parse(session.userId.ToString());

            if (what == "poll-cancel")
            {
                //var sessions = StructureGraph.Instance.GetSessions();
                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    if (sess.id == session.id)
                    {
                        continue;
                    }
                    var bag = sess as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(message, connectionId);
                }
                return(Helper.BuildMessage(what));
            }


            if (what.StartsWith("poll-vcom"))
            {
                //var sessions = StructureGraph.Instance.GetSessions();
                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    if (sess.id == session.id)
                    {
                        continue;
                    }
                    var bag = sess as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(message, connectionId);
                }
                return(Helper.BuildMessage(what));
            }


            if (what == "poll")
            {
                //препроцессинг
                //редиректы

                var dmessage = message.body as IDictionary <string, object>;
                if (dmessage.ContainsKey("redirect"))
                {
                    var objIds = new List <Guid>();
                    foreach (var objId in message.body.objectIds)
                    {
                        objIds.Add(Guid.Parse(objId));
                    }
                    message.body.objectIds = StructureGraph.Instance.GetRelatedIds(objIds, message.body.redirect.ToString());
                }

                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    if (sess.id == session.id)
                    {
                        continue;
                    }
                    var bag = sess as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(message, connectionId);
                }
            }

            if (what == "poll-subscribe")
            {
                var bag = session.bag as IDictionary <string, object>;
                if (!bag.ContainsKey(SUBSCRIBE))
                {
                    bag.Add(SUBSCRIBE, new Dictionary <Guid, IEnumerable <Guid> >());
                }
                var old = (Dictionary <Guid, IEnumerable <Guid> >)bag[SUBSCRIBE];
                foreach (dynamic subs in message.body.subscribers)
                {
                    Guid tubeId     = subs.id;
                    var  sattelites = new List <Guid>();
                    foreach (Guid satteliteId in subs.sattelites)
                    {
                        sattelites.Add(satteliteId);
                    }
                    if (old.ContainsKey(tubeId))
                    {
                        old[tubeId] = sattelites;
                    }
                    else
                    {
                        old.Add(tubeId, sattelites);
                    }
                }
                session.Bag[SUBSCRIBE] = old;
            }

            if (what == "poll-unsubscribe")
            {
                var bag = session.bag as IDictionary <string, object>;
                if (!bag.ContainsKey(SUBSCRIBE))
                {
                    bag.Add(SUBSCRIBE, new Dictionary <Guid, IEnumerable <Guid> >());
                }
                var old = (Dictionary <Guid, IEnumerable <Guid> >)bag[SUBSCRIBE];
                foreach (dynamic subs in message.body.subscribers)
                {
                    Guid tubeId = subs.tubeId;
                    if (old.ContainsKey(tubeId))
                    {
                        old.Remove(tubeId);
                    }
                }
                session.Bag[SUBSCRIBE] = old;
            }
            if (what == "poll-get-objectid-imeina")
            {
                string imei           = message.body.imei;
                string networkaddress = $"{message.body.networkaddress}";
                var    objectId       = StructureGraph.Instance.GetTubeIdFromIMEIandNetworkAddress(imei, networkaddress);
                var    answer         = Helper.BuildMessage(what);
                answer.body.objectId = objectId;
                return(answer);
            }
            if (what == "poll-get-objectid-imeina-matrixterminal")
            {
                string imei           = message.body.imei;
                string networkaddress = $"{message.body.networkaddress}";
                var    objectId       = StructureGraph.Instance.GetTubeIdFromIMEIandNAMatrixTerminal(imei, networkaddress);
                var    answer         = Helper.BuildMessage(what);
                answer.body.objectId = objectId;
                return(answer);
            }
            if (what == "poll-set-light-astronomtimer")
            {
                byte afterSunSet   = Byte.Parse(message.body.afterBeforeSunSetRise[0]);
                byte beforeSunRise = Byte.Parse(message.body.afterBeforeSunSetRise[1]);

                Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
                byte   u8timeDiff = Byte.Parse(message.body.utc);
                double dLatitude  = Double.Parse(((string)message.body.coordinates[0]).Replace(',', '.'));
                UInt32 latitude   = (UInt32)(dLatitude * 10000000);
                double dLongitude = Double.Parse(((string)message.body.coordinates[1]).Replace(',', '.'));
                UInt32 longitude  = (UInt32)(dLongitude * 10000000);
                string cmd        = "setAstronTimer";

                List <byte> listSetAstronom = new List <byte>();
                listSetAstronom.Add(u8timeDiff);

                byte[] u32Lat = BitConverter.GetBytes(latitude);
                listSetAstronom.AddRange(u32Lat);

                byte[] u32Lon = BitConverter.GetBytes(longitude);
                listSetAstronom.AddRange(u32Lon);

                listSetAstronom.Add(afterSunSet);

                listSetAstronom.Add(beforeSunRise);

                dynamic msg = new ExpandoObject();
                msg = Helper.BuildMessage("poll");
                msg.head.sessionId      = message.head.sessionId;
                msg.body.objectIds      = new string[] { (string)message.body.objectId };
                msg.body.what           = "all";
                msg.body.arg            = new ExpandoObject();
                msg.body.arg.components = "Current";
                msg.body.arg.onlyHoles  = false;
                msg.body.arg.cmd        = cmd + BitConverter.ToString(listSetAstronom.ToArray());
                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    if (sess.id == session.id)
                    {
                        continue;
                    }
                    var bag = sess as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(msg, connectionId);
                }
            }
            if (what == "poll-light-control-config")
            {
                var lightControlMetod           = message.body.lightControlMetod;
                var afterSunSetAndBeforeSunRise = message.body.afterSunSetAndBeforeSunRise;

                var      lightSheduleOn  = message.body.lightSheduleOn;
                var      lightSheduleOff = message.body.lightSheduleOff;
                DateTime dt1970          = new DateTime(1970, 1, 1, 0, 0, 0);

                Guid        id          = Guid.Parse(message.body.objectId.ToString());
                dynamic     tube        = StructureGraph.Instance.GetTube(id, userId);
                string      strConfig   = (string)tube.strConfig;
                var         bytesConfig = strConfig.Split('-').Select(x => byte.Parse(x, NumberStyles.HexNumber)).ToArray();
                LightConfig conf        = StructsHelper.Instance.setBytesFromConfig <LightConfig>(bytesConfig, new LightConfig());

                string cmd = "setAstronTimer";

                if (lightControlMetod.Count > 0 && lightControlMetod[0] != null)
                {
                    conf.ligthtChannels1.u8ControlMode = Convert.ToByte(lightControlMetod[0]);
                }
                conf.ligthtChannels1.u8afterSunSet   = Convert.ToByte(afterSunSetAndBeforeSunRise[0][0]);
                conf.ligthtChannels1.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[0][1]);

                conf.ligthtChannels1.on1 = lightChannelOnOff(lightSheduleOn[0][0]);
                conf.ligthtChannels1.on2 = lightChannelOnOff(lightSheduleOn[0][1]);   //------------------

                conf.ligthtChannels1.off1 = lightChannelOnOff(lightSheduleOff[0][0]); //---------------------
                conf.ligthtChannels1.off2 = lightChannelOnOff(lightSheduleOff[0][1]);

                if (lightControlMetod.Count > 1 && lightControlMetod[1] != null)
                {
                    conf.ligthtChannels2.u8ControlMode = Convert.ToByte(lightControlMetod[1]);
                }

                conf.ligthtChannels2.u8afterSunSet   = Convert.ToByte(afterSunSetAndBeforeSunRise[1][0]);
                conf.ligthtChannels2.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[1][1]);

                conf.ligthtChannels2.on1 = lightChannelOnOff(lightSheduleOn[1][0]);
                conf.ligthtChannels2.on2 = lightChannelOnOff(lightSheduleOn[1][1]);

                conf.ligthtChannels2.off1 = lightChannelOnOff(lightSheduleOff[1][0]);
                conf.ligthtChannels2.off2 = lightChannelOnOff(lightSheduleOff[1][1]);

                if (lightControlMetod.Count > 2 && lightControlMetod[2] != null)
                {
                    conf.ligthtChannels3.u8ControlMode = Convert.ToByte(lightControlMetod[2]);
                }
                conf.ligthtChannels3.u8afterSunSet   = Convert.ToByte(afterSunSetAndBeforeSunRise[2][0]);
                conf.ligthtChannels3.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[2][1]);

                conf.ligthtChannels3.on1 = lightChannelOnOff(lightSheduleOn[2][0]);
                conf.ligthtChannels3.on2 = lightChannelOnOff(lightSheduleOn[2][1]);

                conf.ligthtChannels3.off1 = lightChannelOnOff(lightSheduleOff[2][0]);
                conf.ligthtChannels3.off2 = lightChannelOnOff(lightSheduleOff[2][1]);

                if (lightControlMetod.Count > 3 && lightControlMetod[3] != null)
                {
                    conf.ligthtChannels4.u8ControlMode = Convert.ToByte(lightControlMetod[3]);
                }
                conf.ligthtChannels4.u8afterSunSet   = Convert.ToByte(afterSunSetAndBeforeSunRise[3][0]);
                conf.ligthtChannels4.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[3][1]);

                conf.ligthtChannels4.on1  = lightChannelOnOff(lightSheduleOn[3][0]);
                conf.ligthtChannels4.on2  = lightChannelOnOff(lightSheduleOn[3][1]);
                conf.ligthtChannels4.off1 = lightChannelOnOff(lightSheduleOff[3][0]);
                conf.ligthtChannels4.off2 = lightChannelOnOff(lightSheduleOff[3][1]);

                byte[]  outByte = StructsHelper.Instance.getBytes <LightConfig>(conf);
                dynamic msg     = new ExpandoObject();
                msg = Helper.BuildMessage("poll");
                msg.head.sessionId      = message.head.sessionId;
                msg.body.objectIds      = new string[] { (string)message.body.objectId };
                msg.body.what           = "all";
                msg.body.arg            = new ExpandoObject();
                msg.body.arg.components = "Current";
                msg.body.arg.onlyHoles  = false;
                msg.body.arg.cmd        = cmd + BitConverter.ToString(outByte);
                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    if (sess.id == session.id)
                    {
                        continue;
                    }
                    var bag = sess as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(msg, connectionId);
                }
            }

            var ans = Helper.BuildMessage("poll-accepted");

            return(ans);
        }
Beispiel #21
0
 public RemoteServiceBase(SignalRConnection connection)
 {
     this.connection = connection;
 }
Beispiel #22
0
 public void SendTrackDetails(MediaState mediaState)
 {
     SignalRConnection.Notify(new Message <MediaState>(mediaState, MessageType.TrackDetails));
 }
Beispiel #23
0
        public async Task <dynamic> Handle(dynamic session, dynamic message)
        {
            string what   = message.head.what;
            Guid   userId = Guid.Parse(session.userId.ToString());


            #region edit
            if (what == "edit")
            {
                var relations = new List <dynamic>();
                var nodes     = new List <dynamic>();
                var tubeIds   = new List <Guid>();
                foreach (var rule in message.body.rules)
                {
                    string  action  = rule.action;
                    string  target  = rule.target;
                    dynamic content = rule.content;

                    if (target == TARGET_RELATION)
                    {
                        relations.Add(rule);
                    }
                    if (target == TARGET_NODE)
                    {
                        nodes.Add(rule);
                    }
                }

                var audit = new List <DataRecord>();

                var ids = new List <Guid>();

                //Удаление 1.Связей и 2.Нодов
                foreach (var rule in relations.Union(nodes))
                {
                    string action = rule.action;

                    if (action == ACTION_DEL)
                    {
                        string  target  = rule.target;
                        dynamic content = rule.content;

                        if (target == TARGET_RELATION)
                        {
                            Guid start = Guid.Parse(content.start.ToString());
                            Guid end   = Guid.Parse(content.end.ToString());
                            ids.Add(start);
                            ids.Add(end);
                            string  type = content.type;
                            dynamic body = content.body;
                            body.type = type;

                            var leftTubes  = StructureGraph.Instance.GetRelatedTubs(start);
                            var rightTubes = StructureGraph.Instance.GetRelatedTubs(end);

                            var relatedTubes = leftTubes.Union(rightTubes).Distinct();

                            //var relatedTubes = StructureGraph.Instance.GetRelatedTubs(end);

                            //if (action == ACTION_DEL)
                            {
                                StructureGraph.Instance.DelRelation(start, end, type, userId);
                                var st = StructureGraph.Instance.GetNodeById(start, userId);
                                var ed = StructureGraph.Instance.GetNodeById(end, userId);
                                if (st.type == "Folder" && ed.type == "Folder")
                                {
                                    audit.AddRange(MakeAudit(string.Format("группа {0} удалена из группы {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Folder" && ed.type == "Area")
                                {
                                    audit.AddRange(MakeAudit(string.Format("плошадка {0} удалена из группы {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "MatrixConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("контроллер матрикс {0} отвязан от объекта {1}", ed.imei, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "CsdConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("модем или контроллер СТЕЛ {0} отвязан от объекта {1}", ed.phone, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "LanConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("ethernet контроллер {0}:{1} отвязан от объекта {2}", ed.host, ed.port, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else
                                {
                                    audit.AddRange(MakeAudit(string.Format("удалено соединение {0} -> {1}", st.id, Guid.Parse(ed.id.ToString())), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                            }
                        }
                        else if (target == TARGET_NODE)
                        {
                            Guid id = Guid.Parse(content.id.ToString());

                            ids.Add(id);
                            string  type = content.type;
                            dynamic body = content.body;

                            //NamesCache.Instance.Update(body, userId);

                            if (type == "Tube")
                            {
                                tubeIds.Add(id);
                            }

                            var relatedTubes = StructureGraph.Instance.GetRelatedTubs(id);

                            {
                                StructureGraph.Instance.DelNode(id, type, userId);
                                //var st = StructureGraph.Instance.GetNodeById(start, userId);
                                //var ed = StructureGraph.Instance.GetNodeById(end, userId);
                                if (body.type == "Folder")
                                {
                                    audit.AddRange(MakeAudit(string.Format("группа {0} удалена", body.name), userId, relatedTubes, Guid.Parse(body.id.ToString())));
                                }
                                else
                                {
                                    audit.AddRange(MakeAudit(string.Format("нод {0} удален", body.id), userId, relatedTubes, Guid.Parse(body.id.ToString())));
                                }
                            }
                        }
                    }
                }

                //Добавление или Изменение 1.Нодов и 2.Связей
                foreach (var rule in nodes.Union(relations))
                {
                    string  action  = rule.action;
                    string  target  = rule.target;
                    dynamic content = rule.content;

                    if ((action == ACTION_ADD) || (action == ACTION_UPD))
                    {
                        if (target == TARGET_RELATION)
                        {
                            Guid start = Guid.Parse(content.start.ToString());
                            Guid end   = Guid.Parse(content.end.ToString());
                            ids.Add(start);
                            ids.Add(end);
                            string  type = content.type;
                            dynamic body = content.body;
                            body.type = type;

                            var leftTubes  = StructureGraph.Instance.GetRelatedTubs(start);
                            var rightTubes = StructureGraph.Instance.GetRelatedTubs(end);

                            var relatedTubes = leftTubes.Union(rightTubes).Distinct();

                            //var relatedTubes = StructureGraph.Instance.GetRelatedTubs(end);

                            if (action == ACTION_ADD)
                            {
                                StructureGraph.Instance.AddOrUpdRelation(start, end, type, body, userId);
                                var st = StructureGraph.Instance.GetNodeById(start, userId); //F4E311F5-35E6-4E35-90D5-BA85F1A315CB
                                var ed = StructureGraph.Instance.GetNodeById(end, userId);   //f4e311f5-35e6-4e35-90d5-ba85f1a315cb
                                if (st.type == "Folder" && ed.type == "Folder")
                                {
                                    audit.AddRange(MakeAudit(string.Format("группа {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Folder" && ed.type == "Area")
                                {
                                    audit.AddRange(MakeAudit(string.Format("плошадка {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "MatrixConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("контроллер матрикс {0} привязан к объекту {1}", ed.imei, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "CsdConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("модем или контроллер СТЕЛ {0} привязан к объекту {1}", ed.phone, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "LanConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("ethernet контроллер {0}:{1} привязан к объекту {2}", ed.host, ed.port, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else
                                {
                                    audit.AddRange(MakeAudit(string.Format("добавлено соединение {0} -> {1}", st.id, Guid.Parse(ed.id.ToString())), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                            }
                            else if (action == ACTION_UPD)
                            {
                                StructureGraph.Instance.AddOrUpdRelation(start, end, type, body, userId);
                                var st = StructureGraph.Instance.GetNodeById(start, userId);
                                var ed = StructureGraph.Instance.GetNodeById(end, userId);
                                if (st.type == "Folder" && ed.type == "Folder")
                                {
                                    audit.AddRange(MakeAudit(string.Format("группа {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Folder" && ed.type == "Area")
                                {
                                    audit.AddRange(MakeAudit(string.Format("плошадка {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "MatrixConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("контроллер матрикс {0} привязан к объекту {1}", ed.imei, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "CsdConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("модем или контроллер СТЕЛ {0} привязан к объекту {1}", ed.phone, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else if (st.type == "Tube" && ed.type == "LanConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("ethernet контроллер {0}:{1} привязан к объекту {2}", ed.host, ed.port, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                                else
                                {
                                    audit.AddRange(MakeAudit(string.Format("обновлено соединение {0} -> {1}", st.id, Guid.Parse(ed.id.ToString())), userId, relatedTubes, Guid.Parse(ed.id.ToString())));
                                }
                            }
                        }
                        else if (target == TARGET_NODE)
                        {
                            Guid id = Guid.Parse(content.id.ToString());

                            ids.Add(id);
                            string  type = content.type;
                            dynamic body = content.body;

                            //NamesCache.Instance.Update(body, userId);

                            if (type == "Tube")
                            {
                                tubeIds.Add(id);
                            }
                            else if (type == "Area")
                            {
                                if ((body as IDictionary <string, object>).ContainsKey("addr") && (body.addr is string) && ((body.addr as string) != null) && ((body.addr as string) != ""))
                                {
                                    body.city    = "";
                                    body.street  = "";
                                    body.house   = "";
                                    body.fiasid  = "";
                                    body.address = "";

                                    var response = api.QueryAddress(body.addr as string);
                                    if (response != null && response.suggestions.Count > 0)
                                    {
                                        var result = response.suggestions.FirstOrDefault().data;
                                        body.city    = result.city_with_type ?? "";
                                        body.street  = result.street_with_type ?? "";
                                        body.house   = result.house ?? "";
                                        body.fiasid  = result.house_fias_id ?? "";
                                        body.address = $"{body.city}, {body.street}, {body.house}";
                                    }
                                }
                            }

                            var relatedTubes = StructureGraph.Instance.GetRelatedTubs(id);

                            if (action == ACTION_ADD)
                            {
                                StructureGraph.Instance.AddNode(id, type, body, userId);

                                var ser = JsonConvert.SerializeObject(body).Replace(@"/""", "'");

                                if (body.type == "Folder")
                                {
                                    audit.AddRange(MakeAudit(string.Format("добавлена группа ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "Area")
                                {
                                    audit.AddRange(MakeAudit(string.Format("добавлена площадка учета ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "Tube")
                                {
                                    audit.AddRange(MakeAudit(string.Format("добавлена точка учета ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "CsdConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("добавлено модемное соединение ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "MatrixConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("добавлено соединение matrix ({0})", ser), userId, relatedTubes, id));
                                }
                                else
                                {
                                    audit.AddRange(MakeAudit(string.Format("добавлен объект {0}", ser), userId, relatedTubes, id));
                                }
                            }
                            else if (action == ACTION_UPD)
                            {
                                StructureGraph.Instance.UpdNode(id, type, body, userId);

                                var ser = JsonConvert.SerializeObject(body).Replace(@"/""", "'");

                                if (body.type == "Folder")
                                {
                                    audit.AddRange(MakeAudit(string.Format("обновлена группа ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "Area")
                                {
                                    audit.AddRange(MakeAudit(string.Format("обновлена площадка учета ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "Tube")
                                {
                                    audit.AddRange(MakeAudit(string.Format("обновлена точка учета ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "CsdConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("обновлено модемное соединение ({0})", ser), userId, relatedTubes, id));
                                }
                                else if (body.type == "MatrixConnection")
                                {
                                    audit.AddRange(MakeAudit(string.Format("обновлено соединение matrix ({0})", ser), userId, relatedTubes, id));
                                }
                                else
                                {
                                    audit.AddRange(MakeAudit(string.Format("обновлен объект {0}", ser), userId, relatedTubes, id));
                                }
                            }
                        }
                    }
                }

                foreach (var node in nodes)
                {
                    NamesCache.Instance.Update(node.content.body, userId);
                }

                Cache.Instance.SaveRecords(audit);
                RowsCache.Instance.UpdateRow(tubeIds, userId);

                ids.Distinct().ToList().ForEach(id => CacheRepository.Instance.Del("row", id));

                var sessions = CacheRepository.Instance.GetSessions();
                sessions.AsParallel().ForAll(s =>
                {
                    var ds = s as IDictionary <string, object>;
                    if (ds == null || !ds.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID) || ds[SignalRConnection.SIGNAL_CONNECTION_ID] == null)
                    {
                        return;
                    }

                    Guid uId       = Guid.Parse(s.userId.ToString());
                    dynamic msg    = Helper.BuildMessage("changes");
                    msg.body.rules = new List <dynamic>();
                    foreach (var rule in message.body.rules)
                    {
                        string target   = rule.target;
                        dynamic content = rule.content;
                        Guid id         = Guid.Empty;
                        if (target == TARGET_RELATION)
                        {
                            id = Guid.Parse(content.end.ToString());
                        }
                        else if (target == TARGET_NODE)
                        {
                            id = Guid.Parse(content.id.ToString());
                        }
                        if (id != Guid.Empty && StructureGraph.Instance.CanSee(id, uId))
                        {
                            msg.body.rules.Add(rule);
                        }
                    }
                    if (msg.body.rules.Count > 0)
                    {
                        var connectionId = ds[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                        SignalRConnection.RaiseEvent(msg, connectionId);
                    }
                });
            }

            #endregion

            if (what == "edit-get-connections")
            {
                string filter = message.body.filter;
                var    types  = new List <string>();
                foreach (string type in message.body.types)
                {
                    types.Add(type);
                }
                var  dbody   = message.body as IDictionary <string, object>;
                Guid startId = Guid.Empty;
                //if (dbody.ContainsKey("startId"))
                //{
                //    startId = Guid.Parse(message.body.startId.ToString());
                //}
                var answer = Helper.BuildMessage(what);
                //StructureGraph.Instance.GetNeightbours(startId, userId);
                answer.body.connections = StructureGraph.Instance.GetConnections(filter, types, userId);
                return(answer);
            }

            if (what == "edit-get-wave")
            {
                Guid startId = Guid.Parse(message.body.startId.ToString());
                var  answer  = Helper.BuildMessage(what);
                answer.body.wave = StructureGraph.Instance.GetNeightbours(startId, userId);
                return(answer);
            }

            if (what == "edit-get-devices")
            {
                var answer = Helper.BuildMessage(what);
                answer.body.devices = StructureGraph.Instance.GetDevices();
                return(answer);
            }

            if (what == "edit-get-fias")
            {
                var answer = Helper.BuildMessage(what);

                string queryText = "";
                if ((message.body as IDictionary <string, object>).ContainsKey("searchText"))
                {
                    queryText = message.body.searchText;
                }
                AddressSuggestQuery asquery = new AddressSuggestQuery(queryText);

                if ((message.body as IDictionary <string, object>).ContainsKey("searchFias"))
                {
                    string      queryFias = message.body.searchFias;
                    AddressData addrData  = new AddressData();
                    addrData.fias_id  = queryFias;
                    asquery.locations = new AddressData[] { addrData };
                }

                var response = api.QueryAddress(asquery);
                if (response == null)
                {
                    throw new Exception("Сервис подсказок недоступен");
                }

                var results = new List <dynamic>();
                foreach (var suggest in response.suggestions)
                {
                    dynamic result = new ExpandoObject();
                    result.value       = suggest.value;
                    result.fiasid      = suggest.data.fias_id;
                    result.fiaslvl     = suggest.data.fias_level;
                    result.housefiasid = suggest.data.house_fias_id;
                    results.Add(result);
                }
                answer.body.results = results;

                return(answer);
            }


            if (what == "edit-get-row")
            {
                var answer = Helper.BuildMessage(what);

                Guid id;
                if (message.body.isNew)
                {
                    answer.body.area      = new ExpandoObject();
                    answer.body.area.id   = Guid.NewGuid();
                    answer.body.area.type = "Area";
                    answer.body.tube      = new ExpandoObject();
                    answer.body.tube.id   = Guid.NewGuid();
                    answer.body.tube.type = "Tube";
                }
                else
                {
                    id = Guid.Parse(message.body.id.ToString());
                    answer.body.area      = StructureGraph.Instance.GetArea(id, userId);
                    answer.body.tube      = StructureGraph.Instance.GetTube(id, userId);
                    answer.body.areaIsNew = false;
                    if (answer.body.tube != null && answer.body.area == null)
                    {
                        answer.body.area      = new ExpandoObject();
                        answer.body.area.id   = Guid.NewGuid();
                        answer.body.area.type = "Area";
                        answer.body.areaIsNew = true;
                    }
                    answer.body.device = StructureGraph.Instance.GetTubeDevice(id, userId);
                    answer.body.Tube   = StructureGraph.Instance.GetHouseTubes(id, userId);
                    //answer.body.connections = StructureGraph.Instance.GetTubeConnections(id, userId);
                    answer.body.relations = StructureGraph.Instance.GetTubeRelations(id, userId);
                }

                answer.body.devices = StructureGraph.Instance.GetDevices();
                //answer.body.ports = StructureGraph.Instance.GetPollPorts(userId);
                return(answer);
            }

            //if (what == "edit-get-house")
            //{
            //    var answer = Helper.BuildMessage(what);

            //    Guid id;
            //    if (message.body.isNew)
            //    {
            //        answer.body.area = new ExpandoObject();
            //        answer.body.area.id = Guid.NewGuid();
            //        answer.body.area.type = "Area";
            //        answer.body.tube = new ExpandoObject();
            //        answer.body.tube.id = Guid.NewGuid();
            //        answer.body.tube.type = "Tube";
            //    }
            //    else
            //    {
            //        id = Guid.Parse(message.body.id.ToString());
            //        answer.body.area = StructureGraph.Instance.GetArea(id, userId);
            //        answer.body.tube = StructureGraph.Instance.GetTube(id, userId);
            //        answer.body.device = StructureGraph.Instance.GetTubeDevice(id, userId);
            //        answer.body.relations = StructureGraph.Instance.GetTubeRelations(id, userId);
            //    }

            //    return answer;
            //}

            if (what == "edit-get-folder")
            {
                var answer = Helper.BuildMessage(what);

                Guid id;
                if (message.body.isNew)
                {
                    answer.body.folderNew      = new ExpandoObject();
                    answer.body.folderNew.id   = Guid.NewGuid();
                    answer.body.folderNew.type = "Folder";
                    //answer.body.connections = new List<object>();
                }

                if (message.body.id != null)
                {
                    id = Guid.Parse(message.body.id.ToString());
                    dynamic pack = StructureGraph.Instance.GetFolder(id, userId);
                    answer.body.folder = pack.folder;
                    answer.body.parent = pack.parent;
                }

                return(answer);
            }

            if (what == "edit-get-folder-id")
            {
                var folderId = Guid.Parse((string)message.body.id);
                //
                var folder = StructureGraph.Instance.GetFolderById(folderId, userId);
                //
                var answer = Helper.BuildMessage(what);
                answer.body.folder = folder;
                return(answer);
            }

            if (what == "edit-get-folders-id")
            {
                var folders = new List <dynamic>();
                foreach (string sid in message.body.ids)
                {
                    var folderId = Guid.Parse(sid);
                    var folder   = StructureGraph.Instance.GetFolderById(folderId, userId);
                    folders.Add(folder);
                }

                var answer = Helper.BuildMessage(what);
                answer.body.folders = folders;
                return(answer);
            }

            if (what == "edit-get-branch")
            {
                var  answer = Helper.BuildMessage(what);
                Guid id     = Guid.Parse(message.body.id.ToString());
                answer.body.branch = StructureGraph.Instance.GetServerBranch(id, userId);
                return(answer);
            }

            if (what == "edit-get-area-id")
            {
                var  answer = Helper.BuildMessage(what);
                Guid id     = Guid.Parse(message.body.id.ToString());
                answer.body.areaId = StructureGraph.Instance.GetIdAreaForTube(id, userId);
                return(answer);
            }

            if (what == "edit-get-area")
            {
                var  answer = Helper.BuildMessage(what);
                Guid id     = Guid.Parse(message.body.id.ToString());
                answer.body.area = StructureGraph.Instance.GetArea(id, userId);
                return(answer);
            }

            if (what == "edit-get-name-area")
            {
                var answer = Helper.BuildMessage(what);
                var ids    = message.body.ids;
                var areas  = new List <string>();
                foreach (var id in ids)
                {
                    Guid guid = Guid.Parse(id.ToString());
                    var  area = StructureGraph.Instance.GetArea(guid, userId);
                    if (area != null)
                    {
                        areas.Add(area.name);
                    }
                }
                answer.body.areas = areas.ToArray();
                return(answer);
            }

            if (what == "edit-get-tasks")
            {
                var answer = Helper.BuildMessage(what);
                var tasks  = StructureGraph.Instance.GetNodesByType("Task", Guid.Parse(session.userId.ToString()));
                answer.body.tasks = tasks;
                return(answer);
            }

            if (what == "edit-delate-tube")
            {
                var answer = Helper.BuildMessage(what);
                if (message.body.objectIds == null)
                {
                    return(answer);
                }
                List <Guid> listObjectIds = new List <Guid>();
                foreach (var objectId in message.body.objectIds)
                {
                    Guid id = Guid.Parse(objectId.ToString());
                    StructureGraph.Instance.DelAllRelationObjects(id, userId);
                    if (StructureGraph.Instance.DelObject(id, userId))
                    {
                        listObjectIds.Add(id);
                    }
                }
                if (listObjectIds.Any())
                {
                    Data.Cache.Instance.DeleteRow(listObjectIds);
                }
            }

            if (what == "edit-disable-tube")
            {
                Guid id   = Guid.Parse(message.body.id.ToString());
                var  tube = StructureGraph.Instance.GetTube(id, userId);
                tube.isDisabled = true;
                StructureGraph.Instance.UpdNode(id, "Tube", tube, userId);

                NamesCache.Instance.Update(tube, userId);
            }

            return(Helper.BuildMessage(what));
        }
        public int RemoveConnections(SignalRConnection con)
        {
            var Connection = _signalrRepo.GetAll().SingleOrDefault(c => c.ConnectionId == con.ConnectionId && c.ApplicationUserId == con.ApplicationUserId);

            return(_signalrRepo.Delete(Connection));
        }
 public string AddNewConnections(SignalRConnection con)
 {
     return(_signalrRepo.Insert(con).ConnectionId);
 }
Beispiel #26
0
 private void SendTimespan(TrackTimespan timeSpan)
 {
     SignalRConnection.Notify(new Message <TrackTimespan>(timeSpan, MessageType.ProgressTimer));
 }
        public async Task <dynamic> Handle(dynamic session, dynamic message)
        {
            string what   = message.head.what;
            Guid   userId = Guid.Parse(session.userId.ToString());

            if (false && !session.IsSuperUser)
            {
                var ans = Helper.BuildMessage(what);
                ans.body.message = "недостаточно прав";
                return(ans);
            }

            if (what == "managment-get-sessions")
            {
                var ans = Helper.BuildMessage(what);
                ans.body.sessions = new List <dynamic>();

                return(ans);
            }

            if (what == "managment-pollserver-reset")
            {
                var serverName = message.body.serverName;
                var sessions   = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    var dsession = sess as IDictionary <string, object>;
                    if (!dsession.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = dsession[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(message, connectionId);
                }
                var ans = Helper.BuildMessage(what);
                ans.body.message = string.Format("перезагрузка сервера {0} уведомлено {1} клиентов", serverName, sessions.Count());
                return(ans);
            }

            if (what == "managment-service-operation")
            {
                var ans = Helper.BuildMessage(what);
                ans.body.message = "недостаточно прав";

                if ((message is IDictionary <string, object>) && (message as IDictionary <string, object>).ContainsKey("body") && (message.body is IDictionary <string, object>))
                {
                    IDictionary <string, object> dbody = message.body as IDictionary <string, object>;
                    string password = ConfigurationManager.AppSettings["servicePassword"];

                    string operationName   = null;
                    string operationAction = null;
                    string successMessage  = null;
                    if (dbody.ContainsKey("operation") && (message.body.operation is string) && (message.body.operation != null) && (message.body.operation != ""))
                    {
                        operationName   = message.body.operation;
                        operationAction = ConfigurationManager.AppSettings["operation_" + operationName];
                        successMessage  = ConfigurationManager.AppSettings["message_" + operationName];

                        if (operationAction == null)
                        {
                            ans.body.message = "не найдена соответствующая операция в конфигурационном файле";
                        }
                        else if (successMessage == null || successMessage == "")
                        {
                            successMessage = string.Format("выполняется сервисная операция: {0}", ans.body.operation);
                        }
                    }
                    else
                    {
                        operationName   = "serviceOperation";
                        operationAction = ConfigurationManager.AppSettings["serviceOperation"];
                        successMessage  = "производится рестарт сервера";
                    }

                    if (password != null &&
                        operationAction != null &&
                        operationAction != "" &&
                        dbody.ContainsKey("password") &&
                        (message.body.password is string) &&
                        (password == message.body.password))
                    {
                        ans.body.message = successMessage;
                        Process.Start(operationAction);

                        //Process myProcess = new Process();
                        //myProcess.StartInfo.FileName = "cmd.exe";
                        //myProcess.StartInfo.Arguments = string.Format(@"/C cd {0} & {1}", Environment.CurrentDirectory, operation);
                        //myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                        //myProcess.StartInfo.CreateNoWindow = true;
                        //myProcess.Start();
                    }
                }

                return(ans);
            }

            if (what == "managment-rebuild-cache")
            {
                var diagnos = "";
                var sw      = new Stopwatch();
                //параметры
                sw.Start();
                var parameters = StructureGraph.Instance.GetAllParameters(userId);
                foreach (var par in parameters)
                {
                    CacheRepository.Instance.SaveParameter(par.tubeId, par);
                }
                sw.Stop();
                diagnos += string.Format("параметры перестроены за {0} мс;", sw.ElapsedMilliseconds);


                var result = new List <dynamic>();

                sw.Restart();
                var       ids  = StructureGraph.Instance.GetRowIds("", new Guid[] { }, userId);
                var       rows = new List <dynamic>();
                const int step = 100;
                for (var offset = 0; offset < ids.Count(); offset += step)
                {
                    rows.AddRange(StructureGraph.Instance.GetRows(ids.Skip(offset).Take(step), userId));
                }
                foreach (var row in rows)
                {
                    var id = Guid.Parse(row.id.ToString());
                    CacheRepository.Instance.Set("row", id, row);
                    //CacheRepository.Instance.SetLocal("row", id, row);
                }
                sw.Stop();
                diagnos += string.Format("строки перестроены за {0} мс;", sw.ElapsedMilliseconds);

                var ans = Helper.BuildMessage(what);
                ans.body.message = diagnos;
                return(ans);
            }

            if (what == "managment-kill-com")
            {
                string port = message.body.port;

                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    var dsession = sess as IDictionary <string, object>;
                    if (!dsession.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = dsession[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(message, connectionId);
                }
                var ans = Helper.BuildMessage(what);
                ans.body.message = string.Format("убийство ком порта {0}", port);
                return(ans);
            }

            if (what == "managment-ping")
            {
                var ans = Helper.BuildMessage("managment-pong");
                if ((message as IDictionary <string, object>).ContainsKey("body") && (message.body is IDictionary <string, object>) && (message.body as IDictionary <string, object>).ContainsKey("message") && (message.body.message is string) && (message.body.message != ""))
                {
                    log.Info(string.Format("сообщение пинг: {0}", message.body.message));
                }
                return(ans);
            }

            if (what == "managment-test")
            {
                string[] objectIds = new string[] { "15739db6-d683-45fa-92ff-7d6ff37ae2a1" };
                dynamic  test      = new ExpandoObject();
                test.head                = new ExpandoObject();
                test.head.what           = "poll";
                test.body                = new ExpandoObject();
                test.body.objectIds      = objectIds;
                test.body.auto           = false;
                test.body.arg            = new ExpandoObject();
                test.body.arg.cmd        = "";
                test.body.arg.components = "Current:3;";
                test.body.arg.logLevel   = "1";
                test.body.arg.onlyHoles  = false;

                var sessions = CacheRepository.Instance.GetSessions();
                foreach (var sess in sessions)
                {
                    if (sess.id == session.id)
                    {
                        continue;
                    }
                    var bag = sess as IDictionary <string, object>;
                    if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                    {
                        continue;
                    }
                    var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                    SignalRConnection.RaiseEvent(test, connectionId);
                }
            }

            return(Helper.BuildMessage(what));
        }
        public void Handle(IEnumerable <Domain.Entities.DataRecord> db_records, Guid userId)
        {
            long paramsTime = 0;
            long statesTime = 0;

            var sw = new Stopwatch();

            sw.Start();

            //

            //Кэш событий
            dynamic events        = null;
            var     eventsUpdated = new List <dynamic>();

            // УСТАВКИ - Минимум, Максимум по ТЕКУЩИМ

            var groups = db_records.Where(r => setpointTypes.Contains(r.Type)).GroupBy(r => r.ObjectId).Select(g => new { objectId = g.Key, records = g.Select(r => r).Distinct() });   // группировка архивных+текущих значений по объектам

            //var userId = StructureGraph.Instance.GetRootUser();
            foreach (var group in groups)                                                                       // для каждого объекта:
            {
                if (!group.records.Any())
                {
                    continue;                                                                                   // проверка наличия записей
                }
                var parameters = CacheRepository.Instance.GetParameters(group.objectId);                        // получаем все параметры

                //Кэш статусов
                dynamic states = CacheRepository.Instance.Get("setpoint", group.objectId);                    // инициализация кэша
                //dynamic states = CacheRepository.Instance.GetLocal("setpoint", group.objectId);
                if (states == null)
                {
                    states = new ExpandoObject();
                }
                bool statesUpdate = false;                                                                      // флаг записи в кэш
                var  dstates      = states as IDictionary <string, object>;


                foreach (var record in group.records)                                                           // (текущие) записи для объекта
                {
                    if (record.D1 == null)
                    {
                        continue;
                    }

                    var sw2 = new Stopwatch();
                    sw2.Start();

                    if (record.Type == "Abnormal" && record.D1 != null && record.D1 == 1)
                    {
                        sw2.Stop();
                        paramsTime += sw2.ElapsedMilliseconds;

                        var sw3 = new Stopwatch();
                        sw3.Start();

                        // вычислить значение
                        var value = record.D1;
                        var unit  = record.S2;
                        var date  = record.Date.ToUniversalTime();
                        var dt1   = ((DateTime)record.Dt1).ToUniversalTime();

                        dynamic state = new ExpandoObject();
                        state.bad = true;


                        if (events == null)
                        {
                            events = CacheRepository.Instance.Get("setpoint-event");                                // инициализация кэша
                                                                                                                    //events = CacheRepository.Instance.GetLocal("setpoint-event");
                            if (events == null)
                            {
                                events = new ExpandoObject();
                            }
                        }
                        var devents = events as IDictionary <string, object>;

                        var     key = string.Format("{0}-{1}-{2}", group.objectId.ToString(), record.S1, date.ToString());
                        dynamic ev  = null;

                        if (!devents.ContainsKey(key))
                        {
                            ev          = new ExpandoObject();
                            ev.id       = null;
                            ev.objectId = group.objectId;
                            ev.param    = record.S1;
                            ev.start    = date;
                            ev.end      = null;
                            ev.message  = record.S2;
                        }
                        else
                        {
                            ev = devents[key];
                        }

                        eventsUpdated.Add(ev);
                        devents[key] = ev;
                        state.bad    = true;

                        state.value = value;
                        state.unit  = unit;
                        state.date  = date;
                        state.dt1   = dt1;

                        dstates[record.S1] = state;
                        statesUpdate       = true;

                        sw3.Stop();
                        statesTime += sw3.ElapsedMilliseconds;
                    }
                    else
                    {
                        // взять у каждой записи параметр
                        var par  = parameters.Where(p => p.name == record.S1).Select(p => p).FirstOrDefault();
                        var dpar = par as IDictionary <string, object>;

                        // узнать, есть ли тег и уставки
                        if (par == null || !dpar.ContainsKey("tag"))
                        {
                            continue;                                          // параметр должен быть теггирован
                        }
                        //TODO сравнение date с предыдущим, т.к интересуют только последние по времени record

                        //dynamic current = new ExpandoObject();  // текущие

                        var min = ParseDoubleParameter(par, "min");
                        var max = ParseDoubleParameter(par, "max");
                        //var minNigth = ParseDoubleParameter(par, "minNight");
                        //var maxNight = ParseDoubleParameter(par, "maxNight");

                        sw2.Stop();
                        paramsTime += sw2.ElapsedMilliseconds;

                        if ((min == null) && (max == null))
                        {
                            continue;                                 // есть уставка?
                        }
                        var sw3 = new Stopwatch();
                        sw3.Start();


                        double init = 0.0;
                        if (!dpar.ContainsKey("init") || !Double.TryParse(par.init.ToString(), out init))
                        {
                            init = 0.0;
                        }

                        double k = 1.0;
                        if (!dpar.ContainsKey("k") || !Double.TryParse(par.k.ToString(), out k))
                        {
                            k = 1.0;
                        }

                        // вычислить значение
                        var value = init + record.D1 * k;
                        var unit  = record.S2;
                        var date  = record.Date.ToUniversalTime();
                        var dt1   = record.Dt1 == null ? DateTime.MinValue : ((DateTime)record.Dt1).ToUniversalTime();

                        dynamic state;
                        if (!dstates.ContainsKey(par.tag))
                        {
                            state     = new ExpandoObject();
                            state.bad = false;
                        }
                        else
                        {
                            state = dstates[par.tag];
                            //проверка даты на прошедшее время
                            if (date < state.date)
                            {
                                continue;
                            }
                        }


                        // проверить на выход за уставку
                        // получаем статус: хорошо-плохо
                        var bad = (value <= min) || (value >= max);

                        // смотрим: если статус изменился, то рождается событие
                        if (state.bad != bad)
                        {
                            if (events == null)
                            {
                                events = CacheRepository.Instance.Get("setpoint-event");                                // инициализация кэша
                                                                                                                        //events = CacheRepository.Instance.GetLocal("setpoint-event");
                                if (events == null)
                                {
                                    events = new ExpandoObject();
                                }
                            }
                            var devents = events as IDictionary <string, object>;

                            var     key = string.Format("{0}-{1}", group.objectId.ToString(), par.tag);
                            dynamic ev  = null;

                            if (!devents.ContainsKey(key))
                            {
                                ev          = new ExpandoObject();
                                ev.id       = null;
                                ev.objectId = group.objectId;
                                ev.param    = par.tag;
                                ev.start    = null;
                                ev.end      = null;
                                ev.message  = "";
                            }
                            else
                            {
                                ev = devents[key];
                            }


                            //ухудшение = новое событие
                            if (bad == true)
                            {
                                ev.start = date;
                                ev.end   = null;
                                var message = string.Format("Выход за уставки {0}={1}{2} {3}{4}",
                                                            par.tag, value, unit,
                                                            min == null ? "" : string.Format("(min={0})", min),
                                                            max == null ? "" : string.Format("(max={0})", max)
                                                            );

                                if (!dpar.ContainsKey("alertMsg") || (par.alertMsg == ""))
                                {
                                    ev.message = message;
                                }
                                else
                                {
                                    ev.message = par.alertMsg;
                                }

                                log.Info(string.Format("{0:dd HH:mm:ss} началось событие tp={1}: {2}", date, key.Substring(32), ev.message));
                            }
                            else
                            {
                                var message = string.Format("{0}={1}{2}{3}{4}",
                                                            par.tag, value, unit,
                                                            min == null ? "" : string.Format(" мин.={0}", min),
                                                            max == null ? "" : string.Format(" макс.={0}", max)
                                                            );
                                ev.end = date.ToUniversalTime();
                                log.Info(string.Format("{0:dd HH:mm:ss} закончилось событие tp={1}: {2} при {3}", date, key.Substring(32), ev.message ?? "неизвестное событие", message));
                            }

                            eventsUpdated.Add(ev);
                            devents[key] = ev;
                            state.bad    = bad;
                        }
                        state.value = value;
                        state.unit  = unit;
                        state.date  = date;
                        state.dt1   = dt1;

                        dstates[par.tag] = state;
                        statesUpdate     = true;

                        sw3.Stop();
                        statesTime += sw3.ElapsedMilliseconds;
                    }
                }

                if (statesUpdate == true)
                {
                    CacheRepository.Instance.Set(states, "setpoint", group.objectId);
                }
            }

            // ... ЕЩЕ СОБЫТИЯ

            // Обработка событий

            if (eventsUpdated.Count > 0)
            {
                // сохранение кэша событий
                CacheRepository.Instance.Set(events, "setpoint-event");

                var sessions = CacheRepository.Instance.GetSessions();

                // оповещение
                sessions.ToList().ForEach(session =>
                {
                    try
                    {
                        var bag = session as IDictionary <string, object>;
                        if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID))
                        {
                            //log.Debug(string.Format("сессия {0} не содержит сигналр подписки", session.id));
                            return;
                        }

                        dynamic eventsMessage     = Helper.BuildMessage("setpoint");
                        eventsMessage.body.events = eventsUpdated.ToArray();

                        log.Debug(string.Format("отправка событий {0} шт, сессия {1}", eventsUpdated.Count, session.id));

                        var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString();
                        SignalRConnection.RaiseEvent(eventsMessage, connectionId);
                    }
                    catch (Exception ex)
                    {
                        log.Error(string.Format("сессия {0} битая", session.id), ex);
                    }
                });


                // запись в базу SQL
                try
                {
                    var data = new List <dynamic>();

                    foreach (var ev in eventsUpdated)
                    {
                        dynamic record = new ExpandoObject();
                        record.id       = Guid.NewGuid().ToString();
                        record.date     = ev.start;
                        record.type     = DataRecordTypes.EventType.Name;
                        record.objectId = ev.objectId.ToString();
                        record.s1       = ev.param;
                        record.s2       = ev.message;
                        record.dt1      = DateTime.Now;
                        if (ev.end == null)
                        {
                            record.i1 = 1;
                        }
                        else
                        {
                            record.i1  = 0;
                            record.dt2 = ev.end;
                        }
                        data.Add(record);
                    }

                    //

                    var records = new List <DataRecord>();
                    foreach (var raw in data)
                    {
                        records.Add(EntityExtensions.ToRecord(raw));
                    }

                    if (records.Count > 0)
                    {
                        RecordAcceptor.Instance.Save(records);
                    }
                }
                catch (Exception ex)
                {
                    log.Error(string.Format("не удалось сохранить {0} событий в SQL DB", eventsUpdated.Count), ex);
                }
            }

            //

            sw.Stop();
            log.Info(string.Format("обработчик уставок принял {0} записей за {1} мс: параметры={2} уставки={3}", db_records.Count(), sw.ElapsedMilliseconds, paramsTime, statesTime));


            //if (events.Any())
            //{
            //}
        }
Beispiel #29
0
 public void DeleteConnection(SignalRConnection connection)
 {
     _repository.Delete(connection);
 }
Beispiel #30
0
        private void Run(string[] args)
        {
            // Creating this from static causes an exception in Raspian. Not in ubunti though?
            Log = LogManager.GetCurrentClassLogger();
            var options = new ConsoleOptions(args);

            if (options.ShowHelp)
            {
                Console.WriteLine("Options:");
                options.OptionSet.WriteOptionDescriptions(Console.Out);
                return;
            }

            var deviceFactory   = new Pca9685DeviceFactory();
            var device          = deviceFactory.GetDevice(options.UseFakeDevice);
            var motorController = new PwmController(device);

            motorController.Init();

            Log.InfoFormat("RPi.Console running with {0}", options);

            switch (options.Mode)
            {
            case Mode.DcMotor:
                RunDcMotor(motorController);
                break;

            case Mode.Servo:
                RunServo(motorController);
                break;

            case Mode.Stepper:
                motorController.Stepper.Rotate(600);
                break;

            case Mode.Led:
                RunLed(motorController);
                break;

            case Mode.RawPwm:
                RunRawPwm(device);
                break;

            case Mode.AlarmClock:
                var alarmClock = new AlarmClock(motorController);
                alarmClock.Set(options.AlarmDate);
                alarmClock.WaitForAlarm();
                break;

            case Mode.SignalRTest:
                var signalRConnection = new SignalRConnection(motorController);
                signalRConnection.Run();
                break;
            }

            motorController.AllStop();
            deviceFactory.Dispose();

            //http://nlog-project.org/2011/10/30/using-nlog-with-mono.html
            // NLog.LogManager.Configuration = null;
        }