]> code.bitgloo.com Git - clyne/stmdsp.git/commitdiff
add run status
authorClyne Sullivan <clyne@bitgloo.com>
Wed, 2 Sep 2020 00:24:23 +0000 (20:24 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Wed, 2 Sep 2020 00:24:23 +0000 (20:24 -0400)
source/main.cpp

index 596991d9bef4f59dea701cc9cd6e660809df7be6..f55c80155f47404ba2398a069dd8cc80453ac68d 100644 (file)
 
 #include <array>
 
+enum class RunStatus : char
+{
+    Idle = '1',
+    Converting
+};
+static RunStatus run_status = RunStatus::Idle;
+
+
 static_assert(sizeof(adcsample_t) == sizeof(uint16_t));
 static_assert(sizeof(dacsample_t) == sizeof(uint16_t));
 
@@ -65,6 +73,7 @@ int main()
                     }
                     break;
                 case 'R':
+                    run_status = RunStatus::Converting;
                     dac_samples.fill(0);
                     adc::read_start(signal_operate, &adc_samples[0], adc_samples.size());
                     dac::write_start(&dac_samples[0], dac_samples.size());
@@ -76,6 +85,7 @@ int main()
                 case 'S':
                     dac::write_stop();
                     adc::read_stop();
+                    run_status = RunStatus::Idle;
                     break;
                 case 'e':
                     if (usbserial::read(&cmd[1], 2) < 2)
@@ -101,6 +111,9 @@ int main()
                 case 'i': // Identify ourself as an stmdsp device
                     usbserial::write("stmdsp", 6);
                     break;
+                case 'I': // Info (i.e. run status)
+                    usbserial::write(&run_status, 1);
+                    break;
                 default:
                     break;
                 }
@@ -166,6 +179,7 @@ void conversion_abort()
     dac::write_stop();
     adc::read_stop();
     signal_operate_done = true;
+    run_status = RunStatus::Idle;
 }
 
 extern "C" {
@@ -173,13 +187,17 @@ extern "C" {
 __attribute__((naked))
 void HardFault_Handler()
 {
-    uint32_t *stack;
-    asm("mrs %0, msp" : "=r" (stack));
-    stack[6] = stack[5];
-    stack[7] |= (1 << 24);
-
     asm("push {lr}");
-    conversion_abort();
+
+    if (run_status == RunStatus::Converting) {
+        uint32_t *stack;
+        asm("mrs %0, msp" : "=r" (stack));
+        stack[6] = stack[5];   // Escape from elf_entry code
+        stack[7] |= (1 << 24); // Keep Thumb mode enabled
+
+        conversion_abort();
+    }
+
     asm("pop {lr}; bx lr");
 }