This is the assessment project
Dependencies: C12832 FXOS8700Q LM75B mbed
Fork of app-shield-LM75B by
core.cpp@10:5cf5a731af73, 2016-02-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |