Twisting jig experiment.

Dependencies:   TextLCD

Files at this revision

API Documentation at this revision

Comitter:
yphilippou
Date:
Fri Dec 21 15:38:53 2018 +0000
Commit message:
Buttons for experiment steps added.

Changed in this revision

.gitignore Show annotated file Show diff for this revision Revisions of this file
README.md Show annotated file Show diff for this revision Revisions of this file
SETUP.hpp Show annotated file Show diff for this revision Revisions of this file
STEPPER_MOTOR.cpp Show annotated file Show diff for this revision Revisions of this file
STEPPER_MOTOR.hpp Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
stats_report.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,4 @@
+.build
+.mbed
+projectfiles
+*.py*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,164 @@
+# Getting started example for Mbed OS
+
+This guide reviews the steps required to get Blinky with the addition of dynamic OS statistics working on an Mbed OS platform.
+
+Please install [mbed CLI](https://github.com/ARMmbed/mbed-cli#installing-mbed-cli).
+
+## Import the example application
+
+From the command-line, import the example:
+
+```
+mbed import mbed-os-example-blinky
+cd mbed-os-example-blinky
+```
+
+### Now compile
+
+Invoke `mbed compile`, and specify the name of your platform and your favorite toolchain (`GCC_ARM`, `ARM`, `IAR`). For example, for the ARM Compiler 5:
+
+```
+mbed compile -m K64F -t ARM
+```
+
+Your PC may take a few minutes to compile your code. At the end, you see the following result:
+
+```
+[snip]
++----------------------------+-------+-------+------+
+| Module             |     .text |    .data |     .bss |
+|--------------------|-----------|----------|----------|
+| [fill]             |    98(+0) |    0(+0) | 2211(+0) |
+| [lib]/c.a          | 27835(+0) | 2472(+0) |   89(+0) |
+| [lib]/gcc.a        |  3168(+0) |    0(+0) |    0(+0) |
+| [lib]/misc         |   248(+0) |    8(+0) |   28(+0) |
+| [lib]/nosys.a      |    32(+0) |    0(+0) |    0(+0) |
+| main.o             |   924(+0) |    0(+0) |   12(+0) |
+| mbed-os/components |   134(+0) |    0(+0) |    0(+0) |
+| mbed-os/drivers    |    56(+0) |    0(+0) |    0(+0) |
+| mbed-os/features   |    42(+0) |    0(+0) |  184(+0) |
+| mbed-os/hal        |  2087(+0) |    8(+0) |  152(+0) |
+| mbed-os/platform   |  3633(+0) |  260(+0) |  209(+0) |
+| mbed-os/rtos       |  9370(+0) |  168(+0) | 6053(+0) |
+| mbed-os/targets    |  9536(+0) |   12(+0) |  382(+0) |
+| Subtotals          | 57163(+0) | 2928(+0) | 9320(+0) |
+Total Static RAM memory (data + bss): 12248(+0) bytes
+Total Flash memory (text + data): 60091(+0) bytes
+
+Image: ./BUILD/K64F/GCC_ARM/mbed-os-example-blinky.bin
+```
+
+### Program your board
+
+1. Connect your mbed device to the computer over USB.
+1. Copy the binary file to the mbed device.
+1. Press the reset button to start the program.
+
+The LED on your platform turns on and off. The main thread will additionally take a snapshot of the device's runtime statistics and display it over serial to your PC. The snapshot includes:
+
+* System Information:
+    * Mbed OS Version: Will currently default to 999999
+    * Compiler ID
+        * ARM = 1
+        * GCC_ARM = 2
+        * IAR = 3
+    * [CPUID Register Information](#cpuid-register-information)
+    * [Compiler Version](#compiler-version)
+* CPU Statistics
+    * Percentage of runtime that the device has spent awake versus in sleep
+* Heap Statistics
+    * Current heap size
+    * Max heap size which refers to the largest the heap has grown to
+* Thread Statistics
+    * Provides information on all running threads in the OS including
+        * Thread ID
+        * Thread Name
+        * Thread State
+        * Thread Priority
+        * Thread Stack Size
+        * Thread Stack Space
+
+#### Compiler Version
+
+| Compiler | Version Layout |
+| -------- | -------------- |
+| ARM      | PVVbbbb (P = Major; VV = Minor; bbbb = build number) |
+| GCC      | VVRRPP  (VV = Version; RR = Revision; PP = Patch)    |
+| IAR      | VRRRPPP (V = Version; RRR = Revision; PPP = Patch)   |
+
+#### CPUID Register Information
+
+| Bit Field | Field Description | Values |
+| --------- | ----------------- | ------ |
+|[31:24]    | Implementer       | 0x41 = ARM |
+|[23:20]    | Variant           | Major revision 0x0  =  Revision 0 |
+|[19:16]    | Architecture      | 0xC  = Baseline Architecture |
+|           |                   | 0xF  = Constant (Mainline Architecture) |
+|[15:4]     | Part Number       | 0xC20 =  Cortex-M0 |
+|           |                   | 0xC60 = Cortex-M0+ |
+|           |                   | 0xC23 = Cortex-M3  |
+|           |                   | 0xC24 = Cortex-M4  |
+|           |                   | 0xC27 = Cortex-M7  |
+|           |                   | 0xD20 = Cortex-M23 |
+|           |                   | 0xD21 = Cortex-M33 |
+|[3:0]      | Revision          | Minor revision: 0x1 = Patch 1 |
+
+
+
+You can view individual examples and additional API information of the statistics collection tools at the bottom of the page in the [related links section](#related-links).
+
+
+### Output
+
+To view the serial output you can use any terminal client of your choosing such as [PuTTY](http://www.putty.org/) or [CoolTerm](http://freeware.the-meiers.org/).
+
+The default baud rate for this application is set to `115200` and may be modified in the `mbed_app.json` file.
+
+You can find more information on the Mbed OS configuration tools and serail communication in Mbed OS in the related [related links section](#related-links).
+
+The output should contain the following block transmitted at the blinking LED frequency (actual values may vary depending on your target, build profile, and toolchain):
+
+```
+=============================== SYSTEM INFO  ================================
+Mbed OS Version: 999999
+CPU ID: 0x410fc241
+Compiler ID: 2
+Compiler Version: 60300
+================= CPU STATS =================
+Idle: 98% Usage: 2%
+================ HEAP STATS =================
+Current heap: 1096
+Max heap size: 1096
+================ THREAD STATS ===============
+ID: 0x20001eac
+Name: main_thread
+State: 2
+Priority: 24
+Stack Size: 4096
+Stack Space: 3296
+
+ID: 0x20000f5c
+Name: idle_thread
+State: 1
+Priority: 1
+Stack Size: 512
+Stack Space: 352
+
+ID: 0x20000f18
+Name: timer_thread
+State: 3
+Priority: 40
+Stack Size: 768
+Stack Space: 664
+
+```
+
+## Troubleshooting
+
+If you have problems, you can review the [documentation](https://os.mbed.com/docs/latest/tutorials/debugging.html) for suggestions on what could be wrong and how to fix it.
+
+## Related Links
+
+* [Mbed OS Stats API](https://os.mbed.com/docs/latest/apis/mbed-statistics.html)
+* [Mbed OS Configuration](https://os.mbed.com/docs/latest/reference/configuration.html)
+* [Mbed OS Serial Communication](https://os.mbed.com/docs/latest/tutorials/serial-communication.html)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SETUP.hpp	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,16 @@
+/*
+Setup file for the main
+*/
+
+#ifndef SETUP_HPP//Header Guards Prevents Multiple includes
+#define SETUP_HPP
+
+//Libraries and header includes
+#include "rtos.h"
+
+#include "STEPPER_MOTOR.hpp"
+
+//Time definitions
+
+static STEPPER_MOTOR STEPPER_MOTOR_1(D15,D14,D13,D12);
+#endif 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/STEPPER_MOTOR.cpp	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,281 @@
+#include "mbed.h"           //Include the mbed libraries
+#include "STEPPER_MOTOR.hpp"          //Include the header file, this acts like a series of forward declarations
+
+//Constructor
+STEPPER_MOTOR::STEPPER_MOTOR(PinName N1, PinName N2, PinName N3, PinName N4) : pin1(N1),pin2(N2),pin3(N3),pin4(N4)
+{
+     _dir = true;
+    _step = 0;    
+}
+
+STEPPER_MOTOR::~STEPPER_MOTOR(){}   //Destructor
+
+void STEPPER_MOTOR::Rotate_Steps(int Steps)
+{
+         #define STIME    1000
+         
+         Steps = Steps*50;
+         //int correctionfactor;
+         //int timeofturn=correctinfactor*speed;
+         
+         int mystep=0;
+         printf("START!!! step value is=%d\n\r",mystep);
+         for(int x =0 ; x <= Steps; x++)
+         {
+             printf("FOR LOOP! step value is=%d  %d\n\r",mystep,x);
+                   this->pin1 = 0;
+                   this->pin2 = 1;
+                   this->pin3 = 0;
+                   this->pin4 = 1;
+                   mystep=1;
+                   wait_us(666);
+              printf("FOR LOOP! step value is=%d  %d\n\r",mystep,x);
+                   this->pin1 = 0;
+                   this->pin2 = 1;
+                   this->pin3 = 1;
+                   this->pin4 = 0; 
+                   mystep=2;
+                   wait_us(666);
+              printf("FOR LOOP! step value is=%d  %d\n\r",mystep,x);
+                   this->pin1 = 1;
+                   this->pin2 = 0;
+                   this->pin3 = 1;
+                   this->pin4 = 0;
+                   mystep=3;
+                   wait_us(666);
+              printf("FOR LOOP! step value is=%d  %d\n\r",mystep,x);
+                   this->pin1 = 1;
+                   this->pin2 = 0;
+                   this->pin3 = 0;
+                   this->pin4 = 1;
+                   mystep=4;
+                   wait_us(666);;
+ /*             printf("FOR LOOP! step value is=%d  %d\n\r",mystep,x);
+                   this->pin1 = 0;
+                   this->pin2 = 1;
+                   this->pin3 = 0;
+                   this->pin4 = 0; 
+                   mystep=5;
+                   wait_ms(0.6);
+              printf("FOR LOOP! step value is=%d  %d\n\r",mystep,x);
+                   this->pin1 = 1;
+                   this->pin2 = 1;
+                   this->pin3 = 0;
+                   this->pin4 = 0;
+                   mystep=6;
+                   wait_ms(0.6);
+              printf("FOR LOOP! step value is=%d  %d\n\r",mystep,x);
+                   this->pin1 = 1;
+                   this->pin2 = 0;
+                   this->pin3 = 0;
+                   this->pin4 = 0;
+                   mystep=7;
+                   wait_ms(0.6);
+             
+                   this->pin1 = 1;
+                   this->pin2 = 0;
+                   this->pin3 = 0;
+                   this->pin4 = 1;
+                   mystep=0;
+                   wait_ms(0.6);
+
+                   this->pin1 = 0;
+                   this->pin2 = 0;
+                   this->pin3 = 0;
+                   this->pin4 = 0;
+                   mystep=0;
+                   wait_ms(0.6);*/
+            }
+}
+                   
+                   /*
+             switch(mystep){ 
+               case 0:{
+                  
+                break;  
+               case 1:{
+                  
+               break;  
+               case 2: 
+                   
+               break;  
+               case 3: 
+                   
+               break;  
+               case 4: 
+                 
+               break;  
+               case 5: 
+                   
+               break;  
+                 case 6: 
+                 
+               break;  
+               case 7: 
+                  
+               break;  
+               default: 
+               
+               break;  
+             } 
+             
+             if(_dir){ 
+               _step++; 
+             }else{ 
+               _step--; 
+             } 
+             if(_step>7){ 
+               _step=0; 
+             } 
+             if(_step<0){ 
+               _step=7; 
+             } 
+             */
+             //wait_ms(1);
+    
+
+void STEPPER_MOTOR::Permanent_Rotate_clock_wise()
+{
+    switch(_step){ 
+       case 0:
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 1;
+       break;  
+       case 1:
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 1;
+           pin4 = 1; 
+       break;  
+       case 2: 
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 1;
+           pin4 = 0;
+       break;  
+       case 3: 
+           pin1 = 0;
+           pin2 = 1;
+           pin3 = 1;
+           pin4 = 0;
+       break;  
+       case 4: 
+           pin1 = 0;
+           pin2 = 1;
+           pin3 = 0;
+           pin4 = 0; 
+       break;  
+       case 5: 
+           pin1 = 1;
+           pin2 = 1;
+           pin3 = 0;
+           pin4 = 0;
+       break;  
+         case 6: 
+           pin1 = 1;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 0;
+       break;  
+       case 7: 
+           pin1 = 1;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 1;
+       break;  
+       default: 
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 0;
+       break;  
+     } 
+     if(_dir){ 
+       _step++; 
+     }else{ 
+       _step--; 
+     } 
+     if(_step>7){ 
+       _step=0; 
+     } 
+     if(_step<0){ 
+       _step=7; 
+     } 
+} 
+
+void STEPPER_MOTOR::Permanent_Rotate_anti_clock_wise()
+{
+
+        //Rotate
+    switch(_step){ 
+       case 0:
+           pin1 = 1;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 1;
+       break;  
+       case 1:
+           pin1 = 1;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 0; 
+       break;  
+       case 2: 
+           pin1 = 1;
+           pin2 = 1;
+           pin3 = 0;
+           pin4 = 0;
+       break;  
+       case 3: 
+           pin1 = 0;
+           pin2 = 1;
+           pin3 = 0;
+           pin4 = 0;
+       break;  
+       case 4: 
+           pin1 = 0;
+           pin2 = 1;
+           pin3 = 1;
+           pin4 = 0; 
+       break;  
+       case 5: 
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 1;
+           pin4 = 0;
+       break;  
+         case 6: 
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 1;
+           pin4 = 1;
+       break;  
+       case 7: 
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 1;
+       break;  
+       default: 
+           pin1 = 0;
+           pin2 = 0;
+           pin3 = 0;
+           pin4 = 0;
+       break;  
+     } 
+     if(_dir){ 
+       _step++; 
+     }else{ 
+       _step--; 
+     } 
+     if(_step>7){ 
+       _step=0; 
+     } 
+     if(_step<0){ 
+       _step=7; 
+     } 
+     //wait_ms(1); 
+} 
+ 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/STEPPER_MOTOR.hpp	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,34 @@
+/*
+This is the stepper motor class and is used to control all of the motors individually
+*/
+
+#ifndef STEPPER_MOTOR_HPP//Header Guards Prevents Multiple includes
+#define STEPPER_MOTOR_HPP
+
+//Libraries and header includes
+#include "mbed.h"
+#include "rtos.h"
+class STEPPER_MOTOR                       //This creates a class called Led
+{ 
+public: 
+ 
+    STEPPER_MOTOR(PinName N1, PinName N2, PinName N3, PinName N4); //Constructor
+    ~STEPPER_MOTOR();                                 //Destructor
+    void Permanent_Rotate();
+    void Permanent_Rotate_clock_wise();
+    void Permanent_Rotate_anti_clock_wise();
+    void Rotate_90();
+    void Rotate_Steps(int Steps);
+private:    
+    //Private member variables to prevent them being accessed externally 
+    //Data Pins
+    bool _dir;
+    int _step;
+    int _Number_of_steps;
+    DigitalOut pin1;         //Pin 1
+    DigitalOut pin2;         //Pin 2
+    DigitalOut pin3;         //Pin 3  
+    DigitalOut pin4;         //Pin 4
+
+};
+#endif//STEPPER_MOTOR_HPP
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/simon/code/TextLCD/#308d188a2d3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,84 @@
+#include "mbed.h"
+#include "TextLCD.h"
+#include "SETUP.hpp"
+
+
+//#include <iostream>
+
+//using namespace std;
+//Serial pc(USBTX, USBRX);         //define serial namespace so the serial comms can be printed to
+//TextLCD lcd(D0,D1,D4,D5,D6,D7); // rs, e, d4-d7
+
+DigitalOut myled(LED1);
+DigitalIn B1(PE_15);
+DigitalIn B2(PE_14);
+DigitalIn B3(PE_12);
+DigitalIn B4(PE_10);
+
+int main() {
+    
+  //pc.baud(9600);  
+
+    printf("Putty test\n"); //request command in the terminal
+
+  //lcd.printf("Hello World!\n");
+
+    
+    printf("Please input a number of rotations\n");
+
+  // Spin the motor
+    
+    while(1) {
+         myled = 1; // LED is ON
+         wait(1);
+        if(B1)
+        {
+        myled = 0; // LED is OFF
+        printf("20 Turns\n");
+        STEPPER_MOTOR_1.Rotate_Steps(22);
+        myled = 1; // LED is ON
+        wait(1); // 
+        myled = 0; // LED is OFF
+        wait(1); // 1 sec
+        printf("Turning Complete\n");
+          }
+        else if(B2)
+        {
+        myled = 0; // LED is OFF
+        printf("30 Turns\n");
+        STEPPER_MOTOR_1.Rotate_Steps(23);
+        myled = 1; // LED is ON
+        wait(1); // 
+        myled = 0; // LED is OFF
+        wait(1); // 1 sec
+        printf("Turning Complete\n");
+          }  
+         else if(B3)
+        {
+        myled = 0; // LED is OFF
+        printf("40 Turns\n");
+        STEPPER_MOTOR_1.Rotate_Steps(24);
+        myled = 1; // LED is ON
+        wait(1); // 
+        myled = 0; // LED is OFF
+        wait(1); // 1 sec
+        printf("Turning Complete\n");
+          }
+         else if(B4)
+        {
+        myled = 0; // LED is OFF
+        printf("50 Turns\n");
+        STEPPER_MOTOR_1.Rotate_Steps(25);
+        myled = 1; // LED is ON
+        wait(1); // 
+        myled = 0; // LED is OFF
+        wait(1); // 1 sec
+        printf("Turning Complete\n");
+          }
+        else {
+            myled = 1; // LED is ON
+            }
+    }
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#bf6f2c3c6434a6de9eb9511feffa5948b3d1f20f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,12 @@
+{
+    "target_overrides": {
+        "*": {
+            "platform.stdio-baud-rate": 115200,
+            "platform.stack-stats-enabled": true,
+            "platform.heap-stats-enabled": true,
+            "platform.cpu-stats-enabled": true,
+            "platform.thread-stats-enabled": true,
+            "platform.sys-stats-enabled": true
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stats_report.h	Fri Dec 21 15:38:53 2018 +0000
@@ -0,0 +1,121 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2018 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef STATS_REPORT_H
+#define STATS_REPORT
+
+#include "mbed.h"
+
+/**
+ *  System Reporting library. Provides runtime information on device:
+ *      - CPU sleep, idle, and wake times
+ *      - Heap and stack usage
+ *      - Thread information
+ *      - Static system information
+ */
+class SystemReport {
+    mbed_stats_heap_t   heap_stats;
+    mbed_stats_cpu_t    cpu_stats;
+    mbed_stats_sys_t    sys_stats;
+
+    mbed_stats_thread_t *thread_stats;
+    uint8_t   thread_count;
+    uint8_t   max_thread_count;
+    uint32_t  sample_time_ms;
+
+public:
+    /**
+     *  SystemReport - Sample rate in ms is required to handle the CPU percent awake logic
+     */
+    SystemReport(uint32_t sample_rate) : max_thread_count(8), sample_time_ms(sample_rate)
+    {
+        thread_stats = new mbed_stats_thread_t[max_thread_count];
+
+        // Collect the static system information
+        mbed_stats_sys_get(&sys_stats);
+
+        printf("=============================== SYSTEM INFO  ================================\r\n");
+        printf("Mbed OS Version: %ld \r\n", sys_stats.os_version);
+        printf("CPU ID: 0x%lx \r\n", sys_stats.cpu_id);
+        printf("Compiler ID: %d \r\n", sys_stats.compiler_id);
+        printf("Compiler Version: %ld \r\n", sys_stats.compiler_version);
+    }
+
+    ~SystemReport(void)
+    {
+        free(thread_stats);
+    }
+
+    /**
+     *  Report on each Mbed OS Platform stats API
+     */
+    void report_state(void)
+    {
+        report_cpu_stats();
+        report_heap_stats();
+        report_thread_stats();
+
+        // Clear next line to separate subsequent report logs
+        printf("\r\n");
+    }
+
+    /**
+     *  Report CPU idle and awake time in terms of percentage
+     */
+    void report_cpu_stats(void)
+    {
+        static uint64_t prev_idle_time = 0;
+
+        printf("================= CPU STATS =================\r\n");
+
+        // Collect and print cpu stats
+        mbed_stats_cpu_get(&cpu_stats);
+
+        uint64_t diff = (cpu_stats.idle_time - prev_idle_time);
+        uint8_t idle = (diff * 100) / (sample_time_ms * 1000);  // usec;
+        uint8_t usage = 100 - ((diff * 100) / (sample_time_ms * 1000));  // usec;;
+        prev_idle_time = cpu_stats.idle_time;
+
+        printf("Idle: %d%% Usage: %d%% \r\n", idle, usage);
+    }
+
+    /**
+     *  Report current heap stats. Current heap refers to the current amount of
+     *  allocated heap. Max heap refers to the highest amount of heap allocated
+     *  since reset.
+     */
+    void report_heap_stats(void)
+    {
+        printf("================ HEAP STATS =================\r\n");
+
+        // Collect and print heap stats
+        mbed_stats_heap_get(&heap_stats);
+
+        printf("Current heap: %lu\r\n", heap_stats.current_size);
+        printf("Max heap size: %lu\r\n", heap_stats.max_size);
+    }
+
+    /**
+     *  Report active thread stats
+     */
+    void report_thread_stats(void)
+    {
+        printf("================ THREAD STATS ===============\r\n");
+
+        // Collect and print running thread stats
+        int count = mbed_stats_thread_get_each(thread_stats, max_thread_count);
+
+        for (int i = 0; i < count; i++) {
+            printf("ID: 0x%lx \r\n",        thread_stats[i].id);
+            printf("Name: %s \r\n",         thread_stats[i].name);
+            printf("State: %ld \r\n",       thread_stats[i].state);
+            printf("Priority: %ld \r\n",    thread_stats[i].priority);
+            printf("Stack Size: %ld \r\n",  thread_stats[i].stack_size);
+            printf("Stack Space: %ld \r\n", thread_stats[i].stack_space);
+        }
+    }
+};
+
+#endif // STATS_REPORT_H