working version

Dependencies:   mbed mbed-rtos SimpleDMA FreescaleIAP eeprom

Fork of CDMS_CODE_FM_28JAN2017 by samp Srinivasan

Revision:
266:ae588e75cfa4
Parent:
261:1e54415b34d3
Child:
267:783c248a6207
--- a/Compression.h	Thu Jul 14 23:05:09 2016 +0000
+++ b/Compression.h	Fri Jul 15 14:59:27 2016 +0000
@@ -1,18 +1,38 @@
-unsigned int read_2byte(uint8_t* ptr){
-    unsigned int output = (unsigned int) *(ptr+1);
-    output += ( (unsigned int)(*ptr) ) << 8;
-    return output;
-}
-    
-unsigned int read_4byte(uint8_t* ptr){
-    unsigned int output = (unsigned int) *(ptr+3);
-    output += (unsigned int)*(ptr+2)<<8;
-    output += (unsigned int)*(ptr+1)<<16;
-    output += (unsigned int)*(ptr)<<24;
+/*-----------------------------------------to_do_compression.h--------------------------------------------------
+
+    -> SD_Write error to be checked
+    -> fsc_counter is 32 bit but in the code 24 bit. Talk to chaitu
+---------------------------------------------------------------------------------------------------------------*/
+
+//updated compression algorithm
+/*#include <iostream>
+#include "stdio.h"
+#include "crc.h"
+#include "interleave.h"
+#include "Convolution.h"
+#include "bitset"*/
+//using namespace std;
+
+//reading functions 2byte, 4byte
+
+uint16_t read_2byte(uint8_t* ptr)
+{
+    uint16_t output = (uint8_t ) *(ptr+1);
+    output += ( (uint8_t )(*ptr) ) << 8;
     return output;
 }
 
-int adjust(int size, unsigned int data, uint8_t* ptr , int space){
+uint32_t read_4byte(uint8_t* ptr)
+{
+    uint32_t output = (uint32_t) (*(ptr+3));
+    output += (uint32_t)(*(ptr+2)<<8);
+    output += (uint32_t)(*(ptr+1)<<16);
+    output += (uint32_t)(*(ptr)<<24);
+    return output;
+}
+
+uint8_t adjust(uint8_t size, uint8_t data, uint8_t* ptr , uint8_t space)
+{
     space = space&0x0f;
     if(space == 8)  *ptr = 0;
     data = data&((1<<size)-1);
@@ -29,284 +49,337 @@
         return 0x10 + 8-(size - space);
     }
 }
-
-
-int compress (int data, int x, int y){  //to be compressed with scheme (msb x)*4^y ;
-    for(int i = 0 ; i < 1<<y ; i++){
-        if(data <= ( (1<<x)-1) * (1<<(2*i)) ){
+int compress (int data, int x, int y)   //to be compressed with scheme (msb x)*4^y ;
+{
+    for(int i = 0 ; i < (1<<y) ; i++)
+    {
+        if(data <= ( (1<<x)-1) * (1<<(2*i)) )
+        {
             return ( ((data>>i*2)<<y) + i);
         }
     }
-    if ( data > ( (1<<x)-1) * (1<<(2*((1<<y)-1))) ){
-//      cout <<"compression exception"<<endl;
-        return 0;
+    if ( data > (( (1<<x)-1) * (1<<(2*((1<<y)-1)))) )
+    {
+        //cout <<"compression exception"<<endl;
+        return (((1<<x)-1) * (1<<(2*((1<<y)-1))));
     }
 }
 
-
+//--------------------------------------------------------beacon
+uint8_t beacon_array[134];
+uint8_t beacon_cntr = 1;
+uint8_t *beacon_ptr;
+//--------------------------------------------------------beacon
 
-//variable declerations
-uint8_t srp_mode , at , pzf , ezf ,sfp[65] ,scp[55];; //tells which mode is calibrated or plot 0 for calibrated and 1 for scatterered, below threshold , proton zero flux, electron zero flux.
-unsigned int sfp_bin[52] , scp_bin[52];         //storing the bin values.
-unsigned int sfp_threshold_m0[52] = {8128,8128,8128,8128,8128,8128,8128,8128,960,960,960,960,960,960,960,960,960,960,960,960,4032,4032,4032,4032,8128,8128,8128,8128,4032,4032,124,124,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,252,252,252,252,252}; 
-unsigned int scp_threshold_m0[52] = {245760,245760,245760,245760,245760,245760,245760,245760,49152,49152,49152,49152,49152,49152,49152,49152,49152,49152,49152,49152,114688,114688,114688,114688,245760,245760,245760,245760,114688,114688,4032,4032,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,8128,4032,4032,4032,4032};
-unsigned int scp_threshold_m0_1[9]={114688,245760,245760,245760,245760,114688,114688,65472,65472} ; //for mode 0..ie callibrated mode
-unsigned int sfp_threshold_m1[2] ={252,8128},scp_threshold_m1[2]={7680,245760};
+//variable declarations
+uint8_t srp_mode , at , pzf , ezf ,sfp[71] ,scp[56],beacon_at; //tells which mode is calibrated or plot 0 for calibrated and 1 for scatterered, below threshold , proton zero flux, electron zero flux.
+uint32_t sfp_bin[52] , scp_bin[52];         //storing the bin values.
+uint32_t sfp_threshold_m0[52]  = {124,124,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,4032,252,252,252,252,252,4032,8128,8128,8128,8128,8128,8128,8128,8128,960,960,960,960,960,960,960,960,960,960,960,960,4032,4032,4032,4032,8128,8128,8128,8128};
+uint32_t scp_threshold_m0[52]  = {4032,4032,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,114688,8128,4032,4032,4032,4032,114688,245760,245760,245760,245760,245760,245760,245760,245760,49152,49152,49152,49152,49152,49152,49152,49152,49152,49152,49152,49152,114688,114688,114688,114688,245760,245760,245760,245760};
+uint32_t scp_threshold_m0_1[9] = {114688,245760,245760,245760,245760,114688,114688,65472,65472} ; //for callibrated mode with data conservation
+uint32_t scp_sfp_threshold_m0_2[3] = {245760,65472,65472};
+uint32_t sfp_threshold_m1[52]  = {1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,8128,8128,8128,8128};
+uint32_t scp_threshold_m1[52]  = {114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,114688,245760,245760,245760,245760};
 uint8_t frames[3][134] = {0};
 uint8_t position_tm_frame[3] = {8,11,5} , position_tm_starting[3] = {8,11,5}; //{sc,sf-bt,sf-at}
 uint8_t id;   //sf = 0,sc-at = 1,sc-bt = 2;
 uint8_t TM_interleave_data[512] , TM_convoluted_data[270] = {0};
-int proton_scp_sum,electron_scp_sum,length, temp_crc,attitude = 0,debug_cntr = 0, size,space;
-uint32_t FSC_science;   
+uint64_t proton_scp_sum,electron_scp_sum,FSC_science;
+uint16_t temp_crc;
+uint32_t debug_cntr, size,space,length;
 uint8_t *ptr ,* pointer;
-long long int sci_time = 0x221000000;       //call some function and get the time or get in the starting, what ever akshay says
-int test_cntr = 0;
+uint64_t sci_time = 0, time_prev_scp = 0;
+uint32_t attitude = 0;
+uint32_t beacon_threshold[9] = {114688,245760,245760,245760,245760,114688,114688,65472,65472};
 
-    Convolution ConvObj;
-    void convolution (uint8_t * ptr){
-        ConvObj.convolutionEncode(ptr, TM_convoluted_data);
-        ConvObj.convolutionEncode(ptr + 67, TM_convoluted_data + 135);
-    }
+Convolution ConvObj;
+void convolution (uint8_t * ptr){
+    ConvObj.convolutionEncode(ptr, TM_convoluted_data);
+    ConvObj.convolutionEncode(ptr + 67, TM_convoluted_data + 135);
+}
 
 //give the pointer of 6 second data to this function
-void srp(uint8_t * head){
-    //sci_time = FCTN_CDMS_RD_RTC();
-    sci_time = 0;
-    gPC.puts("enter srp");
-    
-    
-    
-    //Call FCTN_SD_MNGR for latest fsc
-    FCTN_SD_MNGR();
-    uint8_t sd_stat;
-    
-    for (int i = 0; i < 52 ; i++){
+void srp(uint8_t * head)
+{
+    gPC.printf("\n\rEntered srp");
+    debug_cntr = 0;
+    sci_time = FCTN_CDMS_RD_RTC();
+    if(time_prev_scp==0){
+        time_prev_scp = sci_time;
+    }    
+    FCTN_SD_MNGR();                                                             ///changed recently
+    for (int i = 0; i < 56 ; i++)
+    {
         scp_bin[i] = 0;
     }
-    ptr = head + 3;
+    ptr = head + 3;                                         //ptr points to proton energy bin of srp
     srp_mode = head[2]&0x1;
-    at = 0;     //above threshold is false
-    for(int counter = 0 ; counter < 60 ; counter++){
-        //gPC.puts("Y");
-//        gPC.printf("counter = %d\n",counter);
-//        cout<<"counter = "<<counter<<endl;
-        pzf = 1;    ezf = 1;
-        if(srp_mode == 0){      //calibrated mode
-            for(int i=0; i<48 ; i++){
+    for(uint8_t counter = 0 ; counter < 60 ; counter++)
+    {       
+        /*-------------------- ------------populating sfp_bin and scp_bin[] starts here(also tag AT or BT)-----------------------*/
+        at = 0;     pzf = 1;    ezf = 1;
+        if(srp_mode == 0)                                   //calibrated mode 
+        {
+            for(int i=0; i<48 ; i++)                        //first 48 bins or SRP are of 16 bits size
+            {
                 sfp_bin[i] = read_2byte(ptr + i*2);
                 scp_bin[i] += sfp_bin[i];
-                if(sfp_bin[i]>sfp_threshold_m0[i]){
+                if(sfp_bin[i]>sfp_threshold_m0[i])
+                {
                     at = 1;
                 }
-                if(i<17){
+                if(i<17)
+                {
                     if(sfp_bin[i] > 0)
                         pzf = 0;
                 }
-                else if (i>17 && i < 23){
+                else if (i>17 && i < 23)
+                {
                     if(sfp_bin[i]>0)
                         ezf = 0;
                 }
             }
-            for(int i=0; i<4; i++){
+            for(int i=0; i<4; i++)                          //last 4 bins(excluding the spare bin) are 32 bit each
+            {
                 sfp_bin[i+48] = read_4byte( (ptr+96) + 4*i );
                 scp_bin[i+48] += sfp_bin[i+48];
                 if(sfp_bin[i+48]>sfp_threshold_m0[i+48])
                     at = 1;
             }
         }
-        else if(srp_mode == 1){ //scattered mode
-            for(int i = 0; i <32; i++){
-                sfp_bin[i] = read_2byte(ptr+2*i);
+        else if(srp_mode == 1)                              //scattered mode
+        {
+            for(int i = 0; i <48; i++)                      //first 48 bins of SRP are of 16 bit size
+            {
+                sfp_bin[i]  = read_2byte(ptr+2*i);
                 scp_bin[i] += sfp_bin[i];
-                if(sfp_bin[i] > sfp_threshold_m1[0])
+                if(sfp_bin[i] > sfp_threshold_m1[i])
                     at = 1;
             }
-            for(int i = 0; i < 4 ; i++){
-                sfp_bin[i+32] = read_4byte( (ptr+64) + 4*i );
-                scp_bin[i+32] += sfp_bin[i+32];
-                if(sfp_bin[i+32] > sfp_threshold_m1[1])
+            for(int i = 0; i < 4 ; i++)                     //next 4 bins are of 32 bit size
+            {
+                ///sfp_bin[i+48] = read_4byte( (ptr+64) + 4*i );
+                sfp_bin[i+48] = read_4byte( (ptr+96) + 4*i );
+                scp_bin[i+48] += sfp_bin[i+48];
+                if(sfp_bin[i+48] > sfp_threshold_m1[i+48])
                     at = 1;
             }
         }
-        ptr = ptr + 112;
-        for(int i = 0; i<65; i++)
+        /*---------------------------populating sfp_bin[] and scp_bin[] from srp ends here(also tagging AT or BT)------------------*/
+
+        ptr = ptr + 112;                                    //moving the pointer to next srp packet in the DMA buffer
+        
+        /*------------------------------------------forming a science fine packet starts here----------------------------------------
+        First we fill packet header, then fill packet data and finally assign its length
+        ----------------------------------------------------------------------------------------------------------------------------*/
+        for(int i = 0; i<71; i++)    
             sfp[i] = 0;
-        if(srp_mode == 0){      //calibrated mode
-            if(at == 0){
+        if(srp_mode == 0)                                                                   //calibrated mode
+        {
+            if(at == 0)
+            {
                 pointer = sfp; debug_cntr = 0;
-                space = adjust(4, attitude,pointer,8);  pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(4, attitude,pointer,8);      pointer += space>>4;    debug_cntr += space>>4;
                 space = adjust(6, counter,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
                 space = adjust(1, srp_mode,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(1, pzf,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(1, ezf,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
-                for(int i = 0 ; i < 8 ; i++){
-                    space = adjust(1, ((compress(sfp_bin[24+i],7,2))&0x100)>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, pzf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, ezf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i = 0 ; i < 8 ; i++){
+                    space = adjust(1, ((compress(sfp_bin[24+i],7,2))&0x100)>>8 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
                     space = adjust(8, ((compress(sfp_bin[24+i],7,2))&0xff) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
                 }
-                for(int i = 0 ; i <12 ; i++){
-                    space = adjust(6, (compress(sfp_bin[32+i],4,2)) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i = 0 ; i <12 ; i++){
+                    space = adjust(6, (compress(sfp_bin[32+i],4,2)) ,pointer,space);            pointer += space>>4;    debug_cntr += space>>4;
                 }
-                for(int i = 0; i < 4; i++){
-                    space = adjust(8, (compress(sfp_bin[44+i],6,2)) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i = 0; i < 4; i++){
+                    space = adjust(8, (compress(sfp_bin[44+i],6,2)) ,pointer,space);            pointer += space>>4;    debug_cntr += space>>4;
                 }
-                for(int i = 0 ; i < 4 ; i++){
-                    space = adjust(1, (compress(sfp_bin[48+i],7,2))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, compress(sfp_bin[48+i],7,2) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i = 0 ; i < 4 ; i++){
+                    space = adjust(1, (compress(sfp_bin[48+i],7,2))>>8 ,pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, compress(sfp_bin[48+i],7,2) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
                 }
-                space = adjust(8, ((compress(sfp_bin[17],6,2))&0xff) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, ((compress(sfp_bin[23],6,2))&0xff) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, ((compress(sfp_bin[17],6,2))&0xff) ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, ((compress(sfp_bin[23],6,2))&0xff) ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
                 if(pzf == 0){
-                    for(int i = 0; i<2 ; i++){
-                        space = adjust(6, ((compress(sfp_bin[i],5,1))&0xff) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                    for(uint8_t i = 0; i<2 ; i++){
+                        space = adjust(6, ((compress(sfp_bin[i],5,1))&0xff) ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
                     }
-                    for(int i = 0; i<15 ; i++){
-                        space = adjust(5, ((compress(sfp_bin[i+2],4,1))&0xff) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                    for(uint8_t i = 0; i<15 ; i++){
+                        space = adjust(5, ((compress(sfp_bin[i+2],4,1))&0xff) ,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
                     }
                 }
                 if(ezf == 0){
-                    for(int i = 0; i <5 ;i++){
-                        space = adjust(7, ((compress(sfp_bin[18+i],6,1))&0xff) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                    for(uint8_t i = 0; i <5 ;i++){
+                        space = adjust(7, ((compress(sfp_bin[18+i],6,1))&0xff) ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
                     }
                 }
-            }//below thershold ends here.
-        
-        //gPC.puts("below_thresh\r\n");
-        
+            }                                                                                           //below thershold ends here.
             if(at == 1){
                 pointer = sfp + 6; debug_cntr = 6;space = 8;
                 sfp[0] = (sci_time>>27)&0xff;   sfp[1] = (sci_time>>19)&0xff;   sfp[2] = (sci_time>>11)&0xff;   sfp[3] = (sci_time>>3)&0xff;
-                sfp[4] = ((sci_time&0x07)<<5) + ((attitude&0x0f)<<1) + (counter>>5);    
-                sfp[5] = ((counter&0x0f)<<3) + (srp_mode<<2);   
+                sfp[4] = ((sci_time&0x07)<<5) + ((attitude&0x0f)<<1) + (counter>>5);
+                sfp[5] = ((counter&0x1f)<<3) + (srp_mode<<2);
                 sfp[5] += (pzf<<1) + ezf ;
-                for(int i = 0 ; i < 8 ; i++){
-                    space = adjust(1, (compress(sfp_bin[24+i],7,2))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i = 0 ; i < 8 ; i++){
+                    space = adjust(1, (compress(sfp_bin[24+i],7,2))>>8 ,pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
                     space = adjust(8, ((compress(sfp_bin[24+i],7,2))&0xff) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
                 }
-                for(int i = 0 ; i <12 ; i++){
+                for(uint8_t i = 0 ; i <12 ; i++){
                     space = adjust(6, ((compress(sfp_bin[32+i],3,3))&0xff) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
                 }
-                for(int i = 0 ; i < 4 ; i++){
-                    space = adjust(2, (compress(sfp_bin[44+i],8,2))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, compress(sfp_bin[44+i],8,2) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i = 0 ; i < 4 ; i++){
+                    space = adjust(2, (compress(sfp_bin[44+i],8,2))>>8 ,pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, compress(sfp_bin[44+i],8,2) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
                 }
-                for(int i = 0 ; i < 4 ; i++){
-                    space = adjust(1, (compress(sfp_bin[48+i],6,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, compress(sfp_bin[48+i],6,3) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i = 0 ; i < 4 ; i++){
+                    space = adjust(1, (compress(sfp_bin[48+i],6,3))>>8 ,pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, compress(sfp_bin[48+i],6,3) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
                 }
-                space = adjust(2, (compress(sfp_bin[17],8,2))>>8 ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, compress(sfp_bin[17],8,2) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(2, (compress(sfp_bin[23],8,2))>>8 ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, compress(sfp_bin[23],8,2) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-                
+                space = adjust(2, (compress(sfp_bin[17],8,2))>>8 ,pointer,space);               pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, compress(sfp_bin[17],8,2) ,pointer,space);                    pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(2, (compress(sfp_bin[23],8,2))>>8 ,pointer,space);               pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, compress(sfp_bin[23],8,2) ,pointer,space);                    pointer += space>>4;    debug_cntr += space>>4;
+
                 if(pzf == 0){
-//                  cout<<"proton bins ";
-                    for(int i = 0; i<17 ; i++){
+                    //cout<<"proton bins ";
+                    for(uint8_t i = 0; i<17 ; i++){
                         space = adjust(2, ((compress(sfp_bin[i],8,2))>>8) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                        space = adjust(8, compress(sfp_bin[i],8,2) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-//                      printf("%02X ",compress(sfp_bin[i],8,2));
+                        space = adjust(8, compress(sfp_bin[i],8,2) ,pointer,space);             pointer += space>>4;    debug_cntr += space>>4;
+                        //printf("%02X ",compress(sfp_bin[i],8,2));
                     }
                 }
                 if(ezf == 0){
-//                  cout<<"electron bins ";
+                    //cout<<"electron bins ";
                     for(int i = 0; i<5 ; i++){
-                        space = adjust(2, ((compress(sfp_bin[18+i],8,2))>>8) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-                        space = adjust(8, compress(sfp_bin[18+i],8,2) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-//                      printf("%02X ",compress(sfp_bin[i],8,2));
+                        space = adjust(2,((compress(sfp_bin[18+i],8,2))>>8),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                        space = adjust(8, compress(sfp_bin[18+i],8,2),pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+                        //printf("%02X ",compress(sfp_bin[i],8,2));
                     }
                 }
-//              cout<<debug_cntr<<" "<<(space&0xf)<<endl;
-//              cout<<"packet ";
-//              for(int i = 0; i< 64; i++){
-//                  cout<<bitset<8>(sfp[i]);
-//              }
-//              cout<<"ends"<<endl;
-            }//above threshold ends here.
-        }else if(srp_mode == 1){    //scattered mode
-            if(at == 0){
-                pointer = sfp; debug_cntr = 0;  space = 8;
-                space = adjust(4, attitude,pointer,8);  pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(6, counter,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(1, srp_mode,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
-                for(int i=0; i<32; i++){
-                    space = adjust(7, compress(sfp_bin[i],6,1) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                }
-                for(int i = 0 ; i < 4 ; i++){
-                    space = adjust(1, (compress(sfp_bin[32+i],7,2))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, compress(sfp_bin[32+i],7,2) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                }
-            }
-            if(at == 1){
-                pointer = sfp; debug_cntr = 0;  space = 8;
-                space = adjust(3, sci_time>>32 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, sci_time>>24 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, sci_time>>16 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, sci_time>>8 ,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, sci_time ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(4, attitude,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(6, counter,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(1, srp_mode,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
-                for(int i=0; i<32; i++){
-                    space = adjust(2, (compress(sfp_bin[i],8,2))>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, compress(sfp_bin[i],8,2) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                }
-                for(int i = 0 ; i < 4 ; i++){
-                    space = adjust(1, (compress(sfp_bin[32+i],6,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, compress(sfp_bin[32+i],6,3) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                }
-            }
-        }   
-        
-        //gPC.puts("sci fine pack\r\n");
-        //science fine packet is complete here.
-        //lets try to make frame now******************************************************************************************************************************
-        if(srp_mode == 0){
-            if(at == 0){
-                id = 1;     length = 241;
+            }                                                                                   //above threshold ends here.            
+            if(at == 0)
+            {
+                id = 1;     length = 241+5;                                 //5 spare bits
                 if(pzf == 0)
                     length += 87;
                 if(ezf == 0)
                     length += 35;
-            }else{
-                id = 2;     length = 288;
+            }
+            else
+            {
+                id = 2;     length = 288;                                   //0 spare bits
                 if(pzf == 0)
                     length += 170;
                 if(ezf == 0)
                     length += 50;
             }
         }
-        else if(srp_mode == 1){
-            if(at == 0){
-                id = 1;     length = 272;
-            }else{
-                id = 2;     length = 408;
+        else if(srp_mode == 1)                                                                 //scattered mode
+        {
+            if(at == 0)
+            {
+                pointer = sfp; debug_cntr = 0;  space = 8;
+                space = adjust(4, attitude,pointer,8);      pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(6, counter,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, srp_mode,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i=0; i<48; i++)
+                {
+                    space = adjust(7, compress(sfp_bin[i],5,2) ,pointer,space);             pointer += space>>4;    debug_cntr += space>>4;
+                }
+                for(uint8_t i = 0 ; i < 4 ; i++)
+                {
+                    space = adjust(1, (compress(sfp_bin[48+i],7,2))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, compress(sfp_bin[48+i],7,2) ,pointer,space);          pointer += space>>4;    debug_cntr += space>>4;
+                }
+            }
+            if(at == 1)
+            {
+                pointer = sfp; debug_cntr = 0;  space = 8;
+                space = adjust(3, sci_time>>32 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, sci_time>>24 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, sci_time>>16 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, sci_time>>8 ,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, sci_time ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(4, attitude,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(6, counter,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, srp_mode,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                for(uint8_t i=0; i<48; i++)
+                {
+                    space = adjust(2, (compress(sfp_bin[i],8,2))>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, compress(sfp_bin[i],8,2) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                }
+                for(uint8_t i = 0 ; i < 4 ; i++)
+                {
+                    space = adjust(1, (compress(sfp_bin[48+i],6,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, compress(sfp_bin[48+i],6,3) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                }
+            }
+            if(at == 0)
+            {
+                id = 1;     length = 384;                                       //0 spare bits
+            }
+            else
+            {
+                id = 2;     length = 568;                                       //0 spare bits
             }
         }
-        length = (length%8==0)?(length/8):(length/8)+1;
-        for(int j=0 ; j<length ;j++){
-//          printf("%02X",sfp[j]);
-            frames[id][position_tm_frame[id]] = sfp[j];
-            position_tm_frame[id]++;
-            if(position_tm_frame[id] == 132){   //space full in the frame bro
+        length = (length%8==0)?(length/8):(length/8)+1;                         //converting length to mulitple of 8
+        /*----------------------------------------forming a science packet ends here-----------------------------------------------*/
+
+        /*-----------------------------Inserting the above packet(sfp) into the TM frame(s) starts here----------------------------*/
+        if(id==1){
+            if(position_tm_frame[id]>130){
+                while(position_tm_frame[id]<132){
+                    frames[id][position_tm_frame[id]] = 0;
+                    position_tm_frame[id]++;
+                }
+            }
+        }
+        else if(id==2){
+            if(position_tm_frame[id]>126){
+                while(position_tm_frame[id]<132){
+                    frames[id][position_tm_frame[id]] = 0;
+                    position_tm_frame[id]++;
+                }
+            }
+        }
+        if(position_tm_frame[id]==position_tm_starting[id]){
+            frames[id][6-id] = position_tm_starting[id];
+        }
+        for(uint16_t j=0 ; j<length ;)
+        {            
+            if(position_tm_frame[id]==frames[id][6-id]){
+                if(id==1){
+                    frames[id][6]  = (uint8_t)((sci_time>>32)&0x07);
+                    frames[id][7]  = (uint8_t)((sci_time>>24)&0xff);
+                    frames[id][8]  = (uint8_t)((sci_time>>16)&0xff);
+                    frames[id][9]  = (uint8_t)((sci_time>>8)&0xff);
+                    frames[id][10] = (uint8_t)((sci_time)&0xff);
+                }
+            }
+            if(position_tm_frame[id]<132){
+                frames[id][position_tm_frame[id]] = sfp[j];
+                j++;
+                position_tm_frame[id]++;                                            //incrementing position of write pointer in TM frame
+            }
+            if(position_tm_frame[id] == 132)
+            {
+                /*-----------the current frame is completely filled and we fill frame header to write into SD card---------*/
                 pointer = frames[id];
-                if(id == 1){    //below thereshold
+                if(id == 1){    //below threshold
                     space = adjust(1,0,pointer,8);
                     space = adjust(4,3,pointer,space);
-                    FSC_science = FSC_CURRENT[3]+1;
-                    //gPC.printf("SID = 3, FSC = %02X\r\n", FSC_CURRENT[3]+1);
+                    FSC_science = FSC_CURRENT[3];                               ///to be used as this, but FSC_CURRENT[] is 32 bit
                     frames[id][1] = (FSC_science>>24)&0xff;
                     frames[id][2] = (FSC_science>>16)&0xff;
                     frames[id][3] = (FSC_science>>8)&0xff;
-                    frames[id][4] = FSC_science&0xff;
-                    frames[id][6] = (sci_time>>32)&0xff;
-                    frames[id][7] = (sci_time>>24)&0xff;
-                    frames[id][8] = (sci_time>>16)&0xff;
-                    frames[id][9] = (sci_time>>8)&0xff;
-                    frames[id][10] = (sci_time)&0xff;
-                }else if(id == 2){
+                    frames[id][4] = FSC_science&0xff;                    
+                }
+                else if(id == 2)    //above threshold
+                {
                     space = adjust(1,0,pointer,8);
-                    space = adjust(4,2,pointer,space);
-                    FSC_science = FSC_CURRENT[2]+1;
-                    //gPC.printf("SID = 2, FSC = %02X\r\n", FSC_science);
+                    space = adjust(4,2,pointer,space);                    
+                    FSC_science = FSC_CURRENT[2];                                               ///to be used as this
                     frames[id][1] = (FSC_science>>16)&0xff;
                     frames[id][2] = (FSC_science>>8)&0xff;
                     frames[id][3] = FSC_science&0xff;
@@ -314,121 +387,302 @@
                 temp_crc = crc16_gen(frames[id],132);
                 frames[id][132] = temp_crc>>8;
                 frames[id][133] = temp_crc & 0xff;
-                //if(test_cntr++ == 0){
-                    /*gPC.puts("frame start\r\n");
-                    for(int i = 0; i<134; i++){
-                        gPC.printf("%02X",frames[id][i]);
-                    }    
-                    gPC.puts("frame ends\r\n");*/
-                //}
-                   
+
+                /*------------------current TM frame completely filled-----------------------*/
                 
                 exor(frames[id]);
                 convolution(frames[id]);
                 interleave(TM_convoluted_data,TM_interleave_data);
                 interleave(TM_convoluted_data+ 135,TM_interleave_data + 144);
-                
-                if(id == 1){
-                    sd_stat = SD_WRITE(TM_interleave_data,FSC_CURRENT[3]+1,3);
-                   }
-                else if (id == 2){
-                    sd_stat = SD_WRITE(TM_interleave_data,FSC_CURRENT[2]+1,2);
-                  }
-                if(sd_stat)
+                if(id == 1)
                 {
-                    //gPC.puts("sd write failure");
-                    break;
-                    }
+                    SD_WRITE(TM_interleave_data,FSC_science+1,3);     //sd_write will return ack later, for now not included
+                }
+                else if (id == 2)
+                {
+                    SD_WRITE(TM_interleave_data,FSC_science+1,2);     //sd_write will return ack later, for now not included
+                }
                 position_tm_frame[id] = position_tm_starting[id];
-                frames[id][6-id] = (length-1) - j;      // first head pointer.
-                
+                frames[id][6-id] = ((length-1) - j)+position_tm_starting[id];
             }
         }
-        
-    }//for loop bracket which runs 60 times
-    
-    //---------------below is scp --------------**************************************************************************************************
+        /*------------------------------finished inserting the sfp packet into the TM frame(s)-------------------------------------*/
+    }                                                                                           // for loop bracket which runs 60 times    
     at = 0;     pzf = 1;    ezf = 1;
     srp_mode = head[2]&0x1;
-    uint8_t compression_option = (head[2]>>1)&0x3;    //--------------------------------------------------------------------------------------
-    if(srp_mode ==0){
-        if(compression_option == 0){
-            for(int i=0; i<52 ;i++){
-                if(scp_bin[i] > scp_threshold_m0[i]){
+    uint8_t compression_option = (head[2]>>1)&0x3;
+    /*-------------------------------Tagging the scp packet formed from these 60 sfp's as AT or BT starts here-------------------------
+    ------------------(in case compression option = 0 , then tagging beacon packet(not yet formed) as AT or BT is also done)----------*/
+    if(srp_mode ==0)
+    {
+        if(compression_option == 0)
+        {
+            for(int i=0; i<52 ;i++)
+            {
+                if(scp_bin[i] > scp_threshold_m0[i])
+                {
                     at = 1;
                     break;
                 }
             }
         }
-        else if(compression_option == 1){
+        else if(compression_option == 1)
+        {
             if(scp_bin[44] > scp_threshold_m0_1[0]) at=1;
-            for(int i=0; i<4 ;i++){
-                if(scp_bin[48+i] > scp_threshold_m0_1[i+1]){
+            for(int i=0; i<4 ;i++)
+            {
+                if(scp_bin[48+i] > scp_threshold_m0_1[i+1])
+                {
                     at = 1;
                     break;
                 }
             }
             if(scp_bin[17] > scp_threshold_m0_1[5]) at=1;
             if(scp_bin[23] > scp_threshold_m0_1[6]) at=1;
-            
+
             proton_scp_sum = 0; electron_scp_sum = 0;
-            for(int i=0;i<17;i++){
+            for(int i=0;i<17;i++)
+            {
                 proton_scp_sum += scp_bin[i];
             }
-            for(int i=0; i<5; i++){
+            for(int i=0; i<5; i++)
+            {
                 electron_scp_sum += scp_bin[18+i];
             }
             if(proton_scp_sum > scp_threshold_m0_1[7]) at=1;
             if(electron_scp_sum > scp_threshold_m0_1[8]) at=1;
         }
-    }else if(srp_mode ==1){
-        for(int i=0; i<32; i++){
-            if(scp_bin[i] > scp_threshold_m1[0]){
-                at = 1;
-                break;
+        else if(compression_option == 2)
+        {
+            if(scp_bin[50] > scp_sfp_threshold_m0_2[0]) at=1;
+            proton_scp_sum = 0; electron_scp_sum = 0;
+            for(int i=0;i<17;i++)
+            {
+                proton_scp_sum += scp_bin[i];
+            }
+            for(int i=0; i<5; i++)
+            {
+                electron_scp_sum += scp_bin[18+i];
+            }
+            if(proton_scp_sum > scp_sfp_threshold_m0_2[1]) at=1;
+            if(electron_scp_sum > scp_sfp_threshold_m0_2[2]) at=1;
+        }
+    }
+    else if(srp_mode ==1)
+    {
+        if(compression_option==0){ 
+            for(int i=0; i<48; i++)
+            {
+                if(scp_bin[i] > scp_threshold_m1[i]){
+                    at = 1;
+                    break;
+                }
+            }
+            for(int i=48; i<52; i++)
+            {
+                if(scp_bin[i] > scp_threshold_m1[i]){
+                    at = 1;
+                    break;
+                }
             }
         }
-        for(int i=32; i<36; i++){
-            if(scp_bin[i] > scp_threshold_m1[1]){
-                at = 1;
-                break;
+        else if(compression_option==2){
+            if(scp_bin[50]>scp_sfp_threshold_m0_2[0])   at=1;
+        }
+    }
+    /*----------------------------Tagging the scp packet formed from these 60 sfp's as AT or BT ends here--------------------------*/
+
+    if(srp_mode == 0)
+    {
+        //determining if non zero values of proton and electron bins exist for calibrated mode (srp)
+        for(int i=0; i<17 ;i++)
+        {
+            if(scp_bin[i]>0)
+                pzf = 0;
+        }
+        for(int i=18; i<23 ;i++)
+        {
+            if(scp_bin[i]>0)
+                ezf = 0;
+        }
+    }
+    /*-----------------------------------------Tagging beacon packet as AT or BT starts here-------------------------------------*/
+    beacon_at = 0;
+    if(srp_mode==0)     //those bins which can be meaningfully compared only in srp_mode==0
+    {
+        if(scp_bin[44]>beacon_threshold[0])     beacon_at = 1;            
+        if(scp_bin[17]>beacon_threshold[5])     beacon_at = 1;
+        if(scp_bin[23]>beacon_threshold[6])     beacon_at = 1;
+        proton_scp_sum = 0; electron_scp_sum = 0;
+        for(int i=0;i<17;i++)
+        {
+            proton_scp_sum += scp_bin[i];
+        }
+        for(int i=0; i<5; i++)
+        {
+            electron_scp_sum += scp_bin[18+i];
+        }
+        if(proton_scp_sum > beacon_threshold[7]) beacon_at =1;
+        if(electron_scp_sum > beacon_threshold[8]) beacon_at =1;
+    }
+    if(scp_bin[48]>beacon_threshold[1])     beacon_at = 1;
+    if(scp_bin[49]>beacon_threshold[2])     beacon_at = 1;
+    if(scp_bin[50]>beacon_threshold[3])     beacon_at = 1;
+    if(scp_bin[51]>beacon_threshold[4])     beacon_at = 1;   
+    /*----------------------------------------Tagging beacon packet as AT or BT ends here------------------------------------------*/
+
+    /*-----------------------------------------------Forming the beacon packet starts here-----------------------------------------*/
+    //Last 512 bits of beacon_array excluding CRC bits is used for storing the 5 most recent beacon packets
+
+    if(beacon_cntr == 1)
+    {
+        beacon_ptr = &(beacon_array[62]);   // starting block address, stores the oldest(among the 5 most recent) beacon packet
+    }
+    else if(beacon_cntr>1 && beacon_cntr<6)
+    {
+        beacon_ptr +=14;                    // increase the block number(totally 5 blocks for 5 beacon packets)
+    }
+    else if(beacon_cntr == 6)
+    {
+        for(uint16_t i=0;i<14;i++)          // when all 5 blocks have been used shift the last 4 blocks up along the array and
+        {                                   // overwrite the new beacon packet in the 5th block
+            beacon_array[62+i] = beacon_array[76+i];
+            beacon_array[76+i] = beacon_array[90+i];
+            beacon_array[90+i] = beacon_array[104+i];
+            beacon_array[104+i] = beacon_array[118+i];
+        }
+        beacon_ptr = &(beacon_array[118]);  //address of the 5th block
+        beacon_cntr = 5;
+    }
+    pointer = beacon_ptr;        debug_cntr = 0;     space = 8;
+    space = adjust(1, 1,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+    space = adjust(5,(sci_time>>8)&0x1f,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+    space = adjust(8, sci_time,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+    space = adjust(4, (attitude)&0xf,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+
+    if(srp_mode==0){
+        if(beacon_at == 0){
+            space = adjust(1, 0,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(6, compress(scp_bin[44],3,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(scp_bin[48],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(scp_bin[49],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(scp_bin[50],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(scp_bin[51],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(6, compress(scp_bin[17],3,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(6, compress(scp_bin[23],3,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(proton_scp_sum ,10,2)>>8,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(8, compress(proton_scp_sum ,10,2),pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(electron_scp_sum ,10,2)>>8,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(8, compress(electron_scp_sum ,10,2),pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+            pointer = pointer + 1;
+            for(int temp_i = 12; temp_i<14; temp_i++)
+            {            
+                *pointer = 0;
+                pointer = pointer + 1;
+            }
+        }
+        else if(beacon_at==1){
+            space = adjust(1, 1,pointer,space);     pointer += space>>4;        debug_cntr += space>>4;
+            space = adjust(1, compress(sfp_bin[44],6,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(sfp_bin[44],6,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[48],9,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(sfp_bin[48],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[49],9,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(sfp_bin[49],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[50],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;                 
+            space = adjust(8, compress(sfp_bin[50],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[51],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;                 
+            space = adjust(8, compress(sfp_bin[51],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, compress(sfp_bin[17],6,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(sfp_bin[17],6,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, compress(sfp_bin[23],6,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(sfp_bin[23],6,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, compress(proton_scp_sum ,6,3)>>8,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;         
+            space = adjust(8, compress(proton_scp_sum ,6,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, compress(electron_scp_sum,6,3)>>8,pointer,space); pointer += space>>4;    debug_cntr += space>>4;     
+            space = adjust(8, compress(electron_scp_sum ,6,3),pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
+            //cout<<"for beacon space = "<<(space&0x0f)<<" counter = "<<debug_cntr;
+        }
+    }else if(srp_mode==1){
+        if(beacon_at==0){
+            space = adjust(1, 0,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(6, compress(0,3,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(sfp_bin[48],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(sfp_bin[49],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(sfp_bin[50],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(7, compress(sfp_bin[51],4,3),pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            pointer = pointer + 1;
+            for(uint8_t temp_i = 7; temp_i<14; temp_i++)
+            {            
+                *pointer = 0;
+                pointer = pointer + 1;
+            }
+        }
+        else if(beacon_at==1){
+            space = adjust(1, 1,pointer,space);     pointer += space>>4;        debug_cntr += space>>4;
+            space = adjust(1, compress(0,6,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(0,6,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[48],9,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(sfp_bin[48],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[49],9,3)>>8,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;             
+            space = adjust(8, compress(sfp_bin[49],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[50],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;                 
+            space = adjust(8, compress(sfp_bin[50],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(4, compress(sfp_bin[51],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;                 
+            space = adjust(8, compress(sfp_bin[51],9,3),pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+            pointer = pointer + 1;
+            for(uint8_t temp_i = 10; temp_i<14; temp_i++)
+            {            
+                *pointer = 0;
+                pointer = pointer + 1;
             }
         }
     }
-    
-    for(int i=0; i<17 ;i++){
-        if(scp_bin[i]>0)
-            pzf = 0;
-    }
-    for(int i=18; i<23 ;i++){
-        if(scp_bin[i]>0)
-            ezf = 0;
-    }
-    
-    gPC.puts("scp\r\n");
-    
+    beacon_cntr++;
+    /*--------------------------------------------------beacon packet ends here--------------------------------------------------------*/
+
+    gPC.printf("scp\r\n");
+    uint8_t packet_pp,time_diff;
+    /*------------------------------------------Forming a science packet(scp) starts here----------------------------------------------*/
+
     pointer = scp;      debug_cntr = 0;     space = 8;
-    uint8_t packet_pp = 1;    //where to get this packet present bit----------------------------------------------------------------------------------
-    int sfp_at_counter; //----------------------------------------------------------------------------------------------------------------------------------
-    space = adjust(1, packet_pp,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(5, (sci_time>>8)&0x1f,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(8, (sci_time)&0xff,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(4, (attitude)&0xf,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(2, compression_option,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(1,srp_mode,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(1,srp_mode,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(8, sfp_at_counter>>16,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(8, sfp_at_counter>>8,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-    space = adjust(8, sfp_at_counter,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+    time_diff = 0;
+    
+    packet_pp = 1;
+    if((((uint8_t)(sci_time>>7))&0x3f)<(((uint8_t)(time_prev_scp>>7))&0x3f))
+    {
+        time_diff = time_diff+60;
+    }
+    time_diff += (((uint8_t)(sci_time>>7))&0x3f);
+    time_diff -= (((uint8_t)(time_prev_scp>>7))&0x3f);
+    if(time_diff>10){
+        packet_pp = 0;
+    }
+    time_prev_scp = sci_time;
+    uint32_t sfp_at_counter;
+    sfp_at_counter = FSC_CURRENT[2];
+    space = adjust(1, packet_pp,pointer,space);                     pointer += space>>4;    debug_cntr += space>>4;
+    space = adjust(5, (sci_time>>8)&0x1f,pointer,space);            pointer += space>>4;    debug_cntr += space>>4;
+    space = adjust(8, (sci_time)&0xff,pointer,space);               pointer += space>>4;    debug_cntr += space>>4;
+    space = adjust(4, (attitude)&0xf,pointer,space);                pointer += space>>4;    debug_cntr += space>>4;
+    space = adjust(2, compression_option,pointer,space);            pointer += space>>4;    debug_cntr += space>>4; //first two bits of compression option
+    space = adjust(1, at,pointer,space);                            pointer += space>>4;    debug_cntr += space>>4; //last bit of compression option
+    space = adjust(1, srp_mode,pointer,space);                      pointer += space>>4;    debug_cntr += space>>4;
+    if(!(srp_mode==0 && compression_option==2))
+    {
+        space = adjust(8, sfp_at_counter>>16,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+        space = adjust(8, sfp_at_counter>>8,pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
+        space = adjust(8, sfp_at_counter,pointer,space);            pointer += space>>4;    debug_cntr += space>>4;
+    }
     if(srp_mode == 0 && compression_option == 0){       //normal callibrated mode
-        space = adjust(1, pzf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-        space = adjust(1, ezf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+        space = adjust(1, pzf,pointer,space);                       pointer += space>>4;    debug_cntr += space>>4;
+        space = adjust(1, ezf,pointer,space);                       pointer += space>>4;    debug_cntr += space>>4;
         if(at == 0 ){
             for(int i = 0; i<8 ;i++){
-                space = adjust(7,compress(sfp_bin[24+i],4,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(7,compress(scp_bin[24+i],4,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
             }
             for(int i = 0; i<12 ;i++){
-                space = adjust(5,compress(sfp_bin[32+i],2,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(5,compress(scp_bin[32+i],2,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
             }
             for(int i = 0; i<4 ;i++){
                 space = adjust(6,compress(scp_bin[44+i],3,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
@@ -436,21 +690,21 @@
             for(int i = 0; i<4 ;i++){
                 space = adjust(7,compress(scp_bin[48+i],4,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
             }
-            space = adjust(6,compress(scp_bin[17],3,3) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(6,compress(scp_bin[23],3,3),pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(6,compress(scp_bin[17],3,3) ,pointer,space);             pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(6,compress(scp_bin[23],3,3),pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
             if(pzf == 0){
                 for(int i = 0; i<2 ;i++){
                     space = adjust(8,compress(scp_bin[i],6,2) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
                 }
                 for(int i = 0; i<15 ;i++){
-                    space = adjust(7,compress(scp_bin[i+2],5,2) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(7,compress(scp_bin[i+2],5,2) ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
                 }
             }
             if(ezf == 0){
                 space = adjust(1,compress(scp_bin[18],7,2)>>8 ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8,compress(scp_bin[18],7,2) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8,compress(scp_bin[18],7,2) ,pointer,space);         pointer += space>>4;    debug_cntr += space>>4;
                 for(int i=0; i<4; i++){
-                    space = adjust(8,compress(scp_bin[19+i],6,2) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8,compress(scp_bin[19+i],6,2) ,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
                 }
             }
         }// below threshold ends here
@@ -462,20 +716,21 @@
                 space = adjust(5,compress(scp_bin[32+i],2,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
             }
             for(int i = 0; i<4 ;i++){
-                space = adjust(1,compress(scp_bin[44+i],6,3)>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1,compress(scp_bin[44+i],6,3)>>8 ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
                 space = adjust(8,compress(scp_bin[44+i],6,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
             }
             for(int i=0; i<4 ;i++){
-                space = adjust(2,compress(scp_bin[48+i],6,4)>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8,compress(scp_bin[48+i],6,4) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(4,compress(scp_bin[48+i],9,3)>>8 ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8,compress(scp_bin[48+i],9,3) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
             }
-            space = adjust(1,compress(scp_bin[17],6,3)>>8 ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(8,compress(scp_bin[17],6,3),pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(1,compress(scp_bin[23],6,3)>>8,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(8,compress(scp_bin[23],6,3),pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1,compress(scp_bin[17],6,3)>>8 ,pointer,space);          pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(8,compress(scp_bin[17],6,3),pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1,compress(scp_bin[23],6,3)>>8,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(8,compress(scp_bin[23],6,3),pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+
             if(pzf == 0){
                 for(int i = 0; i<17 ; i++){
-                    space = adjust(8, (compress(scp_bin[i],5,3)) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, (compress(scp_bin[i],5,3)) ,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
                 }
             }
             if(ezf == 0){
@@ -487,20 +742,20 @@
     }   //srp_mode == 0 ends
     if(srp_mode == 1){
         if(at == 0){
-            for(int i=0; i<32; i++){
-                space = adjust(6, ((compress(scp_bin[i],4,2))&0xff) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+            for(int i=0; i<48; i++){
+                space = adjust(6, ((compress(scp_bin[i],3,3))&0xff) ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
             }
             for(int i = 0 ; i < 4 ; i++){
-                space = adjust(7, (compress(scp_bin[32+i],4,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(7, (compress(scp_bin[48+i],4,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
             }
         }
         if(at == 1){
-            for(int i=0; i<32; i++){
-                space = adjust(6, (compress(scp_bin[i],3,3))>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+            for(int i=0; i<48; i++){
+                space = adjust(7, (compress((scp_bin[i]/2),4,3))>>8 ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
             }
             for(int i = 0 ; i < 4 ; i++){
-                space = adjust(4, (compress(scp_bin[32+i],9,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(8, (compress(scp_bin[32+i],9,3)) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(4, (compress(scp_bin[48+i],9,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(scp_bin[48+i],9,3)) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
             }
         }
     }// scp mode 1 end
@@ -508,120 +763,190 @@
         space = adjust(1, pzf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
         space = adjust(1, ezf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
         if(at == 0){
-            if(at == 0){
-                space = adjust(6, (compress(scp_bin[44],3,3)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                for(int i=0; i<4; i++){
-                    space = adjust(7, (compress(scp_bin[48+i],4,3)) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
-                }
-                space = adjust(6, (compress(scp_bin[17],3,3)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                space = adjust(6, (compress(scp_bin[23],3,3)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                if(pzf==0){
-                    space = adjust(2, (compress(proton_scp_sum,10,2))>>8 ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, (compress(proton_scp_sum,10,2)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-                }
-                if(ezf==0){
-                    space = adjust(2, (compress(electron_scp_sum,10,2))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
-                    space = adjust(8, (compress(electron_scp_sum,10,2)) ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
-                }
-            }   // scp data conservaton mode 
+            space = adjust(6, (compress(scp_bin[44],3,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+            for(int i=0; i<4; i++){
+                space = adjust(7, (compress(scp_bin[48+i],4,3)) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+            }
+            space = adjust(6, (compress(scp_bin[17],3,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(6, (compress(scp_bin[23],3,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+            if(pzf==0){
+                space = adjust(4, (compress(proton_scp_sum,10,2))>>8 ,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, ( compress(proton_scp_sum,10,2)) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+            }
+            if(ezf==0){
+                space = adjust(4, (compress(electron_scp_sum,10,2))>>8 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(electron_scp_sum,10,2)) ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
+            }
         }else if(at == 1){
-            space = adjust(1, (compress(scp_bin[44],6,3))>>8 ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(8, (compress(scp_bin[44],6,3)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, (compress(scp_bin[44],6,3))>>8 ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(8, (compress(scp_bin[44],6,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
             for(int i=0; i<4; i++){
                 space = adjust(4, (compress(scp_bin[48+i],9,3))>>8 ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
                 space = adjust(8, (compress(scp_bin[48+i],9,3)) ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
             }
-            space = adjust(1, (compress(scp_bin[17],6,3)>>8) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(8, (compress(scp_bin[17],6,3)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(1, (compress(scp_bin[23],6,3))>>8 ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
-            space = adjust(8, (compress(scp_bin[23],6,3)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, (compress(scp_bin[17],6,3)>>8) ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(8, (compress(scp_bin[17],6,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, (compress(scp_bin[23],6,3))>>8 ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(8, (compress(scp_bin[23],6,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
             if(pzf==0){
-                space = adjust(1, (compress(proton_scp_sum,6,3))>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, (compress(proton_scp_sum,6,3))>>8 ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
                 space = adjust(8, (compress(proton_scp_sum,6,3)) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
             }
             if(ezf==0){
-                space = adjust(1, (compress(electron_scp_sum,6,3))>>8 ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, (compress(electron_scp_sum,6,3))>>8 ,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
                 space = adjust(8, (compress(electron_scp_sum,6,3)) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
             }
         }
-    }//-----------------------------------------------------------------------------------------------------------------------------------------------------
-    
-    gPC.puts("sci frame starts\r\n");
-    
-    //time to make scp frame
+    }
+    if(compression_option == 2 )  //scp extreme data conservation mode
+    {
+        if(srp_mode==0)
+        {
+            space = adjust(1, pzf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, ezf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+            if(at==0){
+                space = adjust(7, (compress(scp_bin[50],4,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+                if(pzf==0){
+                    space = adjust(4, (compress(proton_scp_sum,10,2))>>8 ,pointer,space);   pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, ( compress(proton_scp_sum,10,2)) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                }
+                if(ezf==0){
+                    space = adjust(4, (compress(electron_scp_sum,10,2))>>8 ,pointer,space); pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, (compress(electron_scp_sum,10,2)) ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
+                }
+            }else if(at==1){
+                space = adjust(4, (compress(scp_bin[50],9,3))>>8 ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(scp_bin[50],9,3)) ,pointer,space);              pointer += space>>4;    debug_cntr += space>>4;
+                if(pzf==0){
+                    space = adjust(1, (compress(proton_scp_sum,6,3))>>8 ,pointer,space);    pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, (compress(proton_scp_sum,6,3)) ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                }
+                if(ezf==0){
+                    space = adjust(1, (compress(electron_scp_sum,6,3))>>8 ,pointer,space);  pointer += space>>4;    debug_cntr += space>>4;
+                    space = adjust(8, (compress(electron_scp_sum,6,3)) ,pointer,space);     pointer += space>>4;    debug_cntr += space>>4;
+                }
+            }
+        }
+        else if(srp_mode==1)
+        {
+            pzf = 0;    ezf = 0;    //because proton energy bins are not available in scatter plot mode and hence in the packet we send dummy data(which is nothng but the maximum value which fits into that particular compression scheme)
+            space = adjust(1, pzf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+            space = adjust(1, ezf,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+            if(at==0){
+                space = adjust(7, (compress(scp_bin[50],4,3)) ,pointer,space);      pointer += space>>4;    debug_cntr += space>>4;
+                // below 4 lines - filling the proton ane electron energy bins with zeros(junk value) since they're not available in srp
+                space = adjust(4, (compress(0,10,2))>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(0,10,2)) ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(4, (compress(0,10,2))>>8 ,pointer,space);        pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(0,10,2)) ,pointer,space);           pointer += space>>4;    debug_cntr += space>>4;
+            }
+            else if(at==1){
+                space = adjust(4, (compress(scp_bin[50],9,3))>>8 ,pointer,space);       pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(scp_bin[50],9,3)) ,pointer,space);          pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, (compress(0,6,3))>>8 ,pointer,space);                 pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(0,6,3)) ,pointer,space);                    pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(1, (compress(0,6,3))>>8 ,pointer,space);                 pointer += space>>4;    debug_cntr += space>>4;
+                space = adjust(8, (compress(0,6,3)) ,pointer,space);                    pointer += space>>4;    debug_cntr += space>>4;
+            }
+        }
+    }
+    /*---------------------------------------------forming a science packet ends here----------------------------------------------*/
+
     id = 0;
     if(srp_mode == 0 && compression_option == 0){
         if(at == 0){
-            length = 228;
+            length = 228+2;                                                       //2 spare bits
             if(pzf == 0)
                 length += 121;
             if(ezf == 0)
                 length +=41;
         }else if(at == 1){
-            length = 266;
+            length = 266+6;                                                       //6 spare bits
             if(pzf == 0)
                 length += 136;
             if(ezf == 0)
                 length += 40;
         }
-            
-    }else if(srp_mode == 0 && compression_option == 1){     //data conservation mode
+    }else if(srp_mode == 0 && compression_option == 1){                         //data conservation mode
         if(at == 0){
-            length = 94;
+            length = 94+2;                                                        //2 spare bits
             if(pzf == 0)
                 length += 12;
             if(ezf == 0)
                 length += 12;
         }else if(at == 1){
-            length = 123;
+            length = 123+3;                                                       //3 spare bits
+            if(pzf == 0)
+                length += 9;
+            if(ezf == 0)
+                length += 9;
+        }
+    }
+    else if( srp_mode == 1){
+        if(at == 0)
+            length = 368;
+        else if(at == 1)
+            length = 432;
+    }
+    else if(compression_option == 2)                                //in extreme data conservation mode, length is same for both srp_modes
+    {                         
+        if(at == 0){
+            length = 31+1;                                                        //1 spare bits
+            if(pzf == 0)
+                length += 12;
+            if(ezf == 0)
+                length += 12;
+        }else if(at == 1){
+            length = 36+2;                                                       //2 spare bits
             if(pzf == 0)
                 length += 9;
             if(ezf == 0)
                 length += 9;
         }
-    }else if( srp_mode == 1){
-        if(at == 0)
-            length = 272;
-        else if(at == 1)
-            length = 288;
     }
     length = (length%8==0)?(length/8):(length/8)+1;
-    for(int j= 0; j < length ; j++){
-        frames[id][position_tm_frame[id]] = scp[j];
+    if(position_tm_frame[id]>129){
+        while(position_tm_frame[id]<132){
+            frames[id][position_tm_frame[id]] = 0;
+            position_tm_frame[id]++;
+        }
+    }
+    if(position_tm_frame[id]==position_tm_starting[id]){
+        frames[id][4] = position_tm_starting[id];
+    }
+    for(int j= 0; j < length ;)
+    {        
+        if(position_tm_frame[id]==frames[id][4]){
+            frames[id][5] = (uint8_t)((sci_time>>29)&0x3f);
+            frames[id][6] = (uint8_t)((sci_time>>21)&0xff);
+            frames[id][7] = (uint8_t)((sci_time>>13)&0x3f);
+        }
+        if(position_tm_frame[id]<132){
+            frames[id][position_tm_frame[id]] = scp[j];
+            j++;
             position_tm_frame[id]++;
-            if(position_tm_frame[id] == 132){   //space full in the frame bro
-                pointer = frames[id];
-                space = adjust(1,0,pointer,8);
-                space = adjust(4,1,pointer,space);
-                FSC_science = FSC_CURRENT[1]+1;
-                //gPC.printf("SID = 1, FSC = %02X\r\n", FSC_science);
-                frames[id][1] = (FSC_science>>16)&0xff;
-                frames[id][2] = (FSC_science>>8)&0xff;
-                frames[id][3] = (FSC_science)&0xff;
-                frames[id][5] = (sci_time>>16)&0x3f;
-                frames[id][6] = (sci_time>>8)&0xff;
-                frames[id][7] = (sci_time)&0xff;
-                temp_crc = crc16_gen(frames[id],132);
-                frames[id][132] = temp_crc>>8;
-                frames[id][133] = temp_crc & 0xff;
-                /*gPC.puts("frame start\r\n");*/
-                /*for(int i = 0; i<134; i++){
-                    gPC.printf("%02X",frames[id][i]);
-                }    
-                gPC.puts("frame ends\r\n");*/
-                exor(frames[id]);
-                convolution(frames[id]);
-                interleave(TM_convoluted_data,TM_interleave_data);
-                interleave(TM_convoluted_data+ 135,TM_interleave_data + 144);
-                sd_stat = SD_WRITE(TM_interleave_data,FSC_CURRENT[1]+1,1);
-                if(sd_stat)
-                {
-                    //gPC.puts("sd write failure");
-                    break;
-                }
-                position_tm_frame[id] = position_tm_starting[id];
-                frames[id][4] = (length-1) - j;
-            }
+        }
+        if(position_tm_frame[id] == 132)                                                //space full in the frame bro
+        {
+            pointer = frames[id];
+            space = adjust(1,0,pointer,8);
+            space = adjust(4,1,pointer,space);
+            FSC_science = FSC_CURRENT[1];
+            frames[id][1] = (FSC_science>>16)&0xff;
+            frames[id][2] = (FSC_science>>8)&0xff;
+            frames[id][3] = (FSC_science)&0xff;
+            temp_crc = crc16_gen(frames[id],132);
+            frames[id][132] = temp_crc>>8;
+            frames[id][133] = temp_crc & 0xff;
+            exor(frames[id]);
+            convolution(frames[id]);
+            interleave(TM_convoluted_data,TM_interleave_data);
+            interleave(TM_convoluted_data+ 135,TM_interleave_data + 144);
+
+            SD_WRITE(TM_interleave_data,FSC_science+1,1);         //sd_write returns ack, for now not included
+
+            position_tm_frame[id] = position_tm_starting[id];
+            frames[id][4] = ((length-1) - j)+position_tm_starting[id];
+        }
     }
-    gPC.puts("end srp");
-}//srp fucntion end bracket
\ No newline at end of file
+}
\ No newline at end of file