This is the assessment project

Dependencies:   C12832 FXOS8700Q LM75B mbed

Fork of app-shield-LM75B by Chris Styles

Files at this revision

API Documentation at this revision

Comitter:
co838_am2073
Date:
Mon Feb 22 08:26:43 2016 +0000
Parent:
8:e0f3f151c3cc
Child:
10:5cf5a731af73
Commit message:
First stable version

Changed in this revision

FXOS8700Q.lib Show annotated file Show diff for this revision Revisions of this file
LM75B.lib Show annotated file Show diff for this revision Revisions of this file
core.cpp Show annotated file Show diff for this revision Revisions of this file
core.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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FXOS8700Q.lib	Mon Feb 22 08:26:43 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Freescale/code/FXOS8700Q/#aee7dea904e2
--- a/LM75B.lib	Fri Aug 01 14:29:15 2014 +0000
+++ b/LM75B.lib	Mon Feb 22 08:26:43 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/neilt6/code/LM75B/#fc27dc535ea9
+http://mbed.org/users/neilt6/code/LM75B/#7ac462ba84ac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core.cpp	Mon Feb 22 08:26:43 2016 +0000
@@ -0,0 +1,120 @@
+#include "core.h"
+#define M_PI 3.14159265358979323846
+
+// Tickers
+
+void Core::optTrigger()
+{
+    m_optTrigger = !m_optTrigger;
+}
+
+void Core::nextTrigger()
+{
+    nextMode();
+}
+
+void Core::updateStateTrigger() {/* Used only to interrupt sleep */}
+
+// End tickers
+
+void Core::nextMode()
+{
+    m_mode = static_cast<Mode>(((int)m_mode + 1) % MODES_COUNT);
+    m_accelerometer.disable();
+    m_magnetometer.disable();
+    m_stateEntred = false;
+}
+
+void Core::init()
+{
+    writeText("Init...", 0, 3);
+    // Init states
+    m_states[Temperature] = &Core::stateTemperature;
+    m_states[Accelerometer] = &Core::stateAccelerometer;
+    m_states[Magnetometer] = &Core::stateMagnetometer;
+    
+    // Init buttons
+    m_btnOpt.mode(PullUp);
+    m_btnOpt.fall(this, &Core::optTrigger);
+    
+    m_btnNext.mode(PullUp);
+    m_btnNext.fall(this, &Core::nextTrigger);
+    
+    m_stateTicker.attach(this, &Core::updateStateTrigger, 1);
+}
+
+
+void Core::update()
+{
+    m_lcd.cls();
+    (this->*m_states[m_mode])();
+    sleep();
+}
+
+void Core::setLedColor(float red, float green, float blue)
+{
+    m_ledR = red;
+    m_ledG = green;
+    m_ledB = blue;
+}
+
+void Core::writeText(const char* format, int x, int y, ...)
+{
+    char buffer[strlen(format) + 32];
+    
+    // Using va_list to set arguments like a printf
+    va_list args;
+    va_start(args, y);
+    vsprintf(buffer, format, args);
+    va_end(args);
+    
+    // Setting location and writing on screen
+    m_lcd.locate(x, y);
+    m_lcd.printf(buffer);
+}
+
+// STATES
+
+void Core::stateTemperature()
+{
+    char type;
+    float temp;
+    
+    if (m_optTrigger) {
+        type = 'F';
+        temp = m_temperature.temp() * 9 / 5 + 32;
+    } else {
+        type = 'C';
+        temp = m_temperature.temp();
+    }
+    writeText("Temperature\n", 35, 3);
+    writeText("%1.f %c\n", 56, 12, temp, type);
+}
+
+void Core::stateAccelerometer()
+{
+    motion_data_units_t data;
+    
+    if (!m_stateEntred)
+    {
+        m_stateEntred = true;
+        m_accelerometer.enable();
+    }
+    m_accelerometer.getAxis(data);
+    writeText("Accelerometer\n", 33, 3);
+    writeText("X=%4.1ff Y=%4.1ff Z=%4.1ff\r\n", 0, 12, data.x, data.y, data.z);
+}
+
+void Core::stateMagnetometer()
+{
+    motion_data_units_t data;
+    
+    if (!m_stateEntred)
+    {
+        m_stateEntred = true;
+        m_magnetometer.enable();
+    }
+    m_magnetometer.getAxis(data);
+    writeText("Magnetometer\n", 33, 3);
+    writeText("X=%4.1ff Y=%4.1ff Z=%4.1ff\r\n", 0, 12, data.x, data.y, data.z);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core.h	Mon Feb 22 08:26:43 2016 +0000
@@ -0,0 +1,85 @@
+#ifndef CORE_H_
+#define CORE_H_
+
+#include <stdarg.h>
+#include "mbed.h"
+#include "LM75B.h" // temperature
+#include "C12832.h" // lcd
+#include "FXOS8700Q.h" // accelerometer
+
+#define MODES_COUNT 3
+#define SCREEN_REFRESH_VALUE 1
+
+class Core {
+    public:
+        Core() :
+                m_mode(Temperature),
+                m_ledR(D5),
+                m_ledG(D8),
+                m_ledB(D9),
+                m_lcd(D11, D13, D12, D7, D10),
+                m_temperature(D14, D15),
+                m_btnNext(PTC6),
+                m_btnOpt(PTA4),
+                m_optTrigger(false),
+                m_i2c(PTE25, PTE24),
+                m_accelerometer(m_i2c, FXOS8700CQ_SLAVE_ADDR1),
+                m_magnetometer(m_i2c, FXOS8700CQ_SLAVE_ADDR1),
+                m_stateEntred(false)
+                {}
+        virtual ~Core() {}
+        enum Mode {
+            Temperature = 0,
+            Accelerometer,
+            Magnetometer
+        };
+    
+    public:
+        /**
+        * Switch to next mode
+        */
+        void nextMode();
+        /**
+        * Init devices
+        */
+        void init();
+        /**
+        * Update datas (called on each "frame")
+        */
+        void update();
+        
+    private:
+        void setLedColor(float red, float green, float blue);
+        void writeText(const char* text, int x, int y, ...);
+        
+    // Triggers
+    private:
+        void optTrigger();
+        void nextTrigger();
+        void updateStateTrigger();
+        
+    // States
+    private:
+        void stateTemperature();
+        void stateAccelerometer();
+        void stateMagnetometer();
+    
+    private:
+        volatile Mode m_mode;
+        PwmOut m_ledR;
+        PwmOut m_ledG;
+        PwmOut m_ledB;
+        C12832 m_lcd;
+        LM75B m_temperature;
+        InterruptIn m_btnNext;
+        InterruptIn m_btnOpt;
+        void (Core::*m_states[MODES_COUNT])();
+        volatile bool m_optTrigger;
+        Ticker m_stateTicker;
+        I2C m_i2c;
+        FXOS8700QAccelerometer m_accelerometer;
+        FXOS8700QMagnetometer m_magnetometer;
+        bool m_stateEntred;
+};
+
+#endif /* !CORE_H_ */
\ No newline at end of file
--- a/main.cpp	Fri Aug 01 14:29:15 2014 +0000
+++ b/main.cpp	Mon Feb 22 08:26:43 2016 +0000
@@ -1,17 +1,11 @@
-#include "mbed.h"
-#include "LM75B.h"
-#include "C12832.h"
-
-// Using Arduino pin notation
-C12832 lcd(D11, D13, D12, D7, D10);
-LM75B sensor(D14,D15);
+#include "core.h"
 
 int main ()
 {
-    while (1) {
-        lcd.cls();
-        lcd.locate(0,3);
-        lcd.printf("Temp = %.1f\n", sensor.temp());
-        wait(1.0);
+    Core core;
+    core.init();
+    while (true)
+    {
+        core.update();
     }
 }
--- a/mbed.bld	Fri Aug 01 14:29:15 2014 +0000
+++ b/mbed.bld	Mon Feb 22 08:26:43 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/6213f644d804
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/252557024ec3
\ No newline at end of file