private bool processMessage(String data) { if (data.IndexOf("COORDINATE_MOVE") != -1) { // we have a move command coming in rtController.ExecuteRadioTelescopeControlledStop(MovementPriority.GeneralStop); // get azimuth and orientation int azimuthIndex = data.IndexOf("AZIM"); int elevationIndex = data.IndexOf("ELEV"); int idIndex = data.IndexOf("ID"); double azimuth = 0.0; double elevation = 0.0; string userId = ""; if (azimuthIndex != -1 && elevationIndex != -1 && idIndex != -1) { elevation = Convert.ToDouble(data.Substring(elevationIndex + 5, azimuthIndex - elevationIndex - 5)); azimuth = Convert.ToDouble(data.Substring(azimuthIndex + 5, idIndex - azimuthIndex - 5)); userId = data.Substring(idIndex + 3); } else { return(false); } logger.Debug(Utilities.GetTimeStamp() + ": Azimuth " + azimuth); logger.Debug(Utilities.GetTimeStamp() + ": Elevation " + elevation); Orientation movingTo = new Orientation(azimuth, elevation); rtController.MoveRadioTelescopeToOrientation(movingTo, MovementPriority.Manual); // TODO: store the User Id and movement somewhere in the database (issue #392) return(true); } else if (data.IndexOf("SET_OVERRIDE") != -1) { // false = ENABLED; true = OVERRIDING // If "OVR" is contained in the data, will return true bool doOverride = data.Contains("OVR"); // Non-PLC Overrides if (data.Contains("WEATHER_STATION")) { controlRoom.weatherStationOverride = data.Contains("OVR"); rtController.setOverride("weather station", data.Contains("OVR")); DatabaseOperations.SetOverrideForSensor(SensorItemEnum.WEATHER_STATION, doOverride); } // PLC Overrides else if (data.Contains("MAIN_GATE")) { rtController.setOverride("main gate", doOverride); } // Proximity overrides else if (data.Contains("ELEVATION_LIMIT_0")) { rtController.setOverride("elevation proximity (1)", doOverride); } else if (data.Contains("ELEVATION_LIMIT_90")) { rtController.setOverride("elevation proximity (2)", doOverride); } // Sensor network overrides else if (data.Contains("AZ_ABS_ENC")) { rtController.setOverride("azimuth absolute encoder", doOverride); } else if (data.Contains("EL_ABS_ENC")) { rtController.setOverride("elevation absolute encoder", doOverride); } else if (data.Contains("AZ_ACC")) { rtController.setOverride("azimuth motor accelerometer", doOverride); } else if (data.Contains("EL_ACC")) { rtController.setOverride("elevation motor accelerometer", doOverride); } else if (data.Contains("CB_ACC")) { rtController.setOverride("counterbalance accelerometer", doOverride); } else if (data.Contains("AZIMUTH_MOT_TEMP")) { rtController.setOverride("azimuth motor temperature", doOverride); } else if (data.Contains("ELEVATION_MOT_TEMP")) { rtController.setOverride("elevation motor temperature", doOverride); } else { return(false); } return(true); } else if (data.IndexOf("SCRIPT") != -1) { // we have a move command coming in rtController.ExecuteRadioTelescopeControlledStop(MovementPriority.GeneralStop); // get azimuth and orientation int colonIndex = data.IndexOf(":"); string script = ""; if (colonIndex != -1) { script = data.Substring(colonIndex + 2); } else { return(false); } logger.Debug(Utilities.GetTimeStamp() + ": Script " + script); if (script.Contains("DUMP")) { rtController.SnowDump(MovementPriority.Manual); } else if (script.Contains("FULL_EV")) { rtController.FullElevationMove(MovementPriority.Manual); } else if (script.Contains("CALIBRATE")) { rtController.ThermalCalibrateRadioTelescope(MovementPriority.Manual); } else if (script.Contains("STOW")) { rtController.MoveRadioTelescopeToOrientation(MiscellaneousConstants.Stow, MovementPriority.Manual); } else if (script.Contains("FULL_CLOCK")) { // TODO: Implement with MoveByX function (issue #379) } else if (script.Contains("FULL_COUNTER")) { // TODO: Implement with MoveByX function (issue #379) } else { return(false); } return(true); } else if (data.IndexOf("STOP_RT") != -1) { rtController.ExecuteRadioTelescopeControlledStop(MovementPriority.GeneralStop); } else if (data.IndexOf("SENSOR_INIT") != -1) { string[] splitData = data.Split(','); if (splitData.Length != 10) { return(false); } var config = rtController.RadioTelescope.SensorNetworkServer.InitializationClient.SensorNetworkConfig; // Set all the sensors to their new initialization config.AzimuthTemp1Init = splitData[(int)SensorInitializationEnum.AzimuthTemp].Equals("1"); config.ElevationTemp1Init = splitData[(int)SensorInitializationEnum.ElevationTemp].Equals("1"); config.AzimuthAccelerometerInit = splitData[(int)SensorInitializationEnum.AzimuthAccelerometer].Equals("1"); config.ElevationAccelerometerInit = splitData[(int)SensorInitializationEnum.ElevationAccelerometer].Equals("1"); config.CounterbalanceAccelerometerInit = splitData[(int)SensorInitializationEnum.CounterbalanceAccelerometer].Equals("1"); config.AzimuthEncoderInit = splitData[(int)SensorInitializationEnum.AzimuthEncoder].Equals("1"); config.ElevationEncoderInit = splitData[(int)SensorInitializationEnum.ElevationEncoder].Equals("1"); // Set the timeout values config.TimeoutDataRetrieval = (int)(double.Parse(splitData[7]) * 1000); config.TimeoutInitialization = (int)(double.Parse(splitData[8]) * 1000); // Reboot rtController.RadioTelescope.SensorNetworkServer.RebootSensorNetwork(); return(true); } // can't find a keyword then we fail return(false); }
public ExecuteTCPCommandResult ExecuteRLCommand(String[] splitCommandString) { // Convert version from string to double. This is the first value in our string before the "|" character. // From here we will direct to the appropriate parsing for said version double version = 0.0; try { version = Double.Parse(splitCommandString[TCPCommunicationConstants.VERSION_NUM]); } catch (Exception e) { String errMessage = TCPCommunicationConstants.VERSION_CONVERSION_ERR + e.Message; return(new ExecuteTCPCommandResult(MovementResult.InvalidCommand, errMessage)); } // Use appropriate parsing for given version if (version == 1.0) { // command is placed after pike and before colon; get it here // <VERSION> | <COMMANDTYPE> | <NAME<VALUES>> | TIME string command = splitCommandString[TCPCommunicationConstants.COMMAND_TYPE]; if (command == "ORIENTATION_MOVE") { // we have a move command coming in rtController.ExecuteRadioTelescopeControlledStop(MovementPriority.GeneralStop); // get azimuth and orientation double azimuth = 0.0; double elevation = 0.0; try { azimuth = Convert.ToDouble(splitCommandString[TCPCommunicationConstants.ORIENTATION_MOVE_AZ]); elevation = Convert.ToDouble(splitCommandString[TCPCommunicationConstants.ORIENTATION_MOVE_EL]); } catch (Exception e) { String errMessage = TCPCommunicationConstants.AZ_EL_CONVERSION_ERR + e.Message; return(new ExecuteTCPCommandResult(MovementResult.InvalidCommand, errMessage)); } logger.Debug(Utilities.GetTimeStamp() + ": Azimuth " + azimuth); logger.Debug(Utilities.GetTimeStamp() + ": Elevation " + elevation); Orientation movingTo = new Orientation(azimuth, elevation); // check result of movement, if it fails we return the result type along with an error message. // The command parse was successful however, so we indicate that MovementResult result = rtController.MoveRadioTelescopeToOrientation(movingTo, MovementPriority.Manual); if (result != MovementResult.Success) { return(new ExecuteTCPCommandResult(result, TCPCommunicationConstants.ORIENTATION_MOVE_ERR + result.ToString())); } else // everything was successful { return(new ExecuteTCPCommandResult(result)); } } else if (command == "RELATIVE_MOVE") { // we have a relative movement command rtController.ExecuteRadioTelescopeControlledStop(MovementPriority.GeneralStop); // get azimuth and orientation double azimuth = 0.0; double elevation = 0.0; try { azimuth = Convert.ToDouble(splitCommandString[TCPCommunicationConstants.RELATIVE_MOVE_AZ]); elevation = Convert.ToDouble(splitCommandString[TCPCommunicationConstants.RELATIVE_MOVE_EL]); } catch (Exception e) { String errMessage = TCPCommunicationConstants.AZ_EL_CONVERSION_ERR + e.Message; return(new ExecuteTCPCommandResult(MovementResult.InvalidCommand, errMessage)); } logger.Debug(Utilities.GetTimeStamp() + ": Azimuth " + azimuth); logger.Debug(Utilities.GetTimeStamp() + ": Elevation " + elevation); Orientation movingBy = new Orientation(azimuth, elevation); MovementResult result = rtController.MoveRadioTelescopeByXDegrees(movingBy, MovementPriority.Manual); if (result != MovementResult.Success) { // the actual movement failed return(new ExecuteTCPCommandResult(result, TCPCommunicationConstants.RELATIVE_MOVE_ERR + result.ToString())); } else { // everything was successful return(new ExecuteTCPCommandResult(result)); } } else if (command == "SET_OVERRIDE") { string sensorToOverride = splitCommandString[TCPCommunicationConstants.SENSOR_TO_OVERRIDE]; bool doOverride = splitCommandString[TCPCommunicationConstants.DO_OVERRIDE] == "TRUE" ? true : false; switch (sensorToOverride) { // Non-PLC Overrides case "WEATHER_STATION": controlRoom.weatherStationOverride = doOverride; rtController.setOverride("weather station", doOverride); DatabaseOperations.SetOverrideForSensor(SensorItemEnum.WEATHER_STATION, doOverride); break; // PLC Overrides case "MAIN_GATE": rtController.setOverride("main gate", doOverride); break; // Proximity overrides case "ELEVATION_LIMIT_0": rtController.setOverride("elevation proximity (1)", doOverride); break; case "ELEVATION_LIMIT_90": rtController.setOverride("elevation proximity (2)", doOverride); break; // Sensor network overrides case "AZ_ABS_ENC": rtController.setOverride("azimuth absolute encoder", doOverride); break; case "EL_ABS_ENC": rtController.setOverride("elevation absolute encoder", doOverride); break; case "AZ_ACC": rtController.setOverride("azimuth motor accelerometer", doOverride); break; case "EL_ACC": rtController.setOverride("elevation motor accelerometer", doOverride); break; case "CB_ACC": rtController.setOverride("counterbalance accelerometer", doOverride); break; case "AZIMUTH_MOT_TEMP": rtController.setOverride("azimuth motor temperature", doOverride); break; case "ELEVATION_MOT_TEMP": rtController.setOverride("elevation motor temperature", doOverride); break; // If no case is reached, the sensor is not valid. Return appropriately default: return(new ExecuteTCPCommandResult(MovementResult.InvalidCommand, TCPCommunicationConstants.INVALID_SENSOR_OVERRIDE + sensorToOverride)); } return(new ExecuteTCPCommandResult(MovementResult.Success)); } else if (command == "SCRIPT") { // we have a move command coming in rtController.ExecuteRadioTelescopeControlledStop(MovementPriority.GeneralStop); // Retrieve script name used for switch case string script = splitCommandString[TCPCommunicationConstants.SCRIPT_NAME]; MovementResult result = MovementResult.None; logger.Debug(Utilities.GetTimeStamp() + ": Script " + script); switch (script) { case "DUMP": result = rtController.SnowDump(MovementPriority.Manual); break; case "FULL_EV": result = rtController.FullElevationMove(MovementPriority.Manual); break; case "THERMAL_CALIBRATE": result = rtController.ThermalCalibrateRadioTelescope(MovementPriority.Manual); break; case "STOW": result = rtController.MoveRadioTelescopeToOrientation(MiscellaneousConstants.Stow, MovementPriority.Manual); break; case "FULL_CLOCK": result = rtController.MoveRadioTelescopeByXDegrees(new Orientation(360, 0), MovementPriority.Manual); break; case "FULL_COUNTER": result = rtController.MoveRadioTelescopeByXDegrees(new Orientation(-360, 0), MovementPriority.Manual); break; case "HOME": result = rtController.HomeTelescope(MovementPriority.Manual); break; case "HARDWARE_MVMT_SCRIPT": result = rtController.ExecuteHardwareMovementScript(MovementPriority.Manual); break; default: // If no command is found, result = invalid result = MovementResult.InvalidCommand; break; } // Return based off of movement result if (result != MovementResult.Success) { return(new ExecuteTCPCommandResult(result, TCPCommunicationConstants.SCRIPT_ERR + result.ToString())); } else { // everything was successful return(new ExecuteTCPCommandResult(result)); } } else if (command == "STOP_RT") { rtController.RadioTelescope.PLCDriver.InterruptMovementAndWaitUntilStopped(); return(new ExecuteTCPCommandResult(MovementResult.Success, TCPCommunicationConstants.ALL_STOP_ERR)); } else if (command == "SENSOR_INIT") { // Retrieve sensor init values from the comma separated portion of the string string[] splitData = splitCommandString[TCPCommunicationConstants.SENSOR_INIT_VALUES].Split(','); var config = rtController.RadioTelescope.SensorNetworkServer.InitializationClient.SensorNetworkConfig; // Set all the sensors to their new initialization config.AzimuthTemp1Init = splitData[(int)SensorInitializationEnum.AzimuthTemp].Equals("1"); config.ElevationTemp1Init = splitData[(int)SensorInitializationEnum.ElevationTemp].Equals("1"); config.AzimuthAccelerometerInit = splitData[(int)SensorInitializationEnum.AzimuthAccelerometer].Equals("1"); config.ElevationAccelerometerInit = splitData[(int)SensorInitializationEnum.ElevationAccelerometer].Equals("1"); config.CounterbalanceAccelerometerInit = splitData[(int)SensorInitializationEnum.CounterbalanceAccelerometer].Equals("1"); config.AzimuthEncoderInit = splitData[(int)SensorInitializationEnum.AzimuthEncoder].Equals("1"); config.ElevationEncoderInit = splitData[(int)SensorInitializationEnum.ElevationEncoder].Equals("1"); // Set the timeout values config.TimeoutDataRetrieval = (int)(double.Parse(splitData[7]) * 1000); config.TimeoutInitialization = (int)(double.Parse(splitData[8]) * 1000); // Reboot rtController.RadioTelescope.SensorNetworkServer.RebootSensorNetwork(); return(new ExecuteTCPCommandResult(MovementResult.Success)); } else if (command == "REQUEST") { switch (splitCommandString[TCPCommunicationConstants.REQUEST_TYPE]) { case "MVMT_DATA": return(new ExecuteTCPCommandResult(MovementResult.Success, GetMovementData())); default: return(new ExecuteTCPCommandResult(MovementResult.InvalidCommand, TCPCommunicationConstants.INVALID_REQUEST_TYPE + splitCommandString[TCPCommunicationConstants.REQUEST_TYPE])); } } // can't find a keyword then we return Invalid Command sent return(new ExecuteTCPCommandResult(MovementResult.InvalidCommand, TCPCommunicationConstants.COMMAND_NOT_FOUND + command)); } // Version is not found; add new versions here else { return(new ExecuteTCPCommandResult(MovementResult.InvalidCommand, TCPCommunicationConstants.VERSION_NOT_FOUND + version)); } }