Core Base Classes for the Light Endpoints
Dependents: mbed_mqtt_endpoint_ublox_ethernet mbed_mqtt_endpoint_ublox_cellular mbed_nsp_endpoint_ublox_cellular mbed_nsp_endpoint_ublox_ethernet ... more
Diff: ErrorHandler.cpp
- Revision:
- 192:54b758a8eaaa
- Parent:
- 191:c83c1c5010ed
diff -r c83c1c5010ed -r 54b758a8eaaa ErrorHandler.cpp --- a/ErrorHandler.cpp Wed Sep 24 19:12:35 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,365 +0,0 @@ -/* 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 - Thread::wait(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); } \ No newline at end of file