Обработчик ошибок

kadushkin
Offline
Зарегистрирован: 18.12.2011

Уважаемые гуру, посоветуйте как организовать функцию обработки ошибок...

Есть код программы, обрабатываю там переменную Errorcode...

int ChangeGearSensor1=analogRead(ChangeGearSensor1Pin);
int ChangeGearSensor2=analogRead(ChangeGearSensor2Pin);
//ошибка 1
if (IsValInRangeEx(ChangeGearSensor1,ChangeGearSensor2,ErrorSensorLimit)==false){ErrorCode=ErrorCode+1;} // большая разница в показаниях основного и вспомогательного датчиков
...

int SelectGearSensor1=analogRead(SelectGearSensor1Pin);
int SelectGearSensor2=analogRead(SelectGearSensor2Pin);
//ошибка 2
if (IsValInRangeEx(SelectGearSensor1,SelectGearSensor2,ErrorSensorLimit)==false){ErrorCode=ErrorCode+2;} // большая разница в показаниях основного и вспомогательного датчиков

...
//ошибка 3
if (total_timer>=motor_check_timer) {ErrorCode=ErrorCode+4; stopMotor=true;break;} // проверка на время длительности работы приводов

Здесь в коде не правильно реализовал занесение значений в Errorcode, так как при одной и той же ошибке данные складываются постоянно.

Надо как-то, чтобы в Errorcode писались значения 1, 2, 4, 8, 16..., ну еще и складывались как-то (скорее всего смещение надо применять или логическое сложение)

Ну то есть, если возникают ошибка1 и 3, то в  Errorcode должно быть 1+4=5.

А потом еще нужно декодировать Errorcode=5, в ошибка1 и 3.

Вот такая задачка.... как реализовать?

kadushkin
Offline
Зарегистрирован: 18.12.2011

Чувствую, что нужно двоичные значения обрабатывть, а как не знаю...

1=1

2=10

4=100

5=101

5 раскладывается на 100+1

maksim
Offline
Зарегистрирован: 12.02.2012
// ошибка 1
ErrorCode |= 1<<1;
// ошибка 2
ErrorCode |= 1<<2;
// ошибка 3
ErrorCode |= 1<<3;

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну, для начала, я бы дал ошибкам какие-то "говорящие имена константы". Значения задавал-бы сразу бинарно (каждая константа - отдельный бит).

#define  ERROR_SENSOR1 B00000001
#define  ERROR_SENSOR2 B00000010
#define ERROR_SENSOR3 B00000100

Потом, объявляем переменную где ошибку будем хранить, и пару помогалок для работы с ней

byte errorCode=0;

// помогайки для работы с ошибками
#define CLEAR_ERROR errorCode=0 // сбрасывает ошибки
#define HAS_ERRORS errorCode  // есть ли вообще ошибки
#define SET_ERROR(newCode) errorCode|=newCode // добавляет ошибку
#define HAS_ERROR(testError) errorCode & testError

Ну а затем, уже и пользоватся всем этим можем

CLEAR_ERROR; // сбросили все ошибки

  // устанавливаем ошибки  
  SET_ERROR(ERROR_SENSOR1);
  SET_ERROR(ERROR_SENSOR2);
  SET_ERROR(ERROR_SENSOR3);
  
  // проверяем на наличие ошибок вообще
  if(HAS_ERRORS){
    Serial.println("Errors found"); // есть какие-то ошибки
  }
  
  
  // одиночные проверки ошибок
  if(HAS_ERROR(ERROR_SENSOR1)){
     Serial.println("Sensor1 problem"); // проблема в первом сенсоре
  }
  
  if(HAS_ERROR(ERROR_SENSOR2)){
     Serial.println("Sensor2 problem"); // проблема в  сенсоре 2
  }
  
   if(HAS_ERROR(ERROR_SENSOR3)){
     Serial.println("Sensor3 problem"); // проблема в сенсоре 3
  }
  
  // проверяем сразу две ошибки
  if(HAS_ERROR( ERROR_SENSOR1 | ERROR_SENSOR3)){
     Serial.println("Sensor1 or Sensor3 problem"); // проблема в сенсоре 3
  }

 

kadushkin
Offline
Зарегистрирован: 18.12.2011

Спасибо огромное, исчерпывающе...