/*********************************************************************
PURPOSE: (Simulate a single rigid body with six degrees of freedom)
LIBRARY DEPENDENCIES: 
	((SingleRigidBody/src/body.o))
*********************************************************************/
#ifndef BODY_HH
#define BODY_HH

class BODY {
public: 
	BODY();
	~BODY();
	//Variables
	
	//Initializes state variables
	double POS_INIT[3];
	double VEL_INIT[3];
	double ANGLE_INIT[3];
	double OMEGA_INIT[3];

	//State variables
	double pos[3];
	double vel[3];	
	double angle[3];
	double omega[3];
	
	double acc[3];
	double omegaDot[3];

	double force[3];
	double FORCE_INIT[3];
	double force_remain[3];
	double POS_FORCE[3];

	double torque[3];
	double TORQUE_INIT[3];
	double torque_remain[3];
	
	double inertia; 
	double inertia_matrix[3][3];
			
	double radius;
	double mass; 
	double mat_mass[6][6];
	double massmatrix[3][3];

	double CM[3]; 
	double CM_skew[3][3];
	double m_CM_skew[3][3];
	double neg_m_CM_skew[3][3];
	
	double vec_a[6];
	double vec_b[6];

	double rotate[3][3];
	double angle_force[3];

	double tmp_vec[6];
	double **mat_mass_dyn;
        double **mat_L;

	// Methods
	void default_data();
	void init();
	void derivative();
	int integ();
	int body_shutdown();

	void rotation_matrix();
	void calcforce();
	void calctorque();
	void calcforce_remain();
	void calctorque_remain();
	void eq_setup();
	void eq_solver();
};

#endif
