bae integrated final (may be)

Dependencies:   mbed-rtos mbed

Fork of BAE_FRDMTESIN2 by Seeker of Truth ,

slave.cpp

Committer:
greenroshks
Date:
2014-12-15
Revision:
8:667fbc82d634
Parent:
7:f06840d848e3

File content as of revision 8:667fbc82d634:

/*******************Below is an old version**********************************************************************************************/
/* Added fault to hk structure and being sent through I2C. Need to verify the format */
/*#include "slave.h"
#include "HK.h"
 
extern struct SensorData Sensor;
I2CSlave slave(PTC9,PTC8);                       //configuring pins p27, p28 as I2Cslave
Serial screen (USBTX,USBRX);
void write_to_master(char send)                           //function to write data to master
        {
           int acknowledge; 
           int loopvariable4=1;
           while(loopvariable4)
           {
           acknowledge = slave.write(send);    //sending the byte to master
           if(acknowledge==1)
            {
              screen.printf(" acknowledge %d sent %u \n",acknowledge,send);
              loopvariable4=0;
            }
           } 
        }
        
 
 
 
void FUNC_I2C_SLAVE_MAIN(int iterations)
{
    
    screen.printf("\nSlave entered\n");
    slave.address(slave_address);                           //assigning slave address
    slave.stop();
    char Switch_Variable;
    
    
    int loopvariable1=1;
    int loopvariable2=0;
    int loopvariable3=1;
//initialising dummy sensor data                         
    
    while(loopvariable1)
    { 
//to read data from master       
    if(slave.receive()==WriteGeneral)                   //checking if slave is addressed to write
    {
      slave.stop();
      Switch_Variable=slave.read();                   //receiving data
      screen.printf("switch variable=%d\n",Switch_Variable);
      slave.stop();                          //reset slave to default receiving state
      loopvariable1=0;
//to interpret and write data to master       
      switch(Switch_Variable)
      {

       
       case 1:   printf("\nEntered switch\n"); 
                   while(loopvariable3)
                  {
                     if(slave.receive()==ReadAddressed)             //check if slave is addressed to read 
                   {
                      while(loopvariable2<iterations)
                     {
                      if(loopvariable2%3==0)
                          {
                          screen.printf("\nvoltage%d\n",loopvariable2/3);
                          write_to_master(Sensor.Voltage[loopvariable2/3]);
                          }
                      else if(loopvariable2%3==1)
                          {   
                          screen.printf("\ncurrent%d\n",loopvariable2/3);
                          write_to_master(Sensor.Current[loopvariable2/3]);
                          }
                      else if(loopvariable2%3==2)
                          {   
                          screen.printf("\ntemp%d\n",loopvariable2/3);
                          write_to_master(Sensor.Temperature[loopvariable2/3]);
                          }         
                      loopvariable2++;
                       }
                       screen.printf("\nfault %c\n",Sensor.faultpoll);
                       write_to_master(Sensor.faultpoll);
                       screen.printf("\nfault %c\n",Sensor.faultir);
                       write_to_master(Sensor.faultir);
                       screen.printf("\npower mode %c\n",Sensor.power_mode);
                       write_to_master(Sensor.power_mode);
                       printf("\nExited i2c while loop\n");
                      slave.stop();    
                      loopvariable3=0;  
                    }//if(read addressed)
                    
                    }//while(loopvariable3)
                  
                  break;
         case 2 : screen.printf(" telecommand 2\n");
                  break;         
                 
        }//switch case ends
   }   
}
   screen.printf("\nexited slave function\n");
}
*/

//******************The following is a new version********************************************************************************/
#include "HK.h"
#include "slave.h"



I2CSlave slave(D14,D15);                       //configuring pins p27, p28 as I2Cslave
Serial pc_slave (USBTX,USBRX);
//InterruptIn interrupt(D9);                    //This should be in the main
//DigitalOut data_ready(D10);                     //Again in the main function
//int i2c_status=0;                                 //read/write mode for i2c 0 : write2slave, 1 : write2master (Again in tha main)

typedef struct
{
    char data;          // To avoid dynamic memory allocation
    int length;
}i2c_data;

//Mail<i2c_data,16> i2c_data_receive;           To be done in the main
//Mail<i2c_data,16> i2c_data_send;              To be done in the main

void FUNC_I2C_WRITE2CDMS(char *data, int length=1)
{
       
    int slave_status = 1;
    while(slave_status)
    {                 
            slave.address(0x20);
            if(slave.receive()==1)
            {
                slave_status=slave.write(data,length);
               // printf("\n In the while loop\n");
                
                /*if(!slave_status)
                {
                        printf("slave wrote %c to master\n\r",*data);
              
                }*/
                
            }
            else
                if(slave.receive()==3 || slave.receive()==2)
                {
                     //i2c_data *i2c_data_r = i2c_data_receive.alloc();
                     slave_status=slave.read(data,length);
                     /*if(!slave_status)
                     {
                         printf("1 read %c from master\n\r",*data);
                     }*/
                }
            //slave.stop();
    }
            printf("2 done");

}

/*void T_I2C_BAE(void const * args)
{
    char data_send,data_receive;
    //data_send = 'a';
    while(1)
    {
        Thread::signal_wait(0x1);
        printf("\ndetected interrupt\n");
        if(i2c_status == 0)
        {
            
            FUNC_I2C_WRITE2CDMS(&data_receive);
            //printf("\n Data received from CDMS is %c\n",data_receive);
            i2c_data * i2c_data_r = i2c_data_receive.alloc();
            i2c_data_r->data = data_receive;
            i2c_data_r->length = 1;
            i2c_data_receive.put(i2c_data_r);
        }
        else if(i2c_status ==1 )
        {
            osEvent evt = i2c_data_send.get();
            if (evt.status == osEventMail) 
            {
                i2c_data *i2c_data_s = (i2c_data*)evt.value.p;
                //printf("\nData read from CDMS is %c\n",i2c_data_r->data);
                data_send = i2c_data_s -> data;
                FUNC_I2C_WRITE2CDMS(&data_send);
                printf("\nData sent to CDMS is %c\n",data_send);
                i2c_data_send.free(i2c_data_s);
                i2c_status = 0;
                //delete i2c_data_r;
            }
        }   
    }
}
        
void FUNC_INT()
{
  // char * data = new char;
   //*data = 'a';
   //printf("\nInterrupt from master detected\n");
   ptr_t_i2c->signal_set(0x1);
  // 
   //delete data;
}
   


void main()
{
    printf("\nStarted slave... waiting for master\n");
    ptr_t_i2c = new Thread(T_I2C_BAE);
    char data='a';
    interrupt.rise(&FUNC_INT);
    
   /* i2c_data * i2c_data_s = i2c_data_send.alloc();
    i2c_data_s->data = data;
    i2c_data_s->length = 1;
    i2c_data_send.put(i2c_data_s);
    //data_ready=1;
    i2c_status=1;*/
   // while(1)
    //{
        //*(data_send)=pc.getc();
        
        //FUNC_I2C_WRITE2CDMS(&data,1);
        //printf("\n The data send or received by slave is %c\n",data);
        //(data)++;
        //wait(1);
        //Remove the comments for receiving data
        /* osEvent evt = i2c_data_receive.get();
         if (evt.status == osEventMail) 
         {
            i2c_data *i2c_data_r = (i2c_data*)evt.value.p;
            printf("\nData read from CDMS is %c\n",i2c_data_r->data);
            
            i2c_data_receive.free(i2c_data_r);
            //delete i2c_data_r;
        }*/
/*        //put in comments for receiving data
        data_ready=0;
        data = pc.getc();
        i2c_data * i2c_data_s = i2c_data_send.alloc();
        i2c_data_s->data = data;
        i2c_data_s->length = 1;
        i2c_data_send.put(i2c_data_s);
        data_ready=1;
        i2c_status=1;
                
    }
}
*/

//To be done in the main