Dummy program to demonstrate problems: working code

Dependencies:   SLCD mbed-rtos mbed

Fork of MNG_TC by Shreesha S

snd_tm_class.h

Committer:
shreeshas95
Date:
2015-09-17
Revision:
17:2b04e53f3b1d
Parent:
14:a4c259ca0325

File content as of revision 17:2b04e53f3b1d:

//without warning
void adf_not_SDcard();
 
#define S_FRAME_SIZE 48
#define EoS_SIZE 120
#define SEGMENT_SIZE 40
#define TM_FRAME_SIZE 134
 
class SND_TM{
    
    int diff_prev;
    int type0_no;                                               //number of type zero frames
    int type1_no;                                           
    int total_frames;                                           //number of type one packe (TMP)
    int segment_no;                                             //number of type one packe (TMP)
    TM_list * list_ptr;   
    unsigned char SCH40[5];                                     
    unsigned char FCCH80[10];
    bool reset_flag;                                            //for reseting all the variables when new list is given.
    
    
//    transmit data variables
    int Tframe_counter;                                  //contains the number of Tframes in a segment had been written  
    int EOS_counter;                                     //count no of byres of eos have been weitten in the buffer
    int Sframe_Counter;
    int SCH40_counter;
    int string_space_counter;
    int FCCH80_counter;
    int rolling_buffer_counter;                                 //maximum it can be 1152 bits
    bool Sframe_flag;
    bool new_Tframe_flag;
    bool FCCH80_flag;
    bool data_flag;
    int uv;
    bool repete_data_flag;
    int segment_counter;
    bool diff_enc_flag;
    
//    make_DataStream variables
    bool state;
    int DS_counter;
    unsigned char * DS_ptr;
    bool DS_flag;
    
//  type 1 frame
    TM_list *T1F_pointer ;
    int T1F_counter;
    
    TM_list *T0F_pointer ;
    
    void differential_encode(unsigned char* ptr, int length){
    
        for(int i=0; i<length;i++){
        
            unsigned char s = ptr[i] , t;
            t = s ^ (s >> 1);
            (diff_prev == 0) ? t=t^0x00 : t=t^0x80 ;
            diff_prev = int(s & 0x01);
            ptr[i] = t;
        }
        
    }    
    
    int decide_type(unsigned char tmid){
        int type = 0;
    
        switch(tmid){
            case 0x1:
            case 0x2:
            case 0x3:
            case 0x4:
            case 0x5:
            case 0x6:
            case 0x7:
            case 0x8:
                type = 0;
                break;
            case 0xA:
            case 0xB:
            case 0xC:
            case 0xD:
            case 0xE:
                type = 1;
                break;
        }
    
        return type;
    }
    
    void inline data_number(){
 
        int type1_frame_no;
        TM_list *head = list_ptr;
        
        type0_no = 0;
        type1_no = 0;
        
        do{
            
            switch( decide_type(head->tmid) ){
                case 0:
                        type0_no++;
                        break;
                case 1:
                        type1_no++;
                    
            }
            
            head=head->next_TM;
            
        }
        while(head->next_TM != NULL);
        
        type1_frame_no = ( type1_no % 10 == 0 )? (type1_no / 10) : ( (type1_no / 10) + 1);
        total_frames = type0_no + type1_frame_no ;
        segment_no = (total_frames*2 % (SEGMENT_SIZE-1) == 0) ? ( total_frames*2/(SEGMENT_SIZE-1) ) : (total_frames*2/(SEGMENT_SIZE-1) + 1);            //subtracting 1 since the last Tframe is not detected
 
    }
    
    
    TM_list* next_type_structure(TM_list *ptr){
        
        if(ptr == NULL){
            return NULL;
        }
                        
        int temp = decide_type(ptr->tmid);
        
        if((temp == 0) && (ptr->next_TM != NULL) ){
            
            do{
                ptr = ptr->next_TM;
                temp =  decide_type(ptr->tmid);
            }   
            while(temp == 1 && ptr->next_TM != NULL);   
            
            if(temp == 1){
            return NULL;
            }           
                
        }
        
        else if((temp == 1) && (ptr->next_TM != NULL)){
            
            do{
                ptr = ptr->next_TM;
                temp = decide_type(ptr->tmid);
            }   
            while(temp == 0 && ptr->next_TM != NULL);
            
            if(temp == 0){
            return NULL;
            }
                
                    
        }
        
        else{
                
//          cout<<"\nNULL returned by next_type_structure\n";
            return NULL;
            
        }
        return ptr;
    }
    
    /*
        brief:      take input type 0  or  1 and return the address of the first node in the list that have that type
        parameter:  type 0 or 1
        return:     pointer of the first node having same type      
    */
    TM_list* first_type_structure(int type){
        TM_list* temp_ptr = list_ptr;
    
        if(type == 0){
            while((decide_type(temp_ptr->tmid) == 1)){
                temp_ptr = temp_ptr->next_TM;
            
                if(temp_ptr == NULL){
                    return NULL ;
                }       
            }   
        }
        
        else if(type == 1){
            while((decide_type(temp_ptr->tmid) == 0) ){
                temp_ptr = temp_ptr->next_TM;
                
                if(temp_ptr == NULL){
                    return NULL;    
                }   
            }   
        }   
        return temp_ptr;
    }
    
    unsigned char TMframe_type1[TM_FRAME_SIZE];
    bool type1_frame_flag;                              //should be true for every new list
    
     unsigned char * type1_frame(){
        
        int i;
        
        if(type1_frame_flag){
            T1F_pointer = first_type_structure(1);
            T1F_counter = 0;
            type1_frame_flag = false;
        }
        
        
 
        for(i = 4 ; (i < 134) && (T1F_pointer != NULL) ; i++){
             TMframe_type1[i] = T1F_pointer->TM_string[T1F_counter];
             
              if(T1F_counter++ == 12){
                T1F_counter = 0;
                T1F_pointer = next_type_structure(T1F_pointer);
              }
        }
        
        // header
        TMframe_type1[0] = 1<<7 + ( (i-4)/10 )<<3;                          //( (i-4)/10 ) gives number of packets in the frame
            //insert time ;
        TMframe_type1[3] = CRC::crc16_gen(TMframe_type1,3);
        //end header
        
        if(T1F_pointer == NULL){
            for( ; i < 134 ; i++){                                          //repeating ;ast packet to fill up the extra space
                TMframe_type1[i] = TMframe_type1[i-13]; 
            }
        
        }
        return TMframe_type1;
    
    }
    
    bool type0_frame_flag;
    
    unsigned char* type0_frame(){
         
        
        if(type0_frame_flag){
            T0F_pointer = first_type_structure(0);  
            type0_frame_flag = false;
        }            
        
        else {
            T0F_pointer = next_type_structure(T0F_pointer);
            
        }
        return T0F_pointer->TM_string;
    }
 
 
    
void interleave( unsigned char *input, unsigned char *output ){
    
    unsigned int outState = 0;
    unsigned int outByte = 0;
    
    for( unsigned int i = 0 ; i < 36 ; ++i ){
        for(unsigned int j = 0 ; j < 30 ; ++j){
            unsigned int x = j*36+i;
            unsigned char tempBit = ((input[x >> 3]) >> (7-(x % 8))) & 1;
            switch(outState){
                case 0:
                    outState = 1;
                    output[outByte] = tempBit << 7;
                    break;
                case 1:
                    outState = 2;
                    output[outByte] += tempBit << 6;
                    break;
                case 2:
                    outState = 3;
                    output[outByte] += tempBit << 5;
                    break;
                case 3:
                    outState = 4;
                    output[outByte] += tempBit << 4;
                    break;
                case 4:
                    outState = 5;
                    output[outByte] += tempBit << 3;
                    break;
                case 5:
                    outState = 6;
                    output[outByte] += tempBit << 2;
                    break;
                case 6:
                    outState = 7;
                    output[outByte] += tempBit << 1;
                    break;
                case 7:
                    outState = 0;
                    output[outByte] += tempBit;
                    ++outByte;
                    break;
            }
        }
        for(unsigned int j = 0 ; j < 2 ; ++j){
            switch(outState){
                case 0:
                    output[outByte] = 0;
                    outState = 1;
                    break;
                case 1:
                    outState = 2;
                    break;
                case 2:
                    outState = 3;
                    break;
                case 3:
                    outState = 4;
                    break;
                case 4:
                    outState = 5;
                    break;
                case 5:
                    outState = 6;
                    break;
                case 6:
                    outState = 7;
                    break;
                case 7:
                    outState = 0;
                    ++outByte;
                    break;
            }
        }
    }
}
 
    
    
    public:
        
        bool give_buffer ;
        bool transmission_done;
        unsigned char S_frame[S_FRAME_SIZE];
        unsigned char EoS[EoS_SIZE];
        SND_TM(){
            
            //transmit
            Tframe_counter = 0;                                  //contains the number of Tframes in a segment had been written  
            EOS_counter = 0;                                     //count no of byres of eos have been weitten in the buffer
            Sframe_Counter = 0;
            SCH40_counter = 0;
            string_space_counter = 0;
            FCCH80_counter = 0;
            rolling_buffer_counter = 0;                                 //maximum it can be 1152 bits
            Sframe_flag = true;
            new_Tframe_flag = false;
            FCCH80_flag = false;
            data_flag = false;
            repete_data_flag = false;
            segment_counter = 0;
            diff_enc_flag = false;
            
            
            state = true;
            DS_counter = 0;
            DS_flag = false;
            
//          type_1_frame
            T1F_counter  = 0;
            
//          list_ptr = x;
            
            diff_prev = 0;
            
            type0_no= 0;
            type1_no= 0;            
            //~ S-FRAME
            //~ SCH_64 * 2
            S_frame[0] = 0x46;
            S_frame[1] = 0x9d;
            S_frame[2] = 0xfb;
            S_frame[3] = 0xf0;
            S_frame[4] = 0xd2;
            S_frame[5] = 0xba;
            S_frame[6] = 0x89;
            S_frame[7] = 0xe4;
            
            S_frame[8] = 0x46;
            S_frame[9] = 0x9d;
            S_frame[10] = 0xfb;
            S_frame[11] = 0xf0;
            S_frame[12] = 0xd2;
            S_frame[13] = 0xba;
            S_frame[14] = 0x89;
            S_frame[15] = 0xe4;
    
            //~ FCCH
            for(int i = 16 ; i < 48 ; ++i ){
                S_frame[i] = 0x00;
            }
    
            
            for(int i = 0 ; i < 24 ; ++i){
                 EoS[i] = 0x00;
            }
    
            //~ S-FRAME [1]
            //~ first two bits of S-FRAME
            EoS[23] = 0x01;
            
            EoS[24] = 0x1a;
            EoS[25] = 0x77;
            EoS[26] = 0xef;
            EoS[27] = 0xc3;
            EoS[28] = 0x4a;
            EoS[29] = 0xea;
            EoS[30] = 0x27;
            EoS[31] = 0x91;
            EoS[32] = 0x1a;
            EoS[33] = 0x77;
            EoS[34] = 0xef;
            EoS[35] = 0xc3;
            EoS[36] = 0x4a;
            EoS[37] = 0xea;
            EoS[38] = 0x27;
            EoS[39] = 0x90;
    
            for(int i = 40 ; i < 72 ; ++i){
                EoS[i] = 0x00;
            }
            
            //~ S-FRAME [2]
            //~ first two bits of S-FRAME
            EoS[71] = 0x01;
            
            EoS[72] = 0x1a;
            EoS[73] = 0x77;
            EoS[74] = 0xef;
            EoS[75] = 0xc3;
            EoS[76] = 0x4a;
            EoS[77] = 0xea;
            EoS[78] = 0x27;
            EoS[79] = 0x91;
            EoS[80] = 0x1a;
            EoS[81] = 0x77;
            EoS[82] = 0xef;
            EoS[83] = 0xc3;
            EoS[84] = 0x4a;
            EoS[85] = 0xea;
            EoS[86] = 0x27;
            EoS[87] = 0x90;
            
            for(int i = 88 ; i < 120 ; ++i){
                EoS[i] = 0x00;
            }
            
            for(int i = 0 ; i < 10 ; ++i){
                FCCH80[i] = 0x00;
            }
            
            SCH40[0] = 0x0a;
            SCH40[1] = 0x3f;
            SCH40[2] = 0x46;
            SCH40[3] = 0xb4;
            SCH40[4] = 0x00;
            
//          give_buffer = false;            
            transmission_done=false;
            
        }
        
        bool transmit_data_flag;  
        
//        void head_pointer(TM_list * ptr){
        void head_pointer(TM_list *ptr){
            list_ptr = ptr ;
            type1_frame_flag = true;
            type0_frame_flag = true;
            make_DataStream_flag = true;
            transmit_data_flag = true;
            transmission_done=false;
            adf_not_SDcard();
        }
        
        unsigned char convoluted_frame[270];                    
                    
        Convolution ConvObj2;
        
        void convolution (unsigned char * ptr){
            
            ConvObj2.convolutionEncode(ptr, convoluted_frame);
            ConvObj2.convolutionEncode(ptr + 67, convoluted_frame + 135);
        }
        
        unsigned char interleave_data[2][144];                  //initialize to zero how;
        
        bool make_DataStream_flag;
        
//        int inline make_DataStream(){
//            
//            if(make_DataStream_flag){
////                data_number();
//
//                int type1_frame_no;
//                TM_list *head = list_ptr;
//                
//                type0_no = 0;
//                type1_no = 0;
//                
//                do{
//                
//                    switch( decide_type(head->tmid) ){
//                        case 0:
//                            type0_no++;
//                            break;
//                        case 1:
//                            type1_no++;
//                    }
//                    
//                    head=head->next_TM;
//                
//                }
//                while(head->next_TM != NULL);
//                
//                type1_frame_no = ( type1_no % 10 == 0 )? (type1_no / 10) : ( (type1_no / 10) + 1);
//                total_frames = type0_no + type1_frame_no ;
//                segment_no = (total_frames*2 % (SEGMENT_SIZE-1) == 0) ? ( total_frames*2/(SEGMENT_SIZE-1) ) : (total_frames*2/(SEGMENT_SIZE-1) + 1);            //subtracting 1 since the last Tframe is not detected
//
//
//                state = true;
//                DS_counter = 0;
//                DS_flag = false;
//                make_DataStream_flag = false;
//            }
////            
//            if(state){
//                    
//                if(DS_counter < type0_no){
//                    DS_ptr = type0_frame(); 
//                    DS_flag = true;    
//                
//                }
//            
//                else if(DS_counter < total_frames ){
//                    DS_ptr = type1_frame();
//                    DS_flag = true;
//                }
//                
//                DS_counter++;  
//                
//            }
//            
//            state = !state;
//            
//            if (DS_flag){
////              cout<<"i m here";
//                
////              printf("------inside convolution\r\n");
//                convolution(DS_ptr);
////              printf("-------out of convolution\n");
//                interleave(convoluted_frame,interleave_data[0]);
//                interleave(convoluted_frame+ 135,interleave_data[1]);
////              printf("completed intrleave\n");
//                DS_flag = false;
//                
//            }
////            
////                    
//            int temp =  (state == false) ? 0 : 1 ;
//    
//            return temp;
//            
//        }
        
        //112 bytes - half rolling buffer
                  
            
        void inline transmit_data(unsigned char * transmit , bool * last_buffer){
                if(transmit_data_flag){
                    rolling_buffer_counter = 0;
                    Sframe_Counter = 0;
                    SCH40_counter = 0;
                    FCCH80_counter = 0;
                    Tframe_counter = 0;
                    EOS_counter = 0;
                    segment_counter = 0;
                    string_space_counter = 0;
                    
                    Sframe_flag = true;
                    new_Tframe_flag = false;
                    repete_data_flag = false;
                    data_flag = false;
                    FCCH80_flag = false;
                    transmit_data_flag = false;
                    diff_enc_flag = false;
                }
                
                    for(rolling_buffer_counter = 0 ; rolling_buffer_counter<112 ; rolling_buffer_counter++){
//                    
                    if(diff_enc_flag){
                        transmit[rolling_buffer_counter] = 0;
                        continue;
                    }
//                    
                    if(Sframe_flag){
                        transmit[rolling_buffer_counter] = S_frame[Sframe_Counter++];
                        
                        if(Sframe_Counter == 48){
//                          printf("sframe quit\n");
                            Sframe_Counter = 0;
                            Sframe_flag = false;
                            new_Tframe_flag =true;
                        }
                        
                    }
//                
                    else if(new_Tframe_flag){
                        transmit[rolling_buffer_counter] = SCH40[SCH40_counter++];      
                        
                        if(SCH40_counter == 5 ){
                            SCH40_counter = 0;
                            new_Tframe_flag = false;
//                          printf("new Tframe flag   quit\n");
//                          data_flag = (Tframe_counter == 38)? false : true; 
//                          put_F = !data_flag;
                            
                            repete_data_flag = (Tframe_counter == SEGMENT_SIZE -1)?true:false;
                            data_flag   =  !repete_data_flag;   
                            
                        }
 
                    }
//                    
                    else if(data_flag){
                        
                        if(string_space_counter == 0 ){
                            
//---------------------------------------------------------------------------------------
                            if(make_DataStream_flag){
                                int type1_frame_no;
                                TM_list *head = list_ptr;
                                
                                type0_no = 0;
                                type1_no = 0;
                                
                                while(head != NULL){
                                    unsigned char tmid = head->tmid;
                                    int type = 0;
                    
                                    switch(tmid){
                                        case 0x1:
                                        case 0x2:
                                        case 0x3:
                                        case 0x4:
                                        case 0x5:
                                        case 0x6:
                                        case 0x7:
                                        case 0x8:
                                            type = 0;
                                            break;
                                        case 0xA:
                                        case 0xB:
                                        case 0xC:
                                        case 0xD:
                                        case 0xE:
                                            type = 1;
                                            break;
                                    }
                                  
                                
                                    switch( type ){
                                        case 0:
                                            type0_no++;
                                            break;
                                        case 1:
                                            type1_no++;
                                    }
                
                                    head=head->next_TM;
                                
                                } 
                                
                                
                                type1_frame_no = ( type1_no % 10 == 0 )? (type1_no / 10) : ( (type1_no / 10) + 1);
                                total_frames = type0_no + type1_frame_no ;
                                segment_no = (total_frames*2 % (SEGMENT_SIZE-1) == 0) ? ( total_frames*2/(SEGMENT_SIZE-1) ) : (total_frames*2/(SEGMENT_SIZE-1) + 1);            //subtracting 1 since the last Tframe is not detected
                
                
                                state = true;
                                DS_counter = 0;
                                DS_flag = false;
                                make_DataStream_flag = false;
                            }
                //            
                            if(state){
                                    
                                if(DS_counter < type0_no){
                                    DS_ptr = type0_frame(); 
                                    DS_flag = true;    
                                
                                }
                            
                                else if(DS_counter < total_frames ){
                                    DS_ptr = type1_frame();
                                    DS_flag = true;
                                }
                                
                                DS_counter++;  
                                
                            }
                            
                            state = !state;
                            
                            if (DS_flag){
                //              cout<<"i m here";
                                
                //              printf("------inside convolution\r\n");
                                convolution(DS_ptr);
                //              printf("-------out of convolution\n");
                                interleave(convoluted_frame,interleave_data[0]);
                                interleave(convoluted_frame+ 135,interleave_data[1]);
                //              printf("completed intrleave\n");
                                DS_flag = false;
                                
                            }
                            
                //                    
                            int temp =  (state == false) ? 0 : 1 ;
//---------------------------------------------------------------------------------------
                            uv = temp ;  
                        }
//                        
                        transmit[rolling_buffer_counter] = interleave_data[uv][string_space_counter++];
                        if(string_space_counter == 144){
//                          printf("data_flag   quit\n");
                            string_space_counter = 0;
                            FCCH80_flag = true;
                            data_flag = false;
                        }
//                        
                    }
//                    
                    else if(repete_data_flag){
                        transmit[rolling_buffer_counter]  = interleave_data[uv][string_space_counter];;
                        if(++string_space_counter == 144){
                            repete_data_flag = false;
                            FCCH80_flag = true;
                            string_space_counter = 0;
//                          cout<<"repete_data_flag quit\n";
                        }
                    }
                    
                    else if(FCCH80_flag){
                        
                            transmit[rolling_buffer_counter] = FCCH80[FCCH80_counter++];
//                          cout<<FCCH80_counter;
                            if(FCCH80_counter == 10){
//                              printf("FCCH80   quit\n");
                                FCCH80_counter = 0;
                                FCCH80_flag = false;
                                
                                if(++Tframe_counter != SEGMENT_SIZE)
                                    new_Tframe_flag =  true;
                                    
                            }       
                
                    }
                    
                    
                
                    else if(Tframe_counter == SEGMENT_SIZE){    
                        
                        transmit[rolling_buffer_counter] = EoS[EOS_counter++];
                        
                        if(EOS_counter == 120){
                            diff_enc_flag = true; 
                            Tframe_counter = 0;
                            EOS_counter = 0;
                            if(++segment_counter == segment_no){
//                              cout<<"transmit_counter = "<<++transmit_counter;
                                *last_buffer = true;
                                break; 
                                
                            }
                            else{
                                Sframe_flag = true;
                                continue;
                            }
                            
                        }
                        continue;
                    }                   
                                
                }
                
                
//                printf("a");
                differential_encode(transmit,112);
 
                if(diff_enc_flag){
                    diff_prev = 0;
                    diff_enc_flag = false;
                    Sframe_flag = true;
                    
                }       
                
        }
        
//        void inline printhaha(void){
////          TM_list *ptr = NULL;
//            printf("c");
// //           list_ptr = ptr ;
//            type1_frame_flag = true;
//            type0_frame_flag = true;
//            make_DataStream_flag = true;
//            transmit_data_flag = true;
//            transmission_done=false;
//            printf("b");
//            adf_not_SDcard();
//            printf("a");
//        }
    
};

SND_TM snd_tm;