QITH FLAGS
Dependencies: FreescaleIAP mbed-rtos mbed
Fork of TF_conops_BAE1_3 by
main.cpp
- Committer:
- sakthipriya
- Date:
- 2015-06-30
- Revision:
- 0:246d1b5f11ae
- Child:
- 1:7185136654ce
File content as of revision 0:246d1b5f11ae:
/************************************************************Header files*****************************************************************/ #include "mbed.h" #include "rtos.h" #include "pin_config.h" #include "EPS.h" #include "beacon.h" #include "ACS.h" #include "FreescaleIAP.h" //required for r/w to flash /***********************************************************For Testing - TO BE REMOVED***************************************************/ Serial pc(USBTX, USBRX); //for debugging purpose. will be removed along with printf Timer t_exec; //To know the time of execution each thread Timer t_start; //To know the time of entering of each thread Timer t_i2c_start; //To check the time sync in i2c communication Timer t_i2c_exec; //To know the time taken by i2c read/write function /**********************************************************configuring peripherals********************************************************/ I2CSlave slave(PIN1,PIN2); //configuring pins as I2Cslave (sda ,scl) InterruptIn irpt_4m_cdms(PIN97); //I2c interrupt from CDMS DigitalOut irpt_2_bae(PIN90); //Sets interrupt to CDMS /****************************************************global variables*********************************************************************/ // flags--------------------------------------------- uint32_t BAE_STATUS = 0x00000000; uint32_t BAE_ENABLE = 0xFFFFFFFF; //--------------------------------------------------- char hk_data[25]; /*****************************************************************Threads USed***********************************************************************************/ Thread *ptr_t_eps; Thread *ptr_t_acs; Thread *ptr_t_bea; Thread *ptr_t_i2c; //Thread *ptr_t_wdt; /**********************************************************pin allocation****************************************************************************/ extern PwmOut PWM1; extern PwmOut PWM2; extern PwmOut PWM3; /**************************************************************funtion header**********************************************************************************/ void FCTN_HK_DATA_CATENATE(); //combines hk structure into a string //-------------------------------------------------------------------------------------------------------------------------------------------------- //TASK 2 : EPS //-------------------------------------------------------------------------------------------------------------------------------------------------- extern SensorDataQuantised SensorQuantised; void T_EPS(void const *args) { while(1) { Thread::signal_wait(0x2); SensorQuantised.power_mode='3'; //default power mode(dummy) printf("\n\rTHIS IS EPS %f\n\r",t_start.read()); t_exec.start(); //FUNC_HK_FAULTS(); // !Actual fault management is not implemented //FUNC_HK_POWER(SensorQuantised.power_mode); // !The power mode algorithm is yet to be obtained FCTN_BAE_HK_MAIN() ; //Collecting HK data FCTN_HK_DATA_CATENATE(); //sending HK data to CDMS t_exec.stop(); printf("The time to execute hk_acq is %f seconds\n\r",t_exec.read()); t_exec.reset(); } } //--------------------------------------------------------------------------------------------------------------------------------------- //TASK 1 : ACS //--------------------------------------------------------------------------------------------------------------------------------------- int power_flag = 4; //temporary dummy flag int acs_pflag = 1; void T_ACS(void const *args) { float mag_field1[3]; float omega1[3]; //float tauc1[3]; float moment[3]; //float *mnm_data; while(1) { Thread::signal_wait(0x1); printf("\n\rEntered ACS %f\n",t_start.read()); t_exec.start(); BAE_STATUS |= 0x00000002; //set ACS_MAIN_STATUS flag to 1 PWM1 = 0; //clear pwm pins PWM2 = 0; //clear pwm pins PWM3 = 0; //clear pwm pins omega1[0] = 1 ; //for testing omega1[1] = 2 ; omega1[2] = 3 ; mag_field1[0] = 10; mag_field1[1] = 20; mag_field1[2] = 30; if (BAE_ENABLE & 0x00000001 == 0x00000001) // check if ACS_DATA_ACQ_ENABLE = 1? { FCTN_ACS_DATA_ACQ(omega1,mag_field1); printf("\n\rmnm gyro values\n"); //printing the angular velocity and magnetic field values for(int i=0; i<3; i++) { printf("%f\t",omega1[i]); } printf("\n\r mnm mag values\n"); for(int i=0; i<3; i++) { printf("%f\t",mag_field1[i]); } } if(BAE_ENABLE & 0x0000000E == 0x00000000) // check ACS_STATE = ACS_CONTROL_OFF? { BAE_STATUS |= 0x00000000; // set ACS_STATUS = ACS_CONTROL_OFF PWM1 = 0; //clear pwm pins PWM2 = 0; //clear pwm pins PWM3 = 0; //clear pwm pins } else { if(power_flag > 1) { if(BAE_ENABLE & 0x0000000E == 0x00000004) // check ACS_STATE = ACS_ZAXIS_MOMENT_ONLY { BAE_STATUS |= 0x00000018; // set ACS_STATUS = ACS_ZAXIS_MOMENT_ONLY FCTN_ACS_CNTRLALGO(mag_field1,omega1,moment); printf("\n\r moment values returned by control algo \n"); moment[0] = 0; moment[1] = 0; printf("\n\r z axis moment %f \n",&moment[2]); FCTN_ACS_GENPWM_MAIN(moment) ; } else { if(BAE_ENABLE & 0x00000040 == 0x00000040) // check ACS_STATE = ACS_DATA_ACQ_FAILURE { BAE_STATUS |= 0x0000000C; // set ACS_STATUS = ACS_DATA_ACQ_FAILURE PWM1 = 0; //clear pwm pins PWM2 = 0; //clear pwm pins PWM3 = 0; //clear pwm pins } else { if(BAE_ENABLE & 0x0000000E == 0x00000008) // check ACS_STATE = ACS_NOMINAL_ONLY { BAE_STATUS |= 0x00000010; // set ACS_STATUS = ACS_NOMINAL_ONLY FCTN_ACS_CNTRLALGO(mag_field1,omega1,moment); printf("\n\r moment values returned by control algo \n"); for(int i=0; i<3; i++) { printf("%f\t",moment[i]); } FCTN_ACS_GENPWM_MAIN(moment) ; } else { if(BAE_ENABLE & 0x0000000E == 0x0000000A) // check ACS_STATE = ACS_AUTO_CONTROL { BAE_STATUS |= 0x00000014; // set ACS_STATUS = ACS_AUTO_CONTROL //FCTN_ACS_AUTOCTRL_LOGIC // gotta include this code } else { if(BAE_ENABLE & 0x0000000E == 0x0000000C) // check ACS_STATE = ACS_DETUMBLING_ONLY { BAE_STATUS |= 0x00000018; // set ACS_STATUS = ACS_DETUMBLING_ONLY FCTN_ACS_CNTRLALGO(mag_field1,omega1,moment); // detumbling code has to be included FCTN_ACS_GENPWM_MAIN(moment) ; } else { BAE_STATUS |= 0x0000001C; // set ACS_STATUS = INVALID STATE PWM1 = 0; //clear pwm pins PWM2 = 0; //clear pwm pins PWM3 = 0; //clear pwm pins } } } } } } else { BAE_STATUS |= 0x00000004; // set ACS_STATUS = ACS_LOW_POWER PWM1 = 0; //clear pwm pins PWM2 = 0; //clear pwm pins PWM3 = 0; //clear pwm pins } } BAE_STATUS &= 0xFFFFFFFD; //clear ACS_MAIN_STATUS flag to 1 printf("\n exited acs main %f ",t_exec.read()); t_exec.reset(); } } //---------------------------------------------------BEACON-------------------------------------------------------------------------------------------- int beac_flag=0; //To receive telecommand from ground. /*void T_BEA_TELECOMMAND(void const *args) { char c = pc.getc(); if(c=='a') { printf("Telecommand detected\n\r"); beac_flag=1; } } */ void T_BEA(void const *args) { while(1) { Thread::signal_wait(0x3); printf("\n\rTHIS IS BEACON %f\n\r",t_start.read()); t_exec.start(); FCTN_BEA_MAIN(); if(beac_flag==1) { Thread::wait(600000); beac_flag = 0; } printf("The time to execute beacon thread is %f seconds\n\r",t_exec.read()); t_exec.reset(); } } extern SensorDataQuantised SensorQuantised; //--------------------------------------------------------------------------------------------------------------------------------------------------- //TASK 5 : i2c data //--------------------------------------------------------------------------------------------------------------------------------------------------- //.................................................................................................................................... void FCTN_I2C_READ(char *data,int length = 1); void FCTN_I2C_WRITE(char *data,int length = 1); Timer t; // time taken from isr to reach i2c function Timer t1; //time taken by read or write function in i2c function Timer t2; //time taken by read function when first command from master comes bool write_ack = 1; bool read_ack = 1; char short_tc[10]; char long_tc[134]; char mstr_cmd; bool cmd_flag = 1; int length; //char* data; bool cmd_err = 1; void T_I2C(void const * args) { while(1) { Thread::signal_wait(0x1); // printf("\n\r check2\n"); wait_us(100); if(cmd_flag == 1) { t.stop(); if( slave.receive()==3 || slave.receive()==2) // slave read { t1.start(); read_ack=slave.read(&mstr_cmd,1); t1.stop(); if(read_ack == 0) printf("\n\r Data received from CDMS is %c \n",mstr_cmd); switch(mstr_cmd) { case 's': length = 10; cmd_flag = 0; break; case 'l': length = 134; cmd_flag = 0; break; case 'h': length = 25; cmd_flag = 0; break; default: printf("\n\r invalid command \n"); //cmd_err = 0; cmd_flag = 1; } } } else if(cmd_flag ==0 ) { t.stop(); if( slave.receive()==3 || slave.receive()==2) // slave read { char* data=(char*)malloc(length*sizeof(char)); FCTN_I2C_READ(data,length); free(data); cmd_flag = 1; } if( slave.receive() == 1) // slave writes to master { FCTN_I2C_WRITE(hk_data,length ); cmd_flag = 1; } } printf("\n \r %d %d\n",t.read_us(),t1.read_us()); t.reset(); t1.reset(); } } void FCTN_I2C_READ(char *data, int length ) { t1.start(); read_ack=slave.read(data,length); t1.stop(); if(read_ack == 0) printf("\n\rData received from CDMS is %s \n",data); else printf("\n\r data not received \n"); } void FCTN_I2C_WRITE(char *data,int length) { t1.start(); write_ack=slave.write(data,length); t1.stop(); if(write_ack == 0) printf("\n\rData sent to CDMS is %s \n",data); else printf("\n\r data not sent\n"); } void FCTN_ISR_I2C() { ptr_t_i2c->signal_set(0x1); t.start(); } void FCTN_HK_DATA_CATENATE() { strcpy(hk_data,"hk_Data"); strcat(hk_data,SensorQuantised.Voltage); strcat(hk_data,SensorQuantised.Current); strcat(hk_data,SensorQuantised.PanelTemperature); strcat(hk_data,SensorQuantised.AngularSpeed); strcat(hk_data,SensorQuantised.Bnewvalue); char fdata[5] = {SensorQuantised.BatteryTemperature,SensorQuantised.faultpoll,SensorQuantised.faultir,SensorQuantised.power_mode}; /*strcat(hk_data,sfaultpoll); strcat(hk_data,sfaultir); strcat(hk_data,spower_mode);*/ strcat(hk_data,fdata); printf("\n\r hk data being sent %s ",hk_data); } //------------------------------------------------------------------------------------------------------------------------------------------------ //TELECOMMAND //------------------------------------------------------------------------------------------------------------------------------------------------ void FUNC_I2C_TC_EXECUTE (char command) { switch(command) { case '0' : printf("command 0 executed"); break; case '1' : printf("command 1 executed"); break; case '2' : printf("command 2 executed"); break; case '3' : printf("command 3 executed"); } } //------------------------------------------------------------------------------------------------------------------------------------------------ //SCHEDULER //------------------------------------------------------------------------------------------------------------------------------------------------ int beacon_sc = 3; uint8_t schedcount=1; void T_SC(void const *args) { if(schedcount == 4) //to reset the counter { schedcount = 1; } printf("\n\rThe value of i in scheduler is %d\n\r",schedcount); if(schedcount%1==0) { ptr_t_acs -> signal_set(0x1); } if(schedcount%2==0) { ptr_t_eps -> signal_set(0x2); } if(schedcount%beacon_sc==0) { if(beac_flag==0) { ptr_t_bea -> signal_set(0x3); } } schedcount++; } //--------------------------------------------------------------BAE_INIT------------------------------------------------------------------// void FCTN_BAE_INIT() { BAE_STATUS |= 0x00000001; // set BAE_INIT_STATUS to 1 irpt_4m_cdms.disable_irq(); // disable interrupts slave.address(0x20); // setting slave address for BAE for I2C communication RtosTimer t_sc_timer(T_SC,osTimerPeriodic); // Initiating the scheduler thread - starting RTOS Timer t_sc_timer.start(10000); printf("\n\rStarted scheduler %f\n\r",t_start.read()); FCTN_EPS_INIT(); // EPS INIT FCTN_ACS_INIT(); // ACS INIT FCTN_BEA_INIT(); // Beacon INIT //read bootup_count from flash //bootup_count++; //update bootup_count in flash irpt_4m_cdms.enable_irq(); BAE_STATUS &= 0xFFFFFFFE; // clear BAE_INIT_STATUS to 0 } //----------------------------------------------------------------------------BAE_MAIN------------------------------------------------------------- int main() { t_start.start(); printf("\n\rIITMSAT BAE Activated \n"); //INITIALISING THREADS ptr_t_eps = new Thread(T_EPS); ptr_t_acs = new Thread(T_ACS); ptr_t_bea = new Thread(T_BEA); ptr_t_i2c = new Thread(T_I2C); //INITIALISING INTERRUPTS //interrupt_fault(); //*to be included-function called when a fault interrupt is detected irpt_4m_cdms.fall(&FCTN_ISR_I2C); //interrupt received from CDMS //Setting priority to threads ptr_t_acs->set_priority(osPriorityAboveNormal); ptr_t_eps->set_priority(osPriorityAboveNormal); ptr_t_bea->set_priority(osPriorityAboveNormal); ptr_t_i2c->set_priority(osPriorityHigh); //---------------------------------------------------------------------------------------------- printf("\n\r T_ACS priority is %d",ptr_t_acs->get_priority()); printf("\n\r T_EPS priority is %d",ptr_t_eps->get_priority()); printf("\n\r T_BEA priority is %d",ptr_t_bea->get_priority()); printf("\n\r T_I2C priority is %d",ptr_t_i2c->get_priority()); //---------------------------------------------------------------------------------------------- FCTN_BAE_INIT(); while(1) //required to prevent main from terminating { ; } }