base code for beer_project

Dependencies:   mbed tsi_sensor FreescaleIAP MMA8451Q MPL3115A2

Files at this revision

API Documentation at this revision

Comitter:
martlefebvre94
Date:
Mon Nov 12 22:13:57 2018 +0000
Child:
1:3a57bceb88f8
Commit message:
Code for the 2018 project

Changed in this revision

FreescaleIAP.lib Show annotated file Show diff for this revision Revisions of this file
MMA8451Q.lib Show annotated file Show diff for this revision Revisions of this file
MPL3115A2.lib 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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
tsi_sensor.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FreescaleIAP.lib	Mon Nov 12 22:13:57 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Sissors/code/FreescaleIAP/#186db0d96fcf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA8451Q.lib	Mon Nov 12 22:13:57 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/LELEC2811-IS/code/MMA8451Q/#51c9ede6bb48
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPL3115A2.lib	Mon Nov 12 22:13:57 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/clemente/code/MPL3115A2/#82ac06669316
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Nov 12 22:13:57 2018 +0000
@@ -0,0 +1,405 @@
+/*******************************************************/ 
+/**** LELEC_2811  Multiple sensors logger            ***/
+/**** P. Gerard UCL     23/11/2016                   ***/
+/**** M. Lefebvre UCL   09/11/2018                   ***/
+/*******************************************************/ 
+
+#include "mbed.h"
+#include "FreescaleIAP.h"   // Library for Flash access
+#include "MMA8451Q.h"       // Accelerometer
+#include "MPL3115A2.h"      // Library for altimeter/temperature access
+
+#define KL25Z_VDD 2.7       // !!! Value of supply voltage VDD: To be measured on board KL25Z pin 3V3 (calibration)
+
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+#define FSR                     0x02    // 0x00 for 2G, 0x01 for 4G, 0x02 for 8G
+#define REG_OUT_X_MSB           0x01
+#define REG_OUT_Y_MSB           0x03
+#define REG_OUT_Z_MSB           0x05
+
+#define MPL3115A2_I2C_ADDRESS (0x60<<1)
+#define REG_ALTIMETER_MSB       0x01
+
+#define DISABLE_STATE           0
+#define ENABLE_STATE            1
+
+#define NO_JUMPER               0
+#define JUMPER_PRESENT          1
+
+#define LEVEL_0                 0
+#define LEVEL_1                 1
+
+#define LED_ON                  0
+#define LED_OFF                 1
+
+#define FLASH_NO_ACQ_DONE       0
+#define FLASH_ACQ_DONE          1
+#define ERASE_FLASH_ERROR       -1
+#define WRITE_FLASH_ERROR       -2
+
+#define SECTOR_SIZE             1024
+#define RESERVED_SECTOR         32
+
+#define ACQ_TIMER_PERIOD        0.010   // Time between 2 acquisitions in seconds
+
+// Structure of sensors Data !!!!! SIZE MUST BE A MULTIPLE OF 4 bytes !!!!!
+typedef struct{
+    int16_t Accel_X;                // 2 bytes
+    int16_t Accel_Y;                // 2 bytes
+    int16_t Accel_Z;                // 2 bytes
+    float Temperature;              // 4 bytes
+    unsigned short Analog_PTE20;    // 2 bytes
+    unsigned short Analog_PTE21;    // 2 bytes
+    unsigned short Analog_PTE22;    // 2 bytes
+} Sensor_Data;                      // TOTAL = 16 bytes 
+
+// --- Setup I2C for MMA8451 accelerometer
+// --- The last argument is the full scale range (FSR). 0x00 for 2G, 0x01 for 4G, 0x02 for 8G
+MMA8451Q my8451(PTE25, PTE24, MMA8451_I2C_ADDRESS, FSR);
+DigitalOut Accel_Enable(PTA13);
+
+// --- Set temperature sensor
+MPL3115A2 myMPL3115(PTE0, PTE1, MPL3115A2_I2C_ADDRESS);
+
+// --- Set serial port (for communication with PC)
+Serial Host_Comm(USBTX, USBRX);
+
+// Analog inputs (ADCs)
+AnalogIn myPTE20(PTE20);
+AnalogIn myPTE21(PTE21);
+AnalogIn myPTE22(PTE22);
+
+// Analog output (DAC)
+AnalogOut myDAC(PTE30);
+
+// Digital outputs
+DigitalOut Led_Red(LED1);           // Define I/O for LEDs
+DigitalOut Led_Green(LED2);
+DigitalOut Led_Blue(LED3);
+DigitalOut Start_Pulse_Out(PTC9);   // Used to enter/exit acquisition mode 
+DigitalIn  Start_Pulse_In(PTC11);   // Short pins J1_15 and J1_16 to enter in Acq_Mode
+
+// Global variables
+volatile bool bTimer;               // 1 means a timer tick is done
+Ticker myTick_Acq;                  // Periodical timer for acquisition
+
+int Flash_Base_Address = RESERVED_SECTOR * SECTOR_SIZE;     // Store Flash base address with 32K reserved for application code
+int Nb_Sector;
+uint32_t KL25_Flash_Size;
+
+// Functions declaration
+void Clear_Led(void);
+int Acquisition_Flash(void);
+int Read_Data_Logging(void);
+bool Check_Jumper(void);
+void myTimer_Acq_Task(void);
+void Acquisition_Task(void);
+void Read_Task(void);
+extern IAPCode verify_erased(int address, unsigned int length);
+
+int main() {
+    
+    uint8_t Count;                                          // Count defining the number of time the LED blinks before data acquisition
+    
+    // Set DAC output voltage
+    float vdac;
+    uint16_t dac_value;                                     // Local variable in 16 bits
+     
+    vdac = 0.3;                                             // Voltage output value
+    dac_value = (uint16_t) ((vdac * 65536) / KL25Z_VDD);    // Transform desired voltage to fraction of 0xFFFF 
+    myDAC.write_u16(dac_value);                             // DAC value in range 0x0000 - 0xFFFF (see mbed's AnalogOut classe ref.)
+    
+    Start_Pulse_In.mode(PullNone);                          // Input pin is programmed as floating
+    Accel_Enable = DISABLE_STATE;                           // Turn Accel. Enable I/O to disabled state
+ 
+// --- Baud rate setting
+    Host_Comm.baud(115200);
+    Clear_Led();
+    
+    KL25_Flash_Size = flash_size();                                 // Get size of KL25 embedded Flash
+    Nb_Sector = (KL25_Flash_Size / SECTOR_SIZE) - RESERVED_SECTOR;  // Reserve max 32K for app code
+    myTick_Acq.attach(&myTimer_Acq_Task, ACQ_TIMER_PERIOD);         // Initialize timer interrupt
+  
+    Host_Comm.printf("\n\rLELEC2811 Multiple sensors logger V2.0 UCL 2018\n\r");
+    
+    if ((sizeof(Sensor_Data) % 4) != 0)
+    {
+        Host_Comm.printf("\n\rERROR! Acquisition Data Structure size is NOT a multiple of 4!!! (%d)", sizeof(Sensor_Data));
+        for(;;);        
+    }
+      
+    myMPL3115.Oversample_Ratio(OVERSAMPLE_RATIO_4); 
+    myMPL3115.Barometric_Mode();                                    // Configure MPL3115 (used for temperature and pressure measurement)
+ 
+    for (;;)
+    {
+        if (Check_Jumper() == JUMPER_PRESENT)             
+        {
+            Clear_Led();
+            
+            Count = 5;
+            while (Count !=0)
+            {
+                if (Check_Jumper() == JUMPER_PRESENT)   
+                {
+                    Led_Blue = LED_ON;  // Blink to alert user "Enter in Acquisition" after 5 seconds
+                    wait_ms(900);
+                    Led_Blue = LED_OFF;
+                    wait_ms(100);
+                    Count --;
+                    if (Count == 0)
+                    {        
+                        Acquisition_Task();
+                    }
+                }
+                else
+                {
+                    Count = 0;
+                }
+            } 
+        }
+        else
+        {
+            Read_Task();         
+        }
+    }
+}
+    
+void Read_Task()
+{
+    char host_cmd;
+    IAPCode Flash_State;
+    bool bAcq_Done;
+    
+    Flash_State = verify_erased(Flash_Base_Address, KL25_Flash_Size - (RESERVED_SECTOR * SECTOR_SIZE)); 
+    if (Flash_State == 0) // Virgin Flash ?
+    {
+        bAcq_Done = 0;      
+    }
+    else
+    {
+        bAcq_Done = 1;
+    }     
+    
+    Clear_Led();
+    wait_ms(500);
+                
+    if (bAcq_Done == 1)
+    {
+        Led_Green = LED_ON;
+        Host_Comm.putc('1');
+    }
+    else
+    {
+        Led_Red = LED_ON;
+        Host_Comm.putc('0');
+    }
+           
+    if(Host_Comm.readable())                    // Did we receive a char from Host ?
+    {
+        host_cmd = Host_Comm.getc();            // Get it
+                  
+        if ((host_cmd == 'R') || (host_cmd == 'r')) // Read Flash Command ?
+        {    
+            Read_Data_Logging();                // Read and send acquisition data                   
+        }
+    }
+    wait_ms(50);          
+}
+
+void Acquisition_Task()
+{
+    int Acq_Status;
+               
+    Clear_Led();
+        
+    Acq_Status = Acquisition_Flash();
+
+    Clear_Led();
+    
+    while (Check_Jumper() == JUMPER_PRESENT)
+    {     
+        if (Acq_Status != FLASH_ACQ_DONE)
+        {
+            Led_Red = !Led_Red;
+        }
+        else
+        {
+           Led_Green = !Led_Green;            
+        }
+        wait_ms(100);
+    }
+}
+
+void Clear_Led(void)
+{
+    Led_Red = LED_OFF;
+    Led_Green = LED_OFF;
+    Led_Blue = LED_OFF;     // Bug on board : Turning on the blue LED decreases consumption...
+}
+
+bool Check_Jumper()         // If J1_15 and J1_16 connected together -> return JUMPER_PRESENT
+{
+    uint8_t i;
+    
+    for (i = 0 ; i < 2 ; i ++)
+    {
+        Start_Pulse_Out = LEVEL_1;
+        wait_ms(1);
+        if (Start_Pulse_In != LEVEL_1)
+        {
+            return NO_JUMPER;
+        }
+    
+        Start_Pulse_Out = LEVEL_0;
+        wait_ms(1);
+        if (Start_Pulse_In != LEVEL_0)
+        {
+            return NO_JUMPER;
+        }
+    }
+    return JUMPER_PRESENT;
+}
+
+int Acquisition_Flash(void)
+{
+    int Status;  
+    int Flash_Ptr ;
+    int Led_Counter;
+    Sensor_Data myData;  
+    
+/*** Erase all Flash Page **/          
+    for (Flash_Ptr = Flash_Base_Address ; Flash_Ptr < KL25_Flash_Size ; Flash_Ptr += 0x400)
+    {
+        Status = erase_sector(Flash_Ptr);   // Erase sector
+                 
+        if (Status !=0)
+        { 
+            return ERASE_FLASH_ERROR;
+        }    
+    }
+  
+    Flash_Ptr = Flash_Base_Address;         // Begin of Storage Area in Flash
+    
+    Led_Blue = LED_ON;
+    Led_Counter = 0;
+    
+/***** Begin of Loop Acquisition - Write in Flash ***/  
+
+    while (Flash_Ptr < (KL25_Flash_Size - sizeof(Sensor_Data)) )    // Acq Loop
+    {              
+        while (bTimer == 0)                                         // Wait Acq Tick Timer Done
+        {
+  
+        }
+        bTimer = 0;
+                   
+        if ((float) Led_Counter * ACQ_TIMER_PERIOD == 1.0)          // Blink at 1Hz
+        { 
+            Led_Counter = 0;
+            Led_Blue = !Led_Blue;
+        }
+        
+        Led_Counter++; 
+        
+        // Get accelerometer data        
+        Accel_Enable = ENABLE_STATE;                                // Rising edge -> Start accelerometer measurement
+  
+        myData.Accel_X = my8451.getAccAxis(REG_OUT_X_MSB);
+        myData.Accel_Y = my8451.getAccAxis(REG_OUT_Y_MSB);
+        myData.Accel_Z = my8451.getAccAxis(REG_OUT_Z_MSB);       
+        
+        Accel_Enable = DISABLE_STATE;
+        
+        // Get temperature value       
+        myData.Temperature = myMPL3115.getTemperature();     
+
+        // Get ADC values
+        myData.Analog_PTE20 = myPTE20.read_u16(); 
+        myData.Analog_PTE21 = myPTE21.read_u16();  
+        myData.Analog_PTE22 = myPTE22.read_u16();  
+        
+ /*** Save Data in Flash ***/   
+        Status = program_flash(Flash_Ptr, (char *) &myData, sizeof(Sensor_Data));   // Write in the Flash
+        if (Status != 0) 
+        {
+             Host_Comm.printf("\n\rFlash_Write Error = %d", Status); 
+             return WRITE_FLASH_ERROR;
+        }
+        Flash_Ptr += sizeof(Sensor_Data); 
+
+        if (Check_Jumper() != JUMPER_PRESENT)                       // If jumper removed -> Stop acquisition
+        {
+            return FLASH_ACQ_DONE ;   
+        }
+    }
+    
+    return FLASH_ACQ_DONE ;
+}
+
+int Read_Data_Logging()
+{  
+    Sensor_Data * data = (Sensor_Data * )Flash_Base_Address;    // Sensor_Data pointer of data stored in Flash
+    int Flash_Record_Ptr;
+    char cmd;
+    int Record_Counter;
+    int Max_Record;
+    Sensor_Data myRead_Data;                                    // Data Structure used to retrieve saved value from Flash
+    
+    float Voltage_PTE20;
+    float Voltage_PTE21;
+    float Voltage_PTE22;
+    
+    Clear_Led(); 
+  
+    Max_Record = (Nb_Sector * SECTOR_SIZE) / sizeof(Sensor_Data);
+    Record_Counter = 0;
+    Flash_Record_Ptr = 0;
+    
+    Host_Comm.printf("\n\rAccX AccY AccZ Temp PTE20 PTE21 PTE22");  
+     
+    while (Record_Counter < Max_Record) 
+    {         
+        Led_Green = !Led_Green;
+        Led_Blue = !Led_Green;
+        
+        if(Host_Comm.readable()) 
+        {
+            cmd = Host_Comm.getc();
+            if ((cmd == 'S') || (cmd == 's'))   // Receiving 'S' or 's' means stop Read Flash
+            {
+                Clear_Led(); 
+                return 0;    
+            }
+        }
+        
+        myRead_Data = data[Flash_Record_Ptr];
+        
+        Flash_Record_Ptr ++;
+                       
+        if ((myRead_Data.Accel_X == -1) && (myRead_Data.Accel_Y == -1) && (myRead_Data.Accel_Z == -1))  // Valid data ? (!= 0xFFFFFFFF from empty Flash sector)
+        {
+        }
+        else
+        {
+            Voltage_PTE20 = ((float) myRead_Data.Analog_PTE20 / 0XFFFF) * KL25Z_VDD;    // Convert to voltage
+            Voltage_PTE21 = ((float) myRead_Data.Analog_PTE21 / 0XFFFF) * KL25Z_VDD;          
+            Voltage_PTE22 = ((float) myRead_Data.Analog_PTE22 / 0XFFFF) * KL25Z_VDD;                 
+            
+            Host_Comm.printf("\n\r%d ", Record_Counter);
+            Host_Comm.printf("%d %d %d ", myRead_Data.Accel_X, myRead_Data.Accel_Y, myRead_Data.Accel_Z);
+            Host_Comm.printf("%1.2f ", myRead_Data.Temperature);
+            Host_Comm.printf("%1.3f %1.3f %1.3f ", Voltage_PTE20, Voltage_PTE21, Voltage_PTE22);               
+        }
+        
+        Record_Counter ++;
+    }
+    Clear_Led();
+    return 0;
+}
+
+/* Interrupt Task */
+void myTimer_Acq_Task() 
+{   
+    bTimer = 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Nov 12 22:13:57 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/0ab6a29f35bf
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsi_sensor.lib	Mon Nov 12 22:13:57 2018 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Kojto/code/tsi_sensor/#20ffa9b18488