📄 gennavdatabit.c
字号:
CopyBitToWord (omega_n, 0,24, word );
Parity_computation(word, D29, D30);
WordtoData(subf+210,word,30);
//////////sub frame 3, word 9999:
// 24 OMEGADOT, 6 Parity
CopyBitToWord (OMEGADOT_n, 0,24, word );
Parity_computation(word, D29, D30);
WordtoData(subf+240,word,30);
//////////sub frame 3, word 10101010:
// 8 IODE, 14 Idot, 6 Parity
CopyBitToWord (Iode_n, 0,8, word );
CopyBitToWord (Idot_n, 0,14, word+8 );
Parity_computation(word, D29, D30);
// Adjust parity checking
if (word[28] == 1)
{
word[28] = 0;
word[23] = 1 - word[23];
word[25] = 1 - word[25];
word[29] = 1 - word[29];
}
if (word[29] == 1)
{
word[29] = 0;
word[22] = 1 - word[22];
word[24] = 1 - word[24];
word[27] = 1 - word[27];
}
*D29 = word[28];
*D30 = word[29];
WordtoData(subf+270,word,30);
}
//******************************************************************************
//** Function: get_sub4
//** Tasks: Generate subframe4
//******************************************************************************
void get_sub4(char *subf, char *D29, char *D30, unsigned long zcount)
{
char word[30],subframeID[3];
// double IODC_n[10],M0_n[32],ec_n[32],sqrtA_n[32];
// double W0_n[32], omeg_n[32], i0_n[32];
// double scale;
int i;
//////////////////////////////////////////////////////////////////
//////////subframe 1 Frame[1:300]
//////////sub frame 1, word 1111
//TLM word
GetTLMWord(word, *D30); // Preamble contain Capital D
Parity_computation(word, D29, D30);
WordtoData(subf,word,30);
//////////sub frame 1, word 2222
subframeID[0] = 1; subframeID[1] = 0; subframeID[2] = 0;
GetHOWWord(word, zcount,subframeID);
Parity_computation(word, D29, D30);
// Adjust parity checking
if (word[28] == 1)
{
word[28] = 0;
word[23] = 1 - word[23];
word[25] = 1 - word[25];
word[29] = 1 - word[29];
}
if (word[29] == 1)
{
word[29] = 0;
word[22] = 1 - word[22];
word[24] = 1 - word[24];
word[27] = 1 - word[27];
}
*D29 = word[28];
*D30 = word[29];
WordtoData(subf+30,word,30);
//////////sub frame 1, word 3333:
//10 WN, 2 reserved, 4 SV accuracy, 6 SV health,2 IODC, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+60,word,30);
//////////sub frame 1, word 4444:
//
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+90,word,30);
//////////sub frame 1, word 5555:
//
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+120,word,30);
//////////sub frame 1, word 6666:
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+150,word,30);
//
//////////sub frame 1, word 7777:
//16**, 8 Tgd, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+180,word,30);
//////////sub frame 1, word 8888:
//8 LSB IODC, 16 Toc(Toe), 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+210,word,30);
//////////sub frame 1, word 9999:
//8 af2, 16 af1, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+240,word,30);
//////////sub frame 1, word 10101010:
//22 af0, 2 t, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
// Adjust parity checking
if (word[28] == 1)
{
word[28] = 0;
word[23] = 1 - word[23];
word[25] = 1 - word[25];
word[29] = 1 - word[29];
}
if (word[29] == 1)
{
word[29] = 0;
word[22] = 1 - word[22];
word[24] = 1 - word[24];
word[27] = 1 - word[27];
}
*D29 = word[28];
*D30 = word[29];
WordtoData(subf+270,word,30);
}
//******************************************************************************
//** Function: get_sub5
//** Tasks: Generate subframe5
//******************************************************************************
void get_sub5(char *subf, char *D29, char *D30, unsigned long zcount)
{
char word[30],subframeID[3];
//double IODC_n[10],M0_n[32],ec_n[32],sqrtA_n[32];
//double W0_n[32], omeg_n[32], i0_n[32];
//double scale;
int i;
//////////////////////////////////////////////////////////////////
//////////subframe 1 Frame[1:300]
//////////sub frame 1, word 1111
//TLM word
GetTLMWord(word, *D30); // Preamble contain Capital D
Parity_computation(word, D29, D30);
WordtoData(subf,word,30);
//////////sub frame 1, word 2222
subframeID[0] = 1; subframeID[1] = 0; subframeID[2] = 1;
GetHOWWord(word, zcount,subframeID);
Parity_computation(word, D29, D30);
// Adjust parity checking
if (word[28] == 1)
{
word[28] = 0;
word[23] = 1 - word[23];
word[25] = 1 - word[25];
word[29] = 1 - word[29];
}
if (word[29] == 1)
{
word[29] = 0;
word[22] = 1 - word[22];
word[24] = 1 - word[24];
word[27] = 1 - word[27];
}
*D29 = word[28];
*D30 = word[29];
WordtoData(subf+30,word,30);
//////////sub frame 1, word 3333:
//10 WN, 2 reserved, 4 SV accuracy, 6 SV health,2 IODC, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+60,word,30);
//////////sub frame 1, word 4444:
//
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+90,word,30);
//////////sub frame 1, word 5555:
//
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+120,word,30);
//////////sub frame 1, word 6666:
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+150,word,30);
//
//////////sub frame 1, word 7777:
//16**, 8 Tgd, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+180,word,30);
//////////sub frame 1, word 8888:
//8 LSB IODC, 16 Toc(Toe), 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+210,word,30);
//////////sub frame 1, word 9999:
//8 af2, 16 af1, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
WordtoData(subf+240,word,30);
//////////sub frame 1, word 10101010:
//22 af0, 2 t, 6 Parity
for (i=0;i<30;i++)
{
word[i] = i&1;
}
Parity_computation(word, D29, D30);
// Adjust parity checking
if (word[28] == 1)
{
word[28] = 0;
word[23] = 1 - word[23];
word[25] = 1 - word[25];
word[29] = 1 - word[29];
}
if (word[29] == 1)
{
word[29] = 0;
word[22] = 1 - word[22];
word[24] = 1 - word[24];
word[27] = 1 - word[27];
}
*D29 = word[28];
*D30 = word[29];
WordtoData(subf+270,word,30);
}
void WordtoData(char Frame[], char word[], int n )
{
int i;
for (i=0;i<n;i++)
{
Frame[i] = word[i];
}
}
void WordtoDataDouble(double Frame[], double word[], int n )
{
int i;
for (i=0;i<n;i++)
{
Frame[i] = word[i];
}
}
//No parity bits are included yet in TLM word
//Only 8 bits preamble, researved bits are set to 1
void GetTLMWord(char word[], char D30 )
{
// Output is small d.
int i;
char ini_val, set_val;
ini_val = 1;
set_val = 0;
if (D30 == 1)
{
ini_val = 0;
set_val = 1;
}
// Initialize Preamble, after parity checking, it should ne 10001011
for (i=0;i<8;i++)
{
word[i] = ini_val;
}
// Initialize TLM message and reserverd bit
for (i=8;i<24;i++)
{
word[i] = (i & 1);
}
word[1] = set_val;
word[2] = set_val;
word[3] = set_val;
word[5] = set_val;
}
void GetHOWWord( char word[],unsigned long TOW, char subframeID[] )
{
int i;
for (i=0;i<30;i++)
{
word[i] = i & 1;
}
//Compute binary of eph_navbit.TOW transmit time of the next subframe
//eph_navbit.TOW is transmit time of this subframe
//z count 19bits. 2 LSB are truncted
//TOW=Ttr=z count 17 MSB *6-6
Convert_to_B(word, (long int)TOW, 17);
//2 flags
//word[17] = 1;
//word[18] = 1;
//subframe ID
WordtoData(word+19,subframeID,3);
//parity not available
}
void Convert_to_B(char B_value[], long int In_value, int n)
{
int i,pow2,tmp;
// In_value = (int)In;
if (In_value>=0)
{
for (i=0;i<n;i++)
{
pow2 = (int)pow(2,n-i-1);
tmp = In_value/pow2;
if (tmp==1)
B_value[i] = 1;
else
B_value[i] = 0;
In_value = In_value % pow2;
}
}
else
{
In_value = -In_value-1;
for (i=0;i<n;i++)
{
pow2 = (int)pow(2,n-i-1);
tmp = In_value/pow2;
if (tmp==1)
B_value[i] = 0 ;
else
B_value[i] = 1;
In_value = In_value % pow2;
}
}
}
//void Parity_bits()
char Parity_calculation( char *hd, char *d)
{
int icount;
char one_bit = 0;
for (icount =0 ; icount < 26; icount ++)
if (hd[icount])
one_bit = (one_bit == d[icount])?0:1;
return one_bit;
}
void Parity_computation( char word[], char *D29, char *D30)
{
// word[] : Small d
char h1[] = {1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,0,1,0 }; // from GPS Th & App p.131
char h2[] = {0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,0,1 }; // by B.W. Parkinson & J. J. Spilker
char h3[] = {1,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,0 };
char h4[] = {0,1,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0 };
char h5[] = {0,1,1,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1 };
char h6[] = {1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,1 };
char ch_word[26];
int icount;
// char ch_bit;//ch_D29, ch_D30,
ch_word[0] = *D29;
ch_word[1] = *D30;
// ch_word contains source bits
for (icount=0; icount <24; icount ++)
ch_word[icount+2] = (word[icount]!=0)? 1: 0;
// word contains the transmit bits
for (icount = 0; icount < 24; icount ++ )
word[icount] = (ch_word[icount+2] == ch_word[1])? 0 : 1;
word[24] = Parity_calculation(h1, ch_word);
word[25] = Parity_calculation(h2, ch_word);
word[26] = Parity_calculation(h3, ch_word);
word[27] = Parity_calculation(h4, ch_word);
word[28] = Parity_calculation(h5, ch_word);
word[29] = Parity_calculation(h6, ch_word);
*D29 = word[28];
*D30 = word[29];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -