public DevicesController(
            IDeviceCommunicationService deviceCommunicationService,
            DeviceCommunicationExtJsWeb.GpsCommunicationService.IGpsCommunicationContract gpsCommunicationContract,
            
            IDeviceRepository deviceRepository,
            IPacketRepository packetRepository,
            IEventRepository eventRepository,
            ICurrentEventRepository currentEventRepository,
            IRequstAckCommandRepository requstAckCommandRepository,
            ICacheDataRepository cacheDataRepository,
            
            IDeviceStateDocuments deviceStateDocuments,
            
            IDailyMileageRepository dailyMileageRepository,
            IGeoPointRepository geoPointRepository,
            ILogDocuments logDocuments)
        {
            DeviceCommunicationService = deviceCommunicationService;

            DeviceRepository = deviceRepository;
            PacketRepository = packetRepository;
            EventRepository = eventRepository;
            CurrentEventRepository = currentEventRepository;
            RequstAckCommandRepository = requstAckCommandRepository;
            CacheDataRepository = cacheDataRepository;

            DeviceStateDocuments = deviceStateDocuments;

            GpsCommunicationContract = gpsCommunicationContract;

            DailyMileageRepository = dailyMileageRepository;
            GeoPointRepository = geoPointRepository;

            LogDocuments = logDocuments;
        }
        static EventMessage getCurrentEvent(string imei, string machineName, IEventRepository eventRepository, ICurrentEventRepository currentEventRepository)
        {
            EventMessage latesEventMsg = null;
            CurrentEvent currentEvent = currentEventRepository.Get(new CurrentEventId { Imei = imei, StateMachine = machineName });

            if (currentEvent != null)
            {
                latesEventMsg = eventRepository.Get(currentEvent.EventId);
            }
            else
            {
                latesEventMsg = eventRepository.GetCurrentEvent(imei, machineName);
            }

            return latesEventMsg;
        }
        public static void LoadState(this DeviceViewModel dvm, IEventRepository eventRepository, ICurrentEventRepository currentEventRepository)
        {
            var currentEventMsg = getCurrentEvent(dvm.Imei, VehicleController.Name, eventRepository, currentEventRepository);
            if (currentEventMsg != null)
            {
                dvm.VehicleState = currentEventMsg.TargetState;
            }

            currentEventMsg = getCurrentEvent(dvm.Imei, DeviceModeController.Name, eventRepository, currentEventRepository);
            if (currentEventMsg != null)
            {
                dvm.ModeState = currentEventMsg.TargetState;
            }

            currentEventMsg = getCurrentEvent(dvm.Imei, Silent1Controller.Name, eventRepository, currentEventRepository);
            if (currentEventMsg != null)
            {
                dvm.Silent1State = currentEventMsg.TargetState;
            }

            currentEventMsg = getCurrentEvent(dvm.Imei, ObdBlackoutController.Name, eventRepository, currentEventRepository);
            if (currentEventMsg != null)
            {
                dvm.ObdBlackoutState = currentEventMsg.TargetState;
            }

            currentEventMsg = getCurrentEvent(dvm.Imei, MismatchVinController.Name, eventRepository, currentEventRepository);
            if (currentEventMsg != null)
            {
                dvm.MismatchVinState = currentEventMsg.TargetState;
            }

            currentEventMsg = getCurrentEvent(dvm.Imei, TcpHangingController.Name, eventRepository, currentEventRepository);
            if (currentEventMsg != null)
            {
                dvm.TcpHangingState = currentEventMsg.TargetState.Replace("Pull", "Polling");
            }
        }