sadr0b0t / stepper_h

Stepper motor control library for ChipKIT/Arduino
GNU Lesser General Public License v3.0
3 stars 1 forks source link

Сделать флаги ошибок stepper.error_xxx побитовыми значениями внутри одного поля #21

Closed sadr0b0t closed 7 years ago

sadr0b0t commented 7 years ago

Сделать флаги ошибок из stepper_info_t побитовыми значениями внутри одного поля (как принято делать всякие двоичные настройки в Сишечке).

    /** Завершил вращение из-за достижения виртуальной нижней границы */
    bool error_soft_end_min = false;
    /** Завершил вращение из-за достижения виртуальной верхней границы */
    bool error_soft_end_max = false;
    /** Завершил вращение из-за срабатывания концевого датчика нижней границы */
    bool error_hard_end_min = false;
    /** Завершил вращение из-за срабатывания концевого датчика верхней границы */
    bool error_hard_end_max = false;
    /** Слишком маленькая задержка между двумя импульсами для шага */
    bool error_step_delay_small = false;

И предварительно обдумать, стоит ли вообще так делать или и так нормально.

sadr0b0t commented 7 years ago

Аргумент за переход к побитовости. Сейчас, чтобы проверить, есть ли на моторе ошибка, нужно писать примерно такую лапшу:

if(sm.error_soft_end_min || sm.error_soft_end_max ||
            sm.error_hard_end_min || sm.error_hard_end_max ||
            sm.error_step_delay_small) {
    // error
}

с одним полем будет достаточно написать:

if(sm.error) {
    // error
}

аналогично, обнулить все ошибки одной строкой:

sm.error = 0;
sadr0b0t commented 7 years ago

Готово дело https://github.com/1i7/stepper_h/commit/066d08eabfb90565a98df51d2fca28d873067b99

Теперь ошибки мотора можно печатать так

void print_motor_error(stepper &sm) {
    if(sm.error) {
        if(sm.error & STEPPER_ERROR_SOFT_END_MIN) {
            Serial.print("STEPPER_ERROR_SOFT_END_MIN");
        }
        if(sm.error & STEPPER_ERROR_SOFT_END_MAX) {
            Serial.print("STEPPER_ERROR_SOFT_END_MAX");
        }
        if(sm.error & STEPPER_ERROR_HARD_END_MIN) {
            Serial.print("STEPPER_ERROR_HARD_END_MIN");
        }
        if(sm.error & STEPPER_ERROR_HARD_END_MAX) {
            Serial.print("STEPPER_ERROR_HARD_END_MAX");
        }
        if(sm.error & STEPPER_ERROR_STEP_DELAY_SMALL) {
            Serial.print("STEPPER_ERROR_STEP_DELAY_SMALL");
        }
    } else {
        Serial.print("none");
    }