|
@@ -8,6 +8,7 @@
|
|
|
#include "dac_transport.h"
|
|
|
#include "monitoring.h"
|
|
|
#include "mux.h"
|
|
|
+#include "io_utils.h"
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#undef DBG
|
|
@@ -29,8 +30,35 @@ led_t ao_output_led[4] = {OUT_1_G, OUT_2_G, OUT_3_G, OUT_4_G};
|
|
|
//
|
|
|
void ao_init(void)
|
|
|
{
|
|
|
- // Зеленые LED сигнализируют (вкл/выкл) входов.
|
|
|
- ao_led_update();
|
|
|
+
|
|
|
+#if 0
|
|
|
+ // Для тестов
|
|
|
+ settings.ao[0].state = 1;
|
|
|
+ settings.ao[1].state = 1;
|
|
|
+ settings.ao[2].state = 0;
|
|
|
+ settings.ao[3].state = 0;
|
|
|
+
|
|
|
+ settings.ao[0].value = 30000;
|
|
|
+ settings.ao[1].value = 30000;
|
|
|
+ settings.ao[2].value = 30000;
|
|
|
+ settings.ao[3].value = 30000;
|
|
|
+
|
|
|
+ settings.ao_save[0].state = 0;
|
|
|
+ settings.ao_save[1].state = 0;
|
|
|
+ settings.ao_save[2].state = 1;
|
|
|
+ settings.ao_save[3].state = 1;
|
|
|
+
|
|
|
+ settings.ao_save[0].value = 50000;
|
|
|
+ settings.ao_save[1].value = 50000;
|
|
|
+ settings.ao_save[2].value = 50000;
|
|
|
+ settings.ao_save[3].value = 50000;
|
|
|
+#endif
|
|
|
+
|
|
|
+ // Зеленые LED сигнализируют (вкл/выкл) входов. Проверка на безопасный режим.
|
|
|
+ if (save_mode_get())
|
|
|
+ ao_led_update(settings.ao_save);
|
|
|
+ else
|
|
|
+ ao_led_update(settings.ao);
|
|
|
|
|
|
// Сдвиговые регистры
|
|
|
sh_init();
|
|
@@ -38,32 +66,38 @@ void ao_init(void)
|
|
|
// Внешний DAC
|
|
|
dac_init();
|
|
|
|
|
|
- // Режир работы выходов
|
|
|
- ao_mode = settings.ao_mode_bits;
|
|
|
+ // Режир работы выходов.
|
|
|
+ // При старте проверяется состояние безопасного режима в настройках
|
|
|
+ if (save_mode_get()) {
|
|
|
+ ao_mode = settings.ao_mode_save_bits;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ao_mode = settings.ao_mode_bits;
|
|
|
+ }
|
|
|
|
|
|
+ // Флаг - нужно обновить значения на выходах
|
|
|
+ ao_set_value_flag();
|
|
|
+}
|
|
|
+
|
|
|
+// Вызывается при обновлении статуса безопасного режима работы
|
|
|
+void ao_save_update(bool state)
|
|
|
+{
|
|
|
+ if (state) {
|
|
|
+ ao_led_update(settings.ao_save);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ao_led_update(settings.ao);
|
|
|
+ }
|
|
|
+
|
|
|
ao_set_value_flag();
|
|
|
-
|
|
|
-#if 0
|
|
|
- // Режим измерения
|
|
|
- ai_set_meas_mode();
|
|
|
-
|
|
|
- // Питание внешних датчиков
|
|
|
- ai_ext_sens_power(settings.ext_sens_power);
|
|
|
-
|
|
|
- // Внешинй ADC
|
|
|
- ai_adc_init();
|
|
|
-
|
|
|
- // Modbus параметры
|
|
|
- ai_init_modbus_params();
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
// Управление LED для выходов
|
|
|
-void ao_led_update(void)
|
|
|
+void ao_led_update(ao_t *ao)
|
|
|
{
|
|
|
for (int i = 0; i < AO_NUMBER; i++)
|
|
|
{
|
|
|
- if (settings.ao[i].state)
|
|
|
+ if (ao[i].state)
|
|
|
leds[ao_output_led[i]].state = LED_ON;
|
|
|
else
|
|
|
leds[ao_output_led[i]].state = LED_OFF;
|
|
@@ -127,6 +161,9 @@ void ao_set_values(ao_t *ao)
|
|
|
if (ao[i].state) {
|
|
|
dac_test((DAC_CHANNEL)i, ao[i].value);
|
|
|
}
|
|
|
+ else {
|
|
|
+ dac_test((DAC_CHANNEL)i, 0);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -139,21 +176,25 @@ void dac_task(void *params)
|
|
|
ao_power = sh_ao_mode(ao_mode);
|
|
|
|
|
|
// Обновить значения на выходах
|
|
|
+ // Нужно проверять наличие безопасного режима работы
|
|
|
if (set_value_flag)
|
|
|
{
|
|
|
set_value_flag = false;
|
|
|
- ao_set_values(&settings.ao[0]);
|
|
|
+
|
|
|
+ if (save_mode_get()) {
|
|
|
+ ao_set_values(settings.ao_save);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ ao_set_values(settings.ao);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ //ao_set_values(settings.ao_save);
|
|
|
+
|
|
|
DBG printf("AO_Power: %u\r\n", ao_power);
|
|
|
|
|
|
vTaskDelay(100);
|
|
|
-#if 0
|
|
|
- ai_alarm = sh_ai_mode(ai_mode);
|
|
|
- ai_processing();
|
|
|
- ai_leds_processing();
|
|
|
- vTaskDelay(10);
|
|
|
-#endif
|
|
|
}
|
|
|
}
|
|
|
|