B+IMU+SD

Dependencies:   BMI160 RTC SDFileSystem USBDevice max32630fthr

Fork of MPSMAXbutton by Faizan Ahmad

Files at this revision

API Documentation at this revision

Comitter:
FaizanAhmad
Date:
Wed May 09 11:01:18 2018 +0000
Parent:
0:769c5a7b3939
Commit message:
bUTTON+IMU+SD

Changed in this revision

BMI160.lib Show annotated file Show diff for this revision Revisions of this file
IMU.cpp Show annotated file Show diff for this revision Revisions of this file
IMU.h Show annotated file Show diff for this revision Revisions of this file
RTC.lib Show annotated file Show diff for this revision Revisions of this file
RTClock.cpp Show annotated file Show diff for this revision Revisions of this file
RTClock.h Show annotated file Show diff for this revision Revisions of this file
files.cpp Show annotated file Show diff for this revision Revisions of this file
files.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMI160.lib	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/j3/code/BMI160/#0ae99e97bcf5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IMU.cpp	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,180 @@
+#include "IMU.h"
+
+
+I2C i2cBus(P5_7, P6_0);
+BMI160_I2C imu(i2cBus, BMI160_I2C::I2C_ADRS_SDO_LO);
+
+BMI160::AccConfig accConfig;
+BMI160::GyroConfig gyroConfig;
+
+int initIMU(){
+   i2cBus.frequency(400000);
+
+    // printf("\033[H");  //home
+    // printf("\033[0J");  //erase from cursor to end of screen
+    
+    uint32_t failures = 0;
+    
+    if(imu.setSensorPowerMode(BMI160::GYRO, BMI160::NORMAL) != BMI160::RTN_NO_ERROR){
+        printf("Failed to set gyroscope power mode\n");
+        failures++;
+    }
+    wait_ms(10);
+    
+    if(imu.setSensorPowerMode(BMI160::ACC, BMI160::NORMAL) != BMI160::RTN_NO_ERROR){
+        printf("Failed to set accelerometer power mode\n");
+        failures++;
+    }
+    wait_ms(10);
+    
+    
+    //example of using getSensorConfig
+    if(imu.getSensorConfig(accConfig) == BMI160::RTN_NO_ERROR){
+        printf("ACC Range = %d\n", accConfig.range);
+        printf("ACC UnderSampling = %d\n", accConfig.us);
+        printf("ACC BandWidthParam = %d\n", accConfig.bwp);
+        printf("ACC OutputDataRate = %d\n\n", accConfig.odr);
+    }else{
+        printf("Failed to get accelerometer configuration\n");
+        failures++;
+    }
+    
+    //example of setting user defined configuration
+    accConfig.range = BMI160::SENS_2G ;
+    accConfig.us = BMI160::ACC_US_OFF;
+    accConfig.bwp = BMI160::ACC_BWP_2;
+    accConfig.odr = BMI160::ACC_ODR_8;
+    if(imu.setSensorConfig(accConfig) == BMI160::RTN_NO_ERROR){
+        printf("ACC Range = %d\n", accConfig.range);
+        printf("ACC UnderSampling = %d\n", accConfig.us);
+        printf("ACC BandWidthParam = %d\n", accConfig.bwp);
+        printf("ACC OutputDataRate = %d\n\n", accConfig.odr);
+    }else{
+        printf("Failed to set accelerometer configuration\n");
+        failures++;
+    }
+    
+    if(imu.getSensorConfig(gyroConfig) == BMI160::RTN_NO_ERROR){
+        printf("GYRO Range = %d\n", gyroConfig.range);
+        printf("GYRO BandWidthParam = %d\n", gyroConfig.bwp);
+        printf("GYRO OutputDataRate = %d\n\n", gyroConfig.odr);
+    }else{
+        printf("Failed to get gyroscope configuration\n");
+        failures++;
+    }
+    
+    // printf("\033[H");  //home
+    // printf("\033[0J");  //erase from cursor to end of screen
+    
+    if(failures == 0){
+        return 0;
+    }else{
+        printf("IMU init failed.. returning 1\n");
+        return 1;
+    }
+}
+
+void printIMUData(){
+    float imuTemperature; 
+    BMI160::SensorData accData;
+    BMI160::SensorData gyroData;
+    BMI160::SensorTime sensorTime;
+
+    imu.getGyroAccXYZandSensorTime(accData, gyroData, sensorTime, accConfig.range, gyroConfig.range);
+    imu.getTemperature(&imuTemperature);
+
+    printf("ACC xAxis = %d\n", accData.xAxis.raw);
+    printf("ACC yAxis = %d\n", accData.yAxis.raw);
+    printf("ACC zAxis = %d\n\n", accData.zAxis.raw);
+
+    printf("GYRO xAxis = %d\n", gyroData.xAxis.raw);
+    printf("GYRO yAxis = %d\n", gyroData.yAxis.raw);
+    printf("GYRO zAxis = %d\n\n", gyroData.zAxis.raw);
+
+    printf("Sensor Time = %f\n", sensorTime.seconds);
+    printf("Sensor Temperature = %5.3f\n", imuTemperature);
+}
+
+
+float getIMUAngle(){
+    BMI160::SensorData accData;
+    BMI160::SensorData gyroData;
+    BMI160::SensorTime sensorTime;
+    double tempxAngle = 0;
+    double xAngle =0;
+    double tempyAngle =0;
+    double yAngle =0;
+    double res =0;
+
+    imu.getGyroAccXYZandSensorTime(accData, gyroData, sensorTime, accConfig.range, gyroConfig.range);
+//    printf("X = %d\tY = %d\tZ = %d\t\n", accData.xAxis.raw, accData.yAxis.raw,  accData.zAxis.raw);
+    
+    // uint32_t xVal = accData.xAxis.raw;
+    // uint32_t yVal = accData.yAxis.raw;
+    // uint32_t zVal = accData.zAxis.raw;
+
+    float xVal = accData.xAxis.scaled;
+    float yVal = accData.yAxis.scaled;
+    float zVal = accData.zAxis.scaled;
+    
+    /* Compute angles in radian */
+    tempxAngle = (double)((yVal * yVal) + (zVal * zVal));
+    tempyAngle = (double)((xVal * xVal) + (zVal * zVal));
+    xAngle = (double)atan (xVal / sqrt (tempxAngle));
+    yAngle = (double)atan (yVal / sqrt(tempyAngle)); 
+    /* Convert radian in degree */
+    xAngle *= 180.00; 
+    yAngle *= 180.00; //zAngle *=180.00;
+    xAngle /= M_PI; 
+    yAngle /= M_PI; //zAngle /= 3.141592;
+        // for x angle         
+    res = xAngle;   
+    return res;
+}
+
+
+
+// DEFAULT MBED FUNCTIONs.. not required for MPS
+void dumpImuRegisters(BMI160 &imu)
+{
+    printRegister(imu, BMI160::CHIP_ID);
+    printBlock(imu, BMI160::ERR_REG,BMI160::FIFO_DATA);
+    printBlock(imu, BMI160::ACC_CONF, BMI160::FIFO_CONFIG_1);
+    printBlock(imu, BMI160::MAG_IF_0, BMI160::SELF_TEST);
+    printBlock(imu, BMI160::NV_CONF, BMI160::STEP_CONF_1);
+    printRegister(imu, BMI160::CMD);
+    printf("\n");
+}
+ 
+void printRegister(BMI160 &imu, BMI160::Registers reg)
+{
+    uint8_t data;
+    if(imu.readRegister(reg, &data) == BMI160::RTN_NO_ERROR)
+    {
+        printf("IMU Register 0x%02x = 0x%02x\n", reg, data);
+    }
+    else
+    {
+        printf("Failed to read register\n");
+    }
+}
+ 
+void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg)
+{
+    uint8_t numBytes = ((stopReg - startReg) + 1);
+    uint8_t buff[numBytes];
+    uint8_t offset = static_cast<uint8_t>(startReg);
+    
+    if(imu.readBlock(startReg, stopReg, buff) == BMI160::RTN_NO_ERROR)
+    {
+        for(uint8_t idx = offset; idx < (numBytes + offset); idx++)
+        {
+            printf("IMU Register 0x%02x = 0x%02x\n", idx, buff[idx - offset]);
+        }
+    }
+    else
+    {
+        printf("Failed to read block\n");
+    }
+}
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IMU.h	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,23 @@
+#ifndef IMU_H
+#define IMU_H
+
+#include "mbed.h"
+#include "main.h"
+
+#ifndef M_PI
+#define M_PI           3.14159265358979323846
+#endif
+
+
+void dumpImuRegisters(BMI160 &imu);
+void printRegister(BMI160 &imu, BMI160::Registers reg);
+void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg);
+
+int initIMU();
+void printIMUData();
+float getIMUAngle();
+void dumpImuRegisters(BMI160 &imu);
+void printRegister(BMI160 &imu, BMI160::Registers reg);
+void printBlock(BMI160 &imu, BMI160::Registers startReg, BMI160::Registers stopReg);
+ 
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RTC.lib	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/DanielOlarte/code/RTC/#86951afbcc3f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RTClock.cpp	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,25 @@
+#include "RTClock.h"
+extern Serial _serialport;
+
+void initRTC(){
+    time_t seconds = time(NULL);
+}
+
+void setRTCTime(){
+
+}
+
+
+void loadNextMove(){
+
+}
+
+void printRTCTime(){
+    time_t seconds = time(NULL);
+    _serialport.printf("Time as seconds since January 1, 1970 = %d\n", seconds);
+    _serialport.printf("Time as a basic string = %s", ctime(&seconds));
+    char buffer[32];
+    strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds));
+    _serialport.printf("Time as a custom formatted string = %s", buffer);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RTClock.h	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,13 @@
+#ifndef RTCLOCK_H
+#define RTCLOCK_H
+
+#include "mbed.h"
+#include "main.h"
+#include "RTC.h"
+
+void initRTC();
+void setRTCAlarm();
+void printRTCTime();
+void loadNextMove();
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/files.cpp	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,111 @@
+#include "files.h"
+#include "USBSerial.h"
+extern Serial _serialport;
+
+#if (MBED_MAJOR_VERSION == 2)
+#include    "SDFileSystem.h"
+#elif (MBED_MAJOR_VERSION == 5)
+#include    "SDBlockDevice.h"
+#include    "FATFileSystem.h"
+#endif
+
+#if (MBED_MAJOR_VERSION == 2)
+SDFileSystem    sd(D11, D12, D13, D10, "fs");  // do,di,clk,cs
+#elif (MBED_MAJOR_VERSION == 5)
+//SDBlockDevice   sd(D11, D12, D13, D10, 8000000);
+SDBlockDevice   sd(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS, 8000000);    // For MAX32630FTHR
+FATFileSystem   fs("fs");
+#endif
+
+
+int totaFunctionlFiles = 0;
+int functionFileNumber = 1;
+int functionActive = 0;
+extern int functionPosition = 0;
+Function ffunc;
+
+int initSDCard()
+{
+#if (MBED_MAJOR_VERSION == 5)
+    /* Init SD CARD reader */
+    sd.init();
+    fs.mount(&sd);
+#endif
+    FILE* fp = fopen("/fs/mydata.txt", "a");
+    if (fp != 0) {
+        _serialport.printf("writing something\n\r\n");
+        fprintf(fp,"writing something\n\r\n");
+    } else {
+        _serialport.printf("ERROR\r\n");
+    }
+    fclose(fp);
+    return 0;
+}
+
+int readFileNames()
+{
+    DIR *d;
+    struct dirent *p;
+
+    d = opendir("/fs/functions");
+    if (d != NULL) {
+        while ((p = readdir(d)) != NULL) {
+//            printf(" - %s\n", p->d_name);
+            totaFunctionlFiles++;
+        }
+    } else {
+        printf("Could not open directory!\n");
+    }
+    closedir(d);
+    printf("Total files = %d\n", totaFunctionlFiles);
+    return 0;
+}
+
+int navFunctionFiles(int direction)
+{
+
+    if(direction == DIR_UP) {
+        if(functionFileNumber < totaFunctionlFiles) {
+            functionFileNumber++;
+        } else {
+            functionFileNumber = 1;
+        }
+        printf("UP: %d\n", functionFileNumber);
+    } else {
+        if(functionFileNumber > 1) {
+            functionFileNumber--;
+        } else {
+            functionFileNumber = totaFunctionlFiles;
+        }
+        printf("DOWN: %d\n", functionFileNumber);
+    }
+    return 0;
+}
+
+int openFunctionFile(int inpFile)
+{
+    char fileLoc [40];
+    sprintf (fileLoc, "/fs/functions/function%d.txt", inpFile);
+    printf ("[%s] is location %d file number\n", fileLoc, inpFile);
+
+    FILE* fp = fopen(fileLoc, "r");
+    ffunc.pos=0;
+    while (fscanf(fp, "%d,%d", &ffunc.x[ffunc.pos], &ffunc.t[ffunc.pos]) != EOF) {
+        ffunc.pos++;
+    }
+
+    fclose(fp);
+    functionActive = 1;
+    functionPosition = 0;
+    printFunctionData();
+    return 0;
+}
+
+void printFunctionData()
+{
+    printf ("total: %d\n", ffunc.pos);
+    for(int i=0; i<ffunc.pos; i++ ) {
+        printf ("%d, %d\n", ffunc.x[i], ffunc.t[i]);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/files.h	Wed May 09 11:01:18 2018 +0000
@@ -0,0 +1,21 @@
+#ifndef MY_FILES_H
+#define MY_FILES_H
+
+#define DIR_UP      0
+#define DIR_DOWN    1
+
+typedef struct{
+    int x[10];
+    int t[10];
+    int pos;
+}Function;
+
+int initSDCard();
+int readFileNames();
+int navFunctionFiles(int direction);
+int openFunctionFile(int inpFile);
+void printFunctionData();
+
+
+
+#endif
--- a/main.cpp	Mon May 07 21:28:03 2018 +0000
+++ b/main.cpp	Wed May 09 11:01:18 2018 +0000
@@ -3,16 +3,11 @@
 #include "USBSerial.h"
 #include "Default.h"
 #include "DefaultRequired.h"
-
-#if (MBED_MAJOR_VERSION == 2)
-#include    "SDFileSystem.h"
-#elif (MBED_MAJOR_VERSION == 5)
-#include    "SDBlockDevice.h"
-#include    "FATFileSystem.h"
-#endif
-
-#include    <stdlib.h>
+#include  <stdlib.h>
 #include "main.h"
+#include "files.h"
+#include "IMU.h"
+#include "RTClock.h"
 
 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
 Serial _serialport(USBTX,USBRX);
@@ -21,17 +16,8 @@
 
 DigitalOut rLED(LED1);
 DigitalOut gLED(LED2);
-DigitalOut bLED(LED3);
 
 
-#if (MBED_MAJOR_VERSION == 2)
-SDFileSystem    sd(D11, D12, D13, D10, "fs");  // do,di,clk,cs
-#elif (MBED_MAJOR_VERSION == 5)
-//SDBlockDevice   sd(D11, D12, D13, D10, 8000000);
-SDBlockDevice   sd(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS, 8000000);    // For MAX32630FTHR
-FATFileSystem   fs("fs");
-#endif
-
 void Rx_interrupt(void);
 
 Default default_SM;
@@ -44,40 +30,32 @@
     _serialport.attach(&Rx_interrupt);
     gLED = LED_ON;
     rLED = LED_ON;
-    
-    _serialport.printf("in main\r\n");
-    _serialport.printf("before init\r\n");
-    
-#if (MBED_MAJOR_VERSION == 5)
-    /* Init SD CARD reader */
-    sd.init();
-    fs.mount(&sd);
-#endif
-    FILE* fp = fopen("/fs/somefile.txt", "a");
-    if (fp != 0) 
-    {
-        _serialport.printf("writing adasda\n\r\n");
-        fprintf(fp,"writing asdasdasd\n\r\n");
-    } else 
-    {
-        _serialport.printf("ERROR\r\n");
+
+
+//    _serialport.printf("before init\r\n");
+
+    if(initSDCard() == 0) {
+        _serialport.printf("SD init OK!\n");
     }
-    fclose(fp);
-    
-    
+
+    if(initIMU() == 0) {
+        _serialport.printf("IMU init OK!\n");
+    }
+
+    //readFileNames();
+    //initRTC();
+
     /* initialize state machine*/
     default_init(&default_SM);
     default_enter(&default_SM);
     is_smactive = false;
-    
-    while(1) 
-    {
-        if(is_smactive == true)
-        {
-           // _serialport.printf("state active\n");
+
+    while(1) {
+        if(is_smactive == true) {
+            // _serialport.printf("state active\n");
             is_smactive = false;
-            default_runCycle(&default_SM);  
-        }  
+            default_runCycle(&default_SM);
+        }
     }
 }
 
@@ -93,31 +71,31 @@
             break;
 
         case 'Q':
-            _serialport.printf("Q");
+            // _serialport.printf("Q");
             defaultIface_raise_mode(&default_SM);
             is_smactive = true;
             break;
 
         case 'W':
-            _serialport.printf("W ");
+            //_serialport.printf("W ");
             defaultIface_raise_up(&default_SM);
             is_smactive = true;
             break;
 
         case 'E':
-            _serialport.printf("E ");
+            //_serialport.printf("E ");
             defaultIface_raise_down(&default_SM);
             is_smactive = true;
             break;
 
         case 'R':
-            _serialport.printf("R ");
+            //_serialport.printf("R ");
             defaultIface_raise_back(&default_SM);
             is_smactive = true;
             break;
 
         case 'T':
-            _serialport.printf("T ");
+            //_serialport.printf("T ");
             defaultIface_raise_home(&default_SM);
             is_smactive = true;
             break;
@@ -127,46 +105,45 @@
 
 void PrintStatus_Serial(int val )
 {
-    switch(val)
-    {
+    switch(val) {
         case 1:
-        _serialport.printf("Menu Selected\n");
-        break;
-        
+            _serialport.printf("Menu ");
+            break;
+
         case 2:
-        _serialport.printf("function \n");
-        break;
-        
+            _serialport.printf("function ");
+            break;
+
         case 3:
-        _serialport.printf("execute\n");
-        break;
-        
+            _serialport.printf("execute ");
+            break;
+
         case 4:
-        _serialport.printf("ready\n");
-        break;
-        
+            _serialport.printf("ready\n");
+            break;
+
         case 5:
-        _serialport.printf("active\n");
-        break;
-        
+            _serialport.printf("active\n");
+            break;
+
         case 6:
-        _serialport.printf("alarm\n");
-        break;
-        
-         case 7:
-        _serialport.printf("move down act\n");
-        break;
-        
-         case 8:
-        _serialport.printf("move up act\n");
-        break;
-        
+            _serialport.printf("alarm\n");
+            break;
+
+        case 7:
+            _serialport.printf("move down act\n");
+            break;
+
+        case 8:
+            _serialport.printf("move up act\n");
+            break;
+
         case 9:
-        _serialport.printf("return\n");
-        break;
-        
+            _serialport.printf("return\n");
+            break;
+
         default:
-        break;
+            break;
     }
 
-    }
+}
--- a/main.h	Mon May 07 21:28:03 2018 +0000
+++ b/main.h	Wed May 09 11:01:18 2018 +0000
@@ -1,9 +1,54 @@
 #include <string.h>
 #include "sc_types.h"
+#include    "max32630fthr.h"
+#include    <stdlib.h>
+#include "bmi160.h"
+#include "files.h"
+
+/*extern MAX32630FTHR pegasus;
+extern Serial _serialport;
+extern DigitalOut LED;
+extern DigitalOut Ctrl;
+
+extern DigitalOut rLED;
+extern DigitalOut gLED;*/
+//typedef struct {
+//    int x[10];
+//    int t[10];
+//    int pos;
+//} Function;
+
+
+// extern Maxim maxim;
+extern I2C i2cBus;
+extern BMI160_I2C imu;
+
+//extern variables here
+extern int functionFileNumber;
+extern Function ffunc;
+extern int functionActive;
+extern int functionPosition;
+extern time_t timealarm;
+
+#if (MBED_MAJOR_VERSION == 2)
+#include    "SDFileSystem.h"
+#elif (MBED_MAJOR_VERSION == 5)
+#include    "SDBlockDevice.h"
+#include    "FATFileSystem.h"
+#endif
+
+#if (MBED_MAJOR_VERSION == 2)
+extern SDFileSystem    sd;  // do,di,clk,cs
+#elif (MBED_MAJOR_VERSION == 5)
+//SDBlockDevice   sd(D11, D12, D13, D10, 8000000);
+extern SDBlockDevice   sd;    // For MAX32630FTHR
+extern FATFileSystem   fs;
+#endif
+
 
 /*Global variable*/
 extern bool is_smactive;
 
 /*function declaration*/
 
-extern void PrintStatus_Serial(int val );
\ No newline at end of file
+extern void PrintStatus_Serial(int val );
--- a/mbed-os.lib	Mon May 07 21:28:03 2018 +0000
+++ b/mbed-os.lib	Wed May 09 11:01:18 2018 +0000
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/mbed-os/#78474a5129e18e136cc7e872adbaa5b74fbb8f6a
+https://github.com/ARMmbed/mbed-os/#ae6c7c60f91c89cbf755a2f3c8ec9c66635849fd