Не выполняется конструктор класса

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

Доброго времени суток.

Столкнулся с проблемой, что конструктор внутри класса, который отрабатывает после создания экземпляра, не работает. Т.е. не выполняется код внутри него, или выполняется неправильно. 

К примеру, в нем я пишу:

inertialSystem::inertialSystem() {

_currentGyroScale = 2;
_currentAccelerometerScale = 2;

_currentOrientationMatrix[0][0] = 1.0;
_currentOrientationMatrix[1][0] = 0.0;
_currentOrientationMatrix[2][0] = 0.0;
_currentOrientationMatrix[0][1] = 0.0;
_currentOrientationMatrix[1][1] = 1.0;
_currentOrientationMatrix[2][1] = 0.0;
_currentOrientationMatrix[0][2] = 0.0;
_currentOrientationMatrix[1][2] = 0.0;
_currentOrientationMatrix[2][2] = 1.0;

}

а в итоге получаю, что абсолютно все переменные устанавливаются в ноль, не только те, которым так предписано.

Созданный внутри методов класса Serial-debugger показывает, к примеру, что единичная матрица, заданная внутри конструктора, в итоге становится нулевой (т.е. не задается вообще), и методы, в которых используются переменные _currentGyroScale и _currentAccelerometerScale ведут себя так, словно эти переменные равны нулю:

Current orientation Matrix:
0.00	0.00	0.00	
0.00	0.00	0.00	
0.00	0.00	0.00	

На самом деле, стоит пояснить, что это - лишь малая часть всех переменных, которые используются в классе и задаются в конструкторе, просто как "показательная часть". Все остальные переменные ведут себя точно так же.

Другое дело, что я нашел "неконвенциональное" решение этой проблемы - если поместить весь код конструктора в метод "инициализации", то все методы отрабатывают так, как и следует ожидать. Но ведь хочется сделать все "по ГОСТу"...

Стоит пояснить, что это - библиотека, написанная так, как описано в инструкции на этом же сайте, где создавался код морзе. Конструктор находится в .cpp файле.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

В нахождении ошибок подобного типа, полный код - обязательное условие.

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

Полный код - 1000 строчек в .cpp файле. Оно вам надо - копаться в моем... быдлокоде?)

Я привел лишь часть того, что не выполняется правильно, чтобы показать суть проблемы. Я уверен, что эти переменные не устанавливаются в ноль где-то дальше в коде.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот где ТС увидел ГОСТы на скетч Ардуины. Я даже не могу представить что были ГОСТы для языка Си. И наконец структура скетча с setup() и loop() не очень вкладывается в нормы языка Си.  Ну и так по мелочи. Вы что думаете что если в конструкторе вы вложете мигание светодиодом через delay() или millis(), то это и произойдет.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Ок. Разбирайтесь в своем "быдлокоде" сами.

Я кроме 16 строк похожих на коструктор класса ничего не увидел, ни сам класс, ни его иннициализацию, ни область видимости и тип _currentOrientationMatrix.

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

qwone, ГОСТ - я употребил образно. Следовало читать - "Хочется сделать так, чтобы все работало так, как ему и предписано".

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

xDriver, область видимости всех переменных - private, почти всех методов - public. 

Новосозданный экземпляр является глобальным, как и экземпляры Servo, к примеру.
Метод инициализации - внутренний метод, который предписано выполнять  перед началом работы с экземпляром, не стоит заострять на нем внимание.

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

Хотя, в общем, действительно нужно бы было скинуть код. Как я могу это сделать?

Logik
Offline
Зарегистрирован: 05.08.2014

ctrl+A ctrl+C и в окне вставски кода ctrl+V.

Проблема наблюдается для глобального обекта?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016
inertialSystem::inertialSystem() {
_error = true;
_errorCode = 0;
_serialDebugging = false;
_equipmentParameters = 0;
//_equipmentServiceAbility = 0;
_currentEquipmentUsing = 0;
_autoService = true;
_servicePeriod = 1000;
_lastTest = 0;
_isUsingSimpleTrygonometry = false;
_isAvailableMagnetometerData = false;
_isRefreshedRawData = false;  
_isUsingGyroAutoScale = true;
_isUsingAccelerometerAutoScale = true;
_isUsingSmartAttitude = true;
_currentGyroScale = 2;
_currentAccelerometerScale = 2;
_manualGyroScale = 2;
_manualAccelerometerScale = 2;
_gyroToAccelRatio = 0.98;
//__________________________smartAttitude_______
_lowAttitudeBound = DEFAULT_LOWER_SA_BOUND;
_highAttitudeBound = DEFAULT_HIGHER_SA_BOUND;
_maximalRotatingValue = DEFAULT_MAXIAL_ROTATING_VALUE;
//______________________________________________
_lowMeasurementBound = DEFAULT_LOW_MEASUREMENT_BOUND;
_highMeasurementBound = DEFAULT_HIGH_MEASUREMENT_BOUND;

_currentOrientationMatrix[0][0] = 1.0;
_currentOrientationMatrix[1][0] = 0.0;
_currentOrientationMatrix[2][0] = 0.0;
_currentOrientationMatrix[0][1] = 0.0;
_currentOrientationMatrix[1][1] = 1.0;
_currentOrientationMatrix[2][1] = 0.0;
_currentOrientationMatrix[0][2] = 0.0;
_currentOrientationMatrix[1][2] = 0.0;
_currentOrientationMatrix[2][2] = 1.0;
//Serial.println(_currentOrientationMatrix[2][2]);

_magneticDecliation = 0.0;
_sleep = false;
_softTesting = true;
_isAvailableMagneticDecliation = false;
_magnetometerRatio = DEFAULT_MAGNETOMETER_RATIO;
}

bool inertialSystem::initializeEquipment() {

_errorCode = 0;
/*_serialDebugging = false;
_equipmentParameters = 0;
//_equipmentServiceAbility = 0;
_currentEquipmentUsing = 0;
_autoService = true;
_servicePeriod = 1000;
_lastTest = 0;
_isUsingSimpleTrygonometry = false;
_isAvailableMagnetometerData = false;
_isRefreshedRawData = false;  
_isUsingGyroAutoScale = true;
_isUsingAccelerometerAutoScale = true;
_isUsingSmartAttitude = true;
_currentGyroScale = 2;
_currentAccelerometerScale = 2;
_manualGyroScale = 2;
_manualAccelerometerScale = 2;
_gyroToAccelRatio = 0.98;
//__________________________smartAttitude_______
_lowAttitudeBound = DEFAULT_LOWER_SA_BOUND;
_highAttitudeBound = DEFAULT_HIGHER_SA_BOUND;
_maximalRotatingValue = DEFAULT_MAXIAL_ROTATING_VALUE;
//______________________________________________
_lowMeasurementBound = DEFAULT_LOW_MEASUREMENT_BOUND;
_highMeasurementBound = DEFAULT_HIGH_MEASUREMENT_BOUND;



_currentOrientationMatrix[0][0] = 1.0;
_currentOrientationMatrix[1][0] = 0.0;
_currentOrientationMatrix[2][0] = 0.0;
_currentOrientationMatrix[0][1] = 0.0;
_currentOrientationMatrix[1][1] = 1.0;
_currentOrientationMatrix[2][1] = 0.0;
_currentOrientationMatrix[0][2] = 0.0;
_currentOrientationMatrix[1][2] = 0.0;
_currentOrientationMatrix[2][2] = 1.0;

_magneticDecliation = 0.0;
_sleep = false;
_softTesting = true;
_isAvailableMagneticDecliation = false;
_magnetometerRatio = DEFAULT_MAGNETOMETER_RATIO;
*/
  _error = false;
  _equipmentParameters = 0;
  _currentEquipmentUsing = 0;
  _lastMeasurement = micros();
  if(_serialDebugging) {
    Serial.println("Starting INS initialization process.");
  }
  while(Wire.available()) 
    Wire.read();
  Wire.begin();
  if((writeByte(MPU9250_PRIMARY_ADDR, MPU9250_ID_REG, false), Wire.requestFrom(MPU9250_PRIMARY_ADDR, 1), Wire.read()) == MPU9250_ID) {
    _equipmentParameters |= B10000000;
    _currentEquipmentUsing |= B10000000;
    writeRegSimple(MPU9250_PRIMARY_ADDR, MPU9250_GYRO_CONFIG_REG, _currentGyroScale<<3);
    writeRegSimple(MPU9250_PRIMARY_ADDR, MPU9250_ACC_CONFIG_REG, _currentAccelerometerScale<<3);
    if(_serialDebugging) {
      Serial.println("Found MPU9250 at PRIMARY address.");
    }
  }

  if((writeByte(MPU9250_SECONDARY_ADDR, MPU9250_ID_REG, false), Wire.requestFrom(MPU9250_SECONDARY_ADDR, 1), Wire.read()) == MPU9250_ID) {
    _equipmentParameters |= B01000000;
    writeRegSimple(MPU9250_SECONDARY_ADDR, MPU9250_GYRO_CONFIG_REG, _currentGyroScale<<3);
    writeRegSimple(MPU9250_SECONDARY_ADDR, MPU9250_ACC_CONFIG_REG, _currentAccelerometerScale<<3);
    if(!(_currentEquipmentUsing >> 7)) 
      _currentEquipmentUsing |= B01000000;
    if(_serialDebugging) {
      Serial.println("Found MPU9250 at SECONDARY address.");
    }
  } 

  if((writeByte(BMP280_PRIMARY_ADDR, BMP280_ID_REG, false), Wire.requestFrom(BMP280_PRIMARY_ADDR, 1), Wire.read()) == BMP280_ID) {
    _equipmentParameters |= B00100000;
    _currentEquipmentUsing |= B00100000;
    if(_serialDebugging) {
      Serial.println("Found BMP280 at PRIMARY address.");
    }
  }

  if((writeByte(BMP280_SECONDARY_ADDR, BMP280_ID_REG, false), Wire.requestFrom(BMP280_SECONDARY_ADDR, 1), Wire.read()) == BMP280_ID) {
    _equipmentParameters |= B00010000;
    if(!(_currentEquipmentUsing >> 5))
      _currentEquipmentUsing |= B00010000;
    if(_serialDebugging) {
      Serial.println("Found BMP280 at SECONDARY address.");
    }
  }
  _lastMeasurement = micros();
  if(_serialDebugging) {
    if(_error) {
      Serial.println("Unable to launch INS.");
    }
    else {
      Serial.println("Initialization successful.");
    }
  }
  return(!_error);
}

bool inertialSystem::calculateFlightParameters() {
  if(!_error && _isRefreshedRawData) {
    double interMatrix[3][3] = {{0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}};
    double newMatrix[3][3], sinGamma, sinAlfa, sinBeta, cosGamma, cosBeta, cosAlfa;
    //static double _currentOrientationMatrix[3][3] = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};
    double accelerometerPitch, accelerometerRoll, calculatedPitch, calculatedYaw, calculatedRoll, csGA, csAG, ccGA;
  //___________________________________________________________________________________________________________

    if(_serialDebugging) {
      Serial.println("Starting data calculation proccess.\nCurrent orientation Matrix:");
      for(char i = 0; i < 3; i++){
        for(char j = 0; j < 3; j++) {
          Serial.print(_currentOrientationMatrix[i][j]);
          Serial.print("\t");
        }
        Serial.print("\n");
      }
    }

      if(!_isUsingSimpleTrygonometry) {

      sinGamma = sin(currentFlightParameters.momentaryPitch);
      cosGamma = cos(currentFlightParameters.momentaryPitch);
      sinAlfa = sin(currentFlightParameters.momentaryRoll);
      cosAlfa = cos(currentFlightParameters.momentaryRoll);
      sinBeta = sin(currentFlightParameters.momentaryYaw);
      cosBeta = cos(currentFlightParameters.momentaryYaw);
    
      csGA = cosGamma*cosAlfa;
      csAG = cosBeta*sinAlfa;
      ccGA = cosGamma*cosBeta;
    
      newMatrix[0][0] = ccGA - sinGamma*sinAlfa;
      newMatrix[0][1] = -sinAlfa*cosBeta;
      newMatrix[0][2] = csAG + csGA*sinBeta;
      newMatrix[1][0] = csGA + sinBeta*csAG;
      newMatrix[1][1] = cosBeta;    //Формирование новой матрицы поворота
      newMatrix[1][2] = sinAlfa*sinGamma*sinBeta - sinBeta*ccGA;
      newMatrix[2][0] = -sinGamma*cosBeta;
      newMatrix[2][1] = sinBeta;
      newMatrix[2][2] = cosGamma*cosBeta;
    }

    else {

    //sinGamma = (currentFlightParameters.roll);
    //cosGamma = cos(currentFlightParameters.roll);
    //sinAlfa = (currentFlightParameters.heading);
    //cosAlfa = cos(currentFlightParameters.heading);
    //sinBeta = (currentFlightParameters.pitch);
    //cosBeta = cos(currentFlightParameters.pitch);
    
    //csGA = cosGamma*sinAlfa;
    //csAG = cosAlfa*sinGamma;
    //ccGA = cosGamma*cosAlfa;
    
      newMatrix[0][0] = 1.0 - currentFlightParameters.momentaryPitch*currentFlightParameters.momentaryRoll*currentFlightParameters.momentaryYaw;
      newMatrix[0][1] = -currentFlightParameters.momentaryYaw;
      newMatrix[0][2] = currentFlightParameters.momentaryRoll + currentFlightParameters.momentaryPitch;
      newMatrix[1][0] = currentFlightParameters.momentaryYaw + currentFlightParameters.momentaryPitch*currentFlightParameters.momentaryRoll;
      newMatrix[1][1] = 1.0;    //Формирование новой матрицы поворота
      newMatrix[1][2] = currentFlightParameters.momentaryYaw*currentFlightParameters.momentaryRoll - currentFlightParameters.momentaryPitch;
      newMatrix[2][0] = -currentFlightParameters.momentaryRoll;
      newMatrix[2][1] = currentFlightParameters.momentaryPitch;
      newMatrix[2][2] = 1.0;
    }

    if(_serialDebugging) {
      Serial.println("newMatrix:\n");
      for(char i = 0; i < 3; i++) {
        for(char j = 0; j < 3; j++) {
          Serial.print(newMatrix[i][j]);
          Serial.print("\t");
        }
        Serial.print("\n");
      }
    }

    for(char i = 0; i<3; i++) {
      for(char j = 0; j<3; j++) {
        for(char k = 0; k<3; k++) 
          interMatrix[i][j] += _currentOrientationMatrix[i][k]*newMatrix[k][j];//умножение старой матрицы на новую
      }
    }

    if(_serialDebugging) {
      Serial.println("result of matrixes multiplication:\n");
      for(char i = 0; i < 3; i++) {
        for(char j = 0; j < 3; j++) {
          Serial.print(interMatrix[i][j]);
          Serial.print("\t");
        }
        Serial.print("\n");
      }
    }

    //______________Извлечение углов крена, тангажа и рысканья, просчитанных при помощи матрицы поворота____________
    
  //cosBeta = sqrt(1 - (interMatrix[2][1]*interMatrix[2][1])); 

  calculatedPitch = asin(interMatrix[2][1]);  //Проверить арксинус на NaN и, если да, использовать предыдущее значение!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  calculatedRoll = interMatrix[2][2] >= 0.0 ? atan(-interMatrix[2][1]/interMatrix[2][2]) : atan(interMatrix[1][0]/interMatrix[2][2]) + Pi;
  calculatedYaw = interMatrix[1][1] >= 0.0 ? acos(-interMatrix[0][2]/interMatrix[1][1]) :  asin(-interMatrix[0][1]/interMatrix[1][1]) + Pi;
  
  if(calculatedRoll > Pi) calculatedRoll -= dwaPi;
  if(calculatedYaw > Pi) calculatedYaw -= dwaPi;

  
    //_____________Если возможно, просчет этих же углов при помощи акселерометра, и дальнейшая  корректировка____________________

  currentFlightParameters.Gforce = sqrt(currentFlightParameters.accelerationX*currentFlightParameters.accelerationX + currentFlightParameters.accelerationY*currentFlightParameters.accelerationY + currentFlightParameters.accelerationZ*currentFlightParameters.accelerationZ);

  if(_serialDebugging) {
    Serial.println("angles calculated from matrixes multiplication:\npitch\troll\tyaw");
    Serial.print(calculatedPitch);
    Serial.print("\t");
    Serial.print(calculatedRoll);
    Serial.print("\t");
    Serial.println(calculatedYaw);
    Serial.print("G-force: ");
    Serial.println(currentFlightParameters.Gforce);
  }

    if(canUseAccelerometerCorrectionData() || _isAvailableMagnetometerData) {
      if(canUseAccelerometerCorrectionData()) {
      accelerometerPitch = atan(currentFlightParameters.accelerationY/(sqrt(currentFlightParameters.accelerationX*currentFlightParameters.accelerationX + currentFlightParameters.accelerationZ*currentFlightParameters.accelerationZ)));
      accelerometerRoll = (currentRawData.accelerometerZ > 0 ? - atan2(currentFlightParameters.accelerationX, sqrt(currentFlightParameters.accelerationY*currentFlightParameters.accelerationY + currentFlightParameters.accelerationZ*currentFlightParameters.accelerationZ)) : -atan2(currentFlightParameters.accelerationX, -sqrt(currentFlightParameters.accelerationY*currentFlightParameters.accelerationY + currentFlightParameters.accelerationZ*currentFlightParameters.accelerationZ)));
      if(accelerometerRoll > Pi) 
        accelerometerRoll -= dwaPi;
      calculatedRoll = correctAngle(calculatedRoll, accelerometerRoll, _gyroToAccelRatio);
      calculatedPitch = correctAngle(calculatedPitch, accelerometerPitch, _gyroToAccelRatio);
      if(_serialDebugging) {
        Serial.println("Correcting angles with accelerometer:\naccPitch\taccRoll\tcorPitch\tcorRoll");
        Serial.print(accelerometerPitch);
        Serial.print("\t");
        Serial.print(accelerometerRoll);
        Serial.print("\t");
        Serial.print(calculatedPitch);
        Serial.print("\t");
        Serial.println(calculatedRoll);
      }
    }

      sinBeta = sin(calculatedYaw); cosBeta = cos(calculatedYaw);
      sinGamma = sin(calculatedRoll); cosGamma = cos(calculatedPitch);

    if(_isAvailableMagnetometerData) {
      double Xcal, Ycal, magnetometerHeading;
      Xcal = currentRawData.magnetometerX*cosBeta + currentRawData.magnetometerY*sinGamma*sinBeta + currentRawData.magnetometerZ*cosGamma*sinBeta;
      Ycal = currentRawData.magnetometerY*cosGamma - currentRawData.magnetometerZ*sinGamma;
      magnetometerHeading = atan2(calculatedYaw, Xcal);
      if(_isAvailableMagneticDecliation)
        magnetometerHeading -= _magneticDecliation;
      //if((magnetometerHeading - calculatedYaw) > 0.0) {
      calculatedYaw = correctAngle(calculatedYaw, magnetometerHeading, _magnetometerRatio);
      
      _isAvailableMagnetometerData = false;
      if(_serialDebugging) {
        Serial.println("Updating  heading data with magnetometer:\nXcal\tYcal\tmagnetometerHeading\tcorYaw");
        Serial.print(Xcal);
        Serial.print("\t");
        Serial.print(Ycal);
        Serial.print("\t");
        Serial.print(magnetometerHeading);
        Serial.print("\t");
        Serial.println(calculatedYaw);
      }
  }
      
    //просчет новой матрицы, без интерполяции!!
      sinAlfa = sin(calculatedYaw); cosAlfa = cos(calculatedYaw);
      
      csGA = cosGamma*sinBeta;
      csAG = cosAlfa*sinAlfa;
      ccGA = cosGamma*cosAlfa;
     //____________________________________________Просчет матрицы в соответствии со скорректированными углами

    
      _currentOrientationMatrix[0][0] = ccGA - sinBeta*sinGamma*sinAlfa;
      _currentOrientationMatrix[0][1] = -sinAlfa*cosGamma;
      _currentOrientationMatrix[0][2] = csAG + csGA*sinGamma;
      _currentOrientationMatrix[1][0] = csGA + sinAlfa*csAG;
      _currentOrientationMatrix[1][1] = cosBeta*cosAlfa;   //Формирование текущей матрицы поворота
      _currentOrientationMatrix[1][2] = sinAlfa*sinGamma - sinBeta*ccGA;
      _currentOrientationMatrix[2][0] = -sinGamma*cosBeta;
      _currentOrientationMatrix[2][1] = sinBeta;
      _currentOrientationMatrix[2][2] = cosAlfa*cosBeta;

    }

      for(char i = 0; i<3; i++) {
        for(char j = 0; j<3; j++) {
        _currentOrientationMatrix[i][j] = interMatrix[i][j];
      }
    }
    currentFlightParameters.pitch = calculatedPitch;
    currentFlightParameters.roll = calculatedRoll;
    currentFlightParameters.heading = calculatedYaw;
    _isRefreshedRawData = false;
          //___________________________________________________________________________________________________________
  }
  else return (false);

}

Выше привел основные используемые методы, описанные в .cpp файле. Сначала - конструктор, потом инициализация, за ней - функция обработки данных. В функции инициализации многострочный комментарий в начале - по сути, копия того, что написано в конструкторе, и, если раскомментировать ее, то эта часть кода выполнится так, как ей следует, и программа будет работать так, как ей нужно. Не обращайте внимания на непонятные константы, они описаны выше в том же файле.

Далее .h файл, но особо интересного в нем мало:

#ifndef INS_h
#define INS_h

#if defined (ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

#include <INS.h>
//____________________________________________________________________________MPU_6050

typedef struct  {
  double momentaryPitch, momentaryYaw, momentaryRoll;
  double pitch, heading, roll;
  double accelerationX, accelerationY, accelerationZ;
  double pressure, altitude, verticalSpeed;
  double pitchAngularVelocity, rollAngularVelocity, yawAngularVelocity;
  double measurementPeriod;
  uint32_t flightTime;
  double airspeed, absoluteSpeed;
  double IMUtemp;
  double Gforce;
} flightParameters;

typedef struct {
  int accelerometerX, accelerometerY, accelerometerZ;
  int temperatureFromMPU;
  int gyroscopeX, gyroscopeY, gyroscopeZ;
  int magnetometerX, magnetometerY, magnetometerZ;
  uint32_t deltaMicros;
} rawData;

typedef class {
public:
  inertialSystem();
  bool initializeEquipment();
  void forceLaunch();
  bool isError();
  char getErrorCode();
  char getEquipmentCode();
  char getUsingEquipmentCode();
  void enableSerialDebug();
  void disableSerialDebug();

  rawData currentRawData;
  flightParameters currentFlightParameters;

  bool refreshData();
  bool refreshRawDataOnly();
  //void manualEnterRawData(int16_t* _gyroscopeData, int16_t* _accelerometerData, uint32_t _timePeriod, char _gyroscopeScale, char _accelerometerScale);
  //void manualEnterMagnetometerData(int16_t _magnetometerData);
  void manualEnterData(double* _rotData, double* _accData, double _timePeriod, char _gyroscopeScale, char _accelerometerScale);
  void manualEnterMagnetometerData(double* _magnetometerData);
  bool calculateFlightParameters();
  //bool calculateMomentaryParameters();
  bool changeGyroToAccelRatio(double _newRatio);
  double getCurrentGyroToAccelRatio();
  void setDefaultGyroToAccelRatio();
  bool smartAttitude();
  bool isUsingSmartAttitude();
  bool setNewSABounds(double _newLowerBound, double _newHighBound);
  void setDefaultSABounds();
  bool autoGyroScale();
  bool isUsingAutoGyroScale();
  bool autoAccelerometerScale();
  bool isUsingAutoAccelerometerScale();
  bool changeGyroManualScale(char _scale);
  void setDefaultGyroManualScale();
  bool changeAccelerometerManualScale(char _scale);
  void setDefaultAccelerometerManualScale();
  bool setNewNonChangingScaleBounds(uint16_t _newLowerBound, uint16_t _newHigherBound);
  void setDefaultNonChangingScaleBounds();
  double getCurrentMagneticDecliation();
  bool setMagneticDecliation(double _magneticDecliationInYourRegionInRadians);
  void resetMagneticDecliation();
  bool setNewMagnetometerRatio(double _newRatio);
  void setDefaultMagnetometerRatio();
  double getCurrentMagnetometerRatio();

  bool calibrateGyroscope(uint16_t _iterations = 1000);
  bool calibrateAccelerometer(uint16_t _iterations = 1000); // warning! don't use accelerometer calibration unit!

private:
  bool canUseAccelerometerCorrectionData();
  bool _error;
  char _errorCode;
  bool _serialDebugging;
  char _equipmentParameters, _currentEquipmentUsing;
  bool _autoService;
  uint16_t _servicePeriod;
  unsigned long int _lastTest;

  bool _softTesting;
  bool _isRefreshedRawData;
  bool _isUsingGyroAutoScale, _isUsingAccelerometerAutoScale;
  bool _isUsingSmartAttitude;
  char _currentGyroScale, _currentAccelerometerScale;
  char _manualGyroScale, _manualAccelerometerScale;
  double _gyroToAccelRatio;
  double _magnetometerRatio;
  double _lowAttitudeBound, _highAttitudeBound;
  uint16_t _lowMeasurementBound, _highMeasurementBound;
  double _maximalRotatingValue;
  double _currentOrientationMatrix[3][3];
  bool _isUsingSimpleTrygonometry;
  bool _isAvailableMagneticDecliation;
  long _lastMeasurement;
  bool _isAvailableMagnetometerData;
  double _magneticDecliation;
  bool _sleep;

  double calculateMPUTemperature (int rawTemp);

  

} inertialSystem;

#endif

Почти все методы, кроме тех, которые я привел в начале, НЕ ИСПОЛЬЗУЮТСЯ в тестовой программе.

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

Logik пишет:

ctrl+A ctrl+C и в окне вставски кода ctrl+V.

Проблема наблюдается для глобального обекта?

Видимо, для всех. Для локальных - попробовал создать локальный экземпляр в setup'е, для него произошло то же самое.

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016
#include <Wire.h>
#include <INS.h>

inertialSystem INS;
void setup() {
  // put your setup code here, to run once:
//Wire.begin();
Serial.begin(250000);
inertialSystem ins;
ins.enableSerialDebug();
ins.initialize();
if(INS.initializeEquipment()){
  Serial.println("eCode\tcurrentEquipmentUsing:");
  Serial.print(INS.getEquipmentCode(), BIN);
  Serial.print("\t");
  Serial.println(INS.getUsingEquipmentCode(), BIN);
  INS.enableSerialDebug();
}
 else {
  while(1);
 }
 while(!Serial.available());
 while(Serial.available())
  Serial.read();
}

void loop() {
  // put your main code here, to run repeatedly:
INS.refreshData();
if(Serial.available()) {
  while(Serial.available())
  Serial.read();
  Serial.println("Calculations paused.");
  while(!Serial.available());
  while(Serial.available()) { 
    Serial.read();
    delay(1);
  }
  Serial.println("Calculations resumed.");
}

}

Такой скетч был использован для тестирования программы.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
#include <Wire.h>
#include <INS.h>

inertialSystem INS; // < --- Это как? Создаем представитель класса INS
void setup() {
  // put your setup code here, to run once:
//Wire.begin();
Serial.begin(250000);
inertialSystem ins; // < --- Теперь 2 представитель ins , но со сроком жизни скобок setup(){}
ins.enableSerialDebug();
ins.initialize();
if(INS.initializeEquipment()){
  Serial.println("eCode\tcurrentEquipmentUsing:");
  Serial.print(INS.getEquipmentCode(), BIN);
  Serial.print("\t");
  Serial.println(INS.getUsingEquipmentCode(), BIN);
  INS.enableSerialDebug();
}

 

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

qwone пишет:

#include <Wire.h>
#include <INS.h>

inertialSystem INS; // < --- Это как? Создаем представитель класса INS
void setup() {
  // put your setup code here, to run once:
//Wire.begin();
Serial.begin(250000);
inertialSystem ins; // < --- Теперь 2 представитель ins , но со сроком жизни скобок setup(){}
ins.enableSerialDebug();
ins.initialize();
if(INS.initializeEquipment()){
  Serial.println("eCode\tcurrentEquipmentUsing:");
  Serial.print(INS.getEquipmentCode(), BIN);
  Serial.print("\t");
  Serial.println(INS.getUsingEquipmentCode(), BIN);
  INS.enableSerialDebug();
}

 

Все верно, это к вопросу выше о том, как область видимости влияет на работоспособность кода. Можете не обращать внимания на локальный экземпляр.
(Хотя, на самом деле, локальный экземпляр я дописал на ходу, вставляя код, ибо исходного скетча с тем экземпляром уже нет. Но он почти в точности повторяет то, что там было)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
inertialSystem INS; // Создаем представитель класса INS
void setup() {
  // put your setup code here, to run once:
//Wire.begin();
Serial.begin(250000);
inertialSystem ins; // < --- Теперь 2 представитель ins 
ins.enableSerialDebug();
ins.initialize(); //<--- вот ins инициализируется , а где INS инициализируется??
// INS.initialize(); <--- это вы не потеряли ??
if(INS.initializeEquipment()){
  Serial.println("eCode\tcurrentEquipmentUsing:");
  Serial.print(INS.getEquipmentCode(), BIN);
  Serial.print("\t");
  Serial.println(INS.getUsingEquipmentCode(), BIN);
  INS.enableSerialDebug();
}
 else {
  while(1);
 }
 while(!Serial.available());
 while(Serial.available())
  Serial.read();
}

 

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

qwone пишет:

inertialSystem INS; // Создаем представитель класса INS
void setup() {
  // put your setup code here, to run once:
//Wire.begin();
Serial.begin(250000);
inertialSystem ins; // < --- Теперь 2 представитель ins 
ins.enableSerialDebug();
ins.initialize(); //<--- вот ins инициализируется , а где INS инициализируется??
// INS.initialize(); <--- это вы не потеряли ??
if(INS.initializeEquipment()){
  Serial.println("eCode\tcurrentEquipmentUsing:");
  Serial.print(INS.getEquipmentCode(), BIN);
  Serial.print("\t");
  Serial.println(INS.getUsingEquipmentCode(), BIN);
  INS.enableSerialDebug();
}
 else {
  while(1);
 }
 while(!Serial.available());
 while(Serial.available())
  Serial.read();
}

 

Сорри, говорю же, вставлял на скорую руку)
По другому оно бы не заработало в любом случае. Да, вместо initialize() должна быть initializeEquipment().

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну в отличии от всякого творчества , программирование работа практическая. Всегда можно проверить на железе.У меня все в норме.Видно у вас в программе косяки.

/*cl_.ino
*/
class Cl_ {
  public:
    Cl_();
    byte var;
    byte var1[3];
};

Cl_::Cl_() {
  var = 240;
  var1[0] = 120;
}
Cl_  AAA;
void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(1000);
  Serial.println( "!!!");// печатает !!!
  Serial.println( AAA.var);// печатает 240
  Serial.println( AAA.var1[0]);// печатает 120
}