📄 flexdec.c
字号:
phase_code_count = 0;
init_cfg( void );
decode_buff_head = 0;
decode_buff_tail = 0;
while( 1 )
{
if( decode_buff_head != decode_buff_tail )
{
index = 0;
if( decode_buff[ decode_buff_head ].ucProcotol == 1 ) // flex
{
addr_base = decode_buff[ decode_buff_head ].ucBlockData[ 0 ] & 0x0c;
if( addr_base == 0x00 )
addr_base = 1;
else if( addr_base == 0x08 )
addr_base = 2;
else if( addr_base == 0x04 )
addr_base = 3;
else
addr_base = 4; //codeword
vector_base = ShiftLeftRight( ( decode_buff[ decode_buff_head ].ucBlockData[ 1 ] & 0x3f ), 6 ); //codeword
message_base = 87; //codeword 0 --- 87
offset = 0;
while( ( addr_base + offset ) < vector_base ) //同一块数据 不同地址码
{
addr_capcode0 = GetCode( ( addr_base + offset ) );
if( addr_capcode0 >= 0x008001 && addr_capcode0 <= 0x1e0000 )
capcode_type = 1; // 短地址码
else if( addr_capcode0 >= 0x0001 && addr_capcode0 <= 0x8000 )
capcode_type = 2; // 长地址码
else if( addr_capcode0 >= 0x1f6800 && addr_capcode0 <= 0x1f77ff )
capcode_type = 3; // 网络地址码
else
{
capcode_type = 0; // 无效地址码
continue;
}
if( capcode_type == 2 ) // 长地址码
{
addr_capcode1 = GetCode( ( addr_base + offset + 1 ) );
if( addr_capcode1 < 0x1f7fff || addr_capcode1 > 0x1ffffe )
continue;
}
if( ( vector_base + offset ) < message_base )
{
vector_code = GetCode( vector_base + offset ); //获得向量码字
vector_type = GetInfo( vector_code, 4 , 6 ); //获得向量类型信息
switch( vector_type )
{
case 0x05: //字母数字向量(含汉字字符)
message_addr = GetInfo( vector_code, 7, 13 );
message_len = GetInfo( vector_code, 14, 20 );
if( message_addr <= message_base )
message_base = message_addr; //message_base:消息区基地址
//message_addr:消息区当前地址
//取消息的第一个码字
if( capcode_type == 2 ) //长地址码向量的第二个码字为消息的第一个码字
{ //从向量区中取消息码字
message_code = GetCode( vector_base + offset + 1 ); //第二个码字
message_len --;
}
else //非长地址码从消息区中取消息码字
{
message_code = GetCode( message_addr ++ );
message_len --;
}
if( message_code & 0x200000 )
subsection_flag = 1;
else
subsection_flag = 0;
message_byte = 0x00;
bit_count = 7;
current_bit = 21;
while( message_byte != HEX3 && message_len != 0 )
{
for( ; bit_count != 0 && current_bit < 21; bit_count -- )
{
message_byte >>= 1;
if( message_code & 0x80000000 )
{
message_byte |= 0x80;
}
bit_count --;
message_code <<= 1;
current_bit ++;
}
if( bit_count == 0 )
{ //一个数字字符已收完
bit_count = 7;
message_byte = 0x00;
//加入处理程序
}
if( current_bit == 21 )
{
message_code = GetCode( message_addr ++ ); //从消息区中取下一个新码字
message_len --;
current_bit = 0;
}
}
break;
case 0x06: //HEX和二进制向量
break;
case 0x00: //保安消息向量
break;
case 0x01: //短指令向量
break;
case 0x02: //短消息向量
break;
case 0x03: //数字向量
case 0x04: //特定格式数字向量
case 0x07: //编号的数字向量
message_addr= GetInfo( vector_code, 7 , 13 );
message_len = GetInfo( vector_code, 14, 16 ) + 1 ; //当前消息码字长度
if( message_len != 1 || capcode_type != 2 )
{ //消息码字不等于1或不是长地址码则更新消息区基地址
if( message_addr <= message_base )
message_base = message_addr; //message_base:消息区基地址
//message_addr:消息区当前地址
}
if( capcode_type == 2 ) //长地址码向量的第二个码字为消息的第一个码字
{ //从向量区中取消息码字
message_code = GetCode( vector_base + offset + 1 ); //第二个码字
message_len --;
}
else //非长地址码
{ //从消息区中取消息码字
message_code = GetCode( message_addr ++ );
message_len --;
}
//取第一个码字,确定第一个起始位
if( vector_type == 0x07 ) //编号的数字向量的第一个码字(10bit)
{
current_bit = 10;
message_code <<= 10;
}
else //特定格式或标准数字向量的第一个码字(2bit)
{
current_bit = 2;
message_code <<= 2;
}
message_byte = 0x00;
bit_count = 4;
while( message_byte != HEXC && message_len != 0 )
{
for( ; bit_count != 0 && current_bit < 21; bit_count -- )
{
message_byte >>= 1;
if( message_code & 0x80000000 )
{
message_byte |= 0x80;
}
bit_count --;
message_code <<= 1;
current_bit ++;
}
if( bit_count == 0 )
{ //一个数字字符已收完
bit_count = 4;
message_byte = 0x00;
//加入处理程序
}
if( current_bit == 21 )
{
message_code = GetCode( message_addr ++ );//从消息区中取下一个新码字
message_len --;
current_bit = 0;
}
}
break;
default:
break;
}
}
else // vector_base + offset >= message_base :单音
tone_pro( ); //单音呼叫处理后,检测是否还有单音呼叫
if( capcode_type == 2 )
offset += 2; //偏移地址加2
else
offset ++; //偏移地址加1
}
decode_buff[ decode_buff_head ].ucBlockUsedflag = 0; //disable data block
decode_buff_head ++;
decode_buff_head %= MAXDECODEBUFF; //头指针指向下一个数据块
bit_count = 7;
message_byte = 0x00;
}
else
{ //提取pocsag数据块
for( message_addr = 0; message_addr < decode_buff[ decode_buff_head ].uiBlockCodeWords; message_addr ++ )
{
message_code = GetCode( message_addr );
if ( message_code == 0x7cd215d8 || message_code == 0x832dea27 )
pocsag_addr = 0;
else if ( message_code == 0x7a89c197 || message_code == 0x85763e68 );
else
{ // 不是空闲码,不是SC
if( message_code & 0x80000000 )
{ //该码字为消息码
message_code <<= 1; //移出最高位,20位消息码
for( current_bit = 0; current_bit < 20; current_bit ++ )
{
message_byte >>= 1;
if( message_code & 0x80000000 )
{
message_byte |= 0x80;
}
message_code <<= 1;
bit_count --;
if( bit_count == 0 )
{ //一个数字字符已收完
bit_count = 7;
if( message_byte == HEXC )
{
message_byte = 0x00;
break;
}
message_byte = 0x00;
//加入处理程序
}
}
}
else //该码字为地址码
{
addr_capcode0 = GetInfo( message_code , 1 , 18 );
//初始化消息参数
message_byte = 0x00;
bit_count = 7;
//处理地址码
}
}
pocsag_addr ++;
pocsag_addr %= 17;
}
}
}
}
}
void init_cpu( void )
{
DATA_PORT = 0xFF;
TMOD = 0x21;
SCON = 0x50;
TH1 = 0xFB;
TL1 = 0xFB;
TR1 = 1;
IT0 = 1;
IT1 = 1;
EA = 1;
crc_flag = 0;
}
void init_cfg( void )
{
ES = 1;
EX0 = 1;
EX1 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -