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
diff -r 769c5a7b3939 -r bd223559f79b BMI160.lib
--- /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
diff -r 769c5a7b3939 -r bd223559f79b IMU.cpp
--- /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");
+    }
+}
+ 
diff -r 769c5a7b3939 -r bd223559f79b IMU.h
--- /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
diff -r 769c5a7b3939 -r bd223559f79b RTC.lib
--- /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
diff -r 769c5a7b3939 -r bd223559f79b RTClock.cpp
--- /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);
+
+}
diff -r 769c5a7b3939 -r bd223559f79b RTClock.h
--- /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
diff -r 769c5a7b3939 -r bd223559f79b files.cpp
--- /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]);
+    }
+}
+
diff -r 769c5a7b3939 -r bd223559f79b files.h
--- /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
diff -r 769c5a7b3939 -r bd223559f79b main.cpp
--- 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;
     }
 
-    }
+}
diff -r 769c5a7b3939 -r bd223559f79b main.h
--- 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 );
diff -r 769c5a7b3939 -r bd223559f79b mbed-os.lib
--- 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