This is the assessment project

Dependencies:   C12832 FXOS8700Q LM75B mbed

Fork of app-shield-LM75B by Chris Styles

core.cpp

Committer:
co838_am2073
Date:
2016-02-22
Revision:
10:5cf5a731af73
Parent:
9:b14eedf2e34b

File content as of revision 10:5cf5a731af73:

#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, m_updateRate);
}

void Core::update()
{
    m_lcd.cls();
    (this->*m_states[m_mode])();
    float rateValue = (float)m_potentiometerLeft * 10;
    writeText("Update rate: %1.1fs", 0, 21, rateValue);
    // update rate if modified
    if (m_updateRate != rateValue)
    {
        m_updateRate = rateValue;
        m_stateTicker.detach();
        m_stateTicker.attach(this, &Core::updateStateTrigger, m_updateRate);
    }
    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.1f Y=%4.1f Z=%4.1f\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.1f Y=%4.1f Z=%4.1f\n", 0, 12, data.x, data.y, data.z);
}