Display error number on the screen upon panic
This commit is contained in:
		@@ -139,11 +139,24 @@ void sendSerial(const char *data, int len) {
 | 
				
			|||||||
    sendUsb(USB_SERIAL, data, len);
 | 
					    sendUsb(USB_SERIAL, data, len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					volatile bool paniced;
 | 
				
			||||||
 | 
					extern "C" void drawPanic(int code);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern "C" void target_panic(int error_code) {
 | 
					extern "C" void target_panic(int error_code) {
 | 
				
			||||||
    char buf[50];
 | 
					    char buf[50];
 | 
				
			||||||
 | 
					    paniced = true;
 | 
				
			||||||
 | 
					    pthread_mutex_trylock(&execMutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    snprintf(buf, sizeof(buf), "\nPANIC %d\n", error_code);
 | 
					    snprintf(buf, sizeof(buf), "\nPANIC %d\n", error_code);
 | 
				
			||||||
    sendSerial(buf, strlen(buf));
 | 
					
 | 
				
			||||||
 | 
					    drawPanic(error_code);
 | 
				
			||||||
    DMESG("PANIC %d", error_code);
 | 
					    DMESG("PANIC %d", error_code);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (int i = 0; i < 10; ++i) {
 | 
				
			||||||
 | 
					        sendSerial(buf, strlen(buf));
 | 
				
			||||||
 | 
					        sleep_core_us(500 * 1000);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    target_reset();
 | 
					    target_reset();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -284,12 +297,16 @@ static void *evtDispatcher(void *dummy) {
 | 
				
			|||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
        pthread_cond_wait(&newEventBroadcast, &eventMutex);
 | 
					        pthread_cond_wait(&newEventBroadcast, &eventMutex);
 | 
				
			||||||
        while (eventHead != NULL) {
 | 
					        while (eventHead != NULL) {
 | 
				
			||||||
 | 
					            if (paniced)
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
            Event *ev = eventHead;
 | 
					            Event *ev = eventHead;
 | 
				
			||||||
            eventHead = ev->next;
 | 
					            eventHead = ev->next;
 | 
				
			||||||
            if (eventHead == NULL)
 | 
					            if (eventHead == NULL)
 | 
				
			||||||
                eventTail = NULL;
 | 
					                eventTail = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (auto thr = allThreads; thr; thr = thr->next) {
 | 
					            for (auto thr = allThreads; thr; thr = thr->next) {
 | 
				
			||||||
 | 
					                if (paniced)
 | 
				
			||||||
 | 
					                    return 0;
 | 
				
			||||||
                if (thr->waitSource == 0)
 | 
					                if (thr->waitSource == 0)
 | 
				
			||||||
                    continue;
 | 
					                    continue;
 | 
				
			||||||
                if (thr->waitValue != ev->value && thr->waitValue != DEVICE_EVT_ANY)
 | 
					                if (thr->waitValue != ev->value && thr->waitValue != DEVICE_EVT_ANY)
 | 
				
			||||||
@@ -346,11 +363,15 @@ static void runPoller(Thread *thr) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
        sleep_core_us(us);
 | 
					        sleep_core_us(us);
 | 
				
			||||||
 | 
					        if (paniced)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
        TValue curr = pxt::runAction0(query);
 | 
					        TValue curr = pxt::runAction0(query);
 | 
				
			||||||
        if (curr != prev) {
 | 
					        if (curr != prev) {
 | 
				
			||||||
            startUser();
 | 
					            startUser();
 | 
				
			||||||
            pxt::runAction2(thr->act, prev, curr);
 | 
					            pxt::runAction2(thr->act, prev, curr);
 | 
				
			||||||
            stopUser();
 | 
					            stopUser();
 | 
				
			||||||
 | 
					            if (paniced)
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
            decr(prev);
 | 
					            decr(prev);
 | 
				
			||||||
            prev = curr;
 | 
					            prev = curr;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,7 @@ class MMap : public RefObject {
 | 
				
			|||||||
    void print();
 | 
					    void print();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern volatile bool paniced;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,6 @@
 | 
				
			|||||||
#include <fcntl.h>
 | 
					#include <fcntl.h>
 | 
				
			||||||
#include <sys/ioctl.h>
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* Drawing modes
 | 
					* Drawing modes
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
@@ -265,6 +264,56 @@ void init() {
 | 
				
			|||||||
    pthread_create(&pid, NULL, screenRefresh, NULL);
 | 
					    pthread_create(&pid, NULL, screenRefresh, NULL);
 | 
				
			||||||
    pthread_detach(pid);
 | 
					    pthread_detach(pid);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint8_t numbers[] = {
 | 
				
			||||||
 | 
					    0x06, 0x09, 0x09, 0x09, 0x06, 0x04, 0x06, 0x04, 0x04, 0x0e, 0x07, 0x08, 0x06, 0x01, 0x0f, 0x0f,
 | 
				
			||||||
 | 
					    0x08, 0x04, 0x09, 0x06, 0x0c, 0x0a, 0x09, 0x1f, 0x08, 0x1f, 0x01, 0x0f, 0x10, 0x0f, 0x08, 0x04,
 | 
				
			||||||
 | 
					    0x0e, 0x11, 0x0e, 0x1f, 0x08, 0x04, 0x02, 0x01, 0x0e, 0x11, 0x0e, 0x11, 0x0e, 0x0e, 0x11, 0x0e,
 | 
				
			||||||
 | 
					    0x04, 0x02,
 | 
				
			||||||
 | 
					    // face
 | 
				
			||||||
 | 
					    0b11011, 0b11011, 0b00000, 0b11111, 0b11011,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drawNumber(int off, int idx) {
 | 
				
			||||||
 | 
					    const uint8_t *src = &numbers[idx * 5];
 | 
				
			||||||
 | 
					    uint8_t *dst = &bitBuffer[off];
 | 
				
			||||||
 | 
					    for (int i = 0; i < 5; i++) {
 | 
				
			||||||
 | 
					        uint8_t ch = *src++;
 | 
				
			||||||
 | 
					        for (int jj = 0; jj < 8; ++jj) {
 | 
				
			||||||
 | 
					            for (int j = 0; j < 5; j++) {
 | 
				
			||||||
 | 
					                if (ch & (1 << j))
 | 
				
			||||||
 | 
					                    *dst = 0xff;
 | 
				
			||||||
 | 
					                dst++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            dst += ROW_SIZE - 5;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern "C" void drawPanic(int code) {
 | 
				
			||||||
 | 
					    clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int ptr = ROW_SIZE * 16 + 3 + 6;
 | 
				
			||||||
 | 
					    drawNumber(ptr, 10);
 | 
				
			||||||
 | 
					    ptr += 6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ptr = ROW_SIZE * 70 + 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    drawNumber(ptr, (code / 100) % 10);
 | 
				
			||||||
 | 
					    ptr += 6;
 | 
				
			||||||
 | 
					    drawNumber(ptr, (code / 10) % 10);
 | 
				
			||||||
 | 
					    ptr += 6;
 | 
				
			||||||
 | 
					    drawNumber(ptr, (code / 1) % 10);
 | 
				
			||||||
 | 
					    ptr += 6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    updateLCD();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int fd = open("/dev/lms_ui", O_RDWR);
 | 
				
			||||||
 | 
					    uint8_t cmd[] = { 48 + 5, 0 };
 | 
				
			||||||
 | 
					    write(fd, cmd, 2);
 | 
				
			||||||
 | 
					    close(fd);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace pxt {
 | 
					namespace pxt {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user