|
@@ -10,6 +10,9 @@
|
|
|
#if defined (MDIO_88)
|
|
|
|
|
|
uint16_t output_state_bit;
|
|
|
+uint16_t output_state_save_bit;
|
|
|
+uint16_t output_value_bit;
|
|
|
+uint16_t output_value_save_bit;
|
|
|
uint16_t output_mode_bit;
|
|
|
uint16_t output_mode_save_bit;
|
|
|
uint16_t output_pwm[DO_NUMBER];
|
|
@@ -30,6 +33,8 @@ out_t outputs[DO_NUMBER] = {
|
|
|
};
|
|
|
|
|
|
|
|
|
+static bool set_value_flag = false; //
|
|
|
+
|
|
|
|
|
|
//
|
|
|
void do_init(void)
|
|
@@ -37,82 +42,40 @@ void do_init(void)
|
|
|
// Таймер для выходов в режиме PWM
|
|
|
di_out_pwm_tim_init();
|
|
|
|
|
|
- // TODO Битовые поля вынести из настроек.
|
|
|
-
|
|
|
-#if 1
|
|
|
- settings.dout[0].state = 1;
|
|
|
- settings.dout[1].state = 0;
|
|
|
- settings.dout[2].state = 1;
|
|
|
- settings.dout[7].state = 1;
|
|
|
-
|
|
|
- settings.dout_save[0].state = 0;
|
|
|
- settings.dout_save[1].state = 1;
|
|
|
- settings.dout_save[2].state = 0;
|
|
|
- settings.dout_save[7].state = 1;
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
// Актуализация битовых полей (используюся для управления по modbus)
|
|
|
|
|
|
// Состояние выходов вкл/выкл.
|
|
|
- do_update_field(&settings.dout[0].state, &settings.do_state_bits);
|
|
|
- do_update_field(&settings.dout_save[0].state, &settings.do_state_save_bits);
|
|
|
+ do_update_field(&settings.dout[0].state, &output_state_bit);
|
|
|
+ do_update_field(&settings.dout_save[0].state, &output_state_save_bit);
|
|
|
|
|
|
// Режим работы выходов
|
|
|
- do_update_field(&settings.dout[0].mode, &settings.do_mode_bits);
|
|
|
- do_update_field(&settings.dout_save[0].mode, &settings.do_mode_save_bits);
|
|
|
+ do_update_field(&settings.dout[0].mode, &output_mode_bit);
|
|
|
+ do_update_field(&settings.dout_save[0].mode, &output_mode_save_bit);
|
|
|
|
|
|
// Значение на выходах
|
|
|
- do_update_field(&settings.dout[0].value, &settings.do_value_bits);
|
|
|
- do_update_field(&settings.dout_save[0].value, &settings.do_value_save_bits);
|
|
|
-
|
|
|
+ do_update_field(&settings.dout[0].value, &output_value_bit);
|
|
|
+ do_update_field(&settings.dout_save[0].value, &output_value_save_bit);
|
|
|
|
|
|
+ // Установить режим работы и состояние на всех выходах
|
|
|
for (int i = 0; i < DO_NUMBER; i++)
|
|
|
{
|
|
|
do_gpio_init(&outputs[i], i);
|
|
|
-
|
|
|
- if (save_mode_get()) {
|
|
|
- do_update(&settings.dout_save[i], i) ;
|
|
|
- }
|
|
|
- else {
|
|
|
- do_update(&settings.dout[i], i) ;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-#if 0
|
|
|
- output_state_bit = settings.do_bits;
|
|
|
- output_mode_bit = settings.do_mode_bits;
|
|
|
- output_mode_save_bit = settings.do_mode_save_bits;
|
|
|
-
|
|
|
- // Таймер для выходов в режиме PWM
|
|
|
- di_out_pwm_tim_init();
|
|
|
-
|
|
|
- for (int i = 0; i < DO_NUMBER; i++)
|
|
|
- {
|
|
|
- output_pwm[i] = settings.do_pwm[i];
|
|
|
- output_pwm_save[i] = settings.do_pwm_save[i];
|
|
|
- output_pwm_period[i] = settings.do_pwm_period[i];
|
|
|
- output_pwm_period_save[i] = settings.do_pwm_period_save[i];
|
|
|
|
|
|
- if (save_mode_get()) {
|
|
|
- outputs[i].pwm_duty = settings.do_pwm_save[i];
|
|
|
- outputs[i].pwm_period = settings.do_pwm_period_save[i];
|
|
|
- }
|
|
|
- else {
|
|
|
- outputs[i].pwm_duty = settings.do_pwm[i];
|
|
|
- outputs[i].pwm_period = settings.do_pwm_period[i];
|
|
|
- }
|
|
|
-
|
|
|
- do_gpio_init(&outputs[i], i);
|
|
|
+ // Актуализация параметров PWM для modbus
|
|
|
+ output_pwm[i] = settings.dout[i].pwm_duty;
|
|
|
+ output_pwm_period[i] = settings.dout[i].pwm_period;
|
|
|
|
|
|
- do_update(&outputs[i], i) ;
|
|
|
+ output_pwm_save[i] = settings.dout_save[i].pwm_duty;
|
|
|
+ output_pwm_period[i] = settings.dout_save[i].pwm_period;
|
|
|
+
|
|
|
+ // Установка заданного режима и состояния выхода
|
|
|
+ if (!save_mode_get())
|
|
|
+ do_update(&settings.dout[i], i) ;
|
|
|
}
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
-//
|
|
|
+// Заполняет битовые поля по значения в массивах
|
|
|
void do_update_field(uint8_t *param, uint16_t *field)
|
|
|
{
|
|
|
for (int i = 0; i < DO_NUMBER; i++)
|
|
@@ -127,9 +90,7 @@ void do_update_field(uint8_t *param, uint16_t *field)
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-//
|
|
|
+// Настройка GPIO выходов
|
|
|
void do_gpio_init(out_t *out, uint8_t index)
|
|
|
{
|
|
|
gpio_init_type gpio_init_struct;
|
|
@@ -145,23 +106,6 @@ void do_gpio_init(out_t *out, uint8_t index)
|
|
|
}
|
|
|
|
|
|
|
|
|
-// Установка состояний дискретных выходов (вкл./выкл.)
|
|
|
-
|
|
|
-void do_set_state(bool save_mode)
|
|
|
-{
|
|
|
- // Обычный режим работы
|
|
|
- if (!save_mode) {
|
|
|
- for (int i = 0; i < DO_NUMBER; i++) {
|
|
|
- settings.dout[i].state = (uint8_t)((settings.do_state_bits >> i) & 1);
|
|
|
- }
|
|
|
- }
|
|
|
- // Безопасный режим работы
|
|
|
- else {
|
|
|
- for (int i = 0; i < DO_NUMBER; i++) {
|
|
|
- settings.dout_save[i].state = (uint8_t)((settings.do_state_save_bits >> i) & 1);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
|
|
|
//
|
|
@@ -171,66 +115,63 @@ void do_set_common(void)
|
|
|
|
|
|
for (int i = 0; i < DO_NUMBER; i++)
|
|
|
{
|
|
|
-#if 0
|
|
|
- //
|
|
|
- if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i))) {
|
|
|
- settings.do_bits = output_state_bit;
|
|
|
- flag = true;
|
|
|
- }
|
|
|
- else if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i))) {
|
|
|
- settings.do_mode_bits ^= (1 << i);
|
|
|
- settings.do_mode_bits = output_mode_bit;
|
|
|
- flag = true;
|
|
|
- }
|
|
|
- else if (settings.do_pwm[i] != output_pwm[i]) {
|
|
|
- settings.do_pwm[i] = output_pwm[i];
|
|
|
+ // Изменилось состояние выходов
|
|
|
+ if (settings.dout[i].state != (output_state_bit & (1 << i))) {
|
|
|
+ settings.dout[i].state = (output_state_bit >> i) & 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Изменилось значение на выходе
|
|
|
+ if (settings.dout[i].value != (output_value_bit & (1 << i))) {
|
|
|
+ settings.dout[i].value = (output_value_bit >> i) & 1;
|
|
|
flag = true;
|
|
|
}
|
|
|
- else if (settings.do_pwm_save[i] != output_pwm_save[i]) {
|
|
|
- settings.do_pwm_save[i] = output_pwm_save[i];
|
|
|
+
|
|
|
+ // Изменился режим работы
|
|
|
+ if (settings.dout[i].mode != (output_mode_bit & (1 << i))) {
|
|
|
+ settings.dout[i].mode = (output_mode_bit >> i) & 1;
|
|
|
flag = true;
|
|
|
}
|
|
|
- else if (settings.do_pwm_period [i] != output_pwm_period[i]) {
|
|
|
- settings.do_pwm_period[i] = output_pwm_period[i];
|
|
|
+
|
|
|
+ // Изменилось заполнение PWM
|
|
|
+ if (settings.dout[i].pwm_duty != output_pwm[i]) {
|
|
|
+ settings.dout[i].pwm_duty = output_pwm[i];
|
|
|
flag = true;
|
|
|
}
|
|
|
- else if (settings.do_pwm_period_save[i] != output_pwm_period_save[i]) {
|
|
|
- settings.do_pwm_period_save[i] = output_pwm_period_save[i];
|
|
|
+
|
|
|
+ // Изменился период PWM
|
|
|
+ if (settings.dout[i].pwm_period != output_pwm_period[i]) {
|
|
|
+ settings.dout[i].pwm_period = output_pwm_period[i];
|
|
|
flag = true;
|
|
|
}
|
|
|
-
|
|
|
- if (flag)
|
|
|
- do_update(&outputs[i], i);
|
|
|
-#endif
|
|
|
- }
|
|
|
-}
|
|
|
+
|
|
|
+ // Значение на выходе в безопасном режиме. Обновляем значения в настройках.
|
|
|
+ settings.dout_save[i].value = (output_value_save_bit >> i) & 1;
|
|
|
+
|
|
|
+ // Режим работы в безопасном режиме. Обновляем значения в настройках.
|
|
|
+ settings.dout_save[i].mode = (output_mode_save_bit >> i) & 1;
|
|
|
+
|
|
|
+ // Состояние выходов в безопасном режиме. Обновляем значения в настройках.
|
|
|
+ settings.dout_save[i].state = (output_state_save_bit >> i) & 1;
|
|
|
|
|
|
-//
|
|
|
-void do_set(void)
|
|
|
-{
|
|
|
-#if 0
|
|
|
- if (output_state_bit == settings.do_bits)
|
|
|
- return;
|
|
|
-
|
|
|
- // Состояние выхода/выходов изменилось
|
|
|
- for (int i = 0; i < DO_NUMBER; i++)
|
|
|
- {
|
|
|
- if ((settings.do_bits & (1 << i)) != (output_state_bit & (1 << i)))
|
|
|
- {
|
|
|
- do_update(&outputs[i], i);
|
|
|
- }
|
|
|
+ // Заполнение PWM в безопасном режие. Обновляем значение в настройках.
|
|
|
+ settings.dout_save[i].pwm_duty = output_pwm_save[i];
|
|
|
+
|
|
|
+ // Период PWM в безопасном режие. Обновляем значение в настройках.
|
|
|
+ settings.dout_save[i].pwm_period = output_pwm_period_save[i];
|
|
|
+
|
|
|
+ if (flag)
|
|
|
+ do_update(&settings.dout[i], i);
|
|
|
}
|
|
|
-
|
|
|
- // Сохраним новое значение выходов в настройках
|
|
|
- settings.do_bits = output_state_bit;
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
-// Установка значения на выходе
|
|
|
+// Установка режима и значения на выходе
|
|
|
void do_update(do_t *out, uint8_t i)
|
|
|
{
|
|
|
+ // Если выход выключен - ничего не меняем
|
|
|
+ if (!out->state)
|
|
|
+ return;
|
|
|
+
|
|
|
// Режим ШИМ
|
|
|
if (out->mode) {
|
|
|
do_set_pwm(out->pwm_period, out->pwm_duty, i);
|
|
@@ -242,53 +183,6 @@ void do_update(do_t *out, uint8_t i)
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
-#if 0
|
|
|
-// Установка значения на выходе
|
|
|
-void do_update(out_t *out, uint8_t i)
|
|
|
-{
|
|
|
- // Режим ШИМ
|
|
|
- if (settings.do_mode_bits & (1 << i)) {
|
|
|
- // Безопасный режим включен
|
|
|
- if (save_mode_get())
|
|
|
- do_set_pwm(settings.do_pwm_period_save[i], settings.do_pwm_save[i], i);
|
|
|
- else
|
|
|
- do_set_pwm(settings.do_pwm_period[i], settings.do_pwm[i], i);
|
|
|
- }
|
|
|
- // Режим обычного выхода
|
|
|
- else {
|
|
|
- out->mode = 0;
|
|
|
- // Безопасный режим включен
|
|
|
- if (save_mode_get())
|
|
|
- do_set_out(out, settings.do_save_bits & (1 << i));
|
|
|
- else
|
|
|
- do_set_out(out, settings.do_bits & (1 << i));
|
|
|
- }
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-//
|
|
|
-void do_set_mode(void)
|
|
|
-{
|
|
|
-#if 0
|
|
|
- if (output_mode_bit == settings.do_mode_bits)
|
|
|
- return;
|
|
|
-
|
|
|
- // Состояние выхода/выходов изменилось
|
|
|
- for (int i = 0; i < DO_NUMBER; i++)
|
|
|
- {
|
|
|
- if ((settings.do_mode_bits & (1 << i)) != (output_mode_bit & (1 << i)))
|
|
|
- {
|
|
|
- settings.do_mode_bits ^= (1 << i);
|
|
|
- do_update(&outputs[i], i);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- settings.do_mode_bits = output_mode_bit;
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
//
|
|
|
void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
|
|
|
{
|
|
@@ -307,17 +201,17 @@ void do_set_pwm(uint16_t period, uint16_t duty, uint8_t index)
|
|
|
outputs[index].mode = 1;
|
|
|
}
|
|
|
|
|
|
-//
|
|
|
+
|
|
|
+// Дергает пином.
|
|
|
void do_set_out(out_t *out, uint8_t val)
|
|
|
{
|
|
|
- if (val) {
|
|
|
+ if (val)
|
|
|
gpio_bits_set(out->port, out->pin);
|
|
|
- }
|
|
|
- else {
|
|
|
+ else
|
|
|
gpio_bits_reset(out->port, out->pin);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
//
|
|
|
void out_as_pwm(void)
|
|
|
{
|
|
@@ -358,6 +252,33 @@ void out_as_pwm(void)
|
|
|
}
|
|
|
|
|
|
|
|
|
+// Периодический контроль перехода в безопасный режим
|
|
|
+void do_task(void *params)
|
|
|
+{
|
|
|
+ for (;;)
|
|
|
+ {
|
|
|
+ if (save_mode_get()) {
|
|
|
+ set_value_flag = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ set_value_flag = false;
|
|
|
+
|
|
|
+ // Нужно установить параметры выходов
|
|
|
+ if (set_value_flag) {
|
|
|
+ set_value_flag = false;
|
|
|
+
|
|
|
+ for (int i = 0; i < DO_NUMBER; i++)
|
|
|
+ {
|
|
|
+ do_update(&settings.dout_save[i], i) ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ vTaskDelay(100);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
// -------------------------------------------------------------------------- //
|
|
|
// PWM
|
|
|
|