This is the assessment project
Dependencies: C12832 FXOS8700Q LM75B mbed
Fork of app-shield-LM75B by
Revision 9:b14eedf2e34b, committed 2016-02-22
- 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
--- /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