Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mbed_mqtt_endpoint_ublox_ethernet mbed_mqtt_endpoint_ublox_cellular mbed_nsp_endpoint_ublox_cellular mbed_nsp_endpoint_ublox_ethernet ... more
ErrorHandler.cpp
- Committer:
- ansond
- Date:
- 2014-09-09
- Revision:
- 179:35e88daf2d75
- Parent:
- 160:24337c83dd1d
- Child:
- 180:eb43d5cd0ed7
File content as of revision 179:35e88daf2d75:
/* Copyright C2013 Doug Anson, MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files the "Software", to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "ErrorHandler.h"
#include "MBEDEndpoint.h"
#ifdef _ENDPOINT_UBLOX_PLATFORM
// Annunciations
DigitalOut led1(P3_25);
DigitalOut led2(P3_25);
DigitalOut led3(P3_25);
DigitalOut led4(P3_25);
// Multi-color LED support
PwmOut r(D5);
PwmOut g(D9);
PwmOut b(D8);
#endif
#ifdef _ENDPOINT_NXP_PLATFORM
// Annunciations
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
// Multi-color LED support
PwmOut r(p23);
PwmOut g(p24);
PwmOut b(p25);
#endif
#ifdef _ENDPOINT_FREEDOM_PLATFORM
// Annunciations
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
// Multi-color LED support
PwmOut r(p23);
PwmOut g(p24);
PwmOut b(p25);
#endif
// Memory statistics macro
#define ERROR_HANDLER_MEM_STATS(x) \
int s##x=0;\
int *h##x = new int [1];\
if (this->m_pc != NULL) this->m_pc->printf("\r\nMEMORY: stack: 0x%08x heap: 0x%08x avail: %d bytes\r\n", &s##x, h##x, &s##x-h##x);\
if (h##x > &s##x)\
error("collision\n");\
delete [] h##x;\
__nop();
// close down connections
extern void closedown(int code);
// default constructor
ErrorHandler::ErrorHandler(BufferedSerial *pc,LCDCLASS *lcd) {
this->m_pc = pc;
this->m_lcd = lcd;
this->m_status_lcd = false;
memset(this->m_message,0,MAX_LOG_MESSAGE+1);
#ifdef EH_USE_MUTEXES
this->m_mutex = NULL;
this->m_close_mutex = NULL;
this->m_led_mutex = NULL;
this->m_rgb_mutex = NULL;
this->m_mutex = new Mutex();
this->m_close_mutex = new Mutex();
this->m_led_mutex = new Mutex();
this->m_rgb_mutex = new Mutex();
this->releaseMutexes();
#endif
this->resetLEDs();
}
// default destructor
ErrorHandler::~ErrorHandler() {
#ifdef EH_USE_MUTEXES
this->releaseMutexes();
if (this->m_mutex != NULL) delete this->m_mutex;
if (this->m_close_mutex != NULL) delete this->m_close_mutex;
if (this->m_led_mutex != NULL) delete this->m_led_mutex;
if (this->m_rgb_mutex != NULL) delete this->m_rgb_mutex;
#endif
}
// enable LCD to only show summary status
void ErrorHandler::lcdStatusOnly(bool status_lcd) { this->m_status_lcd = status_lcd; }
#ifdef EH_USE_MUTEXES
// release all mutexes
void ErrorHandler::releaseMutexes() {
if (this->m_mutex != NULL) this->m_mutex->unlock();
if (this->m_close_mutex != NULL) this->m_close_mutex->unlock();
if (this->m_led_mutex != NULL) this->m_led_mutex->unlock();
if (this->m_rgb_mutex != NULL) this->m_rgb_mutex->unlock();
}
#endif
// log information
void ErrorHandler::log(const char *format, ...) {
#ifndef HUSH_LOG
memset(this->m_message,0,MAX_LOG_MESSAGE+1);
va_list args;
va_start(args, format);
vsprintf(this->m_message, format, args);
va_end(args);
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->lock();
#endif
if (this->m_pc != NULL) this->m_pc->printf(this->m_message);
#ifdef ENABLE_MEMORY_DEBUG
ERROR_HANDLER_MEM_STATS(0);
#endif
if (this->m_pc != NULL) this->m_pc->printf("\r\n");
if (this->m_status_lcd) {
MBEDEndpoint *endpoint = (MBEDEndpoint *)this->m_endpoint;
if (endpoint != NULL) {
this->m_lcd->cls();
this->m_lcd->locate(0,0);
this->m_lcd->printf(endpoint->getLCDStatus());
}
}
else {
this->m_lcd->cls();
this->m_lcd->locate(0,0);
this->m_lcd->printf(this->m_message);
}
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->unlock();
#endif
#else
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->lock();
#endif
if (this->m_status_lcd) {
MBEDEndpoint *endpoint = (MBEDEndpoint *)this->m_endpoint;
if (endpoint != NULL) {
this->m_lcd->cls();
this->m_lcd->locate(0,0);
this->m_lcd->printf(endpoint->getLCDStatus());
}
}
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->unlock();
#endif
#endif
}
// log information
void ErrorHandler::log_memory(const char *format, ...) {
#ifndef HUSH_LOG
#ifdef MEMORY_LOGGING
memset(this->m_message,0,MAX_LOG_MESSAGE+1);
va_list args;
va_start(args, format);
vsprintf(this->m_message, format, args);
va_end(args);
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->lock();
#endif
if (this->m_pc != NULL) this->m_pc->printf(this->m_message);
ERROR_HANDLER_MEM_STATS(0);
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->unlock();
#endif
#endif
#endif
}
// pause
void ErrorHandler::pause(const char *format, ...) {
#ifndef HUSH_LOG
memset(this->m_message,0,MAX_LOG_MESSAGE+1);
va_list args;
va_start(args, format);
vsprintf(this->m_message, format, args);
va_end(args);
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->lock();
#endif
if (this->m_pc != NULL) this->m_pc->printf(this->m_message);
if (this->m_pc != NULL) this->m_pc->printf("\r\n");
this->m_lcd->cls();
this->m_lcd->locate(0,0);
this->m_lcd->printf(this->m_message);
if (this->m_pc != NULL) {
this->m_pc->printf("Press any key to continue...ctrl-c to stop\r\n");
char c = this->m_pc->getc();
if (c == 0x03) { // CTRL-C ASCII
this->m_pc->printf("ctrl-c: closing down...\r\n");
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->unlock();
#endif
closedown(1);
}
}
#ifdef EH_USE_MUTEXES
if (this->m_mutex != NULL) this->m_mutex->unlock();
#endif
#endif
}
// check for exit
void ErrorHandler::checkForExit() {
#ifdef EH_USE_MUTEXES
if (this->m_close_mutex != NULL) this->m_close_mutex->lock();
#endif
if (this->m_pc != NULL && this->m_pc->readable()) {
char c = this->m_pc->getc();
if (c == 0x03) { // CTRL-C ASCII
this->m_pc->printf("ctrl-c: closing down...\r\n");
closedown(1);
}
}
#ifdef EH_USE_MUTEXES
if (this->m_close_mutex != NULL) this->m_close_mutex->unlock();
#endif
}
// set the color LED
void ErrorHandler::setRGBLED(float H, float S, float V) {
#ifndef HUSH_LEDS
#ifdef EH_USE_MUTEXES
if (this->m_rgb_mutex != NULL) this->m_rgb_mutex->lock();
#endif
float f,h,p,q,t;
int i;
if( S == 0.0) {
r = 1.0 - V; // invert pwm !
g = 1.0 - V;
b = 1.0 - V;
return;
}
if(H > 360.0) H = 0.0; // check values
if(S > 1.0) S = 1.0;
if(S < 0.0) S = 0.0;
if(V > 1.0) V = 1.0;
if(V < 0.0) V = 0.0;
h = H / 60.0;
i = (int) h;
f = h - i;
p = V * (1.0 - S);
q = V * (1.0 - (S * f));
t = V * (1.0 - (S * (1.0 - f)));
switch(i) {
case 0:
r = 1.0 - V; // invert pwm !
g = 1.0 - t;
b = 1.0 - p;
break;
case 1:
r = 1.0 - q;
g = 1.0 - V;
b = 1.0 - p;
break;
case 2:
r = 1.0 - p;
g = 1.0 - V;
b = 1.0 - t;
break;
case 3:
r = 1.0 - p;
g = 1.0 - q;
b = 1.0 - V;
break;
case 4:
r = 1.0 - t;
g = 1.0 - p;
b = 1.0 - V;
break;
case 5:
default:
r = 1.0 - V;
g = 1.0 - p;
b = 1.0 - q;
break;
}
#ifdef EH_USE_MUTEXES
if (this->m_rgb_mutex != NULL) this->m_rgb_mutex->unlock();
#endif
#endif
}
// turn the RGB LED specific colors
void ErrorHandler::turnLEDRed() { this->setRGBLED(0.0,1.0,0.2); }
void ErrorHandler::turnLEDGreen() { this->setRGBLED(120.0,1.0,0.2); }
void ErrorHandler::turnLEDBlue() { this->setRGBLED(200.0,1.0,0.2); }
void ErrorHandler::turnLEDPurple() { this->setRGBLED(261.9,1.0,0.2); }
void ErrorHandler::turnLEDOrange() { this->setRGBLED(51.0,1.0,0.2); }
void ErrorHandler::turnLEDBlack() { this->setRGBLED(0,0,0); }
void ErrorHandler::turnLEDYellow() { this->setRGBLED(60.0,1.0,0.133); }
// reset LEDs
void ErrorHandler::resetLEDs() {
#ifndef HUSH_LEDS
// turn off all LEDs
led1 = 0; led2 = 0; led3 = 0; led4 = 0;
#endif
}
// blink an LED
void ErrorHandler::blinkLED(DigitalOut led) {
#ifndef HUSH_LEDS
#ifdef EH_USE_MUTEXES
if (this->m_led_mutex != NULL) this->m_led_mutex->lock();
#endif
led = 1;
#ifdef EH_USE_MUTEXES
if (this->m_led_mutex != NULL) this->m_led_mutex->unlock();
#endif
wait_ms(BLINK_TIME);
#ifdef EH_USE_MUTEXES
if (this->m_led_mutex != NULL) this->m_led_mutex->lock();
#endif
led = 0;
#ifdef EH_USE_MUTEXES
if (this->m_led_mutex != NULL) this->m_led_mutex->unlock();
#endif
#endif
}
void ErrorHandler::changeLED(DigitalOut led,bool onoff) {
#ifdef EH_USE_MUTEXES
if (this->m_led_mutex != NULL) this->m_led_mutex->lock();
#endif
if (onoff) led = 1;
else led = 0;
#ifdef EH_USE_MUTEXES
if (this->m_led_mutex != NULL) this->m_led_mutex->unlock();
#endif
}
void ErrorHandler::led2On() { this->changeLED(led2,true); }
void ErrorHandler::led2Off() { this->changeLED(led2,false); }
void ErrorHandler::led3On() { this->changeLED(led3,true); }
void ErrorHandler::led3Off() { this->changeLED(led3,false); }
void ErrorHandler::setEndpoint(void *endpoint) { this->m_endpoint = endpoint; }
void *ErrorHandler::getEndpoint() { return this->m_endpoint; }
// blink the Transport TX LED
void ErrorHandler::blinkTransportTxLED() { this->blinkLED(led4); }
// blink the Transport RX LED
void ErrorHandler::blinkTransportRxLED() { this->blinkLED(led1); }