Dmitry Kovalev
/
LG
n
Fork of LG by
Embed:
(wiki syntax)
Show/hide line numbers
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] = ¶mTmpWord; 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
Generated on Tue Jul 12 2022 15:16:11 by 1.7.2