/// <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> /// 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) { double ts = proposedEvent.GetTaskStart(Asset); double te = proposedEvent.GetTaskEnd(Asset); double oldbufferratio = _newState.GetLastValue(Dkeys[0]).Value; Delegate DepCollector; SubsystemDependencyFunctions.TryGetValue("DepCollector", out DepCollector); HSFProfile<double> newdataratein = ((HSFProfile<double>)DepCollector.DynamicInvoke(proposedEvent) / _bufferSize); bool exceeded = false; HSFProfile<double> newdataratio = newdataratein.upperLimitIntegrateToProf(ts, te, 1, 1, ref exceeded, 0, oldbufferratio); if (!exceeded) { _newState.AddValue(DATABUFFERRATIO_KEY, newdataratio); return true; } // TODO: Change to logger Console.WriteLine("SSDR buffer full"); return false; } else if (_task.Type == TaskType.COMM) { double ts = proposedEvent.GetTaskStart(Asset); proposedEvent.SetTaskEnd(Asset, ts + 60.0); double te = proposedEvent.GetTaskEnd(Asset); double data = _bufferSize * _newState.GetLastValue(Dkeys.First()).Value; double dataqueout = data / 2 > 50 ? data / 2 : data; if (data - dataqueout < 0) dataqueout = data; if (dataqueout > 0) _newState.AddValue(DATABUFFERRATIO_KEY, new KeyValuePair<double, double>(te, (data - dataqueout) / _bufferSize)); return true; } return true; }