For coursework of group 3 in SOFT564Z

Dependencies:   Motordriver ros_lib_kinetic

Revision:
4:8afc50a3e4ac
Child:
5:207e0cd8b9de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Debug.cpp	Sat Nov 30 10:59:09 2019 +0000
@@ -0,0 +1,328 @@
+/*------------------------------------------------------------------------------
+Creator : Jonathan Wheadon
+Date : 29/11/2019
+------------------------------------------------------------------------------*/
+#include "mbed.h"
+#include "rtos.h"
+#include "Debug.hpp"
+#include "General.hpp"
+#include "Pins.h"
+
+// queue for Terminal events
+EventQueue TerminalQueue(32 * EVENTS_EVENT_SIZE);
+
+// Create Object PC of class Terminal with Set SERIAL_TX and SERIAL_RX pins
+Terminal PC(SERIAL_TX, SERIAL_RX);
+
+/*------------------------------------------------------------------------------
+ Thread for handiling the terminal
+------------------------------------------------------------------------------*/
+void TerminalThread(void)
+{
+    // Initialise the terminal printing the table.
+    PC.init();
+
+    // Enter Forever loop
+    while(1) {
+        // loop forever dispatching any function called to the queue
+        TerminalQueue.dispatch_forever();
+    }
+}
+
+
+/*------------------------------------------------------------------------------
+ initialize terminal, print table, initialize variables and attach interupts
+------------------------------------------------------------------------------*/
+void Terminal::init(void)
+{
+    CurrentIDX = 0;
+    col = false;
+    
+    // Set baud rate for serial object pc
+    pc.baud (115200);
+
+    // Hide cursor, move to x 0 y 0 and change print colour to green
+    pc.printf("\x1b[?25l");
+    Cursor(0,0);
+    Colour(ColourGREEN);
+
+    // Print DATA table to present data
+    pc.printf("|      PROJ515      :      DEBUG MENU    |                                                      |\n\r"
+              "|***********************************************************************************************|\n\r"
+              "|     Error Level       |      Time Stamp       |                 Error MSG                     |\n\r"
+              "|-----------------------|-----------------------|-----------------------------------------------|\n\r");
+    for(char idx = 0; idx < Rows; idx++) {
+        pc.printf("|                       |                       |                                               |\n\r");
+    }
+    pc.printf("|***********************************************************************************************|\n\r"
+              "| Input Command Line :                                                                          |\n\r"
+              "|-----------------------------------------------------------------------------------------------|\n\r"
+              "|                                                                                               |\n\r"
+              "|***********************************************************************************************|\n\r"
+              "                                                                                                 ");
+
+    // initialise variables
+    buffer_pointer = 0;
+
+    // Attach interupts
+    pc.attach(this, &Terminal::Input_Handler,pc.RxIrq);             // This interupt fires whenever data is added to the terminal buffer and calls function input handler
+}
+
+/*------------------------------------------------------------------------------
+ Move cursor of pc terminal to co-ordinates 'X' and 'Y' (between 0 and 255)
+------------------------------------------------------------------------------*/
+void Terminal::Cursor(char X, char Y)
+{
+    pc.printf("\x1b[%d;%dH",Y,X);
+}
+
+/*------------------------------------------------------------------------------
+ Change pc terminal print colour (8 bit colour) to colour defined by "COLOUR"
+------------------------------------------------------------------------------*/
+void Terminal::Colour(char COLOUR)
+{
+    pc.printf("\x1b[38;5;%dm",COLOUR);
+}
+
+/*------------------------------------------------------------------------------
+ Prints data(STRING) to cell in table defined by IDX
+------------------------------------------------------------------------------*/
+void Terminal::PrintDATA(char* STRING, char IDX)
+{
+    char Y = (IDX/4)+5;
+    char X = ((IDX%4)*23)+3;
+    Cursor(X,Y);
+    pc.printf("%s",STRING);
+}
+
+/*------------------------------------------------------------------------------
+ Function checks terminal buffer to see which key has been entered and saves to
+ internal buffer, if carridge return (0x0D) has been pressed it calls function
+ to decode the command and add the relavant function to the event QUEUE
+------------------------------------------------------------------------------*/
+void Terminal::checkKEY(void)
+{
+    // read char in buffer and save as gotkey
+    char gotkey;
+    gotkey=pc.getc();
+
+    // if not byte is found do nothing and exit
+    if(gotkey == NULL) {
+        // do nothing
+
+        // if key is enter (carridge return) call handleCOMMAND function
+    } else if (gotkey == 0x0D) {
+        Terminal_buffer[buffer_pointer] = 0x00;
+        TerminalQueue.call(&PC, &Terminal::HandleCOMMAND);
+        buffer_pointer = 0;
+        Cursor((24),(Rows+6));
+        pc.printf("                                ");
+
+        // if key entered is backspace print " " over last printed char and shift bufferpointer back
+    }  else if (gotkey == 0x7f) {
+        if (buffer_pointer > 0) {
+            buffer_pointer -= 1;
+            Cursor((24 + buffer_pointer),(Rows+6));
+            pc.printf(" ");
+        } else {
+            //do nothing
+        }
+
+        // if input not specific command save the char to the internal buffer
+    } else {
+        Colour(ColourWHITE);
+        if(buffer_pointer == 30) {
+            // do error thing
+        } else {
+            pc.printf("\x1b[4m");
+            Cursor((24 + buffer_pointer),(Rows+6));
+            Colour(ColourWHITE);
+            pc.printf("%c",gotkey);
+            pc.printf("\x1b[24m");
+            Terminal_buffer[buffer_pointer] = gotkey;
+            buffer_pointer++;
+        }
+    }
+    // re attach the interupt on the serial input flag
+    pc.attach(this, &Terminal::Input_Handler,pc.RxIrq);
+}
+
+/*------------------------------------------------------------------------------
+ Function decodes command that has been input on input command line and performs
+ any necasary action
+------------------------------------------------------------------------------*/
+void Terminal::HandleCOMMAND(void)
+{
+    int commandSize = 0;
+    int dataSIZE = 0;
+    bool searchingCOMMAND = true;
+    bool searchingDATA = true;
+    while(searchingCOMMAND) {
+        if((Terminal_buffer[commandSize] == ' ') || (Terminal_buffer[commandSize] == 0x00)) {
+            searchingCOMMAND = false;
+        } else {
+            commandSize++;
+        }
+
+        // debug break loop if too big
+        if(commandSize > 8) {
+            break;
+        }
+    }
+    while(searchingDATA) {
+        if((Terminal_buffer[commandSize+dataSIZE+1] == ' ') || (Terminal_buffer[commandSize+dataSIZE+1] == 0x00)) {
+            searchingDATA = false;
+        } else {
+            dataSIZE++;
+        }
+
+        // debug break loop if too big
+        if(dataSIZE > 8) {
+            break;
+        }
+    }
+}
+
+/*------------------------------------------------------------------------------
+ ISR for whenever data is in terminal buffer, add function to terminal queue
+ to check which charecteter has been entered and add it to a buffer.
+------------------------------------------------------------------------------*/
+void Terminal::Input_Handler(void)
+{
+    // remove the interupt from the serial input flag
+    pc.attach(NULL,pc.RxIrq);
+    // if data is in the buffer call function to check which key has been entered
+    if(pc.readable()!= 0) {
+        TerminalQueue.call(&PC, &Terminal::checkKEY);
+
+        // if no data present in the buffer re attach the interupt
+    } else {
+        pc.attach(this, &Terminal::Input_Handler,pc.RxIrq);
+    }
+}
+
+/*------------------------------------------------------------------------------
+ Function prints debug messages to screen
+------------------------------------------------------------------------------*/
+void Terminal::printDEBUG(char* msgs)
+{
+    // first delete any messages shown in the debug line
+    Cursor(3,(Rows+8));
+    Colour(ColourWHITE);
+    pc.printf("                                                                                              ");
+    // now print the new data to the line
+    Cursor(3,(Rows+8));
+    pc.printf(msgs);
+}
+
+/*------------------------------------------------------------------------------
+ Function prints ERROR messages to screen
+------------------------------------------------------------------------------*/
+void Terminal::ERROR_MSGS(Error msgs)
+{
+    // first delete any messages shown in the debug line
+    Cursor(3,(Rows+8));
+    pc.printf("                                                                                              ");
+    Cursor(3,(Rows+8));
+
+    char *TimeStamp = " 10:55-30/11/2019 ";
+
+    // Print diferent messages dependent on the Error code attached in the struct Error
+    switch(msgs.ErrorCode) {
+        case warning :
+            Colour(ColourYELLOW);
+            PrintDATA(" Warning" , CurrentIDX);
+            PrintDATA(TimeStamp , CurrentIDX+1);
+            PrintDATA(msgs.ErrorMSGS , CurrentIDX+2);
+            CurrentIDX += 4;
+            break;
+
+        case fault :
+            Colour(ColourAMBER);
+            PrintDATA(" Fault" , CurrentIDX);
+            PrintDATA(TimeStamp , CurrentIDX+1);
+            PrintDATA(msgs.ErrorMSGS , CurrentIDX+2);
+            CurrentIDX += 4;
+            break;
+
+        case criticalERROR :
+            Colour(ColourRED);
+            PrintDATA(" Critical ERROR" , CurrentIDX);
+            PrintDATA(TimeStamp , CurrentIDX+1);
+            PrintDATA(msgs.ErrorMSGS , CurrentIDX+2);
+            CurrentIDX += 4;
+            break;
+
+        case criticalFAILURE :
+            Colour(ColourRED);
+            PrintDATA(" Critical FAILURE" , CurrentIDX);
+            PrintDATA(TimeStamp , CurrentIDX+1);
+            PrintDATA(msgs.ErrorMSGS , CurrentIDX+2);
+            CurrentIDX += 4;
+            // This point should never be reached as it would indicate a full
+            // failure which would cause the watchdog to reset the system
+            break;
+    }
+}
+
+/*------------------------------------------------------------------------------
+ Function converts string to float, one decimal place expected must be 4 bytes
+ long, PAd with '0', example 1.2f would be "01.2" and 12.3f would be "12.3"
+------------------------------------------------------------------------------*/
+float strTOflt(char ary[4])
+{
+    //check that values entered are in format "00.0"
+    for(int tester = 0; tester < 4; tester++) {
+        if(tester != 2) {
+            int testing = (int)(ary[tester]-'0');
+            if((testing > 9) || (testing < 0)) {
+                return NULL;
+            }
+        } else if(ary[tester] != '.') {
+            return NULL;
+        }
+    }
+
+    float retFlt;
+
+    retFlt = ((float)(ary[0]-'0'))*10.0f;
+    retFlt += ((float)(ary[1]-'0'));
+    retFlt += ((float)(ary[3]-'0'))/10.0f;
+
+    if(retFlt > 60.0f) {
+        return NULL;
+    } else {
+        return retFlt;
+    }
+}
+
+/*------------------------------------------------------------------------------
+ Function converts string to int.
+ expected format allows upto 3 digits, 1 to 999
+------------------------------------------------------------------------------*/
+int strTOint(char ary[3])
+{
+    //check that values entered are in format "000"
+    for(int tester = 0; tester < 3; tester++) {
+        int testing = (int)(ary[tester]-'0');
+        if((testing > 9) || (testing < 0)) {
+            return NULL;
+        }
+    }
+
+    int temp_int = (int)(ary[0]-'0')*100;
+    temp_int += (int)(ary[1]-'0')*10;
+    temp_int += (int)(ary[2]-'0');
+
+    return temp_int;
+}
+/*------------------------------------------------------------------------------
+    Function to create and send an error message
+------------------------------------------------------------------------------*/
+void Flag_Error(int ErrorCode, char* ErrorMSG)
+{
+    Error msgs;
+    msgs.ErrorCode = ErrorCode;
+    msgs.ErrorMSGS = ErrorMSG;
+    TerminalQueue.call(&PC, &Terminal::ERROR_MSGS, msgs);
+}
\ No newline at end of file