Esempio n. 1
0
        public GenerateOCRLib(APPLICATION_DATA appData, string srcDir, string outDir)
        {
            m_AppData = appData;
            m_LPREngine = (LPREngine)m_AppData.LPREngine;
            m_LPR_C_Lib = m_LPREngine.m_LPRFuntions;

            m_SourceDirectory = srcDir;

            m_DesitnationDirectory = outDir;
            m_DestinationFile = m_SourceDirectory + "\\OCR_charLib.h";
        }
Esempio n. 2
0
        public void StartRegistration()
        {
            m_LPREngine = (LPREngine)m_AppData.LPREngine;

            for (int c = 0; c < m_NumberChannels; c++)
            {

                try
                {
                    m_CurrentImageQ[c] = new ThreadSafeQueue<FRAME>(3);
                    m_FrameGenerator.RegisterToConsumeChannel(m_ConsumerID, c, (FrameGenerator.NotificationOfNewFrameReady)NewImageCallBack);

                    m_CurrentPlateNumberQ[c] = new ThreadSafeQueue<FRAME>(3);
                    m_LPREngine.OnNewUnfilteredPlateEvent += new LPREngine.NewPlateEvent(m_LPREngine_OnNewPlateEvent); // get unfiltered plate readings for user display
                }

                catch (Exception ex) { m_Log.Trace(ex, ErrorLog.LOG_TYPE.FATAL); }

            }
        }
        public AnalystsWorkstationMainForm()
        {
            InitializeComponent();

            m_LPRCore = new LPRServiceEntryPoint();
            m_AppData = m_LPRCore.GetAppData();

            this.Text = "First Evidence Plate Analysts Workstation, version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

            ///
            ///    enable LPR Diagnostics
            ///

            if (Application.ExecutablePath.Contains("Visual Studio")) // assumes I am debugging on Vista
            {
                m_AppData.LPRDiagEnabled = true;
            }
            else
            {
                m_AppData.LPRDiagEnabled = false;
            }

            m_AppData.LPRDiagEnabled = false;

            //  Remove Diagnostic tabs if not in diag mode

            if (!m_AppData.LPRDiagEnabled)
            {
                tabControlMain.TabPages.Remove(tabPageLPRDiagnostics);
                tabControlMain.TabPages.Remove(tabPageOCRLib);
            }
            else
            {
                OCRSourceFolder = UserSettings.Get(UserSettingTags.AW_OCRLibSourceDirectory);
                labelOCRSourceFolder.Text = OCRSourceFolder;

                OCRDestinationFolder = UserSettings.Get(UserSettingTags.AW_OCRLibDestinationDirectory);
                labelOCRDestinationFolder.Text = OCRDestinationFolder;
            }

            //// need some channel names assigned as place holders, off-line processing simulates hardware channels to the rest of the chain

            //for (int i = 0; i < m_AppData.MAX_VIRTUAL_CHANNELS; i++)
            //    UserSettings.Set(UserSettingTags.ChannelNames.Name(i), i.ToString());

            // allow parallel processing based on the number of cores. The ProcessorCount returns the number of cores

            m_AppData.MAX_VIRTUAL_CHANNELS = Math.Min(Environment.ProcessorCount,m_AppData.MAX_PHYSICAL_CHANNELS);

            m_DataGridRowIndex = new ThreadSafeHashTable(m_AppData.MAX_MOVIE_FILES_TO_LOAD);

            m_AppData.MoviePlayerParentForm = (object)this;

            m_AppData.RunninAsService = false;

            m_LPRCore.Start(m_AppData.RunninAsService);

            m_LPREngine = (LPREngine)m_AppData.LPREngine;
            m_LPREngine.OnNewFilteredPlateGroupEvent += new LPREngine.NewPlateEvent(m_LPREngine_OnNewPlateEvent);

            m_Log = (ErrorLog)m_AppData.Logger;

            m_FrameGenerator = (FrameGenerator)m_AppData.FrameGenerator;

            this.FormClosing += new FormClosingEventHandler(AnalystsWorkstationMainForm_FormClosing);

            m_PathManager = (PATHS)m_AppData.PathManager;
            m_DVR = (DVR)m_AppData.DVR;

            m_SmartSearchUC = new SmartSearchLibUC(m_AppData, OnSearchFatalError);

            m_SmartSearchUC.Location = new Point(0, 0);
            m_SmartSearchUC.Dock = DockStyle.Fill;

            CreateBatchModeVideoDisplayPanels();
            m_FrameGenerator.MovieFileController.DisplayPanels = m_VideoDisplayPanels;

            m_FrameGenerator.MovieFileController.OnStatusUpdateFromPlayerEvent += new MovieFiles.OnStatusUpdateFromPlayer(MovieFileController_OnStatusUpdateFromPlayerEvent);
            tabPageSearch.Controls.Add(m_SmartSearchUC);

            InitMainContainerGrid(dataGridViewFilesInProcess, new System.Drawing.Size(761, 200), new System.Drawing.Point(273, 483));

            m_EditModePictureSelectionViewer = new ListView();
            m_EditModePictureSelectionViewer.Location = new Point(219, 200);
            m_EditModePictureSelectionViewer.View = View.LargeIcon;
            m_EditModePictureSelectionViewer.Size = new Size(this.Size.Width - 275, this.Size.Height - 300);
            m_EditModePictureSelectionViewer.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(m_EditModePictureSelectionViewer_ItemSelectionChanged);
            buttonListViewVisible.Text = m_ShowThumbNails;

            m_EditModePictureSelectionViewer.Enabled = false;
            m_EditModePictureSelectionViewer.Visible = false;
            m_EditModePictureSelectionViewer.SendToBack();

            tabPageEditMode.Controls.Add(m_EditModePictureSelectionViewer);

            tabControlLPRResults.TabPages.Clear();

            // get DVR storage mode for the batch and edit mode processing

            string sm = UserSettings.Get(UserSettingTags.DVR_StorageMode);
            if (sm != null)
            {
                if (sm.Contains(UserSettingTags.DVR_StorageModeValueStoreOnMotion))
                {
                    m_AppData.DVRMode = APPLICATION_DATA.DVR_MODE.STORE_ON_MOTION;

                    radioButtonStoreOnMotion.Checked = true;
                    radioButtonStoreOnPlate.Checked = false;
                }
                else
                {
                    radioButtonStoreOnMotion.Checked = false;
                    radioButtonStoreOnPlate.Checked = true;
                    m_AppData.DVRMode = APPLICATION_DATA.DVR_MODE.STORE_ON_PLATE_FOUND;
                }
            }
            else
            {
                radioButtonStoreOnMotion.Checked = false;
                radioButtonStoreOnPlate.Checked = true;
                m_AppData.DVRMode = APPLICATION_DATA.DVR_MODE.STORE_ON_PLATE_FOUND;
            }

            // by default, store batch outputs to repository

            radioToRepository.Checked = true;
            radioButtonToUserSpecifiedStorage.Checked = false;
            m_AppData.DVR_StoreToUserSpecifiedFolder = false;

            // now see if the user has previously chosen to store to specific folder -- get the user specified (if present) storage path for batch and edit mode processing

            string p = UserSettings.Get(UserSettingTags.DVR_UserSpecifiedStoragePath);
            if (p != null)
            {
                if (p.Contains(UserSettingTags.BOOL_TRUE))
                {
                    // the user want the batch processing results to go to a special folder and not the repository

                    radioToRepository.Checked = false;
                    string s = UserSettings.Get(UserSettingTags.DVR_UserSpecifiedStoragePath);
                    if (s == null)
                    {
                        // error condition, the config setting says use userspecfifiedstorage, but the path is not there

                        UserSettings.Set(UserSettingTags.DVR_StoreToUserSpecifiedFolder, UserSettingTags.BOOL_FALSE);
                        radioButtonToUserSpecifiedStorage.Checked = false;
                        string drive = null;

                        if (m_PathManager.Drive == null)
                            drive = "No repository found";
                        else
                            drive = m_PathManager.Drive;

                        textBoxUserSpecifiedStorageLocation.Text = drive;
                    }
                    else
                    {
                        // the good condition, all as it should be
                        m_AppData.DVR_UserSpecifiedStoragePath = s;

                        textBoxUserSpecifiedStorageLocation.Text = s;
                    }
                }
                else
                {
                    // the auto condition, use the DVRSTORAGE default storage area to put images and results into

                    radioButtonToUserSpecifiedStorage.Checked = false;
                    string drive = null;

                    if (m_PathManager.Drive == null)
                    {
                        // if the user has configured a standard repository, then create one in the default user data folder
                        string dirPath = Application.UserAppDataPath + "\\DVRSTORAGE";
                        if (!Directory.Exists(dirPath))
                        {
                            Directory.CreateDirectory(Application.UserAppDataPath + "\\DVRSTORAGE");
                        }

                        drive = m_PathManager.Drive;
                    }
                    else
                    {
                        drive = m_PathManager.Drive;
                    }

                    textBoxUserSpecifiedStorageLocation.Text = drive;
                }
            }

            // display to the user the time stamps from the processed images so that user has a clue where to find
            //  this images when searching in the search tool
            {
                int consumerID = ((FrameGenerator)m_AppData.FrameGenerator).GetNewConsumerID();
                int maxChannels = ((FrameGenerator)m_AppData.FrameGenerator).GetNumberOfPhysicalChannels();

                for (int c = 0; c < maxChannels; c++)
                    ((FrameGenerator)m_AppData.FrameGenerator).RegisterToConsumeChannel(consumerID, c, OnReceiveNewFrameToExtractTimeStamp); // get callback on new frames

                m_ToDisplayProcessedTimeStampsQ = new ThreadSafeQueue<FRAME>(240);     // store the frames into a Q when calledback.
                m_DisplayBatchTimeStampsThread = new Thread(DisplayBatchTimeStampsLoop); // empty the Q with this thread, dump to the listbox for user display
                m_DisplayBatchTimeStampsThread.Start();
            }

            // install the  user control to allow the user to import images from a field drive
            m_ImportImageDrive = new ImportImageDrive(m_AppData);
            tabPageImportImages.Controls.Add(m_ImportImageDrive);

            // show the results of LPR strings to the user
            m_LPRResultsToPostQ = new ThreadSafeQueue<LPR_RESULT_TO_POST>(100);
            m_LPRPostResultsThread = new Thread(LPRPostResultsLoop);
            m_LPRPostResultsThread.Start();

            // keep tabs on the repository - find one and keep checking for lost drives
            m_CheckRepositoryStatusThread = new Thread(CheckRepositoryLoop);
            m_CheckRepositoryStatusThread.Start();

            //    m_LPRCore.OnSelfDestruct += CloseThis;
        }
Esempio n. 4
0
        public void StartRegistration()
        {
            m_LPREngine = (LPREngine)m_AppData.LPREngine;
            m_LPREngine.OnNewFilteredPlateGroupEvent += new LPREngine.NewPlateEvent(NewLPRResultsEvent_OnNewPlateEvent);

            m_EmailService = (EmailServices) m_AppData.EmailServices;
            m_DVR = (DVR)m_AppData.DVR;
        }
Esempio n. 5
0
        public void Start()
        {
            //////////////////////////////////////
            //
            // start error reporting lib  ( decides if local and/or remote reporting)

            m_AppData.Logger = new ErrorLog(m_AppData);

            m_Log = (ErrorLog)m_AppData.Logger;

            //////////////////////////////////////
            //
            // start email lib (used by error reporting lib for remote error notifications and by the watch list processor)

            m_AppData.EmailServices = new EmailServices(m_AppData);
            m_Email = (EmailServices)m_AppData.EmailServices;



            //////////////////////////////////////
            //
            // load the Frame Generator

            m_AppData.FrameGenerator = (object)new FrameGenerator(m_AppData);


            //////////////////////////////////////
            //
            // load the DVR

            m_DVR         = new DVR(m_AppData);
            m_AppData.DVR = (object)m_DVR;


            //////////////////////////////////////
            //
            // start the TCP Server
            m_RCServer = new RemoteConnectionServer.RemoteConnectionServer(m_AppData);

            //m_TCPServerThread = new Thread(TCPServer);
            //m_TCPServerThread.Start();


            //////////////////////////////////////
            //
            // load the LPR Engine

            m_LPREngine         = new LPREngine(m_AppData);
            m_AppData.LPREngine = m_LPREngine;

            //////////////////////////////////////
            //
            // load the Watch List Processor

            m_WatchList = new WatchLists(m_AppData);


            //  now that all modules are loaded, let them register with each other for event communications
            m_RCServer.StartRegistration();
            m_DVR.StartRegistration();
            m_LPREngine.StartRegistration();
            m_WatchList.StartRegistration();



            // now let all modules start their threads
            m_RCServer.StartThreads();
            m_DVR.StartThreads();
            m_LPREngine.StartThreads();
            m_WatchList.StartThreads();
            m_Email.StartThreads();

            // is everyone happy?
            if (!m_DVR.GetDVRReady || !((FrameGenerator)m_AppData.FrameGenerator).GetReadyStatus)
            {
                m_AppData.SelfDestruct();
            }
        }
Esempio n. 6
0
        public void StartRegistration()
        {
            try
            {

                for (int c = 0; c < m_NumSourceChannels; c++)
                {
                    m_PreMotionRecords[c] = new PRE_MOTION_RECORDS();
                    m_PreMotionRecords[c].MotionDetectedMovingFilesInProcess = false;
                    m_PreMotionRecords[c].PreMotionChannelSubDirCreated = false;
                    m_PreMotionRecords[c].PendingMotionDetectionQ = new ThreadSafeQueue<string>(m_NumberOfFramesToPrePostBuffer + 10);

                    m_FrameGenerator.RegisterToConsumeMotionDetectedFrames(m_ConsumerID, c, OnMotionDetection);
                    m_FrameGenerator.RegisterToConsumeChannel(m_ConsumerID, c, OnNewFrame);
                }

                m_LPREngine = (LPREngine)m_AppData.LPREngine;
                m_LPREngine.OnNewFilteredPlateGroupEvent += OnLPRNewRecord;
            }
            catch (Exception ex)
            {
                m_Log.Trace(ex, ErrorLog.LOG_TYPE.FATAL);
            }
        }
Esempio n. 7
0
        public void Start(bool AsService)
        {
            try
            {
                m_AppData.RunninAsService = AsService;

                //////////////////////////////////////
                //
                // setup system wide health statistics

                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_Drive].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_frameGrabber_2].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_frameGrabber_1].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_GPS].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_Hotswap].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_Service].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel1].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel2].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel3].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel4].StatString.RegisterForUse(true);

                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_DirectyToStorageQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_MotionDetectedQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_NewFrameQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_NewLPRRecordQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_FG_AllFramesConsumerPushQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_FG_MotionDetectedConsumerPushQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_FG_MotionDetectionQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_LPR_LPRFinalPlateGroupOutputQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_LPR_LPRPerFrameReadingQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_LPR_LPRProcessQ].Accumulator.RegisterForUse(true);

                //////////////////////////////////////
                //
                // start error reporting lib  ( decides if local and/or remote reporting)

                m_AppData.Logger = new ErrorLog(m_AppData);

                m_Log = (ErrorLog)m_AppData.Logger;

                m_Log.Log("Starting LPR Services", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_Log.Log("using file in path: " + UserSettings.GetAppPath(), ErrorLog.LOG_TYPE.INFORMATIONAL);

                //////////////////////////////////////
                //
                // start email lib (used by error reporting lib for remote error notifications and by the watch list processor)

                m_Log.Log("Loading Email module", ErrorLog.LOG_TYPE.INFORMATIONAL);

                m_AppData.EmailServices = new EmailServices(m_AppData);
                m_Email = (EmailServices)m_AppData.EmailServices;

                //////////////////////////////////////
                //
                // load the Frame Generator

                m_Log.Log("Loading Frame Generator module", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_AppData.FrameGenerator = (object)new FrameGenerator(m_AppData, AsService);

                //////////////////////////////////////
                //
                // load the DVR

                m_AppData.DVRMode = APPLICATION_DATA.DVR_MODE.STORE_ON_MOTION;
                m_Log.Log("Loading DVR module", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_DVR = new DVR(m_AppData);
                m_AppData.DVR = (object)m_DVR;

                //////////////////////////////////////
                //
                // start the TCP Server
                if (m_AppData.RunninAsService)
                {
                    m_Log.Log("Loading TCP module", ErrorLog.LOG_TYPE.INFORMATIONAL);
                    m_RCServer = new RemoteConnectionServer.RemoteConnectionServer(m_AppData);
                }

                //////////////////////////////////////
                //
                // load the LPR Engine

                m_Log.Log("Loading LPR Engine", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_LPREngine = new LPREngine(m_AppData);
                m_AppData.LPREngine = m_LPREngine;

                //////////////////////////////////////
                //
                // load the Watch List Processor

                m_Log.Log("Loading Watch List module", ErrorLog.LOG_TYPE.INFORMATIONAL);

                m_WatchList = new WatchLists(m_AppData);

                //  now that all modules are loaded, let them register with each other for event communications
                m_Log.Log("Starting registrations", ErrorLog.LOG_TYPE.INFORMATIONAL);
                if (m_AppData.RunninAsService)
                {
                    m_RCServer.StartRegistration();
                }
                m_DVR.StartRegistration();
                m_LPREngine.StartRegistration();
                m_WatchList.StartRegistration();

                // now let all modules start their threads
                if (m_AppData.RunninAsService)
                {
                    m_Log.Log("Starting TCP Server", ErrorLog.LOG_TYPE.INFORMATIONAL);
                    m_RCServer.StartThreads();
                }

                m_Log.Log("Starting DVR", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_DVR.StartThreads();

                m_Log.Log("Starting LPR Engine", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_LPREngine.StartThreads();

                m_Log.Log("Starting Watch list processor", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_WatchList.StartThreads();

                m_Log.Log("Starting Email Services", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_Email.StartThreads();

                // is everyone happy?
                //if (!m_DVR.GetDVRReady || !((FrameGenerator)m_AppData.FrameGenerator).GetReadyStatus)
                //{
                //    m_Log.Log("Error, self destruct", ErrorLog.LOG_TYPE.FATAL);
                //    m_AppData.SelfDestruct();
                //}
            }
            catch (Exception ex) { m_Log.Trace(ex, ErrorLog.LOG_TYPE.FATAL); }
        }
Esempio n. 8
0
        public void Start()
        {
            //////////////////////////////////////
            //
            // start error reporting lib  ( decides if local and/or remote reporting)

            m_AppData.Logger = new ErrorLog(m_AppData);

            m_Log = (ErrorLog)  m_AppData.Logger;

            //////////////////////////////////////
            //
            // start email lib (used by error reporting lib for remote error notifications and by the watch list processor)

            m_AppData.EmailServices = new EmailServices(m_AppData);
            m_Email = (EmailServices)m_AppData.EmailServices;

            //////////////////////////////////////
            //
            // load the Frame Generator

            m_AppData.FrameGenerator = (object)new FrameGenerator(m_AppData);

            //////////////////////////////////////
            //
            // load the DVR

            m_DVR = new DVR(m_AppData);
            m_AppData.DVR = (object)m_DVR;

            //////////////////////////////////////
            //
            // start the TCP Server
            m_RCServer = new RemoteConnectionServer.RemoteConnectionServer(m_AppData);

            //m_TCPServerThread = new Thread(TCPServer);
            //m_TCPServerThread.Start();

            //////////////////////////////////////
            //
            // load the LPR Engine

            m_LPREngine = new LPREngine (m_AppData);
            m_AppData.LPREngine = m_LPREngine;

            //////////////////////////////////////
            //
            // load the Watch List Processor

            m_WatchList = new WatchLists(m_AppData);

            //  now that all modules are loaded, let them register with each other for event communications
            m_RCServer.StartRegistration();
            m_DVR.StartRegistration();
            m_LPREngine.StartRegistration();
            m_WatchList.StartRegistration();

            // now let all modules start their threads
            m_RCServer.StartThreads();
            m_DVR.StartThreads();
            m_LPREngine.StartThreads();
            m_WatchList.StartThreads();
            m_Email.StartThreads();

            // is everyone happy?
            if (!m_DVR.GetDVRReady || !((FrameGenerator) m_AppData.FrameGenerator).GetReadyStatus)
                m_AppData.SelfDestruct();
        }
Esempio n. 9
0
        public void Start(bool AsService)
        {
            try
            {
                m_AppData.RunninAsService = AsService;


                //////////////////////////////////////
                //
                // setup system wide health statistics

                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_Drive].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_frameGrabber_2].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_frameGrabber_1].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_GPS].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_Hotswap].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_Service].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel1].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel2].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel3].StatString.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.System.System_videoChannel4].StatString.RegisterForUse(true);

                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_DirectyToStorageQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_MotionDetectedQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_NewFrameQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_DVR_NewLPRRecordQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_FG_AllFramesConsumerPushQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_FG_MotionDetectedConsumerPushQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_FG_MotionDetectionQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_LPR_LPRFinalPlateGroupOutputQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_LPR_LPRPerFrameReadingQ].Accumulator.RegisterForUse(true);
                m_AppData.HealthStatistics[(int)APPLICATION_DATA.HEALTH_STATISTICS.QueueOverruns.QueueOverruns_LPR_LPRProcessQ].Accumulator.RegisterForUse(true);


                //////////////////////////////////////
                //
                // start error reporting lib  ( decides if local and/or remote reporting)

                m_AppData.Logger = new ErrorLog(m_AppData);

                m_Log = (ErrorLog)m_AppData.Logger;

                m_Log.Log("Starting LPR Services", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_Log.Log("using file in path: " + UserSettings.GetAppPath(), ErrorLog.LOG_TYPE.INFORMATIONAL);

                //////////////////////////////////////
                //
                // start email lib (used by error reporting lib for remote error notifications and by the watch list processor)

                m_Log.Log("Loading Email module", ErrorLog.LOG_TYPE.INFORMATIONAL);

                m_AppData.EmailServices = new EmailServices(m_AppData);
                m_Email = (EmailServices)m_AppData.EmailServices;



                //////////////////////////////////////
                //
                // load the Frame Generator

                m_Log.Log("Loading Frame Generator module", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_AppData.FrameGenerator = (object)new FrameGenerator(m_AppData, AsService);


                //////////////////////////////////////
                //
                // load the DVR

                m_AppData.DVRMode = APPLICATION_DATA.DVR_MODE.STORE_ON_MOTION;
                m_Log.Log("Loading DVR module", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_DVR         = new DVR(m_AppData);
                m_AppData.DVR = (object)m_DVR;


                //////////////////////////////////////
                //
                // start the TCP Server
                if (m_AppData.RunninAsService)
                {
                    m_Log.Log("Loading TCP module", ErrorLog.LOG_TYPE.INFORMATIONAL);
                    m_RCServer = new RemoteConnectionServer.RemoteConnectionServer(m_AppData);
                }



                //////////////////////////////////////
                //
                // load the LPR Engine

                m_Log.Log("Loading LPR Engine", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_LPREngine         = new LPREngine(m_AppData);
                m_AppData.LPREngine = m_LPREngine;

                //////////////////////////////////////
                //
                // load the Watch List Processor

                m_Log.Log("Loading Watch List module", ErrorLog.LOG_TYPE.INFORMATIONAL);

                m_WatchList = new WatchLists(m_AppData);


                //  now that all modules are loaded, let them register with each other for event communications
                m_Log.Log("Starting registrations", ErrorLog.LOG_TYPE.INFORMATIONAL);
                if (m_AppData.RunninAsService)
                {
                    m_RCServer.StartRegistration();
                }
                m_DVR.StartRegistration();
                m_LPREngine.StartRegistration();
                m_WatchList.StartRegistration();



                // now let all modules start their threads
                if (m_AppData.RunninAsService)
                {
                    m_Log.Log("Starting TCP Server", ErrorLog.LOG_TYPE.INFORMATIONAL);
                    m_RCServer.StartThreads();
                }

                m_Log.Log("Starting DVR", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_DVR.StartThreads();

                m_Log.Log("Starting LPR Engine", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_LPREngine.StartThreads();

                m_Log.Log("Starting Watch list processor", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_WatchList.StartThreads();

                m_Log.Log("Starting Email Services", ErrorLog.LOG_TYPE.INFORMATIONAL);
                m_Email.StartThreads();

                // is everyone happy?
                //if (!m_DVR.GetDVRReady || !((FrameGenerator)m_AppData.FrameGenerator).GetReadyStatus)
                //{
                //    m_Log.Log("Error, self destruct", ErrorLog.LOG_TYPE.FATAL);
                //    m_AppData.SelfDestruct();
                //}
            }
            catch (Exception ex) { m_Log.Trace(ex, ErrorLog.LOG_TYPE.FATAL); }
        }