from configUtil import CreateRWAClass
import fswClasses
[docs]class FSWModels(object):
    """
        Class instantiating the FSW modules and initializing them
    """
    def __init__(self, masterSim):
        # Create a sim module as an empty container
        self.simBasePath = masterSim.simBasePath
        # Instantiate C classes
        fsw = fswClasses.FSWClasses(masterSim)
        self.VehConfigData, self.VehConfigDataWrap = fsw.vehConfigDataClass()
        self.rwConfigData, self.rwConfigWrap = fsw.rwConfigDataClass()
        self.inertial3DData, self.inertial3DWrap = fsw.inertial3DClass()
        self.attTrackingData_base, self.attTrackingWrap_base = fsw.attTrackingError_baseClass()
        self.MRP_FeedbackRWAData, self.MRP_FeedbackRWAWrap = fsw.MRP_FeedbackRWAClass()
        self.rwMotorTorqueData, self.rwMotorTorqueWrap = fsw.rwMotorTorqueClass()
        # Initialize all objects
        self.InitAllFSWObjects(masterSim)
    def SetLocalConfigData(self, masterSim):
        # Set RW Config Data
        rwClass = CreateRWAClass()
        masterSim.TotalSim.CreateNewMessage("FSWProcess", "rwa_config_data", rwClass.getStructSize(), 2, "RWConstellation")
        masterSim.TotalSim.WriteMessageData("rwa_config_data", rwClass.getStructSize(), 0, rwClass)
        self.numRW = rwClass.numRW
    def SetVehConfigData(self):
        self.VehConfigData.ISCPntB_B = [700.0, 0.0, 0.0, 0.0, 700.0, 0.0, 0.0, 0.0, 800]  # kg * m^2
        self.VehConfigData.CoM_B = [0.0, 0.0, 1.0]
        self.VehConfigData.outputPropsName = "adcs_config_data"
    def SetRWConfigDataFSW(self):
        self.rwConfigData.rwConstellationInMsgName = "rwa_config_data"
        self.rwConfigData.vehConfigInMsgName = "adcs_config_data"
        self.rwConfigData.rwParamsOutMsgName = "rwa_config_data_parsed"
    def SetInertial3DPoint(self):
        self.inertial3DData.sigma_R0N = [0.2, -0.3, 0.4]
        self.inertial3DData.outputDataName = "att_ref_output_base"
    def setAttTrackingError_base(self):
        self.attTrackingData_base.inputRefName = "att_ref_output_base"
        self.attTrackingData_base.inputNavName = "simple_att_nav_output"
        self.attTrackingData_base.outputDataName = "nom_att_guid_out"
        self.attTrackingData_base.sigma_R0R = [0.0, 0.0, 1.0]
    def SetMRP_FeedbackRWA(self):
        self.MRP_FeedbackRWAData.K = 4.0#1.  # rad/sec
        self.MRP_FeedbackRWAData.P = 30.0#3.  # N*m*sec
        self.MRP_FeedbackRWAData.Ki = -1.0  # N*m - negative values turn off the integral feedback
        self.MRP_FeedbackRWAData.integralLimit = 0.0  # rad
        self.MRP_FeedbackRWAData.inputGuidName = "nom_att_guid_out"
        self.MRP_FeedbackRWAData.vehConfigInMsgName = "adcs_config_data"
        self.MRP_FeedbackRWAData.outputDataName = "controlTorqueRaw"
        self.MRP_FeedbackRWAData.rwParamsInMsgName = "rwa_config_data_parsed"
        # self.MRP_FeedbackRWAData.rwAvailInMsgName = "rw_availability"
        self.MRP_FeedbackRWAData.inputRWSpeedsName = "reactionwheel_output_states"
    def SetRWMotorTorque(self):
        controlAxes_B = [1.0, 0.0, 0.0,
                         0.0, 1.0, 0.0,
                         0.0, 0.0, 1.0]
        self.rwMotorTorqueData.controlAxes_B = controlAxes_B
        self.rwMotorTorqueData.inputVehControlName = "controlTorqueRaw"
        self.rwMotorTorqueData.outputDataName = "reactionwheel_torques"  # "reactionwheel_cmds_raw"
        self.rwMotorTorqueData.rwParamsInMsgName = "rwa_config_data_parsed"
    def InitAllFSWObjects(self, masterSim):
        self.SetLocalConfigData(masterSim)
        self.SetVehConfigData()
        self.SetRWConfigDataFSW()
        self.SetInertial3DPoint()
        self.setAttTrackingError_base()
        self.SetMRP_FeedbackRWA()
        self.SetRWMotorTorque()