コード例 #1
0
        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);
        }
コード例 #2
0
        private RFData AddToRFDataDatabase(SpectraCyberResponse spectraCyberResponse, int appId)
        {
            RFData rfData = RFData.GenerateFrom(spectraCyberResponse);

            //
            // Add to database
            //
            DatabaseOperations.CreateRFData(appId, rfData);

            return(rfData);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        /// <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);
        }