Ejemplo n.º 1
0
        private void IInputMessageProcessor(IInputMessage inputMessage)
        {
            try
            {
                Console.WriteLine("[INFO] ICANSEE.IInputMessage received (" + inputMessage.ControlFunction.ToString() + "): " + JsonConvert.SerializeObject(inputMessage));

                List <string> param    = inputMessage.Parameters;
                string        result   = "";
                string        errorLog = "";
                bool          status;
                switch (inputMessage.ControlFunction)
                {
                case ControlFunction.AddCamera:
                    // "0", "1", null, "Default Webcam", "camera"
                    //helper.AddReplaceCameraConfiguration(1, new CameraConfiguration(0, null, "Default Webcam", 1, "camera"));

                    helper.AddReplaceCameraConfiguration(int.Parse(param[1]), new CameraConfiguration(int.Parse(param[0]), param[2], param[3], int.Parse(param[1]), param[4]));
                    break;

                case ControlFunction.DisplayImageInServerGUI:
                    // firstDevice.ComputeDeviceId, port.ToString()
                    // string result = utility.DisplayImageWindow(firstDevice, port);

                    result = utility.DisplayImageWindow(utility.computeDeviceInfoMap[param[0]], int.Parse(param[1]));
                    if (result == null)
                    {
                        errorLog = "Error occurred @ " + ControlFunction.DisplayImageInServerGUI.ToString();
                    }
                    break;

                case ControlFunction.ExecutePresetExtended:
                    // presetId, cameraId, postResultProcessingStatement

                    logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before executing preset: " + param[0] + "," + param[1]);
                    result = helper.ExecutePresetExtended(param[0], helper.QueryCameraDescription(int.Parse(param[1])), utility.ConvertHtmlToSymbols(param[2]).Replace("{{host}}", brokerHubHost).Replace("{{port}}", brokerHubPort));
                    if (result == null)
                    {
                        errorLog = "Error occurred @ " + ControlFunction.ExecutePreset.ToString();
                    }

                    break;

                case ControlFunction.UnloadPresetAndCamera:
                    // presetId
                {
                    logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before UnloadPresetAndCamera preset: " + param[0]);
                    var    preset          = utility.QueryPresetById(param[0]);
                    string computeDeviceId = preset.ComputeDeviceId;
                    int    port            = preset.Port;

                    var computeDeviceInfo = utility.QueryComputeDeviceById(computeDeviceId);

                    if (computeDeviceInfo == null)
                    {
                        status = false;
                        result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                    }
                    else
                    {
                        var cameraDesc = helper.PresetCameraMap[param[0]];
                        if (cameraDesc == null)
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("[WARNING] ICANSEE.cs: IInputMessageProcessor: " + "case ControlFunction.UnloadPresetAndCamera: " + "camera not associated with preset");
                            Console.ResetColor();
                        }
                        else
                        {
                            logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "1 Before UnloadCamera for preset (camera=" + cameraDesc.Id + ", preset=" + param[0] + ")");
                            status = helper.UnloadCamera(cameraDesc.Id, param[0]);
                            logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "1 After UnloadCamera for preset (camera=" + cameraDesc.Id + ", preset=" + param[0] + ")");
                            result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                        }

                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "2 Before UnloadAlgorithm for preset: " + param[0]);
                        status = helper.UnloadAlgorithm(param[0]);
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "2 After UnloadAlgorithm for preset: " + param[0]);
                        result = FormatBooleanStatus(inputMessage.ControlFunction, status);

                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "3 Before UnloadAlgorithm for preset: " + param[0]);
                        status = helper.UnloadAlgorithm(param[0]);
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "3 After UnloadAlgorithm for preset: " + param[0]);
                        result = FormatBooleanStatus(inputMessage.ControlFunction, status);

                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "4 Before UnloadPreset: " + param[0] + "," + computeDeviceId + "," + port.ToString());
                        status = helper.UnloadPreset(param[0], computeDeviceInfo, port);
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "4 After UnloadPreset (status=" + status.ToString() + "): " + param[0] + "," + computeDeviceId + "," + port.ToString());
                        result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                    }
                    if (result == null)
                    {
                        errorLog = "Error occurred @ " + ControlFunction.UnloadPresetAndCamera.ToString();
                    }
                }

                break;

                case ControlFunction.ExecutePreset:
                    // "Preset1", "2"
                    // result = helper.ExecutePreset("Preset1", helper.QueryCameraDescription(2));

                    logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before executing preset: " + param[0] + "," + param[1]);
                    result = helper.ExecutePreset(param[0], helper.QueryCameraDescription(int.Parse(param[1])));
                    if (result == null)
                    {
                        errorLog = "Error occurred @ " + ControlFunction.ExecutePreset.ToString();
                    }
                    break;

                case ControlFunction.UnloadPreset:
                    // "Preset1", firstDevice.ComputeDeviceId, 5000
                    if (param.Count == 3)
                    {
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before UnloadPreset: " + param[0] + "," + param[1] + "," + param[2]);
                        status = helper.UnloadPreset(param[0], utility.QueryComputeDeviceById(param[1]), int.Parse(param[2]));
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "After UnloadPreset (status=" + status.ToString() + "): " + param[0] + "," + param[1] + "," + param[2]);
                        result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                    }
                    // "Preset1"
                    else if (param.Count == 1)
                    {
                        var    preset          = utility.QueryPresetById(param[0]);
                        string computeDeviceId = preset.ComputeDeviceId;
                        int    port            = preset.Port;

                        var computeDeviceInfo = utility.QueryComputeDeviceById(computeDeviceId);

                        if (computeDeviceInfo == null)
                        {
                            status = false;
                            result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                        }
                        else
                        {
                            logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before UnloadAlgorithm: " + param[0]);
                            status = helper.UnloadAlgorithm(param[0]);
                            logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "After UnloadAlgorithm: " + param[0]);
                            result = FormatBooleanStatus(inputMessage.ControlFunction, status);

                            logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before UnloadPreset (param.Count=1): " + param[0] + "," + computeDeviceId + "," + port.ToString());
                            status = helper.UnloadPreset(param[0], computeDeviceInfo, port);
                            logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "After UnloadPreset (param.Count=1) (status=" + status.ToString() + "): " + param[0] + "," + computeDeviceId + "," + port.ToString());
                            result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                        }
                    }
                    break;

                case ControlFunction.ListAllCameraInUse:

                    List <Tuple <string, string> > cameraInUse = helper.GetAllCameraInUse();
                    result = JsonConvert.SerializeObject(cameraInUse);
                    break;

                case ControlFunction.UnloadCamera:
                    // CameraId: 1
                    logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before UnloadCamera: " + param[0]);
                    status = helper.UnloadCamera(int.Parse(param[0]), param[1]);
                    logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "After UnloadCamera: " + param[0]);
                    result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                    break;

                case ControlFunction.UnloadAlgorithm:
                    // "Algo1", firstDevice.ComputeDeviceId, 5000
                    if (param.Count == 3)
                    {
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before UnloadAlgorithm: " + param[0]);
                        status = helper.UnloadAlgorithm(param[0], utility.QueryComputeDeviceById(param[1]), int.Parse(param[2]));
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "After UnloadAlgorithm: " + param[0]);
                        result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                    }
                    // Or "Preset1"
                    else if (param.Count == 1)
                    {
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "Before UnloadAlgorithm: " + param[0]);
                        status = helper.UnloadAlgorithm(param[0]);
                        logger.LogComputeDeviceStateMap(helper.ComputeDeviceStateMap, "After UnloadAlgorithm: " + param[0]);
                        result = FormatBooleanStatus(inputMessage.ControlFunction, status);
                    }
                    break;

                case ControlFunction.QueryComputeDevice:
                    // Gets Compute Device State Map
                    result = "{\"CurrentState\":\"" + logger._GetShortFormattedStateMap(helper.ComputeDeviceStateMap).Replace("\n", "\\n") + "\"}";
                    break;

                case ControlFunction.RunningTasks:
                    // Gets status of running presets and commands to unload
                    result = "<p style=\"font-family: Consolas;\">" + logger._GetShortFormattedStateMap(helper.ComputeDeviceStateMap).Replace("\n", "\\n") + "</p>";
                    break;
                }

                string json = result;
                string text = result;

                if (errorLog != "")
                {
                    text = ", Error: " + errorLog;
                }

                InformationMessage outputMessage = new InformationMessage(json, text);
                Hub.Publish <InformationMessage>(outputMessage);
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("[ERROR] ICANSEE.cs: IInputMessageProcessor: " + ex.Message);
                if (ex.InnerException != null)
                {
                    Console.WriteLine("        ICANSEE.cs: IInputMessageProcessor: (InnerException) " + ex.InnerException.Message);
                }
                Console.ResetColor();
            }
        }
Ejemplo n.º 2
0
        // Private ExecutePresetHelper
        private string ExecutePresetHelper(string presetId, CameraConfiguration cameraConfiguration, string postScript)
        {
            int  RunCompatibility      = 0;
            bool targetCameraOpen      = false;
            bool targetAlgorithmActive = false;

            PresetDescription presetConfiguration = utility.QueryPresetById(presetId, brokerHubHost, brokerHubPort);

            if (presetConfiguration == null)
            {
                throw new Exception("Preset not found: " + presetId);
            }

            ComputeDeviceInfo computeDevice = utility.QueryComputeDeviceById(presetConfiguration.ComputeDeviceId);
            int port = presetConfiguration.Port;

            ComputeDeviceState currentState = QueryDeviceState(computeDevice, port);

            logger.LogComputeDeviceStateMap(computeDeviceStateMap, string.Format("QueryDeviceState({0}, {1}) = {2}", computeDevice.ComputeDeviceId, port.ToString(), logger._GetShortFormattedComputeDeviceState(currentState)));

            if (currentState == null)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("[ERROR] ExecutePreset(presetId={0}, cameraId={1}) Failure in current state", presetId, cameraConfiguration.Id);
                Console.ResetColor();
                return(null);
            }

            // Any logic for deciding on run
            // Update statusMap with conditions
            if (!(currentState.IsAnyAlgorithmsActive() || currentState.IsAnyCameraActive() || currentState.IsAnyPresetActive()))
            {
                RunCompatibility = 1;
            }
            // If same algorithm, camera is there but preset is over, then run
            else if (currentState.IsAlgorithmActive(presetConfiguration.AlgorithmId) && currentState.IsCameraActive(cameraConfiguration.Id) && !(currentState.IsPresetActive(presetId)))
            {
                RunCompatibility = 2;
            }
            else
            {
                RunCompatibility = 5;

                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("[FIX NEEDED] ExecutePreset(presetId={0}, cameraId={1}) Backdoor activated for allowing execution", presetId, cameraConfiguration.Id);
                Console.ResetColor();
            }

            if (currentState.IsCameraActive(cameraConfiguration.Id))
            {
                targetCameraOpen = true;
            }
            if (currentState.IsAlgorithmActive(presetConfiguration.AlgorithmId))
            {
                targetAlgorithmActive = true;
            }


            // If run compatibility satisfies, run the algorithm in specific compute device
            if (RunCompatibility > 0)
            {
                string result = "";

                // If camera already not loaded, call LoadCamera
                if (!targetCameraOpen)
                {
                    result = utility.LoadCamera(cameraConfiguration.Id, computeDevice, port);
                    if (result == null)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("[ERROR] ExecutePreset(presetId={0}, cameraId={1}) LoadCamera() Failed", presetId, cameraConfiguration.Id);
                        Console.ResetColor();
                        return(null);
                    }
                    else
                    {
                        computeDeviceStateMap[computeDevice][port].SetCameraActive(cameraConfiguration);
                        logger.LogComputeDeviceStateMap(computeDeviceStateMap, string.Format("SetCameraActive={0}", cameraConfiguration.Id + "," + cameraConfiguration.Label));
                    }
                }


                // If preset request to run ScalarExecuteCommand attribute, call the InitCommandFirst
                if (!targetAlgorithmActive)
                {
                    result = utility.ExecuteAlgorithm(presetConfiguration, computeDevice.IpAddress, "InitCommand");

                    if (result == null)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("[ERROR] ExecutePreset(presetId={0}, cameraId={1}) InitAlgo Failed", presetId, cameraConfiguration.Id);
                        Console.ResetColor();
                        return(null);
                    }
                }

                computeDeviceStateMap[computeDevice][port].SetPresetActive(presetConfiguration, utility.GetAlgorithmsList());
                presetCameraMap[presetId] = cameraConfiguration;
                logger.LogComputeDeviceStateMap(computeDeviceStateMap, "SetPresetActive=" + presetConfiguration.Id + "," + presetConfiguration.Name);

                // If preset is one time run, then clear preset from the statusMap
                if (presetConfiguration.ReturnResult && !presetConfiguration.InfiniteLoop && (presetConfiguration.RunOnce || presetConfiguration.LoopLimit == 1))
                {
                    computeDeviceStateMap[computeDevice][port].ClearPreset(presetConfiguration.Id);
                    logger.LogComputeDeviceStateMap(computeDeviceStateMap, "One Run ClearPreset=" + presetConfiguration.Id + "," + presetConfiguration.Name);
                }


                if (postScript == null)
                {
                    result = utility.ExecuteAlgorithm(presetConfiguration, computeDevice.IpAddress);
                }
                else
                {
                    result = utility.ExecuteAlgorithm(presetConfiguration, computeDevice.IpAddress, resultStatementToOverride: postScript);
                }


                if (result == null)
                {
                    computeDeviceStateMap[computeDevice][port].ClearPreset(presetConfiguration.Id);
                    logger.LogComputeDeviceStateMap(computeDeviceStateMap, "Preset Failure ClearPreset=" + presetConfiguration.Id + "," + presetConfiguration.Name);


                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("[ERROR] ExecutePreset(presetId={0}, cameraId={1}) Preset Execution Failed", presetId, cameraConfiguration.Id);
                    Console.ResetColor();

                    return(null);
                }

                return(result);
            }

            return(null);
        }