tiz
Dependencies: TextLCD X_NUCLEO_IKS01A1 func mbed-src mbed
Fork of mas by
main.cpp
- Committer:
- youle1119
- Date:
- 2016-09-14
- Revision:
- 6:fb1b3ce7738d
- Parent:
- 5:100310ea8fba
File content as of revision 6:fb1b3ce7738d:
/**
******************************************************************************
* @file main.cpp
* @author AST / EST
* @version V0.0.1
* @date 14-August-2015
* @brief Simple Example application for using the X_NUCLEO_IKS01A1
* MEMS Inertial & Environmental Sensor Nucleo expansion board.
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes */
#include "main.h"
/* Instantiate the expansion board */
static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
/* Retrieve the composing elements of the expansion board */
static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
/* Helper function for printing floats & doubles */
static char *printDouble(char* str, double v, int decimalDigits=2)
{
int i = 1;
int intPart, fractPart;
int len;
char *ptr;
/* prepare decimal digits multiplicator */
for (;decimalDigits!=0; i*=10, decimalDigits--);
/* calculate integer & fractinal parts */
intPart = (int)v;
fractPart = (int)((v-(double)(int)v)*i);
/* fill in integer part */
sprintf(str, "%i.", intPart);
/* prepare fill in of fractional part */
len = strlen(str);
ptr = &str[len];
/* fill in leading fractional zeros */
for (i/=10;i>1; i/=10, ptr++) {
if(fractPart >= i) break;
*ptr = '0';
}
/* fill in (rest of) fractional part */
sprintf(ptr, "%i", fractPart);
return str;
}
DigitalOut myled(LED1);
DigitalIn mybutton(USER_BUTTON);
Display mydisplay;
RawData myrawdata;
uint8_t fbtn=BTN_RELEASED;
uint8_t fbtn_counter=0;
uint8_t mode=MODE_NORMAL;
uint8_t func=FUNC_DATETIME;
uint8_t config_index=0;
uint8_t flag_flash=0;
/**
* FUNC: wait_action
* DESC: wait for pressing button action, update the global flag for next polling cycle
*/
void wait_action()
{
fbtn=BTN_RELEASED;
for(int i=0; i<5; i++)
{
if(fbtn==BTN_RELEASED)
{
if(mybutton==1 and fbtn==BTN_RELEASED)
{
if(fbtn_counter>0 and fbtn_counter<=20)
{
fbtn=BTN_PRESSED;
}
else if(fbtn_counter>20 and fbtn_counter<=50)
{
fbtn=BTN_PRESSED_LONG;
}
else if(fbtn_counter>50)
{
fbtn=BTN_PRESSED_VERY_LONG;
}
fbtn_counter=0;
}
else
{
fbtn_counter+=1;
}
}
wait(0.1);
}
}
/* Simple main function */
int main() {
myled=0;
uint8_t func=0;
uint8_t button_mem=0;
uint8_t id;
float value1, value2;
char buffer0[16];
char buffer1[32], buffer2[32];
int32_t axes[3];
int16_t axxx[3];
/*
PersistorStorage ps=PersistorStorage();
strcpy(ps.storage, "hello");
ps.writeStorageToFlash();
PersistorStorage ps1=PersistorStorage();
ps1.ReadStorageFromFlash();
printf("%s", ps1.storage);
*/
/*HAL_Init();
__HAL_FLASH_CLEAR_FLAG( FLASH_FLAG_EOP | FLASH_FLAG_OPERR |FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
printf("hello\n");
uint64_t a=124;
uint32_t pageerr = 100;
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef es;
es.TypeErase=FLASH_TYPEERASE_MASSERASE;
es.Banks=FLASH_BANK_2;
es.Page=0;
es.NbPages=1;
if( HAL_OK != (HAL_FLASHEx_Erase_IT( &es))) {
printf("ERROR %d\n", pageerr);
HAL_FLASH_Lock();
}
__HAL_FLASH_CLEAR_FLAG( FLASH_FLAG_EOP | FLASH_FLAG_OPERR |FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
HAL_FLASH_Unlock();
printf("%d\n", HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x08080000, a));
printf("hello\n");
printf("%d\n", HAL_FLASH_GetError());
HAL_FLASH_Lock();
static const int StorageSize = 64;
static unsigned int storage[ StorageSize ] __attribute__((aligned(32)));
HAL_FLASH_Unlock();
memcpy( (uint32_t*)storage, (uint32_t*)(0x08080000), StorageSize);
HAL_FLASH_Lock();
for(int i=0; i<StorageSize; i++)
{
printf("%4x ",storage[i]);
}
printf("\n");
*/
/*
printf("\r\n--- Starting new run ---\r\n");
humidity_sensor->ReadID(&id);
printf("HTS221 humidity & temperature = 0x%X\r\n", id);
pressure_sensor->ReadID(&id);
printf("LPS25H pressure & temperature = 0x%X\r\n", id);
magnetometer->ReadID(&id);
printf("LIS3MDL magnetometer = 0x%X\r\n", id);
gyroscope->ReadID(&id);
printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
*/
float pressure=0;
while(1)
{
// MEASURE AND DISPLAY
if(mode==MODE_NORMAL)
{
myled=0;
if(func==FUNC_DATETIME)
{
myrawdata.__time=time(NULL);
myrawdata.str_date(buffer0);
myrawdata.str_time(buffer1);
}
else if(func==FUNC_TEMPHUMI)
{
temp_sensor1->GetTemperature(&myrawdata.__temp);
humidity_sensor->GetHumidity(&myrawdata.__humi);
myrawdata.str_temperature(buffer0);
myrawdata.str_humidity(buffer1);
}
else if(func==FUNC_ALTICDIR)
{
pressure_sensor->GetPressure(&pressure);
myrawdata.__prss = pressure * 10;
magnetometer->Get_M_Axes(myrawdata.__mag);
accelerometer->Get_X_Axes(myrawdata.__acc);
gyroscope->Get_G_Axes(myrawdata.__gyr);
myrawdata.str_altitude(buffer0);
myrawdata.str_direction(buffer1);
}
mydisplay.show(buffer0, buffer1);
}
else if(mode==MODE_CONFIG)
{
myled=1;
if(func==FUNC_DATETIME)
{
myrawdata.str_date(buffer0);
myrawdata.str_time(buffer1);
if(flag_flash)
{
if(config_index==0)
{
buffer0[0]=0xff;
}
else if(config_index==1)
{
buffer0[1]=0xff;
}
else if(config_index==2)
{
buffer0[3]=0xff;
buffer0[4]=0xff;
}
else if(config_index==3)
{
buffer0[6]=0xff;
buffer0[7]=0xff;
}
else if(config_index==4)
{
buffer1[0]=0xff;
buffer1[1]=0xff;
}
else if(config_index==5)
{
buffer1[3]=0xff;
}
else if(config_index==6)
{
buffer1[4]=0xff;
}
else if(config_index==7)
{
buffer1[6]=0xff;
}
else if(config_index==8)
{
buffer1[7]=0xff;
}
}
}
if(func==FUNC_TEMPHUMI)
{
myrawdata.str_temperature(buffer0);
myrawdata.str_humidity(buffer1);
if(flag_flash)
{
if(config_index==0)
{
buffer0[2]=0xff;
}
else if(config_index==1)
{
buffer0[3]=0xff;
}
else if(config_index==2)
{
buffer0[4]=0xff;
}
else if(config_index==3)
{
buffer0[6]=0xff;
}
else if(config_index==4)
{
buffer1[3]=0xff;
}
else if(config_index==5)
{
buffer1[4]=0xff;
}
else if(config_index==6)
{
buffer1[6]=0xff;
}
}
}
else if(func==FUNC_ALTICDIR)
{
myrawdata.str_altitude(buffer0);
myrawdata.str_direction(buffer1);
if(flag_flash)
{
if(config_index==0)
{
buffer0[3]=0xff;
}
else if(config_index==1)
{
buffer0[4]=0xff;
}
else if(config_index==2)
{
buffer0[5]=0xff;
}
else if(config_index==3)
{
buffer0[6]=0xff;
}
}
}
if(flag_flash)
{
flag_flash=0;
}
else
{
flag_flash=1;
}
mydisplay.show(buffer0, buffer1);
}
else
{
mydisplay.show("CALIBRATION", "START IN 3s ...");
wait(1);
mydisplay.show("CALIBRATION", "START IN 2s ...");
wait(1);
mydisplay.show("CALIBRATION", "START IN 1s ...");
wait(1);
mydisplay.show("CALIBRATION", "PHASE 1 ...");
int32_t acc[3]={0}, gyr[3]={0};
for(int i=0;i<100;i++)
{
int32_t acc_tmp[3]={0}, gyr_tmp[3]={0};
accelerometer->Get_X_Axes(acc_tmp);
gyroscope->Get_G_Axes(gyr_tmp);
acc[0] += acc_tmp[0];
acc[1] += acc_tmp[1];
acc[2] += acc_tmp[2];
gyr[0] += gyr_tmp[0];
gyr[1] += gyr_tmp[1];
gyr[2] += gyr_tmp[2];
wait(0.02);
}
myrawdata.__gyr_offset[0]=-gyr[0]/100;
myrawdata.__gyr_offset[1]=-gyr[1]/100;
myrawdata.__gyr_offset[2]=-gyr[2]/100;
myrawdata.__acc_offset[0]=-acc[0]/100;
myrawdata.__acc_offset[1]=-acc[1]/100;
myrawdata.__acc_offset[2]=1-acc[2]/100; // gravaty
mydisplay.show("CALIBRATION", "PHASE 2 ...");
int32_t mag_max[3]={-10000}, mag_min[3]={10000};
for(int i=0;i<500;i++)
{
int32_t mag_tmp[3]={0};
magnetometer->Get_M_Axes(mag_tmp);
mag_max[0]=mag_tmp[0]>mag_max[0]?mag_tmp[0]:mag_max[0];
mag_max[1]=mag_tmp[1]>mag_max[1]?mag_tmp[1]:mag_max[1];
mag_max[2]=mag_tmp[2]>mag_max[2]?mag_tmp[2]:mag_max[2];
mag_min[0]=mag_tmp[0]<mag_min[0]?mag_tmp[0]:mag_min[0];
mag_min[1]=mag_tmp[1]<mag_min[1]?mag_tmp[1]:mag_min[1];
mag_min[2]=mag_tmp[2]<mag_min[2]?mag_tmp[2]:mag_min[2];
wait(0.02);
}
myrawdata.__mag_offset[0]=-((mag_max[0]+mag_min[0])/2);
myrawdata.__mag_offset[1]=-((mag_max[1]+mag_min[1])/2);
myrawdata.__mag_offset[2]=-((mag_max[2]+mag_min[2])/2);
mode=MODE_NORMAL;
}
// NEXT STATE
if(mode==MODE_NORMAL)
{
if(fbtn==BTN_PRESSED_LONG)
{
mode=MODE_CONFIG;
}
else if(fbtn==BTN_PRESSED)
{
func=func+1;
if(func>FUNC_ALTICDIR)
func=FUNC_DATETIME;
}
else if(fbtn==BTN_PRESSED_VERY_LONG)
{
mode=MODE_CONFIG_AUTO;
}
}
else if(mode==MODE_CONFIG)
{
if(fbtn==BTN_PRESSED_VERY_LONG)
{
config_index=0;
mode=MODE_NORMAL;
}
else if(fbtn==BTN_PRESSED_LONG)
{
config_index+=1;
if(func==FUNC_DATETIME){
if(config_index>8)
{
config_index=0;
}
} else if(func== FUNC_TEMPHUMI){
if(config_index>6)
{
config_index=0;
}
} else if(func==FUNC_ALTICDIR){
if(config_index>3)
{
config_index=0;
}
}
}
else if(fbtn==BTN_PRESSED)
{
if(func==FUNC_DATETIME)
{
if(config_index==0)
{
myrawdata.add_year_10();
}
else if(config_index==1)
{
myrawdata.add_year_1();
}
else if(config_index==2)
{
myrawdata.add_month();
}
else if(config_index==3)
{
myrawdata.add_day();
}
else if(config_index==4)
{
myrawdata.add_hour();
}
else if(config_index==5)
{
myrawdata.add_min_10();
}
else if(config_index==6)
{
myrawdata.add_min_1();
}
else if(config_index==7)
{
myrawdata.add_sec_10();
}
else if(config_index==8)
{
myrawdata.add_sec_1();
}
}
else if(func==FUNC_TEMPHUMI)
{
if(config_index==0)
{
myrawdata.add_temp_sign();
}
else if(config_index==1)
{
myrawdata.add_temp_10();
}
else if(config_index==2)
{
myrawdata.add_temp_1();
}
else if(config_index==3)
{
myrawdata.add_temp_1_10();
}
else if(config_index==4)
{
myrawdata.add_humi_10();
}
else if(config_index==5)
{
myrawdata.add_humi_1();
}
else if(config_index==6)
{
myrawdata.add_humi_1_10();
}
}
else if(func==FUNC_ALTICDIR)
{
if(config_index==0)
{
myrawdata.add_altitude_1000();
}
else if(config_index==1)
{
myrawdata.add_altitude_100();
}
else if(config_index==2)
{
myrawdata.add_altitude_10();
}
else if(config_index==3)
{
myrawdata.add_altitude_1();
}
}
}
}
else
{
;
}
wait_action();
}
/*
raise_error(ERROR_CONFIG);
printf("START CALIBRATION\n");
int32_t m_max[3]={0};
int32_t m_min[3]={0};
for (int i=0; i<1000; i++)
{
magnetometer->Get_M_Axes(axes);
if(i==0)
{
for(int j=0; j<3; j++)
{
m_max[j]=axes[j];
m_min[j]=axes[j];
}
}
else
{
for(int j=0; j<3; j++)
{
if(axes[j]>m_max[j]) m_max[j]=axes[j];
if(axes[j]<m_min[j]) m_min[j]=axes[j];
}
}
wait(0.05);
}
printf("MAX : %d, %d, %d\n", m_max[0], m_max[1], m_max[2]);
printf("MIN : %d, %d, %d\n", m_min[0], m_min[1], m_min[2]);
while(1) {
if((mybutton!=0) && (button_mem==0))
{
func++;
if(func>=6)
func=0;
}
button_mem=mybutton;
printf("func: %d\r\n", func);
printf("\r\n");
if(func==0)
{
time_t seconds = time(NULL);
printf("Time as a basic string = %s\r\n", ctime(&seconds));
}
else if(func==1)
{
temp_sensor1->GetTemperature(&value1);
humidity_sensor->GetHumidity(&value2);
if(value2 > 70)
myled=1;
else
myled=0;
printf("HTS221: [temp] %7s C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
}
else if(func==2)
{
temp_sensor2->GetFahrenheit(&value1);
pressure_sensor->GetPressure(&value2);
printf("LPS25H: [temp] %7s F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
printf("Altitude: %s m\r\n", printDouble(buffer1, 44300-44300*pow((value2/1013.25), 0.00019)));
}
else if(func==3)
{
magnetometer->Get_M_Axes(axes);
axxx[0]=axes[0]-((m_max[0]+m_min[0])/2);
axxx[1]=axes[1]-((m_max[1]+m_min[1])/2);
axxx[2]=axes[2]-((m_max[2]+m_min[2])/2);
printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axxx[0], axxx[1], axxx[2]);
printf("DIR: %s deg\r\n", printDouble(buffer1, 90-atan(float(axxx[0])/float(axxx[1])/3.1416)));
}
else if(func==4)
{
accelerometer->Get_X_Axes(axes);
printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
}
else if(func==5)
{
gyroscope ->Get_G_Axes(axes);
printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
}
wait(1.5);
}*/
}
