63743 (589029), страница 10
Текст из файла (страница 10)
SendCommandHost("TXT",block); // отправка блока в host
}
} // end of while
} // end of main()
/*-------------------------------------------------------------*/
int CheckCommRequest(char *DATA) // Проверка корректности номера
// объекта связи (парохода), по
// которому происходит связь с данным
// объектом
{
int j=0,tmp;
for(j=0;DATA[j]!=';';)
{
tmp = DATA[j];
if(!(tmp>='0' && tmp<='9')) // цифры не могут быть кодом объекта
{
SendHostError(11,tmp); /* ERR;01.1;ID WRONG DIGIT (%c),ID[j] */
return 1;
}
CALL_ID[j] = tmp;
j++;
if(j>9) break;
}
CALL_ID[j]=0;
if(j!=4 && j!=5 && j!=9) /* incorrect ID */ // символ ';' в коде должен быть // третьим, четвертым или восьмым
{
SendHostError(12,j);
return 1;
}
return 0; // проверка успешна, возврат 0.
}
/*-------------------------------------------------------------*/
// массив названий команд для функции SendCommandHost(char *cmd, ...)
char *cmds[] =
{
"TXT","ARQ","CFE","SFE","SET", /* 0... 4 */
"STA","INI","DEB","DBG","DIA", /* 5... 9 */
"FRE","STB","TST","STR","FCC", /* 10...14 */
NULL
};
int CheckCommRequest(char *DATA);
/*-------------------------------------------------------------*/
Программа модуляции
За основу данного способа модуляции взята - частотная модуляция с использованием протокола морского телеграфа NBDP ( narrowband direct printing) - узкополосное буквопечатанье. В основе лежит таблица кодовых значений сиволов, которые представляются в виде комбинации 1 и 0 и после модулируются с соответственно частотами 1615 Hz и 1785 Hz. ( таблица символов в файле nbdp_table.c ).
Mod.c
// Подключаем заголовочные файлы и объявляем локальные и глобальные // переменные
#include
#include
#include
/*-------------------------------------------------------------*/
/*#define OUT_KOEFF 0x6000*/
#ifdef RX_TO_TX_
extern int RX_TO_TX[2];
#endif
/*-------------------------------------------------------------*/
int PH_ACC,TMP_PH_ACC;
int PH_INC;
int mod_ready=1;
int BITTIME=1;
int bits_left;
int out_data;
volatile int l_out,r_out;
extern int FDIV,FS_PTT_OFF;
int dbg_cntr;
/*-------------------------------------------------------------*/
/* MODULATOR */
/*-------------------------------------------------------------*/
extern void Timing(void);
void modulator(void)
{
// Возможна работа в тестовом режиме.
if(SelfTest) goto test_modes;
FDIV++;
// через 10 мс обнуление отсчетов и посылка в хост синхронизирующего // сигнала цикла ARQ.
if(FDIV==80) {FDIV=0;NBDP_THR_TX();}
#ifdef RX_TO_TX_
tx_buf[1] = RX_TO_TX[0];
tx_buf[2] = RX_TO_TX[1];
return;
#endif
// Проверка нужна ли модуляция, если нет то возврат
if(!Modulator_ON)
{
PH_ACC = 0;
return;
}
restart:
if(mod_ready)
{
tx_buf[1] = tx_buf[2] = 0;
if(FS_PTT_OFF) // выключение модуляции
{
FS_PTT_OFF=0;
PTT_OFF();
}
return;
}
test_modes:
BITTIME--;
if(BITTIME==0)
{
/*=== determine the new bit from out byte ===*/
// Режим реальной работы
if(!SelfTest) out_data <<= 1; /* 7 bit mode */
if(out_data & 0x80) /* MARK */
{
PH_INC = MARK_INC;
asm("
#define PFDATA 0x3fe5
ar = b#0000000001000000; /* set 1 PF6/TLG OUT */
ay1 = dm(PFDATA);
ar = ar or ay1;
dm(PFDATA) = ar;");
}
else /* SPACE */
{
PH_INC = SPACE_INC;
asm("
ar = b#1111111110111111; /* reset 1 PF6/TLG OUT */
ay1 = dm(PFDATA);
ar = ar and ay1;
dm(PFDATA) = ar;");
}
// Тестовый режим, работа в 8-битном режиме
if(SelfTest) out_data <<= 1;
BITTIME = BITLENGTH;
bits_left--;
if(bits_left<0)
{
mod_ready=1;
modulating();
goto restart;
}
else
{
/* blink by PF7 as syncro_out */
asm("
ar = dm(PFDATA);
ar = tglbit 7 of ar;
dm(PFDATA) = ar; ");
/* -------------------------- */
}
}
/*asm ("dis m_mode;");*/
PH_ACC += PH_INC;
l_out = sin_i(PH_ACC);
tx_buf[2] = l_out; // выдача результатов в порт ( связь с кодеком)
}
/*-------------------------------------------------------------*/
void modulating(void)
{
if(SelfTest)
{
if(SelfTest==1) /* space */
{
out_data = 0;
}
else if(SelfTest==2) /* mark */
{
out_data = 0xFF;
}
else if(SelfTest==3) /* dot */
{
/* 10101010 */
out_data = 0xAA;
}
else if(SelfTest==4) /* big dot */
{
/* 11110000 */
out_data = 0xF0;
}
else
{
SelfTest=0;
}
BITTIME=1;
bits_left=8; // 8-битный режим работы
mod_ready=0;
return;
}
// В случае тестового режима дальше не идем
if(mod_ready == 0) return;
BITTIME=1;
if(ModulatorGet(&out_data)==0) /* nothing to get */
{
// обнуление флагов и возврат
/* clear PF6 as TLG & PF7 as syncro_out */
asm("
ar = dm(PFDATA);
ar = clrbit 7 of ar;
ar = clrbit 6 of ar;
dm(PFDATA) = ar; ");
/* -------------------------- */
return;
}
bits_left=7; // 7-битный режим работы
mod_ready=0;
}
Программа демодуляции
Принцип демодуляции входного сигнала нашего устройства, основывается на том, что нам известны частоты поступающие от отдельного устройства приема сигнала по радиоканалу, уже отфильтрованные и поданные на вход нашего устройства. И нам необходимо выделить соответственно частоты 1785 Hz = MARK = ' 0 ' и 1615 Hz = SPACE = ' 1 ' и получить определенный код. После получении кода происходит раскодирование по таблице NBDP и передача в ЭВМ, где программа TERMINAL соответственно реагирует на данные кода.
// Demod.c
// Подключаем заголовочные файлы и объявляем локальные и глобальные // переменные
#include
#include
#include
#include
extern void out_mcr(int data);
#define DMD_KOEFF 0x019A
#define DMD_LEVEL 0x1000 /* порог срабатывания */
#define OUT_MARK 'M'
#define OUT_SPACE 'S'
#define OUT_ERR 'E'
int my_fir(int NewValue);
int my_sqrt(int NewValue);
/*-------------------------------------------------------------*/
volatile int l_in,r_in;
int Demodulator_ON=1; // Demodulator ON/OFF flag
int PH_TONE_ACC[2]; // опорный MARK/SPACE PHASE ACC
int PH_TONE_INC[2] = {MARK_INC, SPACE_INC};
int i,j; // временные счетчики
int R [4]; // временные результаты
int S [4]; // частичные суммы
int DL[4*BITLENGTH]; // Delay lines for 4 bands
int DLp = 0; // DL pointer
int countN=BITLENGTH; // Cycle count
int REZ[2]; // Результаты
int PRZLT[2]; // Приблизительные результаты (prev. Rez)
int svMode; /* Save multiplier mode location */
int JitterOff; /* Bit syncro OFF flag */
int OutData[2];
void demodulator(void)
{
// Если демодулятор откл., то обнуление результатов и возврат
if(!Demodulator_ON && (dip_sw & DIP_SW1))
{
REZ[0] = 0;
out_mcr(0);
goto CheckCycle;
}
if(SelfTest) // Если тестовый режим, то возврат
{
return;
}
// Выключение режима целочисленной арифметики
asm("dis m_mode;");
l_in = rx_buf[IN_CHNL];
// ограничить входной сигнал для устранения переполнения фильтра
r_in = _FRACT_MULTIPLY_(r_in,DMD_KOEFF);
Заполняем массив временных результатов для MARK и SPACE
PH_TONE_ACC[0] += PH_TONE_INC[0];
R[0] = _FRACT_MULTIPLY_(r_in,sin_i(PH_TONE_ACC[0]));
R[1] = _FRACT_MULTIPLY_(r_in,cos_i(PH_TONE_ACC[0]));
PH_TONE_ACC[1] += PH_TONE_INC[1];
R[2] = _FRACT_MULTIPLY_(r_in,sin_i(PH_TONE_ACC[1]));
R[3] = _FRACT_MULTIPLY_(r_in,cos_i(PH_TONE_ACC[1]));
//Извлекаем старые данные и добавляем новые
for(i=0;i<4;i++)
{
S[i] = S[i] - DL[DLp];
S[i] = S[i] + R[i];
DL[DLp++] = R[i];
}
if(DLp >= (4*BITLENGTH)) DLp=0; /* wrap DL pointer */
// Получение результата по каждому фильтру.
PRZLT[0] = REZ[0]; // Предварительный результат
REZ[0] = _FRACT_MULTIPLY_(S[0],S[0]) + _FRACT_MULTIPLY_(S[1],S[1]);
REZ[1] = _FRACT_MULTIPLY_(S[2],S[2]) + _FRACT_MULTIPLY_(S[3],S[3]);
if(dip_sw & DIP_SW2)
{
REZ[0] = my_sqrt(REZ[0]);
REZ[1] = my_sqrt(REZ[1]);
}
R[1] = (REZ[0]-REZ[1]);
R[2] = (REZ[0]+REZ[1]);
R[0] = _FRACT_MULTIPLY_((_FRACT_DIVIDE_(R[1],R[2])),0x6400);
REZ[0] = R[0];
/* debug solution output */
tx_buf[1] = REZ[0];
/*================================================
STEP 4.
Time supervision, bit detection, etc.
================================================*/
CheckCycle:
countN--;
if(!countN)
{
if(abs(REZ[0]) > DMD_LEVEL)
{
if(REZ[0] > 0)
{
OutData[0] = OUT_MARK;
asm("reset fl0; set fl2; set fl1; ");
}
else
{
OutData[0] = OUT_SPACE;
asm(" set fl0; reset fl2; set fl1; ");
}
}
else
{
OutData[0] = OUT_ERR;
asm(" set fl0; set fl2; reset fl1; ");
}
countN = BITLENGTH;
// отправляем на ЦАП (кодек)
NBDP_THR_RX(OutData[0]);
}
// включение режима целочисленной арифметики
asm("ena m_mode;");
}
Дополнительные программы и функции
1. Программа nbdp_table.c
Содержит таблицу соответствия кодов ASCII и кодов формата NBDP.
#include
/*B - MARK FREQ:1785Hz
/*Y - SPACE FREQ:1615Hz
/* ¦ +-----------------¦ 5-Unit ¦ 7-Unit ¦ */
/* ¦No ¦LET ¦FIG ¦RUS ¦ Code ¦ Code ¦ */
UCHAR _7bit_code[]= { /*+--+-----+-----+-----+---------+-----------¦ */
0x71 ,/*¦01¦A 41 ¦- 2D ¦А 80 ¦ZZAAA ¦BBBYYYB 71 ¦ */
0x27 ,/*¦02¦B 42 ¦? 3F ¦Б 81 ¦ZAAZZ ¦YBYYBBB 27 ¦ */
0x5c ,/*¦03¦C 43 ¦: 3A ¦Ц 96 ¦AZZZA ¦BYBBBYY 5C ¦ */
0x65 ,/*¦04¦D 44 ¦Wh?? ¦Д 84 ¦ZAAZA ¦BBYYBYB 65 ¦ */
0x35 ,/*¦05¦E 45 ¦3 33 ¦Е 85 ¦ZAAAA ¦YBBYBYB 35 ¦ */
0x6c ,/*¦06¦F 46 ¦Э*9D ¦Ф 94 ¦ZAZZA ¦BBYBBYY 6C ¦ */
0x56 ,/*¦07¦G 47 ¦Ш*98 ¦Г 83 ¦AZAZZ ¦BYBYBBY 56 ¦ */
0x4b ,/*¦08¦H 48 ¦Щ*99 ¦Х 95 ¦AAZAZ ¦BYYBYBB 4B ¦ */
0x59 ,/*¦09¦I 49 ¦8 38 ¦И 88 ¦AZZAA ¦BYBBYYB 59 ¦ */
0x74 ,/*¦10¦J 4A ¦Ю*07 ¦Й 89 ¦ZZAZA ¦BBBYBYY 74 ¦ */
0x3c ,/*¦11¦K 4B ¦( 28 ¦К 8A ¦ZZZZA ¦YBBBBYY 3C ¦ */
0x53 ,/*¦12¦L 4C ¦) 29 ¦Л 8B ¦AZAAZ ¦BYBYYBB 53 ¦ */
0x4e ,/*¦13¦M 4D ¦. 2E ¦М 8C ¦AAZZZ ¦BYYBBBY 4E ¦ */
0x4d ,/*¦14¦N 4E ¦, 2C ¦Н 8D ¦AAZZA ¦BYYBBYB 4D ¦ */
0x47 ,/*¦15¦O 4F ¦9 39 ¦О 8E ¦AAAZZ ¦BYYYBBB 47 ¦ */
0x5a ,/*¦16¦P 50 ¦0 30 ¦П 8F ¦AZZAZ ¦BYBBYBY 5A ¦ */
0x3a ,/*¦17¦Q 51 ¦1 31 ¦Я 9F ¦ZZZAZ ¦YBBBYBY 3A ¦ */
0x55 ,/*¦18¦R 52 ¦4Ч34 ¦Р 90 ¦AZAZA ¦BYBYBYB 55 ¦ */
0x69 ,/*¦19¦S 53 ¦' 27 ¦С 91 ¦ZAZAA ¦BBYBYYB 69 ¦ */
0x17 ,/*¦20¦T 54 ¦5 35 ¦Т 92 ¦AAAAZ ¦YYBYBBB 17 ¦ */
0x39 ,/*¦21¦U 55 ¦7 37 ¦У 93 ¦ZZZAA ¦YBBBYYB 39 ¦ */
0x1e ,/*¦22¦V 56 ¦= 3D ¦Ж 86 ¦AZZZZ ¦YYBBBBY 1E ¦ */
0x72 ,/*¦23¦W 57 ¦2 32 ¦В 82 ¦ZZAAZ ¦BBBYYBY 72 ¦ */
0x2e ,/*¦24¦X 58 ¦/ 2F ¦Ь 9C ¦ZAZZZ ¦YBYBBBY 2E ¦ */
0x6a ,/*¦25¦Y 59 ¦6 36 ¦Ы 9B ¦ZAZAZ ¦BBYBYBY 6A ¦ */
0x63 ,/*¦26¦Z 5A ¦+ 2B ¦З 87 ¦ZAAAZ ¦BBYYYBB 63 ¦ */
0x0f ,/*¦27¦CR 0D -- ----- ¦AAAZA ¦YYYBBBB 0F ¦ */
0x1b ,/*¦28¦LF 0A -- ----- ¦AZAAA ¦YYBBYBB 1B ¦ */
0x2d ,/*¦29¦LET 16 -- ----- ¦ZZZZZ ¦YBYBBYB 2D ¦ */
0x36 ,/*¦30¦FIG 0F -- ----- ¦ZZAZZ ¦YBBYBBY 36 ¦ */
0x1d ,/*¦31¦SP 20 -- ----- ¦AAZAA ¦YYBBBYB 1D ¦ */
0x2b ,/*¦32¦RUS 00 -- ----- ¦AAAAA ¦YBYBYBB 2B ¦ */
/*-------------------------------------------------------------- */
#ifdef RUSSIAN // структура данных под русский алфавит
struct CVT CVT_TABLE[] =
{
/*¦ +-----------------¦ 5-Unit ¦ 7-Unit ¦ */
/*¦ No ¦LET ¦ FIG ¦RUS ¦ Code ¦ Code ¦ */
/*+----+-------+-------+---------+--------------------¦ */
{0x41,0x2D,'a' },/*¦01¦A 41 ¦- 2D ¦А 80 ¦ZZAAA ¦BBBYYYB 71 ¦ */
{0x42,0x3F,'b' },/*¦02¦B 42 ¦? 3F ¦Б 81 ¦ZAAZZ ¦YBYYBBB 27 ¦ */
{0x43,0x3A,'c' },/*¦03¦C 43 ¦: 3A ¦Ц 96 ¦AZZZA ¦BYBBBYY 5C ¦ */
{0x44,0x03,'d' },/*¦04¦D 44 ¦Wh?? ¦Д 84 ¦ZAAZA ¦BBYYBYB 65 ¦ */
{0x45,0x33,'e' },/*¦05¦E 45 ¦3 33 ¦Е 85 ¦ZAAAA ¦YBBYBYB 35 ¦ */
{0x46,'|' ,'f' },/*¦06¦F 46 ¦Э*9D ¦Ф 94 ¦ZAZZA ¦BBYBBYY 6C ¦ */
{0x47,'{' ,'g' },/*¦07¦G 47 ¦Ш*98 ¦Г 83 ¦AZAZZ ¦BYBYBBY 56 ¦ */
{0x48,'}' ,'h' },/*¦08¦H 48 ¦Щ*99 ¦Х 95 ¦AAZAZ ¦BYYBYBB 4B ¦ */
{0x49,0x38,'i' },/*¦09¦I 49 ¦8 38 ¦И 88 ¦AZZAA ¦BYBBYYB 59 ¦ */
{0x4A,'`' ,'j' },/*¦10¦J 4A ¦Ю*07 ¦Й 89 ¦ZZAZA ¦BBBYBYY 74 ¦ */
{0x4B,0x28,'k' },/*¦11¦K 4B ¦( 28 ¦К 8A ¦ZZZZA ¦YBBBBYY 3C ¦ */
{0x4C,0x29,'l' },/*¦12¦L 4C ¦) 29 ¦Л 8B ¦AZAAZ ¦BYBYYBB 53 ¦ */
{0x4D,0x2E,'m' },/*¦13¦M 4D ¦. 2E ¦М 8C ¦AAZZZ ¦BYYBBBY 4E ¦ */
{0x4E,0x2C,'n' },/*¦14¦N 4E ¦, 2C ¦Н 8D ¦AAZZA ¦BYYBBYB 4D ¦ */
{0x4F,0x39,'o' },/*¦15¦O 4F ¦9 39 ¦О 8E ¦AAAZZ ¦BYYYBBB 47 ¦ */
{0x50,0x30,'p' },/*¦16¦P 50 ¦0 30 ¦П 8F ¦AZZAZ ¦BYBBYBY 5A ¦ */
{0x51,0x31,'q' },/*¦17¦Q 51 ¦1 31 ¦Я 9F ¦ZZZAZ ¦YBBBYBY 3A ¦ */
{0x52,0x34,'r' },/*¦18¦R 52 ¦4Ч34 ¦Р 90 ¦AZAZA ¦BYBYBYB 55 ¦ */
{0x53,0x27,'s' },/*¦19¦S 53 ¦' 27 ¦С 91 ¦ZAZAA ¦BBYBYYB 69 ¦ */
{0x54,0x35,'t' },/*¦20¦T 54 ¦5 35 ¦Т 92 ¦AAAAZ ¦YYBYBBB 17 ¦ */
{0x55,0x37,'u' },/*¦21¦U 55 ¦7 37 ¦У 93 ¦ZZZAA ¦YBBBYYB 39 ¦ */
{0x56,0x3D,'v' },/*¦22¦V 56 ¦= 3D ¦Ж 86 ¦AZZZZ ¦YYBBBBY 1E ¦ */
{0x57,0x32,'w' },/*¦23¦W 57 ¦2 32 ¦В 82 ¦ZZAAZ ¦BBBYYBY 72 ¦ */
{0x58,0x2F,'x' },/*¦24¦X 58 ¦/ 2F ¦Ь 9C ¦ZAZZZ ¦YBYBBBY 2E ¦ */
{0x59,0x36,'y' },/*¦25¦Y 59 ¦6 36 ¦Ы 9B ¦ZAZAZ ¦BBYBYBY 6A ¦ */
{0x5A,0x2B,'z' },/*¦26¦Z 5A ¦+ 2B ¦З 87 ¦ZAAAZ ¦BBYYYBB 63 ¦ */
{0x0D,0x0D,0x0D},/*¦27¦CR 0D -- ----- ¦AAAZA ¦YYYBBBB 0F ¦ */
{0x0A,0x0A,0x0A},/*¦28¦LF 0A -- ----- ¦AZAAA ¦YYBBYBB 1B ¦ */
{0x01,0x01,0x01},/*¦29¦LET 16 -- ----- ¦ZZZZZ ¦YBYBBYB 2D ¦ */
{0x02,0x02,0x02},/*¦30¦FIG 0F -- ----- ¦ZZAZZ ¦YBBYBBY 36 ¦ */
{0x20,0x20,0x20},/*¦31¦SP 20 -- ----- ¦AAZAA ¦YYBBBYB 1D ¦ */
{0x03,0x03,0x03},/*¦32¦RUS 00 -- ----- ¦AAAAA ¦YBYBYBB 2B ¦ */
2. Программа nbdp.c
Содержит функции для работы с протоколом NBDP, а также объявление всех глобальных переменных используемых в обмене данными по протоколу NBDP.
#include
#include
#include
#include
#include
/*-------------------------------------------------------------*/
UINT No; /* Channel No */
UCHAR COMF; /* COMMUNICATION FLAG */
/* b0 : 0=stanby 1=communication */
/* b1 : 1=ARQ Mode */
/* b2 : 1=CFEC Mode */
/* b3 : 1=SFEC Mode */
/* b4 : 1=GFEC Mode */
/* b5 : 0=send 1=recv */
/* b6 : 1 = SLAVE wait PHASING, 0 = SLAVE PHASED */
/* b7 : */
UCHAR STATE; /* COMMUNICATION STATE */
UCHAR LAST_STATE;
/* FEC ARQ */
/* 0 stand-by stand-by */
/* 1 set receive mode send before process */
/* 2 syncro signal rx receive before process */
/* 3 FEC msg rcv 7id-phasing-master */
/* 4 Synchronous signal send 7id-rephasing-master */
/* 5 ID send 4id-phasing-master */
/* 6 FEC msg send 4id-rephasing-master */
/* 7 stop signal send 7id-phasing-slave */
/* 8 7id-rephasing-slave */
0>4>














