/// <summary> /// An override of the Subsystem CanPerform method /// </summary> /// <param name="proposedEvent"></param> /// <param name="environment"></param> /// <returns></returns> public override bool CanPerform(Event proposedEvent, Universe environment) { if (base.CanPerform( proposedEvent, environment) == false) return false; //double timetoslew = (rand()%5)+8; double timetoslew = _timetoslew; double es = proposedEvent.GetEventStart(Asset); double ts = proposedEvent.GetTaskStart(Asset); double te = proposedEvent.GetTaskEnd(Asset); if (es + timetoslew > ts) { if (es + timetoslew > te) { // TODO: Change this to Logger //Console.WriteLine("ADCS: Not enough time to slew event start: "+ es + "task end" + te); return false; } else ts = es + timetoslew; } // from Brown, Pp. 99 DynamicState position = Asset.AssetDynamicState; Matrix<double> m_SC_pos_at_ts_ECI = position.PositionECI(ts); Matrix<double> m_target_pos_at_ts_ECI = _task.Target.DynamicState.PositionECI(ts); Matrix<double> m_pv = m_target_pos_at_ts_ECI - m_SC_pos_at_ts_ECI; // set state data _newState.SetProfile(POINTVEC_KEY, new HSFProfile<Matrix<double>>(ts, m_pv)); proposedEvent.SetTaskStart(Asset, ts); return true; }
/// <summary> /// Override of the canPerform method for the power subsystem /// </summary> /// <param name="oldState"></param> /// <param name="newState"></param> /// <param name="tasks"></param> /// <param name="universe"></param> /// <returns></returns> public override bool CanPerform(Event proposedEvent, Universe universe) { //Make sure all dependent subsystems have been evaluated if (!base.CanPerform(proposedEvent, universe)) return false; double es = proposedEvent.GetEventStart(Asset); double te = proposedEvent.GetTaskEnd(Asset); double ee = proposedEvent.GetEventEnd(Asset); double powerSubPowerOut = 10; if (ee > SimParameters.SimEndSeconds) { Console.WriteLine("Simulation ended"); return false; } // get the old DOD double olddod = _newState.GetLastValue(Dkeys.First()).Value; // collect power profile out Delegate DepCollector; SubsystemDependencyFunctions.TryGetValue("DepCollector", out DepCollector); HSFProfile<double> powerOut = (HSFProfile<double>)DepCollector.DynamicInvoke(proposedEvent); // deps->callDoubleDependency("POWERSUB_getPowerProfile"); powerOut = powerOut + powerSubPowerOut; // collect power profile in DynamicState position = Asset.AssetDynamicState; HSFProfile<double> powerIn = CalcSolarPanelPowerProfile(es, te, _newState, position, universe); // calculate dod rate HSFProfile<double> dodrateofchange = ((powerOut - powerIn) / _batterySize); bool exceeded= false ; double freq = 1.0; HSFProfile<double> dodProf = dodrateofchange.lowerLimitIntegrateToProf(es, te, freq, 0.0, ref exceeded, 0, olddod); _newState.AddValue(DOD_KEY, dodProf); return true; }
/// <summary> /// Dependency Function for Power Subsystem /// </summary> /// <param name="currentEvent"></param> /// <returns></returns> public HSFProfile<double> POWERSUB_PowerProfile_EOSENSORSUB(Event currentEvent) { HSFProfile<double> prof1 = new HSFProfile<double>(); prof1[currentEvent.GetEventStart(Asset)] = 10; if (currentEvent.State.GetValueAtTime(EOON_KEY, currentEvent.GetTaskStart(Asset)).Value) { prof1[currentEvent.GetTaskStart(Asset)] = 60; prof1[currentEvent.GetTaskEnd(Asset)] = 10; } return prof1; }
/// <summary> /// An override of the Subsystem CanPerform method /// </summary> /// <param name="proposedEvent"></param> /// <param name="environment"></param> /// <returns></returns> public override bool CanPerform(Event proposedEvent, Universe environment) { if (!base.CanPerform(proposedEvent, environment)) return false; if (_task.Type == TaskType.IMAGING) { //set pixels and time to caputre based on target value int value = _task.Target.Value; double pixels = _lowQualityPixels; double timetocapture = _lowQualityTime; if (value <= _highQualityTime && value >= _midQualityTime) //Morgan took out magic numbers { pixels = _midQualityPixels; timetocapture = _midQualityTime; } if (value > _highQualityTime) { pixels = _highQualityPixels; timetocapture = _highQualityTime; } // get event start and task start times double es = proposedEvent.GetEventStart(Asset); double ts = proposedEvent.GetTaskStart(Asset); double te = proposedEvent.GetTaskEnd(Asset); if (ts > te) { // TODO: Change this to Logger Console.WriteLine("EOSensor lost access"); return false; } // set task end based upon time to capture te = ts + timetocapture; proposedEvent.SetTaskEnd(Asset, te); // calculate incidence angle // from Brown, Pp. 99 DynamicState position = Asset.AssetDynamicState; double timage = ts + timetocapture / 2; Matrix<double> m_SC_pos_at_tf_ECI = position.PositionECI(timage); Matrix<double> m_target_pos_at_tf_ECI = _task.Target.DynamicState.PositionECI(timage); Matrix<double> m_pv = m_target_pos_at_tf_ECI - m_SC_pos_at_tf_ECI; Matrix<double> pos_norm = -m_SC_pos_at_tf_ECI / Matrix<double>.Norm(-m_SC_pos_at_tf_ECI); Matrix<double> pv_norm = m_pv / Matrix<double>.Norm(m_pv); double incidenceang = 90 - 180 / Math.PI * Math.Acos(Matrix<double>.Dot(pos_norm, pv_norm)); // set state data _newState.AddValue(INCIDENCE_KEY, new KeyValuePair<double, double>(timage, incidenceang)); _newState.AddValue(INCIDENCE_KEY, new KeyValuePair<double, double>(timage + 1, 0.0)); _newState.AddValue(PIXELS_KEY, new KeyValuePair<double, double>(timage, pixels)); _newState.AddValue(PIXELS_KEY, new KeyValuePair<double, double>(timage + 1, 0.0)); _newState.AddValue(EOON_KEY, new KeyValuePair<double, bool>(ts, true)); _newState.AddValue(EOON_KEY, new KeyValuePair<double, bool>(te, false)); } return true; }
/// <summary> /// Dependecy function for the power subsystem /// </summary> /// <param name="currentEvent"></param> /// <returns></returns> public HSFProfile<double> POWERSUB_PowerProfile_ADCSSUB(Event currentEvent) { HSFProfile<double> prof1 = new HSFProfile<double>(); prof1[currentEvent.GetEventStart(Asset)] = 40; prof1[currentEvent.GetTaskStart(Asset)] = 60; prof1[currentEvent.GetTaskEnd(Asset)] = 40; return prof1; }
/// <summary> /// Dependecy Function for the power subsystem /// </summary> /// <param name="currentState"></param> /// <returns></returns> public HSFProfile<double> POWERSUB_PowerProfile_SSDRSUB(Event currentEvent) { HSFProfile<double> prof1 = new HSFProfile<double>(); prof1[currentEvent.GetEventStart(Asset)] = 15; return prof1; }