customized_MEMS.cpp 1.85 KB
#include "simple_obd_test.h"
#include "customized_DateAndTime.h"
#include "customized_MEMS.h"

RTC_DATA_ATTR MEMS_dev md_dev;

void init_MEMS_dev(void){
	#if USE_SERIAL==1
		Serial.print("MEMS:");
	#endif
	md_dev.mems = new MPU9250;
	byte ret = (md_dev.mems)->begin(ENABLE_ORIENTATION);
	if (ret) {
		#if USE_SERIAL==1
			Serial.println("MPU-9250");
		#endif
	} else {
		(md_dev.mems)->end();
		delete md_dev.mems;
		md_dev.mems = new ICM_20948_I2C;
		ret = (md_dev.mems)->begin(ENABLE_ORIENTATION);
		if (ret) {
			#if USE_SERIAL==1
				Serial.println("ICM-20948");
			#endif
		} else {
			#if USE_SERIAL==1
				Serial.println("NO");
			#endif
			while(1);
		}
	}
	esp_sleep_wakeup_cause_t wakeup_reason;
	wakeup_reason = esp_sleep_get_wakeup_cause();
	if (wakeup_reason!=ESP_SLEEP_WAKEUP_TIMER)
		calibrateMEMS();

}


void calibrateMEMS(void){
	float temp=0;
	while (!((md_dev.mems)->read(md_dev.accBias, md_dev.gyrBias, md_dev.magBias, &temp))){}
	#if USE_SERIAL==1
		Serial.println("MEMS is calibrated successfully");
	#endif
}

int isDataMEMSReady(MEMS_dev* md){
	float temp=0;
	if (((md_dev.mems)->read(md_dev.acc, md_dev.gyr, md_dev.mag, &temp))){
		for (int i=0; i<3; i++){
			md_dev.acc[i]-=md_dev.accBias[i];
			md_dev.gyr[i]-=md_dev.gyrBias[i];
			md_dev.mag[i]-=md_dev.magBias[i];
		}
		*md=md_dev;
		return 1;
	}
	return 0;
}

int AddMEMSData(char* isoTime,char* p,int* nbr,int GPS_Stat){
	int MEMS_Stat=0;
	MEMS_dev md;
	int i;
	*nbr=0;

	if (!isDataMEMSReady(&md)){
		#if USE_SERIAL==1
			Serial.println("Unable to read MEMS !");
		#endif
		MEMS_Stat=0;
	}else{
		if (!GPS_Stat){
			GetCurrentTime(isoTime);
			i=sprintf(p,"%s,,,,,,",isoTime);
			*nbr+=i;
			p+=i;
		}
		i=sprintf(p,",%f,%f,%f,%f,%f,%f,%f,%f,%f",\
			md.acc[0],md.acc[1],md.acc[2],\
			md.gyr[0],md.gyr[1],md.gyr[2],\
			md.mag[0],md.mag[1],md.mag[2]\
			);
		*nbr+=i;
		MEMS_Stat=1;
	}
	return MEMS_Stat;
}