n

Dependencies:   mbed

Fork of LG by igor Apu

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers commandset.c Source File

commandset.c

00001 
00002 
00003 
00004 #include <string.h>
00005 
00006 
00007 #include "Global.h"
00008 
00009 
00010 #define COMMAND_DEBUG
00011 
00012 //++++++++++++++++debug++++++++++++++++
00013 extern uint32_t In_Flag;
00014 unsigned char BuffTemp1[100];
00015 //e. +++++++++++++++++++  variables +++++++++++++++++++++++++++++++++++++++++++  //r. +++++++++++++++++++ переменные +++++++++++++++++++++++++++++++++++++++++++
00016 uint32_t    CMD_Mode = 0;       //e. operation mode of the device //r. режим работы устройства
00017 uint32_t    CMD_Code;           //e. full code of the last recieved command //r. полный код последней принятой команды
00018 uint32_t    wrk_period;         //e. run period in cycles //r. рабочий период в циклах
00019 uint32_t    blt_in_test;
00020 
00021 int32_t     ScopeMode; //e. mode of display for a control point of an scope //r. режим отображения для контрольной точки осциллографа
00022 
00023 
00024 void SetSpeedPeriod(void)     //e.============ procedure of set of rate and periodicity of answer  ======== //r.============ процедура установки скорости и периодичности ответа ========
00025 {
00026     if ((rcv_buf[3] & 0x0080) != 0) { //e. is periodic data transmission needed? //r. периодическая передача трубуется?
00027         trm_cycl = 1;       //e. yes, set present flag //r. да, установить данный флаг
00028     } else {
00029         trm_cycl = 0;       //e. no, reset present flag //r. нет, сбросить данный флаг
00030     }
00031 
00032     SRgR &= 0xffcf;             //e. clear the bit of transfer rate //r. очистка бит скорости передачи
00033     trm_rate = (rcv_buf[3] >> 1) & 0x0030;
00034     SRgR |= trm_rate;           //e. set present transfer rate //r. установить данную скорость передачи
00035 } // SetSpeedPeriod
00036 
00037 
00038 void B_Delta_BINS(void)        //r.===процедура выдачи накопленных разностей счетчиков импульсов в ИНС в формате 14.18
00039 {
00040     Valid_Data = 0;                     // reset all bits of status word
00041 
00042     num_of_par = 2;                 //e. 2 parameters output //r. выводить 2 параметра
00043     addr_param[0] = &Output.Str.BINS_dif;   //e. set the first parameter address //r. задать адрес первого параметра
00044     addr_param[1] = &Valid_Data;    //e. set the second paremeter address //r. задать адрес второго параметра
00045     size_param[0] = 4;              //e. the length of the 1st parameter is 4 bytes //r. параметр 1  имеeт длину 4 байта
00046     size_param[1] = 1;              //e. the length of the 2nd parameter is 1 byte (!! - the high byte, instead of low is transmitted) //r. параметр 2 имеет длину 1 байт (!!! передается старший байт, а не младший)
00047     trm_ena = 1;                    //e. allow operation of the transmitter //r. разрешить работу передатчика
00048 
00049 } // B_Delta_BINS
00050 
00051 void B_Delta_SF(void)         //r.=== процедура для измерения масштабного множителя
00052 {
00053     //e. time for data transfer has come, we work only with dither counters //r. пришло время передавать данные, работаем только с вибро-счетчиками
00054     RgConB = RATE_VIBRO_1;              //e. set in the additional register of device control the mode of work with dither counters  and the filter of moving average //r. устанавливаем в дополнительном регистре управления режим работы с вибросчетчиками и фильтром скользящего среднего
00055 
00056     Valid_Data = 0;                     // reset all bits of status word
00057 
00058     num_of_par = 5;//8;                     //e. 8 parameters output //r. выводить 8 параметра
00059     addr_param[0] = &Output.Str.SF_dif;     //e. set the first parameter address //r. задать адрес первого параметра
00060     addr_param[1] = &Out_main_cycle_latch;    //e. set the second paremeter address //r. задать адрес второго параметра
00061     addr_param[2] = &Out_T_latch;//F_ras;
00062     addr_param[3] = &Output.Str.WP_reg;
00063     addr_param[4] = &Output.Str.Tmp_Out;
00064     size_param[0] = 8;              //e. the length of the 1st parameter is 4 bytes //r. параметр 1  имеeт длину 4 байта
00065     size_param[1] = 4;              //e. the length of the 2nd parameter is 1 byte (!! - the high byte, instead of low is transmitted) //r. параметр 2 имеет длину 1 байт (!!! передается старший байт, а не младший)
00066     size_param[2] = 2;
00067     size_param[3] = 2;
00068     size_param[4] = 12;
00069     trm_ena = 1;                    //e. allow operation of the transmitter //r. разрешить работу передатчика
00070 } // B_Delta_SF
00071 
00072 void B_Delta_PS_execution(void)
00073 {
00074     static void * paramTable[11] = {&(Output.Str.F_ras) , &(Output.Str.HF_reg), &(Output.Str.T_Vibro), &(Output.Str.L_Vibro), &(Output.Str.WP_reg), &(Output.Str.Tmp_Out[0]), &(Output.Str.Tmp_Out[1]), &(Output.Str.Tmp_Out[2]), &(Output.Str.Tmp_Out[3]), &(Output.Str.Tmp_Out[4]), &(Output.Str.Tmp_Out[5])};
00075     static uint32_t val, paramTmpWord;
00076     static uint32_t * ptr;
00077     static uint32_t index = 0;
00078 
00079     if ((index & 1) == 0) { // high byte
00080         ptr = (uint32_t*)paramTable[index >> 1];
00081         val = *ptr;
00082         paramTmpWord = val >> 8; // move it to low byte of word
00083     } else {
00084         paramTmpWord = val;
00085     }
00086     paramTmpWord &= 0xFF;
00087     paramTmpWord |= index << 8;
00088 
00089     Valid_Data = 0;                     // reset all bits of status word
00090 
00091 
00092     num_of_par = 2;        //e. 2 parameters output //r. выводить 2 параметра
00093     addr_param[0] = &Output.Str.PS_dif;           //e. set the first parameter address //r. задать адрес первого параметра
00094     addr_param[1] = &paramTmpWord;
00095     size_param[0] = 2;              //e. the 1st parameter has 2 bytes length //r. параметр 1  имеeт длину 2 байт
00096     size_param[1] = 2;              //e. the 2nd and 3rd parameters have 1 bytes length//r. параметры 2,3 имеют длину 1 байт
00097     trm_ena = 1;                    //e. allow operation of the transmitter //r. разрешить работу передатчика
00098 
00099     index++;
00100     if (index > 21) {
00101         index = 0;
00102     }
00103 } // B_Delta_PS_execution
00104 
00105 void M_Mirror(void)       //e.---------------- prepare to transmission of the copy of receiving buffer ------------- //r.---------------- подготовка передачи копии приемного буфера -------------
00106 {
00107     num_of_par = 1;     //e. 1 parameter output //r. выводить 1 параметр
00108 
00109     addr_param[0] =  &rcv_copy;         //e. set the address of the receiving buffer //r. установка адреса приемного буфера
00110 
00111     //e. multiply the number of copied words on 2, since each //r. умножить число скопированных слов на 2, т.к. каждое
00112     //e. will be trasferred in two steps: first zero, and then //r. будет передаватьсч в два приема: сначала нулевой, а затем
00113     size_param[0] = rcv_byt_copy << 1; // multiplay by 2
00114     if (size_param[0] >= 64) {
00115         size_param[0] = 64;     //e. maximal amount - no more than double length of the copy buffer //r. максимальное количество - не более двойной длины буфера-копии
00116     }
00117     trm_rate = 0;       //e. set the transfer rate to the 38400 bauds //r. установить скорость передачи 38400 бод
00118     trm_cycl = 0;       //e. forbid cyclic transmission of the parameter //r. запретить передачу параметра в цикле
00119     trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00120 } // M_Mirror
00121 
00122 void Mk_Ask1(void)        //r.----------------- prepare of the standart answer 1 ---------------------- //r.----------------- подготовка стандартного ответа 1 ----------------------
00123 {
00124     CMD_Code &= 0xff00;         //e. clear bits of errors //r. очистить в нем поле ошибок
00125     num_of_par = 1;             //e. total amount parameters in aswer - 1  //r. всего параметров в ответе - 1
00126     addr_param[0] = &CMD_Code;  //e. and this parameter - returnable command code //r. и этот параметр - возвращаемый код команды
00127     size_param[0] = 2;          //e. and both its bytes //r. причем оба его байта
00128     trm_ena = 1;                //e. allow operation of the transmitter of the device //r. разрешить работу передатчика устройства
00129 } // Mk_Ask1
00130 
00131 void Mk_AskDev(void)        //r.----------------- answer on a command for device mode set ------------ //r.----------------- Ответ на команду установки режима прибора ------------
00132 {
00133     num_of_par = 2;     //e. 2 parameters output //r. выводить два параметра
00134     addr_param[0] = &Device_Mode;   //e. address of the counter mode register (intenal latch, external latch, etc.) //r. адрес регистра режима счетчиков (внутр., внешняя защелка и т.д.)
00135     addr_param[1] = &SRgR;      //e. address of the mode register of the processor card //r. адрес регистра режима платы процессора
00136     size_param[0] = 2;              //e. size of the counter mode register - 2 bytes //r. размер регистра режима счетчиков - 2 байта
00137     size_param[1] = 2;              //e. size of the mode register of the processor card //r. размер регистра режима платы процессора
00138     trm_cycl = 0;                   //e. forbid cyclic transmission of the parameter //r. запретить передачу параметра в цикле
00139     trm_ena = 1;                    //e. allow operation of the transmitter //r. разрешить работу передатчика
00140 } // Mk_AskDev
00141 
00142 void GLD_Output(void)       //e. ----------- Output modes --------- //r. --------- Режимы вывода ---------
00143 {
00144     if (Latch_Rdy) {       //latch appeared
00145         if (trm_cycl)
00146             trm_ena = 1;   //enable packet generation
00147 
00148         switch (CMD_Mode) {
00149             case 1:                             //e. Delta _PS mode
00150                 B_Delta_PS_execution();
00151                 break;
00152 
00153             case 5:
00154                 CMD_Code &= 0xff1f; //e. reset bits of current command code settings of periodicity and transfer rate //r. сбросить в текущем коде команды биты установки периодичности и скорости передачи
00155                 if (CMD_Code == 0xdd02) { //e. is it the Rate2 mode? //r. это режим Rate2?
00156                     if (data_Rdy & WHOLE_PERIOD) {
00157                         trm_ena = 1;
00158                     } else
00159                         trm_ena = 0;
00160                 }
00161                 break;
00162         }
00163     }
00164 } // GLD_Delta
00165 
00166 
00167 
00168 ///// -------- commands -------------------------------------------------------------
00169 //e. set main device operation modes: //r. Установка основных режимов работы прибора:
00170 //e. 1. acions with counters (internal latch, external latch with request over line, //r. 1. работа со счетчиками (внутренняя защелка, внешняя защелки с запросом по линии,
00171 //e. external latch without request over line (instant answer after receiving of external latch pulse)) //r. внешняя защелка без запроса по линии (ответ сразу после прихода импульса внешн. защелки))
00172 //e. 2. line receiving/transmission rate //r. 2. скорость приема/передачи по линии
00173 void B_Dev_Mode(void)
00174 {
00175     Device_Mode = rcv_buf[3] & 0x00ff; //e. read the byte of command parameter from the receiver buffer //r. считать из буфера приемника байт параметра команды
00176     //e. and write it to the counter mode register  //r. и записываем в регистр режима счетчиков
00177     trm_cycl = 0;   //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00178     Mk_AskDev();
00179 } // B_Dev_Mode
00180 
00181 void B_BIT_Mode(void)
00182 {
00183     uint8_t temp;
00184 
00185     temp = rcv_buf[3] & 0x000f & (~((rcv_buf[3] & 0x00f0) >> 4));
00186     if (temp == 1) { // 1 - const test
00187         Is_BIT = 1;
00188         BIT_number = (long)(rcv_buf[4] & 0x00FF) << 24;
00189         BIT_number |= (long)(rcv_buf[5] & 0x00FF) << 16;
00190         BIT_number |= (long)(rcv_buf[6] & 0x00FF) << 8;
00191         BIT_number |= (long)(rcv_buf[7] & 0x00FF);
00192     } else {
00193         Is_BIT = 0;
00194     }
00195     trm_cycl = 0;   //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00196     Mk_AskDev();
00197 } // B_BIT_Mode
00198 
00199 void M_Stimul(void)       //e. === procedure of output of analog (DAC) and digital (flags) stimuluses //r. === процедура вывода аналоговых (ЦАП) и дискретных (флаги) стимулов
00200 {
00201     uint32_t chan;
00202 
00203     ScopeMode = 4; //e. WP_PHASE_DETECTOR allocate a mode of display for a control point of an scope //r. WP_PHASE_DETECTOR назначить режим отображения для контрольной точки осциллографа
00204 
00205     chan = CMD_Code & 0x0007;           //e. extracting the number of stimulus //r. выделение номера стимула
00206 
00207     Output.ArrayOut[chan] = (((int)rcv_buf[4] << 8) | (int)rcv_buf[5])-0x8000;
00208 
00209     if ((CMD_Code & (1 << 7)) == 0) { //e. to estimate: whether the answer is required //r. оценить: требуется ли ответ
00210         return;         //e. if no - return //r. если нет - возврат
00211     }
00212     Mk_Ask1();           //e. otherwise - answer output //r. иначе - выдать ответ
00213 } // M_Stymul
00214 
00215 void M_Status(void)        //e. === procedure of initialization of transmission of the device status //r. === процедура инициализации передачи статуса устройства
00216 {
00217     SetSpeedPeriod();        //e. and set the answer transfer rate and its periodicity //r. и установить скорость передачи ответа и его периодичность
00218 
00219     num_of_par = 2;     //e. 2 parameters output //r. выводить два параметра
00220     addr_param[0] = &blt_in_test;      //e. the register address of the self-testing result //r. адрес регистра результата самотестирования
00221     addr_param[1] = &ser_num;   //e. address of the register of errors of line //r. адрес регистра ошибок линии
00222     size_param[0] = 2;     //e. size of the self-test register - 2 bytes //r. размер регистра самотестирования - 2 байта
00223     size_param[1] = 2;   //e. size of the register of errors of line //r. размер регистра ошибок линии
00224 
00225     trm_rate = 0;       //e. set the transfer rate to the 38400 bauds //r. установить скорость передачи 38400 бод
00226     trm_cycl = 0;       //e. forbid cyclic transmission of the parameter //r. запретить передачу параметра в цикле
00227     trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00228 } // M_Status
00229 
00230 void M_Clear(void)        //e.---------------- cleaning of the register of errors of line -------------------------- //r.---------------- очистка регистра ошибок линии --------------------------
00231 {
00232     line_err = 0;
00233 } // M_Clear
00234 
00235 void M_Tmp_W(void)        //e.----------------- write the command to the AD7714 IC ------------------------- //r.----------------- запись команды в схемы AD7714 -------------------------
00236 {
00237 
00238     Mk_Ask1();
00239 }
00240 
00241 void M_Tmp_R(void)        //e.----------------- read the data from the AD7714 IC -------------------------- //r.----------------- чтение данных из схем AD7714 --------------------------
00242 {
00243 
00244 } // M_Tmp_R
00245 
00246 void M_ADC_R(void)        //e.----------------- read the data from the ADCs ADS1250, ADS8321 --------- //r.----------------- чтение данных из каналов АЦП ADS1250, ADS8321 ---------
00247 {
00248     SetSpeedPeriod();               //e. set the answer transfer rate and its periodicity //r. установить скорость передачи ответа и его периодичность
00249     UART_SwitchSpeed(trm_rate);
00250 
00251     num_of_par = 4;             //e. 4 parameters output //r. выводить четыре параметра
00252     addr_param[0] = 0;          //e. //r. <!-- использовались для ДУП, теперь не используются
00253     addr_param[1] = 0;          //e. //r.  -->
00254     addr_param[2] = 0;
00255     addr_param[3] = &(Input.StrIn.HF_out);      //e. set the 4th parameter address  _HF_out //r. задать адрес четвертого параметра _HF_out
00256     size_param[0] = 2;          //e. size of the parameters - 2 bytes //r. размер параметров - 2 байта
00257     size_param[1] = 2;
00258     size_param[2] = 2;
00259     size_param[3] = 2;
00260     trm_ena = 1;                //e. allow operation of the transmitter //r. разрешить работу передатчика
00261 } // M_ADC_R
00262 
00263 void M_Cnt_R(void)        //r.----------------- read the counters of the Elio5 card -------------------------- //r.----------------- чтение счетчиков платы Elio5 --------------------------
00264 {
00265     SetSpeedPeriod();               //e. set the answer transfer rate and its periodicity //r. установить скорость передачи ответа и его периодичность
00266     UART_SwitchSpeed(trm_rate);
00267     num_of_par = 2;             //e. 2 parameters output //r. выводить два параметра
00268 
00269     addr_param[0] = &(Output.Str.Cnt_Pls);   //e. set the first parameter address //r. задать адрес первого параметра
00270     addr_param[1] = &(Output.Str.Cnt_Mns);   //e. set the second paremeter address //r. задать адрес второго параметра
00271     size_param[0] = 2;          //e. size of the parameters - 2 bytes //r. размер параметров - 2 байта
00272     size_param[1] = 2;
00273     trm_ena = 1;                //e. allow operation of the transmitter //r. разрешить работу передатчика
00274 } // M_Cnt_R
00275 
00276 /*void M_e5r_W(void)        //r.----------------- write to the mode register of the Elio5 card ------------------ //r.----------------- запись в регистр режима платы Elio5  ------------------
00277 {
00278     //e. read the byte of command parameter from the receiver buffer //r. считать из буфера приемника байт параметра команды
00279     //e. and write it to the card mode register and its copy //r. и записать его в регистр режима платы и в его копию
00280 #if !defined COMMAND_DEBUG
00281     Copy_e5_RgR = rcv_buf[3];
00282     io_space_write(E5_RGR, Copy_e5_RgR);
00283 #endif
00284     trm_cycl = 0;      //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00285     Mk_Ask1();
00286 } // M_e5r_W  */
00287 /*
00288 void M_e5rA_W(void)       //e.----- write to the 1st additional mode register of the Elio5 card  ---------- //r.----- запись в 1-ый дополнительный регистр режима платы Elio5  ----------
00289 {
00290     //e. this command is used for switching a signal on which data counters are latched: //r. эта команда используется для переключения сигнала, по которому защелкиваются
00291     //e. on the Reper signal or on Sign Meander //r. информационные счетчики: либо по Reper`у либо по RefMeandr`у
00292 
00293     //e. read the byte of command parameter from the receiver buffer //r. считать из буфера приемника байт параметра команды
00294     //e. and write it to the card mode register and its copy //r. и записать его в регистр режима платы и в его копию
00295     Copy_e5_RgRA = rcv_buf[3];
00296 //???   Device_Mode = Copy_e5_RgRA; //e. and write it to the counter mode register  //r. и записываем в регистр режима счетчиков
00297 #if !defined COMMAND_DEBUG
00298     io_space_write(E5_RGRA, Copy_e5_RgRA);
00299 #endif
00300     trm_cycl = 0;               //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00301     Mk_Ask1();
00302 } // M_e5rA_W    */
00303 
00304 void M_Ctl_R(void)        //r.----------------- reading the control register of the device ----------------- //r.----------------- чтение регистра управления устройства -----------------
00305 {
00306     num_of_par = 2;                 //e. 2 parameters transfer //r. передавать 2 параметра
00307     addr_param[0] = &CMD_Code;         //e. the first parameter in answer - returned command code //r. первый параметр в ответе - возвращаемый код команды
00308     size_param[0] = 2;
00309     size_param[1] = 2;   //e. two bytes also have control registers //r. два байта имеют также и регистры управления
00310     if ((rcv_buf[3] & (1 << 4)) == 0) { //e. is main control register needed? //r. требуется основной регистр управления?
00311         addr_param[1] = &RgConA;    //e. yes //r. да
00312     } else {
00313         addr_param[1] = &RgConB;    //e. otherwise - load the address of the addititonal register //r. иначе - загрузить адрес дополнительного регистра
00314     }
00315     CMD_Code &= 0xff10;           //e. clear in it bit of errors and byte number //r. сбросить в нем поля ошибок и номера бита
00316     trm_ena = 1;                 //e. allow operation of the transmitter of line //r. разрешить работу передатчика линии
00317 } // M_Ctl_R
00318 
00319 void M_Ctl_M(void)        //r.----------------- modification of the control register of the device ------------ //r.----------------- модификация регистра управления устройства ------------
00320 {
00321     uint32_t * ptr;
00322     uint32_t bit_numb;
00323 
00324     num_of_par = 2;                 //e. 2 parameters transfer //r. передавать 2 параметра
00325     addr_param[0] = &CMD_Code;         //e. the first parameter in answer - returned command code //r. первый параметр в ответе - возвращаемый код команды
00326     size_param[0] = 2;
00327     size_param[1] = 2;   //e. two bytes also have control registers //r. два байта имеют также и регистры управления
00328     if ((CMD_Code & (1 << 4)) == 0) { //e. is main control register needed? //r. требуется основной регистр управления?
00329         ptr = &RgConA;  //e. yes //r. да
00330     } else {
00331         ptr = &RgConB;  //e. otherwise - load the address of the addititonal register //r. иначе - загрузить адрес дополнительного регистра
00332     }
00333     addr_param[1] = ptr;         //e. the second parameter in answer - modified register //r. второй параметр в ответе - модифицированный регистр
00334 
00335     bit_numb = CMD_Code & 0x000f;    //e. extract the number of the changeable bit //r. выделить номер изменяемого бита
00336     if ((CMD_Code & (1 << 7)) == 0) { // Is clear bit
00337         *ptr &= ~(1 << bit_numb);   // yes, clear bit
00338     } else {
00339         *ptr |= 1 << bit_numb;      // no, set bit
00340     }
00341 
00342     CMD_Code &= 0xff10;           //e. clear in command bit of errors and byte number //r. сбросить в команде поля ошибок и номера бита
00343     trm_cycl = 0;       //e. forbid cyclic transmission of the parameter //r. запретить передачу параметра в цикле
00344     trm_ena = 1;                 //e. allow operation of the transmitter of line //r. разрешить работу передатчика линии
00345 } // M_Ctl_M
00346 
00347 void M_Flg_R(void)        //e.------------ reading the register of input flags --------------------------- //r.------------ чтение регистра входных флагов ---------------------------
00348 {
00349 
00350     num_of_par = 1;     //e. 1 parameter output //r. выводить один параметр
00351     addr_param[0] = &In_Flag;   //e. the address of the flag register copy //r. адрес копии регистра флагов
00352     size_param[0] = 2;          //e. size of the buffer -  2 bytes //r. размер буфера  - 2 байта
00353     trm_ena = 1;                //e. allow operation of the transmitter //r. разрешить работу передатчика
00354 
00355 } // M_Flg_R
00356 
00357 void M_Vib_W(void)        //r.------------ set the oscillation period of the dither drive ----------------- //r.------------ установка периода колебаний вибропривода -----------------
00358 {
00359     ScopeMode = 1; //e. VB_PHASE_DETECTOR allocate a mode of display for a control point of an scope //r. VB_PHASE_DETECTOR назначить режим отображения для контрольной точки осциллографа
00360 
00361     Output.Str.T_Vibro = (rcv_buf[4] << 8) | (rcv_buf[5] & 0xFF); //e. new variable of the period //r. новая переменная периода
00362     /*  sprintf(BuffTemp1, "\n\r F = %d      ", Output.Str.T_Vibro);
00363       SendToBuff(BuffTemp1,15);*/
00364     Output.Str.L_Vibro= (rcv_buf[6] << 8) | (rcv_buf[7] & 0xFF); //e. new variable of the pulse width //r. новая переменная длительности импульсов
00365     /*sprintf(BuffTemp1, "\n\r L = %d      ", Output.Str.L_Vibro);
00366     SendToBuff(BuffTemp1,15);*/
00367     VibroDither_Set();       //e. and output its value to period registers on card  //r. вывести ее значение в регистры периода на плате
00368 
00369     trm_cycl = 0;      //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00370     Mk_Ask1();
00371 } // M_Vib_W
00372 
00373 void M_Gph_W(void)        //e.------------ set the gain factor of photodetector channels ------------------- //r.------------ установка усиления каналов фотоприемника -------------------
00374 {
00375     Device_blk.Str.Gain_Ph_A = rcv_buf[4];     //e. read from the receiver buffer the value of the gain factor of the A channel //r. считать из буфера приемника значение усиления канала А
00376     Device_blk.Str.Gain_Ph_B = rcv_buf[5];     //e. read from the receiver buffer the value of the gain factor of the B channel //r. считать из буфера приемника значение усиления канала В
00377 
00378     Out_G_photo(Device_blk.Str.Gain_Ph_A, Device_blk.Str.Gain_Ph_B);       //e. display these values to digital potentiometers //r. вывести эти значения в цифровые потенциометры
00379 
00380     trm_cycl = 0;      //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00381     Mk_Ask1();
00382 } // M_Gph_W
00383 
00384 void M_Rate(void)         //e.------------ start of transfer of the M_Rate parameters stack ------------------- //r.------------ запуск передачи набора параметров M_Rate -------------------
00385 {
00386     uint8_t mode;
00387 
00388     SetSpeedPeriod();        //e. set the answer transfer rate and its periodicity //r. установить скорость передачи ответа и его периодичность
00389     UART_SwitchSpeed(trm_rate);
00390 
00391     mode = rcv_buf[3] & 0x001f; //e. extract number of the parameters stack in the command //r. выделить номер набора параметров в команде
00392 
00393     switch (mode) {
00394         case 1:                                         //e. it is the Rate stack //r. это набор Rate
00395             RgConB =  RATE_REPER_OR_REFMEANDR;          //e. counter latch every vibro period
00396             SwitchRefMeandInt(RATE_REPER_OR_REFMEANDR); //e. enable reference meander interrupt
00397 
00398             wrk_period = 12500000; //e. load needed length of working period 1 с.//r. загрузить требуемую длительность рабочего периода    1 с.
00399             num_of_par = 14;     //e. 9 parameters or groups of parameters output //r. выводить 9 параметров или групп параметров
00400 
00401             Valid_Data = 0;                     // reset all bits of status word
00402 
00403             addr_param[0] = &(Output.Str.Cnt_Pls);      //e. set the address of the 1st parameter in the 1st group //r. задать адрес первого параметра  в 1-ой группе
00404             addr_param[1] = &(Output.Str.Cnt_Mns);      //e. set the address of the 1st parameter in the 2nd group //r. задать адрес первого параметра  в 2-ой группе
00405             addr_param[2] = &(Output.Str.Cnt_Dif);      //e. set the address of the 1st parameter in the 3rd group //r. задать адрес первого параметра  в 3-ой группе
00406             addr_param[3] = &(Output.Str.F_ras);        //e. set the address of the _F_ras parameter in the 4th group //r. задать адрес параметра  _F_ras во 4-ой группе
00407             addr_param[4] = &(Output.Str.HF_reg);       //e. set the address of the _HF_reg parameter in the 5th group //r. задать адрес параметра  _HF_reg в 5-ей группе
00408             addr_param[5] = &(Output.Str.HF_dif);       //e. set the address of the _HF_dif parameter in the 6th group //r. задать адрес параметра  _HF_dif в 6-ой группе
00409             addr_param[6] = &(Output.Str.T_Vibro);      //e. parameter _T_Vibro //r. параметр _T_Vibro
00410             addr_param[7] = &(Output.Str.T_VB_pll);     //e. parameter _T_VB_pll //r.параметрв _T_VB_pll
00411             addr_param[8] = &(Output.Str.L_Vibro);      //e. parameter _L_Vibro //r. параметр _L_Vibro
00412             addr_param[9] = &(Input.StrIn.HF_out);      //e. set the address of the _RI_reg parameter in the 8th group //r. задать адрес параметра  _RI_reg в 8-ой группе
00413             addr_param[10] = &(Output.Str.WP_reg);      //e. parameters: _WP_reg, _WP_pll //r. параметров _WP_reg, _WP_pll
00414             addr_param[11] = &(Output.Str.WP_pll);      //e. parameters: _WP_reg, _WP_pll //r. параметров _WP_reg, _WP_pll
00415             addr_param[12] = &(Output.Str.Tmp_Out);      //e. set the address of the temperature sensors array //r. задать адрес массива датчиков температуры
00416             addr_param[13] = &(Output.Str.WP_scope1);    //e. reserved //r. зарезервировано для дальнейших применений
00417 
00418             size_param[0] = 2;              //e. groups 1-6, 8-10 consists of one parameter ... //r. группы 1-6, 8-10 содержат по одному параметру
00419             size_param[1] = 2;              //e. and have 2 bytes length each //r. и имеют длину 2 байта каждая
00420             size_param[2] = 2;
00421             size_param[3] = 2;
00422             size_param[4] = 2;
00423             size_param[5] = 2;
00424             size_param[6] = 2;
00425             size_param[7] = 2;
00426             size_param[8] = 2;
00427             size_param[9] = 2;
00428             size_param[10] = 2;
00429             size_param[11] = 2;
00430 
00431             size_param[13] = 4;         //e. the 11th group parameters has length of 4 bytes //r. 11-z группа параметров имеет длину 4 байта
00432 
00433             size_param[12] = 12;   //e. format o the GLD array of temperatures - 12 bytes //r. формат массива температур ГЛД - 12 байт
00434 
00435             trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00436             break;
00437 
00438         case 2:         //e. it is the Rate2 stack //r. это набор Rate2
00439             RgConB = RATE_REPER_OR_REFMEANDR;
00440             SwitchRefMeandInt(RATE_REPER_OR_REFMEANDR);   //e. enable interrupt from ref. meander
00441             wrk_period = 0;     //e. frequency of output = fvibro //r. частота вывода равна частоте ВП
00442 
00443             num_of_par = 2;     //e. 2 parameters output //r. выводить 2 параметра
00444 
00445             addr_param[0] = &(Output.Str.Cnt_Pls);          //e. set the first parameter address //r. задать адрес первого параметра
00446             addr_param[1] = &(Output.Str.Cnt_Mns);          //e. and the 2nd //r. и второго
00447             size_param[0] = 2;     //e. parameters has 2 bytes length //r. параметры имеет длину 2 байта
00448             size_param[1] = 2;
00449             trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00450             break;
00451 
00452         case 3:         //e. it is the Rate3 stack //r. это набор Rate3
00453 
00454             wrk_period = 2500;     //e. frequency of output = 10000 Hz //r. n=1, частота вывода = 10000 Hz
00455             num_of_par = 2;     //e. 2 parameters output //r. выводить 2 параметра
00456 
00457             addr_param[0] = &(Output.Str.WP_scope1);         //e. set the addresses of output parameters //r. задать адреса выводимых параметров
00458             addr_param[1] = &(Output.Str.WP_scope2);
00459             size_param[0] = 2;     //e. all parameters has 2 bytes length //r. все параметры имеют длину 2 байта
00460             size_param[1] = 2;
00461             trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00462             break;
00463 
00464         case 4:         //e. it is the Rate4 stack //r. это набор Rate4
00465             wrk_period = 20000;     //e. correspond to output frequency 1.25 kHz //r. соотвествует частоте вывода 1.25 kHz
00466             num_of_par = 4;     //e. 4 parameters output //r. выводить 4 параметра
00467 
00468             //e. set the addresses of output parameters //r. задать адреса выводимых параметров
00469             // --- raw data array of numbers ---
00470             //  addr_param[0] = &Dif_Curr_Array;
00471             // --- filtered array of numbers ---
00472             //   addr_param[1] = &Dif_Filt_Array;
00473             // ---------------------------------
00474             addr_param[2] = &(Output.Str.HF_reg);           //e. HFO regulator //r. напряжение ГВЧ
00475             addr_param[3] = &(Output.Str.WP_reg);           //e. CPLC heater regulator //r. напряжение нагревателя
00476             size_param[0] = 16;
00477             size_param[1] = 32;
00478             size_param[2] = 2;
00479             size_param[3] = 2;
00480             trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00481             break;
00482         case 7:
00483             wrk_period = 20000;     //e. correspond to output frequency 1250 Hz //r. соотвествует частоте вывода 1.25 kHz
00484             num_of_par = 5;     //e. 4 parameters output //r. выводить 5 параметра
00485 
00486             //e. set the addresses of output parameters //r. задать адреса выводимых параметров
00487             // --- raw data array of PLC phase ---
00488             addr_param[0] = &(Output.Str.WP_Phase_Det_Array);
00489             // --- filtered array of reference sin---
00490             addr_param[1] = &(Output.Str.WP_sin_Array);
00491             // ---------------------------------
00492             addr_param[2] = &(Output.Str.WP_reg);           //e. CPLC heater regulator //r. напряжение нагревателя
00493             addr_param[3] = &(Output.Str.WP_pll);           //e. CPLC phase  //r. фаза
00494             addr_param[4] = &(Output.Str.HF_reg); //e. set the address of the _HF_reg parameter in the 5th group //r. задать адрес параметра  _HF_reg в 5-ей группе
00495             size_param[0] = 16;
00496             size_param[1] = 16;
00497             size_param[2] = 2;
00498             size_param[3] = 2;
00499             size_param[4] = 2;
00500             trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00501             break;
00502     }
00503     SetIntLatch(wrk_period);
00504 } // M_Rate
00505 
00506 void M_Reset(void)
00507 {
00508     while(1);
00509 } // will not achieve
00510 
00511 void M_Param_R(void)      //e. ------------ read the parameter of the GLD from the data memory ---------------------- //r.------------ чтение параметра GLD из памяти данных ----------------------
00512 {
00513     num_of_par = 1;     //e. 1 parameter output //r. выводить один параметр
00514     addr_param[0] = (void *)(&Device_blk.Str.My_Addres + rcv_buf[3]); //e. address of the needed parameter in the block //r. адрес требуемого параметра в блоке
00515     size_param[0] = 2;     //e. size of the buffer -  2 bytes //r. размер буфера  - 2 байта
00516 
00517     trm_ena = 1;        //e. allow operation of the transmitter //r. разрешить работу передатчика
00518 } // M_Param_R
00519 
00520 void M_Param_W(void)      //e.------------ write the parameter of the GLD from the data memory ----------------------- //r.------------ запись параметра GLD в память данных -----------------------
00521 {
00522     int * ptr;
00523 
00524     ScopeMode = 0; //e. VB_DELAY_MEANDER allocate a mode of display for a control point of an scope //r. VB_DELAY_MEANDER назначить режим отображения для контрольной точки осциллографа
00525 
00526     ptr = (int *)&Device_blk.Str.My_Addres; // pointer to Parameters block
00527     ptr += rcv_buf[3];                  // calculate offset
00528     *ptr = (rcv_buf[4] << 8) | (rcv_buf[5] & 0xFF); // write new parameter value
00529 
00530     trm_cycl = 0;      //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00531     Mk_Ask1();
00532 } // M_Param_W
00533 
00534 void M_LdPar_F()      //e.============ procedure for load the GLD parameters from the flash-memory =========== //r.============ процедура загрузки параметров ГЛД из флэш-памяти ===========
00535 {
00536 
00537     LoadFlashParam(FromFLASH);        //e. load the GLD parameters from the flash-memory //r. загрузить параметры ГЛД из фдэш-памяти
00538     blt_in_test = ((uint32_t)FIRMWARE_VER << 8) | (Device_blk.Str.Device_SerialNumber & 0x00FF);
00539 //  Init_software();
00540 
00541     trm_cycl = 0;      //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00542     Mk_Ask1();
00543 } // M_LdPar_F
00544 
00545 void M_LdPar_D(void)        //e.============ procedure for set parameters of the GLD by default ============ //r.============ процедура установки параметров ГЛД по умолчанию ============
00546 {
00547 #if !defined COMMAND_DEBUG
00548     LoadFlashParam(ByDefault);      //e. define parameters of the GLD by default //r. определить параметры ГЛД по умолчанию (default)
00549     Init_software();
00550 #endif
00551     trm_cycl = 0;           //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00552     Mk_Ask1();
00553 } // M_LdPar_D
00554 
00555 void M_Start(void)        //e.============ initialization of the GLD switch on ================================= //r.============ инициализация запуска ГЛД =================================
00556 {
00557     start_Rq = 1;       //e. set the flag of the GLD switch on request //r. установить флаг запроса старта ГЛД
00558     trm_cycl = 0;       //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00559     Mk_Ask1();
00560 } // M_Start
00561 
00562 void M_Stop(void)         //e.============ initialization of the GLD switch off ============================== //r.============ инициализация выключения ГЛД ==============================
00563 {
00564     stop_Rq = 1;        //e. set the flag of the GLD switch off request //r. установить флаг запроса выключения ГЛД
00565     trm_cycl = 0;       //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00566     Mk_Ask1();
00567 } // M_Stop
00568 
00569 void M_Pulse(void)        //e.============ generetion of the light-up pulse ========================= //r.============ генерация импульса запуска лазера =========================
00570 {
00571     pulse_Rq = 1;       //e. set the flag of the GLD switch on request //r. установить флаг запроса старта ГЛД
00572     trm_cycl = 0;       //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
00573     Mk_Ask1();
00574 } // M_Pulse
00575 
00576 void B_Rate(void)         //e. === procedure of device operation in a mode of continuous output of raw data //r. === процедура работы прибора в режиме непрерывной выдачи "сырых" данных
00577 {
00578 } // B_Rate
00579 
00580 void B_Delta(void)        //e. === procedure not used //r. === процедура не используется
00581 {
00582 } // B_Delta
00583 
00584 void D_Period_W(void)     //e. === set the period of the angle increase output //r. === установка периода выдачи приращения угла
00585 {
00586 } // D_Period_W
00587 
00588 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00589 void exec_CMD(void)       //e. === the final decoding and command execution procedure //r. === процедура окончательной дешифрации и исполнения команды
00590 {
00591     uint32_t wcode;
00592 
00593     rx_buf_copy = 1;                 //e. initialization of the flag of copying of receiving buffer //r. предустанов флага копирования приемного буфера
00594 
00595     wcode = (rcv_buf[2] & 0xFF) << 8;
00596     CMD_Code = wcode | (rcv_buf[3] & 0xFF); //e. save it in the memory for echo-transmission //r. сохранить его в памяти для обратной передачи
00597 
00598     if (wcode == CMD_RATE) {        //e. is it Rate command? //r. это команда Rate?
00599         B_Rate();
00600         return;
00601     } else if (wcode == CMD_DEV_MODE) { //e. is it the Device_Mode command? //r. это команда установки режима прибора?
00602         CMD_Mode = 3;
00603         B_Dev_Mode();
00604         return;
00605     } else if (wcode == CMD_DELTA_BINS) { //e. is it the B_DeltaBINS command (command of request for data transfer to the navigation system)? //r. это команда запроса передачи данных в навиг.систему?
00606         RgConB = RATE_VIBRO_1;        //e. set in the additional register of device control the mode of work with dither counters  and the filter of moving average //r. устанавливаем в дополнительном регистре управления режим работы с вибросчетчиками и фильтром скользящего среднего
00607         SetSpeedPeriod();
00608         UART_SwitchSpeed(trm_rate);
00609         CMD_Mode = 4;
00610         B_Delta_BINS();
00611         return;
00612     } else if (wcode == CMD_DELTA_PS) { //e.  is it the B_DeltaPS command (command of request for data transfer to the uPC)? //r. это команда запроса передачи данных в MkPC?
00613         SetSpeedPeriod();         //e. and set the answer transfer rate and its periodicity //r. и установить скорость передачи ответа и его периодичность (_trm_cycl)
00614         UART_SwitchSpeed(trm_rate);
00615         if (Device_Mode < 4)     //e. work with internal latch
00616             Device_Mode = DM_INT_LATCH_DELTA_PS;
00617         else
00618             Device_Mode = DM_EXT_LATCH_DELTA_PS_PULSE;
00619         CMD_Mode = 1;
00620         //  B_Delta_PS();
00621         return;
00622     } else if (wcode == CMD_DELTA_SF) { //  is it the B_DeltaSF command?
00623         SetSpeedPeriod();            //e. and set the answer transfer rate and its periodicity //r. и установить скорость передачи ответа и его периодичность (_trm_cycl)
00624         CMD_Mode = 7;
00625         if ((rcv_buf[3] & 0x0001) != 0) //e.reset of accumulated number is disabled //r. сброс накопленного между защелками числа запрещен
00626             Ext_Latch_ResetEnable = 0;
00627         else
00628             Ext_Latch_ResetEnable = 1;
00629         B_Delta_SF();
00630         return;
00631     } else if (wcode == CMD_BIT_MODE) {     //e. is this the BIT mode command? //r. это команда тестирования?
00632         CMD_Mode = 6;       //e. set the value of the Delta mode//r. установить значение режима Delta
00633         B_BIT_Mode();
00634         return;
00635     } else if (wcode == CMD_DELTA) {     //e. is this the B_Delta command? //r. это команда B_Delta?
00636         CMD_Mode = 2;       //e. set the value of the Delta mode//r. установить значение режима Delta
00637         B_Delta();           //e. output calculated value of angle increase //r. выводить вычисленное значение приращения угла
00638         return;
00639     } else if (CMD_Code == CMD_MAINT) {     //e. is this the Maintenance mode command? //r. это команда Maintenance mode?
00640         if (!RgConB) {
00641             RgConB = RATE_VIBRO_1;
00642             SwitchRefMeandInt(RATE_VIBRO_1);   //e. disable interrupt from referense meander
00643         }
00644         CMD_Mode = 5;                      //e. yes, switch on present mode //r. да, включить данный режим
00645         M_Status();          //e. output the status stack of registers //r. вывести статусный набор регистров
00646         if (Device_Mode != DM_INT_10KHZ_LATCH) {    //e. mode of internal latch 10 kHz //r. режим внутренней защелки 10 кГц
00647             Device_Mode = DM_INT_10KHZ_LATCH;
00648             trm_ena = 0;
00649         } else
00650             UART_SwitchSpeed(trm_rate);
00651         return;
00652     } else if (wcode == SUBCMD_M_RESET) {   //e. is this subcommand for modification of the device control register? //r. это подкоманда модификации регистра управления у-ва?
00653 //              Mk_AskDev();
00654         M_Reset();
00655         return;
00656     } else { // subcommand analyse
00657         if (CMD_Mode == 2) {    //e. is this the 2(Delta) mode? //r. это режим  2? (Delta)
00658             if (CMD_Code == CMD_D_PERIOD_W) {  //e. the Delta mode, check the subcommand ... //r. режим DElta, проверить подкоманду загрузки периода
00659                 D_Period_W();        //e. otherwise - set the data transfer period //r. иначе установитиь период выдачи данных
00660                 return;
00661             } else {
00662                 line_sts = line_sts | CODE_ERR; // invalid command code
00663                 return;
00664             }
00665         } else if (CMD_Mode == 5) { //e. check the 5 mode (Maintenance) //r. проверка режима 5 (Maintenance)
00666             if (CMD_Code == SUBCMD_M_CLEAR) {     //e. is this subcommand of cleaning of the error register? //r. это подкоманда очистки регистра ошибок линии?
00667                 M_Clear();           //e. yes, cleaning the error register //r. да, очистка регистра ошибок
00668                 M_Status();          //e. preparing for trabsfer of the device status //r. подготовка передачи статуса устройства
00669                 UART_SwitchSpeed(trm_rate);
00670                 return;
00671             } else if (CMD_Code == SUBCMD_M_MIRR) {    //e. is this subcommand of return of previous command? //r. это подкоманда возврата предыдущей команды?
00672                 rx_buf_copy = 0;                 //e. yes, forbid copying of command on saving previous //r. да, запретить копирование команды для сохранения предыдущей
00673                 M_Mirror();          //e. prepare transfer of the receiving buffer copy //r. подготовить передачу копии приемного буфера
00674                 return;
00675             }
00676             /*  else if (wcode == SUBCMD_M_TMP_W)       //e. is this subcommand for writing instructions to the AD7714? //r. это подкоманда записи инструкций в AD7714?
00677                 {
00678                 //  M_Tmp_W();           //e. yes, procedure call of write of the command //r. да, вызов процедуры записи команды
00679                     return;
00680                 } */
00681             else if (wcode == SUBCMD_M_TMP_R) {     //e. is this subcommand for data read from the AD7714? //r. это подкоманда чтения данных из AD7714?
00682                 M_Tmp_R();           //r. yes, call the procedure for data read //e. да, вызов процедуры чтения  данных
00683                 return;
00684             }
00685             /*  else if (wcode == SUBCMD_M_E5R_W)       //e. is this subcommand for write to the mode register? //r. это подкоманда записи в регистр режима?
00686                 {
00687                     M_e5r_W();           //e. yes, write data to the mode register of the Elio5 card //r. да, записать данные в регистр режима платы Elio5
00688                     return;
00689                 }
00690                 else if (wcode == SUBCMD_M_E5RA_W)      //e. is this subcommand for write to the mode register? //r. это подкоманда записи в регистр режима?
00691                 {
00692                     M_e5rA_W();          //e. yes, write data to the mode register of the Elio5 card //r. да, записать данные в регистр режима платы Elio5
00693                     return;
00694                 }  */
00695             else if (wcode == SUBCMD_M_ADC_R) {     //e. is t the subcommand for data read from ADCs ADS1250 and ADS8321 ? //r. это подкоманда чтения данных из АЦП ADS1250 и ADS8321?
00696                 M_ADC_R();           //e. read of ADC channels //r. чтение каналов АЦП
00697                 return;
00698             } else if (wcode == SUBCMD_M_CNT_R) {   //e. is this subcommand of data read from pulse counters? //r. это подкоманда чтения данных из счетчиков импульсов?
00699                 M_Cnt_R();           //e. read of counters //r. чтение счетчиков
00700                 return;
00701             } else if (wcode == SUBCMD_M_FLG_R) {   //e. is it the command of data read about input flags? //r. это подкоманда чтения данных о входных флагах?
00702                 M_Flg_R();           //e. read the input flags //r. читать входные флаги
00703                 return;
00704             } else if (wcode == SUBCMD_M_VIB_W) {   //e. is this subcommand for load the dither drive period? //r. это подкоманда загрузки периода вибропривода?
00705                 M_Vib_W();           //e. set the new value of the period //r. установить новое значение периода
00706                 return;
00707             } else if (wcode == SUBCMD_M_GPH_W) {   //e. is this subcommand for set the gain factor of photodetector channels? //r. это подкоманда установки усиления каналов фотоприемника ?
00708                 M_Gph_W();           //e. set the new values of gain factor //r. установить новые значения усиления
00709                 return;
00710             } else if (wcode == SUBCMD_M_STIMUL) {  //e. is this subcommand for set the values of the DACs and flags? //r. это подкоманда установки значения ЦАПов и фдагов ?
00711                 M_Stimul();          //e. set the new values //r. установить новые значения
00712                 return;
00713             } else if (wcode == SUBCMD_M_RATE) {    //e. is this subcommand for set the M_Rate output stack //r. это подкоманда установки выдачи набора M_Rate ?
00714                 M_Rate();            //e. switch on the M_Rate data transfer //r. включить передачу данных M_Rate
00715                 return;
00716             } else if (wcode == SUBCMD_M_PARAM_W) { //e. is this subcommand for write the new value of the GLD parameter ... //r. это подкоманда записи нового значения параметра GLD
00717                 M_Param_W();         //e. write the new value of the parameter //r. записать новое значение параметра
00718                 return;
00719             } else if (wcode == SUBCMD_M_PARAM_R) { //e. is this subcommand for read the value of the GLD parameter? //r. это подкоманда чтения значения параметра GLD?
00720                 M_Param_R();         //e. read the value from the data memory //r. считать значение параметра из памяти даных
00721                 return;
00722             } else if (CMD_Code == SUBCMD_M_LDPAR_F) { //e. is this subcommand for load GLD parameters ... //r. это подкоманда загрузки параметров GLD
00723                 M_LdPar_F();         //e. start the loading of parameters //r. запустить загрузку параметров
00724                 return;
00725             } else if (CMD_Code == SUBCMD_M_LDPAR_D) { //e. is this subcommand for direct setting of the GLD parameters ... //r. это подкоманда прямого назначения параметров GLD
00726                 M_LdPar_D();         //e. read the value of the parameter from the data memory //r. считать значение параметра из памяти даных
00727                 return;
00728             } else if (CMD_Code == SUBCMD_M_START) {   //e. is this subcommand for GLD starting? //r. это подкоманда запуска GLD?
00729                 M_Start();           //e. call the procedure of start //r. запустить процедуру старта
00730                 return;
00731             } else if (CMD_Code == SUBCMD_M_PULSE) {   //e. is this subcommand for GLD starting? //r. это подкоманда запуска GLD?
00732                 M_Pulse();           //e. call light-up function //r. выдать импульс поджига
00733                 return;
00734             } else if (CMD_Code == SUBCMD_M_STOP) {    //e. is this subcommand for GLD switch off? //r. это подкоманда выключения GLD?
00735                 M_Stop();            //e. otherwise- switch off all regulators and stop device //r. выключить все контуры и остановить прибор
00736                 return;
00737             } else if (wcode == SUBCMD_M_CTL_R) {   //e. is this subcommand for read the device control register? //r. это подкоманда чтения регистра управления у-ва?
00738                 M_Ctl_R();
00739                 return;
00740             } else if (wcode == SUBCMD_M_CTL_M) {   //e. is this subcommand for modification of the device control register? //r. это подкоманда модификации регистра управления у-ва?
00741                 M_Ctl_M();
00742                 return;
00743             }
00744             /*          else if (wcode == SUBCMD_M_RESET)       //e. is this subcommand for modification of the device control register? //r. это подкоманда модификации регистра управления у-ва?
00745                         {
00746                             M_Reset();
00747                             return;
00748                         }*/
00749             else {
00750                 line_sts = line_sts | MODE_ERR; // mode error
00751                 return;
00752             }
00753         }
00754     }
00755 } // exec_CMD
00756 
00757 void decode_CMD(void)
00758 {
00759     int size;
00760 
00761     if (!rcv_Rdy) { //e. is data in receive buffer? //r. в приемном буфере есть информация?
00762         return; //e. if no, stop processing //r. если нет, закончить обработку
00763     }
00764 
00765     if (!line_sts) { //e. Whether there were errors of receiving of start-bit? //r. были ли ошибки приема старт-бита ?
00766         //e. there were not errors of receiving of bytes, check the device address //r. ошибок приема байтов не было, проверить адрес обращения
00767         //Is_Brodcast_Req = 0;        //e. reset the flag of broadcasting request //r. сбросить флаг широковещательного запроса
00768         if (rcv_buf[1] != Device_blk.Str.My_Addres) {
00769             if (rcv_buf[1] != BROADCAST_ADDRESS) {
00770                 goto end;
00771             }
00772         }
00773 
00774         if (rcv_buf[0] == COMMAND_PREFIX) {
00775             //e. there is new command in the receiver buffer, stop the transfer //r. в буфере приемника есть новая команда, прекратить передачу
00776             trm_ena = 0;    //e. reset the flag of transmission allowing //r. сбросить флаг разрешения передачи
00777 
00778             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00779 
00780             exec_CMD(); // шей команды
00781 
00782             //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00783 
00784 
00785             //e. check up presence of errors in operation of this procedure //r. проверить, наличие ошибок в работе данной поцедуры
00786             //e. did is the "unknown code of a command" or "parameters were set incorrectly" error? //r. была ошибка "неизвестный код команды" или "неверно заданные параметры"?
00787             if ( ((line_sts & CODE_ERR) == CODE_ERR) || ((line_sts & PARAM_ERR) == PARAM_ERR) ) {
00788                 line_err = line_sts;  //e. set error bits in the error register of the line //r.  установить биты ошибок в регистре ошибок линии
00789             }
00790         } else {
00791             line_err = line_sts | NO_CMD_ERR; // добавление ошибки в регистр ошибок
00792         }
00793 
00794     } else {
00795         line_err = line_sts;
00796     }
00797 end:
00798     if (rx_buf_copy) {                  //e. is copying of present received packet needed? //r. требуется копирование данного принятого пакета?
00799         size = rcv_num_byt;
00800         rcv_byt_copy = rcv_num_byt;         //e. save the size of copy //r. запомнить размер копии
00801         if (rcv_num_byt > sizeof(rcv_buf)) {    //e. compare the size of receiving buffer with amount of received bytes //r. копирование требуется, сравнить размер приемного буфера с числом принятых байт
00802             size = sizeof(rcv_buf);
00803         }
00804         memcpy(rcv_copy, rcv_buf, size);    //e. copy of received amount of bytes, but no more than buffer size //r. копировать принятое число байт, но не более размера буфера
00805     }
00806     rx_buf_copy = 0;                        //e. reset the flag of necessity of copying of receiving buffer  //r. сбросить флаг необходимости копирования приемного буфера
00807 
00808     do
00809         rcv_buf[--rcv_num_byt] = 0;
00810     while(rcv_num_byt);
00811     rcv_num_byt_old = rcv_num_byt;
00812     line_sts = 0;                           //e.  reset the line status register //r. сбросить регистр статуса линии
00813     rcv_Rdy = 0;                            //e. allow further data reception //r. разрешить дальнейший прием данных
00814 } // decode_CMD