private RFData AddToRFDataDatabase(SpectraCyberResponse spectraCyberResponse, Appointment appt) { RFData rfData = RFData.GenerateFrom(spectraCyberResponse); appt = DatabaseOperations.GetUpdatedAppointment(appt); rfData.Appointment = appt; rfData.Intensity = rfData.Intensity * MiscellaneousHardwareConstants.SPECTRACYBER_VOLTS_PER_STEP; // Add to database DatabaseOperations.AddRFData(rfData); configVals.rfData = rfData.Intensity; if (configVals.spectraCyberMode == SpectraCyberModeTypeEnum.SPECTRAL) { if (configVals.bandscan > configVals.frequency / 2) { configVals.bandscan = -1 * (configVals.frequency / 2); } else { configVals.bandscan = configVals.bandscan + MiscellaneousHardwareConstants.SPECTRACYBER_BANDWIDTH_STEP; } } else if (configVals.spectraCyberMode == SpectraCyberModeTypeEnum.CONTINUUM) { configVals.scanTime = configVals.scanTime + configVals.integrationStep; } return(rfData); }
private RFData AddToRFDataDatabase(SpectraCyberResponse spectraCyberResponse, int appId) { RFData rfData = RFData.GenerateFrom(spectraCyberResponse); // // Add to database // DatabaseOperations.CreateRFData(appId, rfData); return(rfData); }
public void TestGenerateFrom() { SpectraCyberResponse response = new SpectraCyberResponse(); DateTime date = DateTime.UtcNow; response.DateTimeCaptured = date; response.DecimalData = 15; response.RequestSuccessful = true; response.SerialIdentifier = 'c'; response.Valid = true; RFData data = RFData.GenerateFrom(response); Assert.IsTrue(data != null); Assert.AreEqual(response.DateTimeCaptured, data.TimeCaptured); Assert.AreEqual(response.DecimalData, data.Intensity); }
/// <summary> /// Method used to calibrate the Radio Telescope before each observation. /// /// The implementation of this functionality is on a "per-RT" basis, as /// in this may or may not work, it depends on if the derived /// AbstractRadioTelescope class has implemented it. /// </summary> public MovementResult ThermalCalibrateRadioTelescope(MovementPriority priority) { MovementResult moveResult = MovementResult.None; // Return if incoming priority is equal to or less than current movement if (priority <= RadioTelescope.PLCDriver.CurrentMovementPriority) { return(MovementResult.AlreadyMoving); } // We only want to do this if it is safe to do so. Return false if not if (!AllSensorsSafe) { return(MovementResult.SensorsNotSafe); } // If a lower-priority movement was running, safely interrupt it. RadioTelescope.PLCDriver.InterruptMovementAndWaitUntilStopped(); // If the thread is locked (two moves coming in at the same time), return if (Monitor.TryEnter(MovementLock)) { Orientation current = GetCurrentOrientation(); moveResult = RadioTelescope.PLCDriver.MoveToOrientation(MiscellaneousConstants.THERMAL_CALIBRATION_ORIENTATION, current); if (moveResult != MovementResult.Success) { if (RadioTelescope.PLCDriver.CurrentMovementPriority != MovementPriority.Critical) { RadioTelescope.PLCDriver.CurrentMovementPriority = MovementPriority.None; } Monitor.Exit(MovementLock); return(moveResult); } // start a timer so we can have a time variable Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); // temporarily set spectracyber mode to continuum RadioTelescope.SpectraCyberController.SetSpectraCyberModeType(SpectraCyberModeTypeEnum.CONTINUUM); // read data SpectraCyberResponse response = RadioTelescope.SpectraCyberController.DoSpectraCyberScan(); // end the timer stopWatch.Stop(); double time = stopWatch.Elapsed.TotalSeconds; RFData rfResponse = RFData.GenerateFrom(response); // move back to previous location moveResult = RadioTelescope.PLCDriver.MoveToOrientation(current, MiscellaneousConstants.THERMAL_CALIBRATION_ORIENTATION); if (moveResult != MovementResult.Success) { if (RadioTelescope.PLCDriver.CurrentMovementPriority != MovementPriority.Critical) { RadioTelescope.PLCDriver.CurrentMovementPriority = MovementPriority.None; } RadioTelescope.SpectraCyberController.StopScan(); Monitor.Exit(MovementLock); return(moveResult); } // analyze data // temperature (Kelvin) = (intensity * time * wein's displacement constant) / (Planck's constant * speed of light) double weinConstant = 2.8977729; double planckConstant = 6.62607004 * Math.Pow(10, -34); double speedConstant = 299792458; double temperature = (rfResponse.Intensity * time * weinConstant) / (planckConstant * speedConstant); // convert to fahrenheit temperature = temperature * (9 / 5) - 459.67; // check against weather station reading double weatherStationTemp = RadioTelescope.WeatherStation.GetOutsideTemp(); // Set SpectraCyber mode back to UNKNOWN RadioTelescope.SpectraCyberController.SetSpectraCyberModeType(SpectraCyberModeTypeEnum.UNKNOWN); // return true if working correctly, false if not if (Math.Abs(weatherStationTemp - temperature) < MiscellaneousConstants.THERMAL_CALIBRATION_OFFSET) { moveResult = RadioTelescope.PLCDriver.MoveToOrientation(MiscellaneousConstants.Stow, current); } if (RadioTelescope.PLCDriver.CurrentMovementPriority != MovementPriority.Critical) { RadioTelescope.PLCDriver.CurrentMovementPriority = MovementPriority.None; } RadioTelescope.SpectraCyberController.StopScan(); Monitor.Exit(MovementLock); } else { moveResult = MovementResult.AlreadyMoving; } return(moveResult); }