This is the assessment project

Dependencies:   C12832 FXOS8700Q LM75B mbed

Fork of app-shield-LM75B by Chris Styles

Committer:
co838_am2073
Date:
Mon Feb 22 09:03:00 2016 +0000
Revision:
10:5cf5a731af73
Parent:
9:b14eedf2e34b
More options, update rate controll, and comments in code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
co838_am2073 9:b14eedf2e34b 1 #include "core.h"
co838_am2073 9:b14eedf2e34b 2 #define M_PI 3.14159265358979323846
co838_am2073 9:b14eedf2e34b 3
co838_am2073 9:b14eedf2e34b 4 // Tickers
co838_am2073 9:b14eedf2e34b 5
co838_am2073 9:b14eedf2e34b 6 void Core::optTrigger()
co838_am2073 9:b14eedf2e34b 7 {
co838_am2073 9:b14eedf2e34b 8 m_optTrigger = !m_optTrigger;
co838_am2073 9:b14eedf2e34b 9 }
co838_am2073 9:b14eedf2e34b 10
co838_am2073 9:b14eedf2e34b 11 void Core::nextTrigger()
co838_am2073 9:b14eedf2e34b 12 {
co838_am2073 9:b14eedf2e34b 13 nextMode();
co838_am2073 9:b14eedf2e34b 14 }
co838_am2073 9:b14eedf2e34b 15
co838_am2073 9:b14eedf2e34b 16 void Core::updateStateTrigger() {/* Used only to interrupt sleep */}
co838_am2073 9:b14eedf2e34b 17
co838_am2073 9:b14eedf2e34b 18 // End tickers
co838_am2073 9:b14eedf2e34b 19
co838_am2073 9:b14eedf2e34b 20 void Core::nextMode()
co838_am2073 9:b14eedf2e34b 21 {
co838_am2073 9:b14eedf2e34b 22 m_mode = static_cast<Mode>(((int)m_mode + 1) % MODES_COUNT);
co838_am2073 9:b14eedf2e34b 23 m_accelerometer.disable();
co838_am2073 9:b14eedf2e34b 24 m_magnetometer.disable();
co838_am2073 9:b14eedf2e34b 25 m_stateEntred = false;
co838_am2073 9:b14eedf2e34b 26 }
co838_am2073 9:b14eedf2e34b 27
co838_am2073 9:b14eedf2e34b 28 void Core::init()
co838_am2073 9:b14eedf2e34b 29 {
co838_am2073 9:b14eedf2e34b 30 writeText("Init...", 0, 3);
co838_am2073 9:b14eedf2e34b 31 // Init states
co838_am2073 9:b14eedf2e34b 32 m_states[Temperature] = &Core::stateTemperature;
co838_am2073 9:b14eedf2e34b 33 m_states[Accelerometer] = &Core::stateAccelerometer;
co838_am2073 9:b14eedf2e34b 34 m_states[Magnetometer] = &Core::stateMagnetometer;
co838_am2073 9:b14eedf2e34b 35
co838_am2073 9:b14eedf2e34b 36 // Init buttons
co838_am2073 9:b14eedf2e34b 37 m_btnOpt.mode(PullUp);
co838_am2073 9:b14eedf2e34b 38 m_btnOpt.fall(this, &Core::optTrigger);
co838_am2073 9:b14eedf2e34b 39
co838_am2073 9:b14eedf2e34b 40 m_btnNext.mode(PullUp);
co838_am2073 9:b14eedf2e34b 41 m_btnNext.fall(this, &Core::nextTrigger);
co838_am2073 9:b14eedf2e34b 42
co838_am2073 10:5cf5a731af73 43 m_stateTicker.attach(this, &Core::updateStateTrigger, m_updateRate);
co838_am2073 9:b14eedf2e34b 44 }
co838_am2073 9:b14eedf2e34b 45
co838_am2073 9:b14eedf2e34b 46 void Core::update()
co838_am2073 9:b14eedf2e34b 47 {
co838_am2073 9:b14eedf2e34b 48 m_lcd.cls();
co838_am2073 9:b14eedf2e34b 49 (this->*m_states[m_mode])();
co838_am2073 10:5cf5a731af73 50 float rateValue = (float)m_potentiometerLeft * 10;
co838_am2073 10:5cf5a731af73 51 writeText("Update rate: %1.1fs", 0, 21, rateValue);
co838_am2073 10:5cf5a731af73 52 // update rate if modified
co838_am2073 10:5cf5a731af73 53 if (m_updateRate != rateValue)
co838_am2073 10:5cf5a731af73 54 {
co838_am2073 10:5cf5a731af73 55 m_updateRate = rateValue;
co838_am2073 10:5cf5a731af73 56 m_stateTicker.detach();
co838_am2073 10:5cf5a731af73 57 m_stateTicker.attach(this, &Core::updateStateTrigger, m_updateRate);
co838_am2073 10:5cf5a731af73 58 }
co838_am2073 9:b14eedf2e34b 59 sleep();
co838_am2073 9:b14eedf2e34b 60 }
co838_am2073 9:b14eedf2e34b 61
co838_am2073 9:b14eedf2e34b 62 void Core::setLedColor(float red, float green, float blue)
co838_am2073 9:b14eedf2e34b 63 {
co838_am2073 9:b14eedf2e34b 64 m_ledR = red;
co838_am2073 9:b14eedf2e34b 65 m_ledG = green;
co838_am2073 9:b14eedf2e34b 66 m_ledB = blue;
co838_am2073 9:b14eedf2e34b 67 }
co838_am2073 9:b14eedf2e34b 68
co838_am2073 9:b14eedf2e34b 69 void Core::writeText(const char* format, int x, int y, ...)
co838_am2073 9:b14eedf2e34b 70 {
co838_am2073 9:b14eedf2e34b 71 char buffer[strlen(format) + 32];
co838_am2073 9:b14eedf2e34b 72
co838_am2073 9:b14eedf2e34b 73 // Using va_list to set arguments like a printf
co838_am2073 9:b14eedf2e34b 74 va_list args;
co838_am2073 9:b14eedf2e34b 75 va_start(args, y);
co838_am2073 9:b14eedf2e34b 76 vsprintf(buffer, format, args);
co838_am2073 9:b14eedf2e34b 77 va_end(args);
co838_am2073 9:b14eedf2e34b 78
co838_am2073 9:b14eedf2e34b 79 // Setting location and writing on screen
co838_am2073 9:b14eedf2e34b 80 m_lcd.locate(x, y);
co838_am2073 9:b14eedf2e34b 81 m_lcd.printf(buffer);
co838_am2073 9:b14eedf2e34b 82 }
co838_am2073 9:b14eedf2e34b 83
co838_am2073 9:b14eedf2e34b 84 // STATES
co838_am2073 9:b14eedf2e34b 85
co838_am2073 9:b14eedf2e34b 86 void Core::stateTemperature()
co838_am2073 9:b14eedf2e34b 87 {
co838_am2073 9:b14eedf2e34b 88 char type;
co838_am2073 9:b14eedf2e34b 89 float temp;
co838_am2073 9:b14eedf2e34b 90
co838_am2073 9:b14eedf2e34b 91 if (m_optTrigger) {
co838_am2073 9:b14eedf2e34b 92 type = 'F';
co838_am2073 9:b14eedf2e34b 93 temp = m_temperature.temp() * 9 / 5 + 32;
co838_am2073 9:b14eedf2e34b 94 } else {
co838_am2073 9:b14eedf2e34b 95 type = 'C';
co838_am2073 9:b14eedf2e34b 96 temp = m_temperature.temp();
co838_am2073 9:b14eedf2e34b 97 }
co838_am2073 9:b14eedf2e34b 98 writeText("Temperature\n", 35, 3);
co838_am2073 9:b14eedf2e34b 99 writeText("%1.f %c\n", 56, 12, temp, type);
co838_am2073 9:b14eedf2e34b 100 }
co838_am2073 9:b14eedf2e34b 101
co838_am2073 9:b14eedf2e34b 102 void Core::stateAccelerometer()
co838_am2073 9:b14eedf2e34b 103 {
co838_am2073 9:b14eedf2e34b 104 motion_data_units_t data;
co838_am2073 9:b14eedf2e34b 105
co838_am2073 9:b14eedf2e34b 106 if (!m_stateEntred)
co838_am2073 9:b14eedf2e34b 107 {
co838_am2073 9:b14eedf2e34b 108 m_stateEntred = true;
co838_am2073 9:b14eedf2e34b 109 m_accelerometer.enable();
co838_am2073 9:b14eedf2e34b 110 }
co838_am2073 9:b14eedf2e34b 111 m_accelerometer.getAxis(data);
co838_am2073 9:b14eedf2e34b 112 writeText("Accelerometer\n", 33, 3);
co838_am2073 10:5cf5a731af73 113 writeText("X=%4.1f Y=%4.1f Z=%4.1f\n", 0, 12, data.x, data.y, data.z);
co838_am2073 9:b14eedf2e34b 114 }
co838_am2073 9:b14eedf2e34b 115
co838_am2073 9:b14eedf2e34b 116 void Core::stateMagnetometer()
co838_am2073 9:b14eedf2e34b 117 {
co838_am2073 9:b14eedf2e34b 118 motion_data_units_t data;
co838_am2073 9:b14eedf2e34b 119
co838_am2073 9:b14eedf2e34b 120 if (!m_stateEntred)
co838_am2073 9:b14eedf2e34b 121 {
co838_am2073 9:b14eedf2e34b 122 m_stateEntred = true;
co838_am2073 9:b14eedf2e34b 123 m_magnetometer.enable();
co838_am2073 9:b14eedf2e34b 124 }
co838_am2073 9:b14eedf2e34b 125 m_magnetometer.getAxis(data);
co838_am2073 9:b14eedf2e34b 126 writeText("Magnetometer\n", 33, 3);
co838_am2073 10:5cf5a731af73 127 writeText("X=%4.1f Y=%4.1f Z=%4.1f\n", 0, 12, data.x, data.y, data.z);
co838_am2073 9:b14eedf2e34b 128 }