Own fork of MbedSmartRestMain

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Cumulocity Official

io/DeviceFeedback.cpp

Committer:
xinlei
Date:
2015-03-20
Revision:
90:423177e8a401
Parent:
78:bf32dfe6c47f
Child:
92:0acd11870c6a

File content as of revision 90:423177e8a401:

#include "DeviceFeedback.h"
#include <stdlib.h>
#include <string.h>

#define MSG_BEEP_SUCCESS 1
#define MSG_BEEP_FAILURE 2
#define MSG_CLOSE_RELAY 3
#define MSG_OPEN_RELAY 4

DeviceFeedback::DeviceFeedback() :
    _speaker(D6),
//    _thread(DeviceFeedback::thread_func, this),
    shieldLEDRed(D5),
    shieldLEDBlue(D8),
    shieldLEDGreen(D9)
{
    shieldLEDRed = 255;
    shieldLEDBlue = 255;
    shieldLEDGreen = 255;
}

void DeviceFeedback::beepSuccess()
{
    sendMessage(MSG_BEEP_SUCCESS);
}

void DeviceFeedback::beepFailure()
{
    sendMessage(MSG_BEEP_FAILURE);
}

void DeviceFeedback::closeRelay()
{
    shieldLEDRed = 255;
    shieldLEDBlue = 255;
    shieldLEDGreen = 0;
//    sendMessage(MSG_CLOSE_RELAY);
}

void DeviceFeedback::openRelay()
{
    shieldLEDRed = 255;
    shieldLEDBlue = 255;
    shieldLEDGreen = 255;
//    sendMessage(MSG_OPEN_RELAY);
}

void DeviceFeedback::sendMessage(uint8_t msg)
{
    uint8_t *msgPtr = _mail.alloc();
    *msgPtr = msg;
    _mail.put(msgPtr);
}

void DeviceFeedback::thread()
{
    osEvent evt; uint8_t *msg;
    bool relayState = false;

    while (true) {
        if ((evt = _mail.get(1000)).status == osEventMail) {
            msg = (uint8_t*)evt.value.p;
            switch (*msg) {
            case MSG_BEEP_SUCCESS:
                for (float i=2000.0; i<10000.0; i+=2000.0) {
                    _speaker.period(1.0/i);
                    _speaker = 0.5;
                    Thread::wait(200);
                    _speaker = 0.0;
                    Thread::wait(50);
                }
                break;
            case MSG_BEEP_FAILURE:
                for (float i=10000.0; i>2000.0; i-=2000.0) {
                    _speaker.period(1.0/i);
                    _speaker = 0.5;
                    Thread::wait(200);
                    _speaker = 0.0;
                    Thread::wait(50);
                }
                break;
            case MSG_CLOSE_RELAY:
                relayState = true;
//                if (!relayState) {
//                    for (float i=2000.0; i<10000.0; i+=100) {
//                        _speaker.period(1.0/i);
//                        _speaker = 0.5;
//                        Thread::wait(20);
//                    }
//                    _speaker = 0.0;
//                }
                break;
            case MSG_OPEN_RELAY:
                relayState = false;
//                if (relayState) {
//                    for (float i=10000.0; i>2000.0; i-=100) {
//                        _speaker.period(1.0/i);
//                        _speaker = 0.5;
//                        Thread::wait(20);
//                    }
//                    _speaker = 0.0;
//                }
                break;
            }
            _mail.free(msg);
        }

//        if (relayState) {
//            _speaker.period(1.0/10000);
//            _speaker = 0.5;
//            Thread::wait(20);
//            _speaker = 0.0;
//        }
    }
}

void DeviceFeedback::thread_func(void const *arg)
{
    DeviceFeedback *that;
    that = (DeviceFeedback*)arg;
    that->thread();
}