123
Fork of LG by
Diff: CntrlGLD.c
- Revision:
- 21:bc8c1cec3da6
- Parent:
- 9:30702450ad00
- Child:
- 112:4a96133a1311
--- a/CntrlGLD.c Tue Feb 02 17:14:25 2016 +0000 +++ b/CntrlGLD.c Wed Feb 03 07:19:30 2016 +0000 @@ -1,262 +1,236 @@ #include "Global.h" -#define COMMAND_DEBUG +#define COMMAND_DEBUG -uint32_t SRgR; //r. ��������� ������� ������ ����� ADSP +uint32_t SRgR; //r. системный регистр режима платы ADSP -uint32_t RgConA; //r. �������� ������� ���������� ���������� -uint32_t RgConB; //r. �������������� ������� ���������� -//uint32_t Copy_e5_RgR; //r. ����� �������� ������ ����� E5 -//uint32_t Copy_e5_RgRA; //r. ����� ��������������� �������� ������ E5 +uint32_t RgConA; //r. основной регистр управления устройства +uint32_t RgConB; //r. дополнительный регистр управления +//uint32_t Copy_e5_RgR; //r. копия регистра режима платы E5 +//uint32_t Copy_e5_RgRA; //r. копия дополнительного регистра режима E5 -uint32_t Valid_Data; //r. ����-������� ����������� ������, ������������� ������ �� ������� �� ������� +uint32_t Valid_Data; //r. байт-признак достоверных данных, накапливающий ошибки от запроса до запроса TDEVICE_BLK Device_blk; //e. union for device constants uint32_t ser_num; //e. device serial number -int Device_Mode = DM_INT_10KHZ_LATCH; //r. ����� ������ ������� (�����.�������, �������� ������ ��� ������� �������) +int Device_Mode = DM_INT_10KHZ_LATCH; //r. режим работы прибора (внутр.защелка, знаковый меандр или внешняя защелка) void Sts_Pulse(void); void Sts_Pause(void); void Sts_Polling(void); - //r. ������� ��������� ��������� ������� ������� +//r. таблица состояний процедуры запуска прибора void (* Tab_Gld_Start[3])(void) = {Sts_Pulse, Sts_Pause, Sts_Polling}; - //r. ������� ��������� ��������� ������� ������ +//r. таблица состояний процедуры поджига лазера void (* Tab_Gld_Pulse[1])(void) = {Sts_Pulse}; - //e. stack of states of the procedure of starting //r. ���� ���������� ��������� ��������� ������� +//e. stack of states of the procedure of starting //r. стек параметров состояний процедуры запуска uint32_t Stk_Gld_Start[3] = {LIGHT_UP_PULSE_WDTH, LIGHT_UP_PAUSE, LIGHT_UP_POLLING}; -uint32_t gyro_Sts = 0; //r. ������� ��������� ������� -uint32_t start_Rq = 1; //r. ������ �� ������ ������� -uint32_t start_Go = 0; //r. ��������� ������� ������� -uint32_t stop_Rq = 0; //r. ������ �� ������� ������� -uint32_t pulse_Rq = 0; //r. ������ �� ������ ������ -uint32_t pulse_Go = 0; //r. ������� ������� ������� +uint32_t gyro_Sts = 0; //r. регистр состояния прибора +uint32_t start_Rq = 1; //r. запрос на запуск прибора +uint32_t start_Go = 0; //r. процедура запуска активна +uint32_t stop_Rq = 0; //r. запрос на останов прибора +uint32_t pulse_Rq = 0; //r. запрос на поджиг лазера +uint32_t pulse_Go = 0; //r. процесс поджига активен -uint32_t state_index; //r. ������ ��������� ��������� (������) -uint32_t sts_work; //r. 1 - ������� ��������� - � ������� ����, 0 - ������������� -uint32_t sts_time; //r. ������� ������� �������� ��������� -uint32_t attempt_Str; //r. ������� ������� ������� ������� +uint32_t state_index; //r. индекс состояния процедуры (старта) +uint32_t sts_work; //r. 1 - текущее состояние - в рабочей фазе, 0 - инициализации +uint32_t sts_time; //r. счетчик времени текущего состояния +uint32_t attempt_Str; //r. счетчик попыток запуска прибора - + uint32_t BIT_number; uint32_t Is_BIT = 0; -void GLD_Stop(void) //e.---------- procedure of GLD stopping -------------------------------------- //r.---------- ��������� �������� ��� -------------------------------------- +void GLD_Stop(void) //e.---------- procedure of GLD stopping -------------------------------------- //r.---------- процедура останова ГЛД -------------------------------------- { - if (!stop_Rq) //r. ��������� ������ �� ���������� ������� - { - return; //r. ���� ���, ������� - } - - //r. �������� ����� - start_Rq = 0; //r. ������� ���������, - start_Go = 0; //r. ���������� �������� ������� �������, - stop_Rq = 0; //r. ������� �������� - open_all_loops(); //r. ��������� ��� ������� ������������� + if (!stop_Rq) { //r. проверить запрос на выключение прибора + return; //r. если нет, возврат + } - gyro_Sts = 0; //r. ����� �������� ��������� ���������� ��� + //r. сбросить флаги + start_Rq = 0; //r. запроса включения, + start_Go = 0; //r. активности процесса запуска прибора, + stop_Rq = 0; //r. запроса останова + open_all_loops(); //r. выключить все контура регулирования - //r. ��������� �������� ����� �������� ���������� ����������� + gyro_Sts = 0; //r. сброс регистра состояния аппаратуры ГЛД + + //r. установка значений покоя выходных параметров регуляторов #if !defined COMMAND_DEBUG - disable_DACs(); + disable_DACs(); #endif } // GLD_Stop - -void GLD_Status(void) //r.---------- ���������� �������� ���������� ��� -------------------------- +void GLD_Status(void) //r.---------- допусковый контроль параметров ГЛД -------------------------- { - static uint32_t Device_Mode_Old = DM_INT_10KHZ_LATCH/*DM_EXT_LATCH_DELTA_SF_PULSE*/; - if ( loop_is_closed(GLD_ON) == 0 ) - { - open_all_loops(); - GLD_Stop(); - } - if (Device_Mode_Old != Device_Mode) //devi�e mode has been changed - { - if (SwitchMode()) //e. mode is changed successful - { - Device_Mode_Old = Device_Mode; //e. save current mode name - if (Device_Mode_Old == DM_INT_10KHZ_LATCH) - trm_ena = 1; //e. enable answer - } - } + static uint32_t Device_Mode_Old = DM_INT_10KHZ_LATCH/*DM_EXT_LATCH_DELTA_SF_PULSE*/; + + if ( loop_is_closed(GLD_ON) == 0 ) { + open_all_loops(); + GLD_Stop(); + } + if (Device_Mode_Old != Device_Mode) { //deviсe mode has been changed + if (SwitchMode()) { //e. mode is changed successful + Device_Mode_Old = Device_Mode; //e. save current mode name + if (Device_Mode_Old == DM_INT_10KHZ_LATCH) + trm_ena = 1; //e. enable answer + } + } } // GLD_Status - -void Sts_Pause(void) //r.------- ��������� ��������� ����� -------------------------------------- +void Sts_Pause(void) //r.------- процедура состояния паузы -------------------------------------- { - if (sts_work) //r. ��������� � �������� ����? - { - sts_time--; //r. ��������� �������� ������� ��������� - if (sts_time > 0) - { - return; //r. ���������� ������, ���� ������� ����������� - } - //r. ����� ��������� ��������� - sts_work = 0; //r. �������� ���� ���������� - state_index++; //r. ����������� ��������� �� ��������� ��������� - } - else - { - sts_time = Stk_Gld_Start[state_index]; //r. ����� ������� ��������� - sts_work = 1; //r. ���������� ���� �������� ���� - } + if (sts_work) { //r. состояние в активной фазе? + sts_time--; //r. декремент счетчика времени состояния + if (sts_time > 0) { + return; //r. продолжать работу, пока счетчик положителен + } + //r. время состояния кончилось + sts_work = 0; //r. сбросить флаг активности + state_index++; //r. передвинуть указатель на следующее состояние + } else { + sts_time = Stk_Gld_Start[state_index]; //r. время данного состояния + sts_work = 1; //r. установить флаг активной фазы + } } // Sts_Pause -void Sts_Pulse() //r. ------- ��������� ��������� �������� ������� -------------------------- +void Sts_Pulse() //r. ------- процедура состояния импульса поджига -------------------------- { - if (sts_work) //r. ��������� � �������� ����? - { - sts_time--; //r. ��������� �������� ������� ��������� - if (sts_time > 0) - { - return; //r. ���������� ������, ���� ������� ����������� - } - //r. ����� ��������� ��������� - sts_work = 0; //r. �������� ���� ���������� - state_index++; //r. ����������� ��������� �� ��������� ��������� - - Set_LightUp; //r. ����� ������ ������� ������ + if (sts_work) { //r. состояние в активной фазе? + sts_time--; //r. декремент счетчика времени состояния + if (sts_time > 0) { + return; //r. продолжать работу, пока счетчик положителен + } + //r. время состояния кончилось + sts_work = 0; //r. сбросить флаг активности + state_index++; //r. передвинуть указатель на следующее состояние - } - else - { - sts_time = Stk_Gld_Start[state_index]; //r. ����� ������� ��������� - sts_work = 1; //r. ���������� ���� �������� ���� + Set_LightUp; //r. снять сигнал поджига лазера - Reset_LightUp; //r. ������������ ������ ������� ������ + } else { + sts_time = Stk_Gld_Start[state_index]; //r. время данного состояния + sts_work = 1; //r. установить флаг активной фазы - } + Reset_LightUp; //r. активировать сигнал поджига лазера + + } } // Sts_Pulse -void Sts_Polling(void) //r.========== ��������� ��������� ��������� � �������� ������� � ������� +void Sts_Polling(void) //r.========== процедура состояния измерения и принятия решения о запуске { - static int32_t Sum_F_ras = 0; //r. ������������ ����� ����������� ��� ��������� ������ + static int32_t Sum_F_ras = 0; //r. интегральная сумма расщепления для процедуры старта - if (sts_work) //r. ��������� � �������� ����? - { - if (Dif_Curr_Vib >0) - Sum_F_ras = L_add(Sum_F_ras, Dif_Curr_Vib); - else - Sum_F_ras = L_sub(Sum_F_ras, Dif_Curr_Vib); + if (sts_work) { //r. состояние в активной фазе? + if (Dif_Curr_Vib >0) + Sum_F_ras = L_add(Sum_F_ras, Dif_Curr_Vib); + else + Sum_F_ras = L_sub(Sum_F_ras, Dif_Curr_Vib); -//r. ���, ���������� ���������� ����� ����������� - sts_time--; //r. ��������� �������� ������� ��������� - if (sts_time > 0) - { - return; //r. ���������� ������, ���� ������� ����������� - } - //r. ����� ��������� ��������� - sts_work = 0; //r. �������� ���� ���������� - state_index++; //r. ����������� ��������� �� ��������� ��������� - //r. ��������� ������� ��������� - if ( Sum_F_ras >= F_RAS_MIN) //e. //r. F_RAS_MIN = 10000 ??? ��� ��� �� �������??? - { - gyro_Sts |= LASER_ON; //r. ����� ����� ���������, �������� � �������� ��������� - return; //r. ������� � ��������� ������� +//r. нет, пропустить накопление суммы расщепления + sts_time--; //r. декремент счетчика времени состояния + if (sts_time > 0) { + return; //r. продолжать работу, пока счетчик положителен + } + //r. время состояния кончилось + sts_work = 0; //r. сбросить флаг активности + state_index++; //r. передвинуть указатель на следующее состояние + //r. проверить наличие генерации + if ( Sum_F_ras >= F_RAS_MIN) { //e. //r. F_RAS_MIN = 10000 ??? что это за единицы??? + gyro_Sts |= LASER_ON; //r. иначе старт состоялся, отметить в регистре состояния + return; //r. прибора и завершать процесс } - //r. ���� ��� ������, ��������� ��� - attempt_Str--; //r. ��������� �������� ������� ������� ������ - if (attempt_Str <= 0) - { - return; //r. ���� ������� ���������, ��������� ������� + //r. если она меньше, генерации нет + attempt_Str--; //r. декремент счетчика попыток запуска лазера + if (attempt_Str <= 0) { + return; //r. если попытки закончены, завершить процесс } - //r. ����� ���������� ��������� ��������� �� - state_index = 0; //r. ������ �������� ������� ��� ��������� ������� - } - else - { - sts_time = Stk_Gld_Start[state_index]; //r. ����� ������� ��������� - sts_work = 1; //r. ���������� ���� �������� ���� - Sum_F_ras = 0; //r. ��������� ������������ ����� ����������� - } - + //r. иначе установить указатель состояний на + state_index = 0; //r. начало процесса запуска для повторной попытки + } else { + sts_time = Stk_Gld_Start[state_index]; //r. время данного состояния + sts_work = 1; //r. установить флаг активной фазы + Sum_F_ras = 0; //r. предсброс интегральной суммы расщепления + } + } // Sts_Polling -//r.---------- ������� ������� ������� ------------------------------------- +//r.---------- процесс запуска прибора ------------------------------------- void GLD_Start(void) { - if (!start_Rq) //r. ��������� ��������� ������� �� ������ ������� - { - return; //r. ������� ���, ������� - } + if (!start_Rq) { //r. проверить состояние запроса на запуск прибора + return; //r. запроса нет, возврат + } - if (!start_Go) //r. ������� ������� ��� �� ��� �������? - { - //r. ��� ������ ������� - attempt_Str = N_START_MAX; //r. ���������� ������������ ����� ������� ������� - //r. ���������� ������� ����������� - //open_loop(VB_FREQ_ON | VB_TAU_ON | WP_REG_ON | HF_REG_ON); // 0xff95 - //close_all_loops(); - - sts_work = 0; //r. �������� ���� �������� ���� ��������� - state_index= 0; //r. ���������� ��������� ��������� � ��������� ��������� - start_Go = 1; //r. ������� ������ ������� - } + if (!start_Go) { //r. процесс запуска еще не был активен? + //r. это начало запуска + attempt_Str = N_START_MAX; //r. установить максимальное число попыток запуска + //r. разомкнуть контура регуляторов + //open_loop(VB_FREQ_ON | VB_TAU_ON | WP_REG_ON | HF_REG_ON); // 0xff95 + //close_all_loops(); + + sts_work = 0; //r. сбросить флаг активной фазы состояния + state_index= 0; //r. установить указатель состояний в начальное положение + start_Go = 1; //r. процесс старта начался + } - ( *Tab_Gld_Start[state_index] )(); //r. ����� ��������� ��������� �� ������ � ������� - - if (sts_work) //r. ������� ��������� ��������? - { - return; //r. ���������� �������� + ( *Tab_Gld_Start[state_index] )(); //r. вызов процедуры состояния по номеру в массиве + + if (sts_work) { //r. текущее состояние окончено? + return; //r. продолжать ожидание } - //r. ��������� ����������� ��������� ��������� ��������� - if ( state_index >= 3 ) - { - //r. ��������� �������� - //r. �������� ����� - start_Rq = 0; //r. ������� - start_Go = 0; //r. � ���������� �������� + //r. состояние закончилось проверить указатель состояний + if ( state_index >= 3 ) { + //r. окончание процесса + //r. сбросить флаги + start_Rq = 0; //r. запроса + start_Go = 0; //r. и активности процесса #if !defined COMMAND_DEBUG - Out_G_photo(Device_blk.Str.Gain_Ph_A, Device_blk.Str.Gain_Ph_B); //r. �������� ���������������� ����-�� �������� �������������� + Out_G_photo(Device_blk.Str.Gain_Ph_A, Device_blk.Str.Gain_Ph_B); //r. повторно инициализировать коэф-ты передачи фотоприемников #endif - // close_all_loops(); + // close_all_loops(); - } - + } + } // GLD_Start -void GLD_Pulse(void) //r.---------- ������� ������� ������ -------------------------------------- +void GLD_Pulse(void) //r.---------- процесс поджига лазера -------------------------------------- { - if (!pulse_Rq) //r. ��������� ��������� ������� �� ������ ������ - { - return; //r. ������� ���, ������� + if (!pulse_Rq) { //r. проверить состояние запроса на поджиг лазера + return; //r. запроса нет, возврат } - - if (!pulse_Go) //r. ������� ������� ��� �� ��� �������? - { - sts_work = 0; //r. �������� ���� �������� ���� ��������� - state_index = 0; //r. ���������� ��������� ��������� � ��������� ��������� - pulse_Go = 1; //r. ������� ������ ������� + + if (!pulse_Go) { //r. процесс поджига еще не был активен? + sts_work = 0; //r. сбросить флаг активной фазы состояния + state_index = 0; //r. установить указатель состояний в начальное положение + pulse_Go = 1; //r. процесс старта начался } - - ( *Tab_Gld_Pulse[state_index] )(); //r. ����� ��������� ��������� �� ������ � ������� - - if (sts_work) //r. ������� ��������� ��������? - { - return; //r. ���������� �������� + + ( *Tab_Gld_Pulse[state_index] )(); //r. вызов процедуры состояния по номеру в массиве + + if (sts_work) { //r. текущее состояние окончено? + return; //r. продолжать ожидание } - - if ( state_index >= 1 ) - { - //r. �������� ����� - pulse_Rq = 0; //r. ������� - pulse_Go = 0; //r. � ���������� �������� + + if ( state_index >= 1 ) { + //r. сбросить флаги + pulse_Rq = 0; //r. запроса + pulse_Go = 0; //r. и активности процесса } - + } // GLD_Pulse -void contrl_GLD(void) //r.========== ��������� ���������� �������� =============================== +void contrl_GLD(void) //r.========== процедура управления прибором =============================== { - GLD_Start(); //r. ��������� ������, ���� ���� ������ - GLD_Status(); //r. �������� ��������� ������� - GLD_Stop(); //r. ���������� ������, ���� ���������� - GLD_Pulse(); //r. ��������� �������� ������� ��� ������� ������� - GLD_Output(); //r. ������ ������ ������ �� ��������� + GLD_Start(); //r. запустить прибор, если есть запрос + GLD_Status(); //r. проверка состояния прибора + GLD_Stop(); //r. остановить прибор, если необходимо + GLD_Pulse(); //r. генерация импульса поджига при наличии запроса + GLD_Output(); //r. режимы выдачи данных из гироскопа } // contrl_GLD +