Debugging tool for mbed enabled microcontrollers, especially for NUCLEO-F303RE and STM32F042F6P6.

Revision:
0:e36b454cc2e6
Child:
1:dbb9fcc20d07
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debug_serial.cpp	Mon May 06 00:01:17 2019 +0000
@@ -0,0 +1,152 @@
+#include "Debug.h"
+
+// create object of class Debug_serial
+//------------------------------------------------------------------------------------------------------------------ 
+Debug_serial::Debug_serial(PinName tx_pin, PinName rx_pin, int baudrate) : pc(tx_pin,rx_pin, baudrate) {
+    init();
+}
+
+// init function
+//------------------------------------------------------------------------------------------------------------------ 
+void Debug_serial::init() {
+    pc.printf("\ec");
+    wait_ms(50);
+    pc.printf("-----------------\n\r|\e[1m\e[97;40m\e[93;40mBREAKPOINT AREA\e[22m\e[97;40m|\n\r-----------------\n\r\033[s");
+    pc.printf("serial successfully initialised\n\r\e[32;40mto start program press any button\e[97;40m");
+    breakpoint_count=0;
+    pc.getc();
+    pc.printf("\r\e[2K\e[31;40mprogram is running\e[97;40m\r");
+    break_line[0] = -1;
+    break_line[1] = -1;
+    break_line[2] = -1;
+    strcpy(var[0], "\0");
+    strcpy(var[1], "\0");
+    strcpy(var[2], "\0");
+    pc.printf("\033[14;0H------------------\n\r|\e[1m\e[93;40mSERIAL PORT AREA\e[22m\e[97;40m|\n\r------------------\n\r\033[s");
+}
+
+
+// perform one breakpoint without printing variable
+//------------------------------------------------------------------------------------------------------------------  
+void Debug_serial::breakpoint(int line_number) {
+    strcpy(var[2], var[1]);
+    strcpy(var[1], var[0]);
+    sprintf(var[0],"\0");
+    print_3_breaks(line_number);     
+}
+
+// perform one breakpoint and print variable of type int
+//------------------------------------------------------------------------------------------------------------------  
+void Debug_serial::breakpoint(int line_number, char name[20], int variable){
+
+    strcpy(var[2], var[1]);
+    strcpy(var[1], var[0]);
+    sprintf(var[0],"int %s = %d",name,variable);
+    print_3_breaks(line_number);
+
+}
+
+// perform one breakpoint and print variable of type char
+//------------------------------------------------------------------------------------------------------------------ 
+void Debug_serial::breakpoint(int line_number, char name[20], char variable){
+
+    strcpy(var[2], var[1]);
+    strcpy(var[1], var[0]);
+    sprintf(var[0],"char %s = %c",name,variable);
+    print_3_breaks(line_number);
+    
+}
+
+// perform one breakpoint and print variable of type float
+//------------------------------------------------------------------------------------------------------------------ 
+void Debug_serial::breakpoint(int line_number, char name[20], float variable){
+   
+    strcpy(var[2], var[1]);
+    strcpy(var[1], var[0]);
+    sprintf(var[0],"float %s = %f",name,variable);
+    print_3_breaks(line_number);
+
+}
+
+// perform one breakpoint and print variable of type string
+//------------------------------------------------------------------------------------------------------------------ 
+void Debug_serial::breakpoint(int line_number, char name[20], char * variable){
+
+    strcpy(var[2], var[1]);
+    strcpy(var[1], var[0]);
+    sprintf(var[0],"string %s = %s",name,variable);
+    print_3_breaks(line_number);
+
+}
+
+// print formatted string to debug serial port
+//------------------------------------------------------------------------------------------------------------------ 
+int Debug_serial::printf(const char* format, ...){
+
+    int ret = pc.printf(format);
+    return ret;
+}
+
+// print character to debug serial port
+//------------------------------------------------------------------------------------------------------------------ 
+int Debug_serial::putc(int character){
+
+    return pc.putc(character);
+}
+
+// read character from debug serial port
+//------------------------------------------------------------------------------------------------------------------ 
+int Debug_serial::getc(){
+    return pc.getc();
+}
+
+// clear screen from m line up to n line
+//------------------------------------------------------------------------------------------------------------------
+void Debug_serial::clear_from_n_up_to_m(int m, int n){
+    pc.printf("\033[%d;0H",m);
+    wait(0.1);
+    while (m > n){ 
+        m--;
+        pc.printf("\033[K\033[%d;0H",m);
+    }
+    pc.printf("\n\r");
+
+}
+
+// print 3 last breakpoints
+//------------------------------------------------------------------------------------------------------------------
+void Debug_serial::print_3_breaks(int line_number){
+    pc.printf("\e[s");
+    wait_ms(50);
+    breakpoint_count++;
+    break_line[2] = break_line[1];
+    break_line[1] = break_line[0];
+    break_line[0] = line_number;
+    clear_from_n_up_to_m(12,3);
+    int i = (breakpoint_count>=3)?3:breakpoint_count;
+    while (i > 0){
+        if (i == 1 ){
+            pc.printf("\e[1m\e[96;40m");
+            print_one_break(i);
+            pc.printf("\e[22m\e[97;40m");            
+        }else{
+            print_one_break(i);        
+        }
+        i--;
+    }  
+    pc.printf("\e[32;40mto continue press any button\e[97;40m");
+    pc.getc();
+    pc.printf("\r\e[2K\e[31;40mprogram is running\e[97;40m\n\r");  
+    pc.printf("\e[u");
+  
+}
+
+// print one breakpoint
+//------------------------------------------------------------------------------------------------------------------
+void Debug_serial::print_one_break(int n){
+    if (break_line[n-1] < 0){
+        pc.printf("Breakpoint number %d\t unknown line number\n\r%s\n\n\r",breakpoint_count - n + 1,var[n-1]);
+    }else{
+        pc.printf("Breakpoint number %d\tline number %d\n\r%s\n\n\r",breakpoint_count - n + 1,break_line[n-1],var[n-1]);
+    }
+}
\ No newline at end of file