Не выполняется конструктор класса
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Столкнулся с проблемой, что конструктор внутри класса, который отрабатывает после создания экземпляра, не работает. Т.е. не выполняется код внутри него, или выполняется неправильно.
К примеру, в нем я пишу:
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 файле.
В нахождении ошибок подобного типа, полный код - обязательное условие.
Полный код - 1000 строчек в .cpp файле. Оно вам надо - копаться в моем... быдлокоде?)
Я привел лишь часть того, что не выполняется правильно, чтобы показать суть проблемы. Я уверен, что эти переменные не устанавливаются в ноль где-то дальше в коде.
Вот где ТС увидел ГОСТы на скетч Ардуины. Я даже не могу представить что были ГОСТы для языка Си. И наконец структура скетча с setup() и loop() не очень вкладывается в нормы языка Си. Ну и так по мелочи. Вы что думаете что если в конструкторе вы вложете мигание светодиодом через delay() или millis(), то это и произойдет.
Ок. Разбирайтесь в своем "быдлокоде" сами.
Я кроме 16 строк похожих на коструктор класса ничего не увидел, ни сам класс, ни его иннициализацию, ни область видимости и тип _currentOrientationMatrix.
qwone, ГОСТ - я употребил образно. Следовало читать - "Хочется сделать так, чтобы все работало так, как ему и предписано".
xDriver, область видимости всех переменных - private, почти всех методов - public.
Новосозданный экземпляр является глобальным, как и экземпляры Servo, к примеру.
Метод инициализации - внутренний метод, который предписано выполнять перед началом работы с экземпляром, не стоит заострять на нем внимание.
Хотя, в общем, действительно нужно бы было скинуть код. Как я могу это сделать?
ctrl+A ctrl+C и в окне вставски кода ctrl+V.
Проблема наблюдается для глобального обекта?
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Почти все методы, кроме тех, которые я привел в начале, НЕ ИСПОЛЬЗУЮТСЯ в тестовой программе.
ctrl+A ctrl+C и в окне вставски кода ctrl+V.
Проблема наблюдается для глобального обекта?
Видимо, для всех. Для локальных - попробовал создать локальный экземпляр в setup'е, для него произошло то же самое.
#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."); } }Такой скетч был использован для тестирования программы.
#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(); }#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(); }Все верно, это к вопросу выше о том, как область видимости влияет на работоспособность кода. Можете не обращать внимания на локальный экземпляр.
(Хотя, на самом деле, локальный экземпляр я дописал на ходу, вставляя код, ибо исходного скетча с тем экземпляром уже нет. Но он почти в точности повторяет то, что там было)
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(); }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().
Ну в отличии от всякого творчества , программирование работа практическая. Всегда можно проверить на железе.У меня все в норме.Видно у вас в программе косяки.
/*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 }