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(); } }
// 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); }