Projects

Find all our projects in development below.
All source code is GNU General Public License (GPL)

javaCamViewer

Browsing javaCamViewer/MainForm.cs (63.62 KB)

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.IO;
using System.Windows.Forms;
using System.Xml;
using VideoSource;
using Tiger.Video.VFW;

namespace javaCamViewer
{
    /// <summary>
    /// Summary description for MainForm
    /// </summary>
    public class MainForm : System.Windows.Forms.Form
    {
        // statistics
        private const int statLength = 15;
        private int statIndex = 0, statReady = 0;
        private int[] statCount = new int[statLength];

        private const int saveStartIntervals = 5; // frames
        private const int maxSaveFrames = 2999; // frames
        private const int saveExtended = 5; // seconds

        private IMotionDetector detector = new javaCamDetector( );
        private Bitmap[] preSaveBuffer;
        private int intervalsToSave = 0;
        private int intervalsToSaveStart = 0;

        private AVIWriter writer = null;
        private StreamWriter debugWriter;
        private ControlForm ctrlForm;

        private bool saveOnMotion = false;
        private bool snapshotOnMotion = false;
        private bool saveFeed = false;
        private bool allowClose = false;

        private String sourceUrl;
        private String sourceType;
        private String savePath = "c:\\";
        private String snapshotPath = "c:\\";
        private String debugPath = "c:\\";
        private String savePrefix = "JavaCam";
        private String saveFormat = "{0}_{1}.avi";
        private String snapshotFormat = "{0}_{1}.jpg";
        private String debugFormat = "{0}_{1}.txt";
        private String dateFormat = "{0}-{1}-{2} {3}-{4}-{5}";
        private String timestampFormat = "ddd mm/dd/yyyy HH:mm:ss";
        private String AVIWriterCodec = "wmv3";
        private String detectionAlertURL = "";

        public bool ptzFlip = false;
        public bool ptzMirror = false;
        public bool ptzOverride = false;

        private String xmlSettingsFile = "config.xml";
        private const String XML_SETTINGS_PATH = "/javaCamViewer";

        private const String CONFIG_CMDLINEARG = "/config";
        private const String FILE_CMDLINEARG = "/file";
        private const String JPEGURL_CMDLINEARG = "/jpeg-url";
        private const String MJPEGURL_CMDLINEARG = "/mjpeg-url";
        private const String USEPRESET_CMDLINEARG = "/usepreset";
        private string[] appArgs;

        private MenuItem fileItem;
        private MenuItem openFileItem;
        private MenuItem menuItem1;
        private MenuItem exitFileItem;
        private OpenFileDialog ofd;
        private MainMenu mainMenu;
        private System.Timers.Timer timerStats;
        private StatusBar statusBar;
        private StatusBarPanel fpsPanel;
        private StatusBarPanel infoPanel;
        private Panel panel;
        private javaCamViewer.CameraWindow cameraWindow;
        private MenuItem motionItem;
        private MenuItem openMJEPGFileItem;
        private MenuItem detectorSaveItem;
        private MenuItem detectorSaveSnapshot;
        private MenuItem menuTools;
        private MenuItem menuSaveFeed;
        private MenuItem menuWriteDebugInfo;
        private MenuItem motionAlarmItem;
        private MenuItem openURLFileItem;
        private NotifyIcon trayIcon;
        private ContextMenuStrip trayMenu;
        private ToolStripMenuItem openToolStripMenuItem;
        private ToolStripSeparator toolStripSeparator1;
        private ToolStripMenuItem exitToolStripMenuItem;
        public MenuItem menuCameraController;
        private MenuItem menuSaveSource;
        private MenuItem menuView;
        private MenuItem menuOpenSaveFolder;
        private MenuItem menuSnapshotFolder;
        private MenuItem menuDebugFolder;
        private MenuItem menuDrawTimestamp;
        private System.Timers.Timer timerDisplay;
        private MenuItem menuDetection;
        private MenuItem menuEnableFaceDetection;
        private MenuItem menuAlertOnDetection;
        private IContainer components;

        public MainForm(string[] args)
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            appArgs = args;
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if ( disposing )
            {
                if ( components != null )
                {
                    components.Dispose( );
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent( )
        {
            this.components = new System.ComponentModel.Container();
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
            this.mainMenu = new System.Windows.Forms.MainMenu(this.components);
            this.fileItem = new System.Windows.Forms.MenuItem();
            this.openFileItem = new System.Windows.Forms.MenuItem();
            this.openURLFileItem = new System.Windows.Forms.MenuItem();
            this.openMJEPGFileItem = new System.Windows.Forms.MenuItem();
            this.menuSaveSource = new System.Windows.Forms.MenuItem();
            this.menuItem1 = new System.Windows.Forms.MenuItem();
            this.exitFileItem = new System.Windows.Forms.MenuItem();
            this.motionItem = new System.Windows.Forms.MenuItem();
            this.motionAlarmItem = new System.Windows.Forms.MenuItem();
            this.detectorSaveItem = new System.Windows.Forms.MenuItem();
            this.detectorSaveSnapshot = new System.Windows.Forms.MenuItem();
            this.menuTools = new System.Windows.Forms.MenuItem();
            this.menuCameraController = new System.Windows.Forms.MenuItem();
            this.menuSaveFeed = new System.Windows.Forms.MenuItem();
            this.menuDrawTimestamp = new System.Windows.Forms.MenuItem();
            this.menuWriteDebugInfo = new System.Windows.Forms.MenuItem();
            this.menuView = new System.Windows.Forms.MenuItem();
            this.menuOpenSaveFolder = new System.Windows.Forms.MenuItem();
            this.menuSnapshotFolder = new System.Windows.Forms.MenuItem();
            this.menuDebugFolder = new System.Windows.Forms.MenuItem();
            this.ofd = new System.Windows.Forms.OpenFileDialog();
            this.timerStats = new System.Timers.Timer();
            this.statusBar = new System.Windows.Forms.StatusBar();
            this.fpsPanel = new System.Windows.Forms.StatusBarPanel();
            this.infoPanel = new System.Windows.Forms.StatusBarPanel();
            this.panel = new System.Windows.Forms.Panel();
            this.cameraWindow = new javaCamViewer.CameraWindow();
            this.trayIcon = new System.Windows.Forms.NotifyIcon(this.components);
            this.trayMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
            this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
            this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.timerDisplay = new System.Timers.Timer();
            this.menuDetection = new System.Windows.Forms.MenuItem();
            this.menuEnableFaceDetection = new System.Windows.Forms.MenuItem();
            this.menuAlertOnDetection = new System.Windows.Forms.MenuItem();
            ((System.ComponentModel.ISupportInitialize)(this.timerStats)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.fpsPanel)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.infoPanel)).BeginInit();
            this.panel.SuspendLayout();
            this.trayMenu.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.timerDisplay)).BeginInit();
            this.SuspendLayout();
            // 
            // mainMenu
            // 
            this.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.fileItem,
            this.motionItem,
            this.menuDetection,
            this.menuTools,
            this.menuView});
            // 
            // fileItem
            // 
            this.fileItem.Index = 0;
            this.fileItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.openFileItem,
            this.openURLFileItem,
            this.openMJEPGFileItem,
            this.menuSaveSource,
            this.menuItem1,
            this.exitFileItem});
            this.fileItem.Text = "&File";
            // 
            // openFileItem
            // 
            this.openFileItem.Index = 0;
            this.openFileItem.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
            this.openFileItem.Text = "&Open File";
            this.openFileItem.Click += new System.EventHandler(this.openFileItem_Click);
            // 
            // openURLFileItem
            // 
            this.openURLFileItem.Index = 1;
            this.openURLFileItem.Shortcut = System.Windows.Forms.Shortcut.CtrlJ;
            this.openURLFileItem.Text = "Open &JPEG URL";
            this.openURLFileItem.Click += new System.EventHandler(this.openURLFileItem_Click);
            // 
            // openMJEPGFileItem
            // 
            this.openMJEPGFileItem.Index = 2;
            this.openMJEPGFileItem.Shortcut = System.Windows.Forms.Shortcut.CtrlM;
            this.openMJEPGFileItem.Text = "Open &MJPEG URL";
            this.openMJEPGFileItem.Click += new System.EventHandler(this.openMJEPGFileItem_Click);
            // 
            // menuSaveSource
            // 
            this.menuSaveSource.Index = 3;
            this.menuSaveSource.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
            this.menuSaveSource.Text = "&Save Source URL";
            this.menuSaveSource.Click += new System.EventHandler(this.menuSaveSource_Click);
            // 
            // menuItem1
            // 
            this.menuItem1.Index = 4;
            this.menuItem1.Text = "-";
            // 
            // exitFileItem
            // 
            this.exitFileItem.Index = 5;
            this.exitFileItem.Text = "E&xit";
            this.exitFileItem.Click += new System.EventHandler(this.exitFileItem_Click);
            // 
            // motionItem
            // 
            this.motionItem.Index = 1;
            this.motionItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.motionAlarmItem,
            this.detectorSaveItem,
            this.detectorSaveSnapshot});
            this.motionItem.Text = "&Motion";
            // 
            // motionAlarmItem
            // 
            this.motionAlarmItem.Checked = true;
            this.motionAlarmItem.Index = 0;
            this.motionAlarmItem.Text = "&Enable motion alarm";
            this.motionAlarmItem.Click += new System.EventHandler(this.motionAlarmItem_Click);
            // 
            // detectorSaveItem
            // 
            this.detectorSaveItem.Index = 1;
            this.detectorSaveItem.Text = "&Save on motion";
            this.detectorSaveItem.Click += new System.EventHandler(this.detectorSaveItem_Click);
            // 
            // detectorSaveSnapshot
            // 
            this.detectorSaveSnapshot.Index = 2;
            this.detectorSaveSnapshot.Text = "S&napshot on motion";
            this.detectorSaveSnapshot.Click += new System.EventHandler(this.detectorSaveSnapshot_Click);
            // 
            // menuTools
            // 
            this.menuTools.Index = 3;
            this.menuTools.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuCameraController,
            this.menuSaveFeed,
            this.menuDrawTimestamp,
            this.menuWriteDebugInfo});
            this.menuTools.Text = "&Tools";
            // 
            // menuCameraController
            // 
            this.menuCameraController.Index = 0;
            this.menuCameraController.Shortcut = System.Windows.Forms.Shortcut.F9;
            this.menuCameraController.Text = "&Camera controller";
            this.menuCameraController.Click += new System.EventHandler(this.menuCameraController_Click);
            // 
            // menuSaveFeed
            // 
            this.menuSaveFeed.Index = 1;
            this.menuSaveFeed.Shortcut = System.Windows.Forms.Shortcut.F10;
            this.menuSaveFeed.Text = "&Save feed to file";
            this.menuSaveFeed.Click += new System.EventHandler(this.menuSaveFeed_Click);
            // 
            // menuDrawTimestamp
            // 
            this.menuDrawTimestamp.Index = 2;
            this.menuDrawTimestamp.Shortcut = System.Windows.Forms.Shortcut.F11;
            this.menuDrawTimestamp.Text = "&Draw timestamp";
            this.menuDrawTimestamp.Click += new System.EventHandler(this.menuDrawTimestamp_Click);
            // 
            // menuWriteDebugInfo
            // 
            this.menuWriteDebugInfo.Index = 3;
            this.menuWriteDebugInfo.Shortcut = System.Windows.Forms.Shortcut.F12;
            this.menuWriteDebugInfo.Text = "&Write debug info";
            this.menuWriteDebugInfo.Click += new System.EventHandler(this.menuWriteDebugInfo_Click);
            // 
            // menuView
            // 
            this.menuView.Index = 4;
            this.menuView.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuOpenSaveFolder,
            this.menuSnapshotFolder,
            this.menuDebugFolder});
            this.menuView.Text = "&View";
            // 
            // menuOpenSaveFolder
            // 
            this.menuOpenSaveFolder.Index = 0;
            this.menuOpenSaveFolder.Text = "Open &Save Folder";
            this.menuOpenSaveFolder.Click += new System.EventHandler(this.menuOpenSaveFolder_Click);
            // 
            // menuSnapshotFolder
            // 
            this.menuSnapshotFolder.Index = 1;
            this.menuSnapshotFolder.Text = "Open S&napshot Folder";
            this.menuSnapshotFolder.Click += new System.EventHandler(this.menuSnapshotFolder_Click);
            // 
            // menuDebugFolder
            // 
            this.menuDebugFolder.Index = 2;
            this.menuDebugFolder.Text = "Open &Debug Folder";
            this.menuDebugFolder.Click += new System.EventHandler(this.menuDebugFolder_Click);
            // 
            // ofd
            // 
            this.ofd.Filter = "AVI files (*.avi)|*.avi";
            this.ofd.Title = "Open movie";
            // 
            // timerStats
            // 
            this.timerStats.Interval = 1000;
            this.timerStats.SynchronizingObject = this;
            this.timerStats.Elapsed += new System.Timers.ElapsedEventHandler(this.timerStats_Elapsed);
            // 
            // statusBar
            // 
            this.statusBar.Location = new System.Drawing.Point(0, 506);
            this.statusBar.Name = "statusBar";
            this.statusBar.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
            this.fpsPanel,
            this.infoPanel});
            this.statusBar.ShowPanels = true;
            this.statusBar.Size = new System.Drawing.Size(666, 22);
            this.statusBar.SizingGrip = false;
            this.statusBar.TabIndex = 1;
            // 
            // fpsPanel
            // 
            this.fpsPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
            this.fpsPanel.Name = "fpsPanel";
            this.fpsPanel.Width = 333;
            // 
            // infoPanel
            // 
            this.infoPanel.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
            this.infoPanel.Name = "infoPanel";
            this.infoPanel.Width = 333;
            // 
            // panel
            // 
            this.panel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.panel.Controls.Add(this.cameraWindow);
            this.panel.Dock = System.Windows.Forms.DockStyle.Fill;
            this.panel.Location = new System.Drawing.Point(0, 0);
            this.panel.Name = "panel";
            this.panel.Size = new System.Drawing.Size(666, 506);
            this.panel.TabIndex = 2;
            // 
            // cameraWindow
            // 
            this.cameraWindow.BackColor = System.Drawing.SystemColors.AppWorkspace;
            this.cameraWindow.Camera = null;
            this.cameraWindow.Location = new System.Drawing.Point(10, 10);
            this.cameraWindow.Name = "cameraWindow";
            this.cameraWindow.Size = new System.Drawing.Size(642, 482);
            this.cameraWindow.TabIndex = 1;
            // 
            // trayIcon
            // 
            this.trayIcon.ContextMenuStrip = this.trayMenu;
            this.trayIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("trayIcon.Icon")));
            this.trayIcon.Text = "javaCam Viewer";
            this.trayIcon.Visible = true;
            this.trayIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.trayIcon_MouseDoubleClick);
            // 
            // trayMenu
            // 
            this.trayMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.openToolStripMenuItem,
            this.toolStripSeparator1,
            this.exitToolStripMenuItem});
            this.trayMenu.Name = "trayMenu";
            this.trayMenu.Size = new System.Drawing.Size(112, 54);
            // 
            // openToolStripMenuItem
            // 
            this.openToolStripMenuItem.Name = "openToolStripMenuItem";
            this.openToolStripMenuItem.Size = new System.Drawing.Size(111, 22);
            this.openToolStripMenuItem.Text = "&Open";
            this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click);
            // 
            // toolStripSeparator1
            // 
            this.toolStripSeparator1.Name = "toolStripSeparator1";
            this.toolStripSeparator1.Size = new System.Drawing.Size(108, 6);
            // 
            // exitToolStripMenuItem
            // 
            this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
            this.exitToolStripMenuItem.Size = new System.Drawing.Size(111, 22);
            this.exitToolStripMenuItem.Text = "E&xit";
            this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
            // 
            // timerDisplay
            // 
            this.timerDisplay.SynchronizingObject = this;
            this.timerDisplay.Elapsed += new System.Timers.ElapsedEventHandler(this.timerDisplay_Elapsed);
            // 
            // menuDetection
            // 
            this.menuDetection.Index = 2;
            this.menuDetection.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
            this.menuEnableFaceDetection,
            this.menuAlertOnDetection});
            this.menuDetection.Text = "&Detection";
            // 
            // menuEnableFaceDetection
            // 
            this.menuEnableFaceDetection.Index = 0;
            this.menuEnableFaceDetection.Text = "&Enable face detection";
            this.menuEnableFaceDetection.Click += new System.EventHandler(this.menuEnableFaceDetection_Click);
            // 
            // menuAlertOnDetection
            // 
            this.menuAlertOnDetection.Index = 1;
            this.menuAlertOnDetection.Text = "&Alert on detection";
            this.menuAlertOnDetection.Click += new System.EventHandler(this.menuAlertOnDetection_Click);
            // 
            // MainForm
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 14);
            this.ClientSize = new System.Drawing.Size(666, 528);
            this.Controls.Add(this.panel);
            this.Controls.Add(this.statusBar);
            this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.Menu = this.mainMenu;
            this.Name = "MainForm";
            this.Text = "javaCam Viewer";
            this.Shown += new System.EventHandler(this.MainForm_Shown);
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
            this.Resize += new System.EventHandler(this.MainForm_Resize);
            ((System.ComponentModel.ISupportInitialize)(this.timerStats)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.fpsPanel)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.infoPanel)).EndInit();
            this.panel.ResumeLayout(false);
            this.trayMenu.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.timerDisplay)).EndInit();
            this.ResumeLayout(false);

        }

        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.Run( new MainForm(args) );
        }

        private bool loadXmlSettings(String xmlFile)
        {
            try
            {
                XmlDocument objXMLdoc = new XmlDocument();
                XmlNode thisNode = null;

                if (!File.Exists(xmlFile)) return false;

                objXMLdoc.Load(xmlFile);
                thisNode = objXMLdoc.SelectSingleNode(XML_SETTINGS_PATH);

                if (thisNode.SelectSingleNode("source_url") != null &&
                    sourceUrl == null && sourceType == null)
                {
                    String _sourceUrl = thisNode.SelectSingleNode("source_url").InnerText;

                    if (_sourceUrl != "" && thisNode.SelectSingleNode("source_type") != null)
                    {
                        String _sourceType = thisNode.SelectSingleNode("source_type").InnerText;

                        if (_sourceType == "jpg" || _sourceType == "jpeg")
                        {
                            // create video source
                            JPEGStream jpegSource = new JPEGStream();
                            jpegSource.VideoSource = _sourceUrl;

                            // open it
                            OpenVideoSource(jpegSource);
                        }
                        else if (_sourceType == "mjpg" || _sourceType == "mjpeg")
                        {
                            // create video source
                            MJPEGStream mjpegSource = new MJPEGStream();
                            mjpegSource.VideoSource = _sourceUrl;

                            // open it
                            OpenVideoSource(mjpegSource);
                        }
                    }

                    if (thisNode.SelectSingleNode("source_name") != null)
                    {
                        String _sourceName = thisNode.SelectSingleNode("source_name").InnerText;
                        if (_sourceName != "")
                        {
                            this.Text += " :: " + _sourceName;
                            trayIcon.Text = this.Text;
                        }
                    }
                }

                if (thisNode.SelectSingleNode("save_path") != null &&
                    thisNode.SelectSingleNode("save_path").InnerText != "")
                {
                    savePath = thisNode.SelectSingleNode("save_path").InnerText;
                    if (!savePath.EndsWith("\\")) savePath += "\\";
                }

                if (thisNode.SelectSingleNode("snapshot_path") != null &&
                    thisNode.SelectSingleNode("snapshot_path").InnerText != "")
                {
                    snapshotPath = thisNode.SelectSingleNode("snapshot_path").InnerText;
                    if (!snapshotPath.EndsWith("\\")) snapshotPath += "\\";
                }

                if (thisNode.SelectSingleNode("debug_path") != null &&
                    thisNode.SelectSingleNode("debug_path").InnerText != "")
                {
                    debugPath = thisNode.SelectSingleNode("debug_path").InnerText;
                    if (!debugPath.EndsWith("\\")) debugPath += "\\";
                }

                if (thisNode.SelectSingleNode("save_prefix") != null &&
                    thisNode.SelectSingleNode("save_prefix").InnerText != "")
                {
                    savePrefix = thisNode.SelectSingleNode("save_prefix").InnerText;
                }

                if (thisNode.SelectSingleNode("motion_alarm") != null &&
                    thisNode.SelectSingleNode("motion_alarm").InnerText != "")
                {
                    bool motionAlarm = bool.Parse(thisNode.SelectSingleNode("motion_alarm").InnerText);
                    if (!motionAlarm)
                    {
                        motionAlarmItem.Checked = false;
                        
                        if ( detector != null )
                            detector.MotionLevelCalculation = false;
                    }
                }

                if (thisNode.SelectSingleNode("save_on_motion") != null &&
                    thisNode.SelectSingleNode("save_on_motion").InnerText != "")
                {
                    saveOnMotion = bool.Parse(thisNode.SelectSingleNode("save_on_motion").InnerText);
                    if (saveOnMotion) detectorSaveItem.Checked = true;
                }

                if (thisNode.SelectSingleNode("snapshot_on_motion") != null &&
                    thisNode.SelectSingleNode("snapshot_on_motion").InnerText != "")
                {
                    snapshotOnMotion = bool.Parse(thisNode.SelectSingleNode("snapshot_on_motion").InnerText);
                    if (snapshotOnMotion) detectorSaveSnapshot.Checked = true;
                }

                if (thisNode.SelectSingleNode("save_prefix") != null &&
                    thisNode.SelectSingleNode("save_prefix").InnerText != "")
                {
                    savePrefix = thisNode.SelectSingleNode("save_prefix").InnerText;
                }

                if (thisNode.SelectSingleNode("save_format") != null &&
                    thisNode.SelectSingleNode("save_format").InnerText != "")
                {
                    saveFormat = thisNode.SelectSingleNode("save_format").InnerText;
                }

                if (thisNode.SelectSingleNode("snapshot_format") != null &&
                    thisNode.SelectSingleNode("snapshot_format").InnerText != "")
                {
                    snapshotFormat = thisNode.SelectSingleNode("snapshot_format").InnerText;
                }

                if (thisNode.SelectSingleNode("date_format") != null &&
                    thisNode.SelectSingleNode("date_format").InnerText != "")
                {
                    dateFormat = thisNode.SelectSingleNode("date_format").InnerText;
                }

                if (thisNode.SelectSingleNode("debug_format") != null &&
                    thisNode.SelectSingleNode("debug_format").InnerText != "")
                {
                    debugFormat = thisNode.SelectSingleNode("debug_format").InnerText;
                }

                if (thisNode.SelectSingleNode("draw_timestamp") != null &&
                    thisNode.SelectSingleNode("draw_timestamp").InnerText != "")
                {
                    menuDrawTimestamp.Checked = bool.Parse(thisNode.SelectSingleNode("draw_timestamp").InnerText);

                    Camera camera = cameraWindow.Camera;
                    if (camera != null)
                    {
                        camera.DrawTimestamp = menuDrawTimestamp.Checked;
                    }
                }

                if (thisNode.SelectSingleNode("timestamp_format") != null &&
                    thisNode.SelectSingleNode("timestamp_format").InnerText != "")
                {
                    timestampFormat = thisNode.SelectSingleNode("timestamp_format").InnerText;

                    Camera camera = cameraWindow.Camera;
                    if (camera != null)
                    {
                        camera.TimestampFormat = timestampFormat;
                    }
                }

                if (thisNode.SelectSingleNode("aviwriter_codec") != null &&
                    thisNode.SelectSingleNode("aviwriter_codec").InnerText != "")
                {
                    AVIWriterCodec = thisNode.SelectSingleNode("aviwriter_codec").InnerText;
                }

                if (thisNode.SelectSingleNode("ptz_flip") != null &&
                    thisNode.SelectSingleNode("ptz_flip").InnerText != "")
                {
                    ptzFlip = bool.Parse(thisNode.SelectSingleNode("ptz_flip").InnerText);
                }

                if (thisNode.SelectSingleNode("ptz_mirror") != null &&
                    thisNode.SelectSingleNode("ptz_mirror").InnerText != "")
                {
                    ptzMirror = bool.Parse(thisNode.SelectSingleNode("ptz_mirror").InnerText);
                }

                if (thisNode.SelectSingleNode("ptz_override") != null &&
                    thisNode.SelectSingleNode("ptz_override").InnerText != "")
                {
                    ptzOverride = bool.Parse(thisNode.SelectSingleNode("ptz_override").InnerText);
                }

                if (thisNode.SelectSingleNode("detection_enable") != null &&
                    thisNode.SelectSingleNode("detection_enable").InnerText != "")
                {
                    bool detectionEnable = bool.Parse(thisNode.SelectSingleNode("detection_enable").InnerText);
                    if (detectionEnable)
                    {
                        menuEnableFaceDetection.Checked = true;

                        if (detector != null)
                            detector.EnableFaceDetection = true;
                    }
                }

                if (thisNode.SelectSingleNode("detection_alert_enable") != null &&
                    thisNode.SelectSingleNode("detection_alert_enable").InnerText != "")
                {
                    bool detectionAlert = bool.Parse(thisNode.SelectSingleNode("detection_alert_enable").InnerText);
                    if (detectionAlert)
                    {
                        this.menuAlertOnDetection.Checked = true;
                    }
                }

                if (thisNode.SelectSingleNode("detection_alert_url") != null &&
                    thisNode.SelectSingleNode("detection_alert_url").InnerText != "")
                {
                    detectionAlertURL = thisNode.SelectSingleNode("detection_alert_url").InnerText;
                }

                thisNode = null;
                objXMLdoc = null;

                return true;
            }
            catch
            {
                return false;
            }
        }

        private bool saveXmlSettings(String xmlFile, bool includeSource)
        {
            try
            {
                XmlDocument objXMLdoc = new XmlDocument();
                XmlNode thisNode = null;

                if (!File.Exists(xmlFile))
                    File.WriteAllText(xmlFile, MainMod.getResourceString("config_default"));

                objXMLdoc.Load(xmlFile);
                thisNode = objXMLdoc.SelectSingleNode(XML_SETTINGS_PATH);

                if (includeSource && sourceUrl != null && sourceType != null)
                {
                    if (thisNode.SelectSingleNode("source_url") == null)
                    {
                        XmlNode childNode = objXMLdoc.CreateElement("source_url");
                        thisNode.AppendChild(childNode);
                    }
                    thisNode.SelectSingleNode("source_url").InnerText = sourceUrl;

                    if (thisNode.SelectSingleNode("source_type") == null)
                    {
                        XmlNode childNode = objXMLdoc.CreateElement("source_type");
                        thisNode.AppendChild(childNode);
                    }
                    thisNode.SelectSingleNode("source_type").InnerText = sourceType;
                }

                if (thisNode.SelectSingleNode("save_path") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("save_path");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("save_path").InnerText = savePath;

                if (thisNode.SelectSingleNode("snapshot_path") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("snapshot_path");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("snapshot_path").InnerText = snapshotPath;

                if (thisNode.SelectSingleNode("debug_path") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("debug_path");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("debug_path").InnerText = debugPath;

                if (thisNode.SelectSingleNode("save_prefix") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("save_prefix");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("save_prefix").InnerText = savePrefix;

                if (thisNode.SelectSingleNode("motion_alarm") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("motion_alarm");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("motion_alarm").InnerText = motionAlarmItem.Checked.ToString();

                if (thisNode.SelectSingleNode("save_on_motion") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("save_on_motion");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("save_on_motion").InnerText = saveOnMotion.ToString();

                if (thisNode.SelectSingleNode("snapshot_on_motion") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("snapshot_on_motion");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("snapshot_on_motion").InnerText = snapshotOnMotion.ToString();

                if (thisNode.SelectSingleNode("save_format") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("save_format");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("save_format").InnerText = saveFormat;

                if (thisNode.SelectSingleNode("snapshot_format") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("snapshot_format");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("snapshot_format").InnerText = snapshotFormat;

                if (thisNode.SelectSingleNode("date_format") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("date_format");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("date_format").InnerText = dateFormat;

                if (thisNode.SelectSingleNode("debug_format") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("debug_format");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("debug_format").InnerText = debugFormat;

                if (thisNode.SelectSingleNode("draw_timestamp") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("draw_timestamp");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("draw_timestamp").InnerText = menuDrawTimestamp.Checked.ToString();

                if (thisNode.SelectSingleNode("timestamp_format") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("timestamp_format");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("timestamp_format").InnerText = timestampFormat;

                if (thisNode.SelectSingleNode("aviwriter_codec") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("aviwriter_codec");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("aviwriter_codec").InnerText = AVIWriterCodec;

                if (thisNode.SelectSingleNode("ptz_flip") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("ptz_flip");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("ptz_flip").InnerText = ptzFlip.ToString();

                if (thisNode.SelectSingleNode("ptz_mirror") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("ptz_mirror");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("ptz_mirror").InnerText = ptzMirror.ToString();

                if (thisNode.SelectSingleNode("ptz_override") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("ptz_override");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("ptz_override").InnerText = ptzOverride.ToString();

                if (thisNode.SelectSingleNode("detection_enable") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("detection_enable");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("detection_enable").InnerText = menuEnableFaceDetection.Checked.ToString();

                if (thisNode.SelectSingleNode("detection_alert_enable") == null)
                {
                    XmlNode childNode = objXMLdoc.CreateElement("detection_alert_enable");
                    thisNode.AppendChild(childNode);
                }
                thisNode.SelectSingleNode("detection_alert_enable").InnerText = menuAlertOnDetection.Checked.ToString();

                objXMLdoc.Save(xmlFile);

                thisNode = null;
                objXMLdoc = null;

                return true;
            }
            catch
            {
                return false;
            }
        }

        private String getDateString()
        {
            DateTime date = DateTime.Now;

            return String.Format(dateFormat,
                date.Year.ToString("#00"), date.Month.ToString("#00"), date.Day.ToString("#00"),
                date.Hour.ToString("#00"), date.Minute.ToString("#00"), date.Second.ToString("#00"));
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!allowClose && e.CloseReason == CloseReason.UserClosing)
            {
                // stop the form from closing
                e.Cancel = true;

                if (ctrlForm != null)
                {
                    ctrlForm.Hide();
                }

                cameraWindow.Hide();
                this.Hide();
            }
            else
            {
                saveXmlSettings(xmlSettingsFile, false);
                CloseFile();
            }
        }

        private void MainForm_Resize(object sender, EventArgs e)
        {
            // check for windowstate change
            if (this.WindowState == FormWindowState.Minimized)
            {
                if (ctrlForm != null)
                {
                    ctrlForm.Hide();
                }

                cameraWindow.Hide();
                this.Hide();
            }
        }

        private void MainForm_Shown(object sender, EventArgs e)
        {
            // check for windowstate change
            if (this.WindowState == FormWindowState.Minimized)
            {
                cameraWindow.Hide();
                this.Hide();
            }

            // check for a cmdline source
            for (int i = 0; i < appArgs.Length; i++)
            {
                if (appArgs[i] == CONFIG_CMDLINEARG && i < appArgs.Length - 1)
                {
                    // use specified config file
                    xmlSettingsFile = appArgs[i + 1];
                }
                else if (appArgs[i] == FILE_CMDLINEARG && i < appArgs.Length - 1)
                {
                    // create video source
                    VideoFileSource fileSource = new VideoFileSource();
                    fileSource.VideoSource = appArgs[i + 1];

                    // open it
                    OpenVideoSource(fileSource);

                    break;
                }
                else if (appArgs[i] == JPEGURL_CMDLINEARG && i < appArgs.Length - 1)
                {
                    // create video source
                    JPEGStream jpegSource = new JPEGStream();
                    jpegSource.VideoSource = appArgs[i + 1];

                    // open it
                    OpenVideoSource(jpegSource);

                    break;
                }
                else if (appArgs[i] == MJPEGURL_CMDLINEARG && i < appArgs.Length - 1)
                {
                    // create video source
                    MJPEGStream mjpegSource = new MJPEGStream();
                    mjpegSource.VideoSource = appArgs[i + 1];

                    // open it
                    OpenVideoSource(mjpegSource);

                    break;
                }
            }

            // check for any cmdline flags
            for (int i = 0; i < appArgs.Length; i++)
            {
                if (appArgs[i] == USEPRESET_CMDLINEARG && i < appArgs.Length - 1)
                {
                    int preset = 0;

                    if (int.TryParse(appArgs[i + 1], out preset) && preset > 0)
                    {
                        // call the specified preset
                        camera_useCameraPreset(preset, null);
                    }
                }
            }
            // load settings from xml
            loadXmlSettings(xmlSettingsFile);
        }

        // Close the main form
        private void exitFileItem_Click( object sender, System.EventArgs e )
        {
            allowClose = true;
            this.Close();
        }

        // Open file
        private void openFileItem_Click(object sender, System.EventArgs e)
        {
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                // create video source
                VideoFileSource fileSource = new VideoFileSource();
                fileSource.VideoSource = ofd.FileName;

                // open it
                OpenVideoSource(fileSource);
            }
        }

        // Open URL
        private void openURLFileItem_Click( object sender, System.EventArgs e )
        {
            URLForm form = new URLForm( );

            form.Description = "Enter URL of an updating JPEG from a web camera:";
            form.URLs = new string[]
            {
                "http://127.0.0.1/snapshot.cgi?user=admin&pwd=&resolution=32"
            };

            if ( form.ShowDialog( this ) == DialogResult.OK )
            {
                // create video source
                JPEGStream jpegSource = new JPEGStream( );
                jpegSource.VideoSource = form.URL;

                // open it
                OpenVideoSource( jpegSource );
            }
        }

        // Open MJPEG URL
        private void openMJEPGFileItem_Click( object sender, System.EventArgs e )
        {
            URLForm form = new URLForm( );

            form.Description = "Enter URL of an MJPEG video stream:";
            form.URLs = new string[]
            {
                "http://127.0.0.1/videostream.cgi?user=admin&pwd=&resolution=32"
            };

            if ( form.ShowDialog( this ) == DialogResult.OK )
            {
                // create video source
                MJPEGStream mjpegSource = new MJPEGStream( );
                mjpegSource.VideoSource = form.URL;

                // open it
                OpenVideoSource( mjpegSource );
            }
        }

        // Open video source
        private void OpenVideoSource( IVideoSource source )
        {
            // set busy cursor
            this.Cursor = Cursors.WaitCursor;

            // close previous file
            CloseFile( );

            // enable/disable motion alarm
            if ( detector != null )
            {
                detector.MotionLevelCalculation = motionAlarmItem.Checked;
                detector.DebugWriter = debugWriter;
                detector.AlertFaceDetected += new EventHandler(camera_alertFaceDetected);
            }

            // create camera
            Camera camera = new Camera( source, detector );

            // config camera
            camera.DrawTimestamp = menuDrawTimestamp.Checked;
            camera.TimestampFormat = timestampFormat;

            // start camera
            camera.Start( );

            // attach camera to camera window
            cameraWindow.Camera = camera;

            // reset statistics
            statIndex = statReady = 0;

            // set event handlers
            camera.NewFrame += new EventHandler( camera_NewFrame );
            camera.Alarm += new EventHandler( camera_Alarm );

            // start timer
            timerStats.Start( );

            // store the source url
            if (source.GetType() == typeof(JPEGStream))
            {
                sourceUrl = source.VideoSource;
                sourceType = "jpeg";
            }
            else if (source.GetType() == typeof(MJPEGStream))
            {
                sourceUrl = source.VideoSource;
                sourceType = "mjpeg";
            }

            this.Cursor = Cursors.Default;
        }

        private void menuSaveSource_Click(object sender, EventArgs e)
        {
            if (sourceUrl != null && sourceType != null)
            {
                if (saveXmlSettings(xmlSettingsFile, true))
                {
                    MessageBox.Show("Source URL saved to config file.", Application.ProductName,
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("Problem saving config file.", Application.ProductName,
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("No source URL to save.", Application.ProductName,
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        // Close current file
        private void CloseFile( )
        {
            try
            {
                Camera camera = cameraWindow.Camera;

                if (camera != null)
                {
                    // detach camera from camera window
                    cameraWindow.Camera = null;

                    // signal camera to stop
                    camera.SignalToStop();
                    // wait for the camera
                    camera.WaitForStop();

                    camera = null;

                    if (detector != null)
                    {
                        detector.DebugWriter = null;
                        detector.Reset();
                    }
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("=============: " + ex.Message);
            }

            if (writer != null)
            {
                CloseWriter();

                if (menuSaveFeed.Checked)
                    menuSaveFeed.Checked = false;
            }

            if (menuCameraController.Checked && ctrlForm != null && !ctrlForm.IsDisposed)
            {
                ctrlForm.Close();
                ctrlForm = null;

                menuCameraController.Checked = false;
            }

            intervalsToSave = 0;
            intervalsToSaveStart = 0;
        }

        private void CloseWriter()
        {
            try
            {
                lock (writer)
                {
                    writer.Dispose();
                    writer = null;
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("=============: " + ex.Message);
            }
        }

        // On timer event - gather statistic
        private void timerStats_Elapsed( object sender, System.Timers.ElapsedEventArgs e )
        {
            Camera camera = cameraWindow.Camera;

            if ( camera != null )
            {
                // get number of frames for the last second
                statCount[statIndex] = camera.FramesReceived;

                // increment indexes
                if ( ++statIndex >= statLength )
                    statIndex = 0;
                if ( statReady < statLength )
                    statReady++;

                float fps = 0;

                // calculate average value
                for ( int i = 0; i < statReady; i++ )
                {
                    fps += statCount[i];
                }
                fps /= statReady;

                statCount[statIndex] = 0;

                fpsPanel.Text = fps.ToString("F2") + " fps";
                infoPanel.Text = MainMod.formatBytes(camera.BytesReceived) + "ps";

                if (writer != null)
                {
                    lock (writer)
                    {
                        infoPanel.Text += " / " + writer.CurrentPosition.ToString() + " frame(s) saved";
                    }
                }

                // descrease save counter
                if (intervalsToSave > 0)
                {
                    if (--intervalsToSave == 0 && writer != null)
                        CloseWriter();
                }

                // check for max save frames on motion saving
                if (!saveFeed && writer != null && writer.CurrentPosition > maxSaveFrames)
                    CloseWriter();
            }
        }

        // On alarm
        private void camera_Alarm( object sender, System.EventArgs e )
        {
            if (saveOnMotion && !saveFeed)
            {
                if (intervalsToSave == 0 && intervalsToSaveStart == 0)
                {
                    intervalsToSaveStart = saveStartIntervals;

                    if (preSaveBuffer != null)
                    {
                        for (int i = 0; i < preSaveBuffer.Length; i++)
                        {
                            if (preSaveBuffer[i] != null)
                            {
                                preSaveBuffer[i].Dispose();
                                preSaveBuffer[i] = null;
                            }
                        }

                        preSaveBuffer = null;
                    }
                    preSaveBuffer = new Bitmap[saveStartIntervals];
                }
                else if ((intervalsToSave > 0 || intervalsToSaveStart == 1))
                {
                    // save movie for xx seconds after motion stops
                    intervalsToSave = (int)(saveExtended * (1000 / timerStats.Interval));
                }
            }
        }

        // On new frame
        private void camera_NewFrame( object sender, System.EventArgs e )
        {
            if (saveFeed || (intervalsToSaveStart == 0 && intervalsToSave > 0 && saveOnMotion))
            {
                try
                {
                    String timeStamp = null;

                    if (writer == null)
                    {
                        String fileName;
                        timeStamp = getDateString();

                        if (Directory.Exists(savePath))
                        {
                            fileName = savePath + String.Format(saveFormat, savePrefix, timeStamp);
                        }
                        else
                        {
                            throw new Exception("Save path not found.");
                        }

                        try
                        {
                            // create AVI writer
                            writer = new AVIWriter(AVIWriterCodec);

                            // open AVI file
                            writer.Open(fileName, cameraWindow.Camera.Width, cameraWindow.Camera.Height);
                        }
                        catch
                        {
                            if (writer != null) CloseWriter();
                        }
                    }

                    lock (writer)
                    {
                        Camera camera = cameraWindow.Camera;

                        camera.Lock();

                        // check for prebuffered frames
                        if (!saveFeed && preSaveBuffer != null && preSaveBuffer.Length > 0)
                        {
                            if (snapshotOnMotion)
                            {
                                String fileName;
                                if (timeStamp == null) timeStamp = getDateString();

                                if (Directory.Exists(snapshotPath))
                                {
                                    fileName = snapshotPath + String.Format(snapshotFormat, savePrefix, timeStamp);
                                }
                                else
                                {
                                    throw new Exception("Snapshot path not found.");
                                }

                                // save the first motion image as snapshot
                                preSaveBuffer[preSaveBuffer.Length - 1].Save(fileName,
                                    System.Drawing.Imaging.ImageFormat.Jpeg);
                            }

                            for (int i = preSaveBuffer.Length - 1; i >= 0; i--)
                            {
                                // save the frame
                                writer.AddFrame(preSaveBuffer[i]);

                                preSaveBuffer[i].Dispose();
                                preSaveBuffer[i] = null;
                            }

                            preSaveBuffer = null;
                        }

                        // save the frame
                        writer.AddFrame(camera.LastFrame);

                        camera.Unlock();
                    }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("=============: " + ex.Message);
                }
            }
            else if (intervalsToSaveStart > 0)
            {
                intervalsToSaveStart--;

                try
                {
                    Camera camera = cameraWindow.Camera;

                    camera.Lock();
                    preSaveBuffer[intervalsToSaveStart] = (Bitmap)camera.LastFrame.Clone();
                    camera.Unlock();
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("=============: " + ex.Message);
                }
            }
        }

        private void camera_alertFaceDetected(object sender, EventArgs e)
        {
            if (detectionAlertURL != null)
            {
                int cnt = (int)sender;

                MainMod.hitUrl(detectionAlertURL + "?cnt=" + cnt.ToString());
            }
        }

        private void camera_useCameraPreset(object sender, EventArgs e)
        {
            if (sourceUrl != null)
            {
                int pos = (int)sender;
                pos = (30 + pos + (pos - 1));

                Uri sourceUri = new Uri(sourceUrl);
                MainMod.cameraDecoderControl(pos, sourceUri.Host, sourceUri.Query);
            }
        }

        // Switch saving mode
        private void detectorSaveItem_Click( object sender, System.EventArgs e )
        {
            // change saving mode
            saveOnMotion = !saveOnMotion;

            // update menu
            detectorSaveItem.Checked = saveOnMotion;
        }

        // Enable/disable motion alaram
        private void motionAlarmItem_Click( object sender, System.EventArgs e )
        {
            motionAlarmItem.Checked = !motionAlarmItem.Checked;

            // enable/disable motion alarm
            if (detector != null)
            {
                detector.MotionLevelCalculation = motionAlarmItem.Checked;
                if (!motionAlarmItem.Checked) cameraWindow.ResetAlarm();
            }
        }

        private void trayIcon_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if ((e.Button == MouseButtons.Left && !SystemInformation.MouseButtonsSwapped) ||
                (e.Button == MouseButtons.Right && SystemInformation.MouseButtonsSwapped))
            {
                openToolStripMenuItem.PerformClick();
            }
        }

        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // display the main form
            this.Show();
            this.WindowState = FormWindowState.Normal;

            timerDisplay.Start();

            if (ctrlForm != null)
            {
                try
                {
                    ctrlForm.Show(this);
                }
                catch
                {
                }
                this.Focus();
            }
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            allowClose = true;
            this.Close();
        }

        private void detectorSaveSnapshot_Click(object sender, EventArgs e)
        {
            // change strict save mode
            snapshotOnMotion = !snapshotOnMotion;

            // update menu
            detectorSaveSnapshot.Checked = snapshotOnMotion;
        }

        private void menuSaveFeed_Click(object sender, EventArgs e)
        {
            // change save mode
            saveFeed = !saveFeed;

            // update menu
            menuSaveFeed.Checked = saveFeed;

            if (writer != null) CloseWriter();
            if (saveFeed && cameraWindow.Camera != null)
            {
                intervalsToSave = 0;
                intervalsToSaveStart = 0;

                if (preSaveBuffer != null)
                {
                    for (int i = 0; i < preSaveBuffer.Length; i++)
                    {
                        if (preSaveBuffer[i] != null)
                        {
                            preSaveBuffer[i].Dispose();
                            preSaveBuffer[i] = null;
                        }
                    }

                    preSaveBuffer = null;
                }
            }
        }

        private void menuWriteDebugInfo_Click(object sender, EventArgs e)
        {
            menuWriteDebugInfo.Checked = !menuWriteDebugInfo.Checked;

            try
            {
                if (debugWriter != null)
                {
                    if (detector != null) detector.DebugWriter = null;

                    debugWriter.Close();
                    debugWriter = null;
                }

                if (menuWriteDebugInfo.Checked && detector != null)
                {
                    String fileName;

                    if (Directory.Exists(debugPath))
                    {
                        fileName = debugPath + String.Format(debugFormat, savePrefix, getDateString());
                    }
                    else
                    {
                        throw new Exception("Debug path not found.");
                    }

                    debugWriter = new StreamWriter(fileName, true);
                    detector.DebugWriter = debugWriter;
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("=============: " + ex.Message);
            }
        }

        private void menuCameraController_Click(object sender, EventArgs e)
        {
            if (!menuCameraController.Checked)
            {
                menuCameraController.Checked = true;

                if (ctrlForm == null || (ctrlForm != null && ctrlForm.IsDisposed))
                {
                    ctrlForm = new ControlForm(sourceUrl);
                }

                ctrlForm.Show(this);
            }
            else
            {
                menuCameraController.Checked = false;
                ctrlForm.Hide();
            }
        }

        private void menuDrawTimestamp_Click(object sender, EventArgs e)
        {
            menuDrawTimestamp.Checked = !menuDrawTimestamp.Checked;

            Camera camera = cameraWindow.Camera;
            if (camera != null)
            {
                camera.DrawTimestamp = menuDrawTimestamp.Checked;
            }
        }

        private void menuOpenSaveFolder_Click(object sender, EventArgs e)
        {
            (new AppLauncher(savePath, "", AppLauncher.SHOWWINDOW_STYLES.SW_SHOWNORMAL)).runApp();
        }

        private void menuSnapshotFolder_Click(object sender, EventArgs e)
        {
            (new AppLauncher(snapshotPath, "", AppLauncher.SHOWWINDOW_STYLES.SW_SHOWNORMAL)).runApp();
        }

        private void menuDebugFolder_Click(object sender, EventArgs e)
        {
            (new AppLauncher(debugPath, "", AppLauncher.SHOWWINDOW_STYLES.SW_SHOWNORMAL)).runApp();
        }

        private void timerDisplay_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            timerDisplay.Stop();
            cameraWindow.Show();
        }

        private void menuEnableFaceDetection_Click(object sender, EventArgs e)
        {
            menuEnableFaceDetection.Checked = !menuEnableFaceDetection.Checked;

            // enable/disable face detection
            if (detector != null)
            {
                detector.EnableFaceDetection = menuEnableFaceDetection.Checked;
            }
        }

        private void menuAlertOnDetection_Click(object sender, EventArgs e)
        {
            menuAlertOnDetection.Checked = !menuAlertOnDetection.Checked;
        }
    }
}

Download javaCamViewer/MainForm.cs

Back to file list


Back to project page