Contains all code needed for analog digital and oscope

Dependencies:   mbed

Revision:
2:9a88de905577
Parent:
1:14e49afb1d7c
Child:
3:60f30ca6a65d
diff -r 14e49afb1d7c -r 9a88de905577 main.cpp
--- a/main.cpp	Tue Apr 21 00:07:44 2020 +0000
+++ b/main.cpp	Tue Apr 21 03:31:20 2020 +0000
@@ -1,21 +1,38 @@
 #include "mbed.h"
-#define reset       0b00000000          //Define masks 
+
+#define reset       0b00000000      //Define function masks
 #define digital     0b00100000
 #define analog      0b01000000
 #define I2C         0b01100000
-#define stateMask   0b11100000
+#define oScope      0b10000000
+
+#define stateMask   0b11100000      //general masks
 #define pinMask     0b00011111
-#define pin1        0b00010000
+#define FULL        0b11111111
+
+#define pin1        0b00010000      //digital and analog masks
 #define pin2        0b00001000
 #define pin3        0b00000100
 #define pin4        0b00000010
 #define pin5        0b00000001
-#define FULL        0b11111111
 
+#define ms1         0b00000000      //Oscope masks
+#define ms5         0b00000001
+#define ms10        0b00000010
+#define ms50        0b00000011
+#define ms100       0b00000100
+#define ms250       0b00000101
+#define ms500       0b00000110
+#define ms1000      0b00000111
+#define rise        0b00010000
+#define fall        0b00000000
+#define timeMask    0b00001111
+#define trigger     0b00010000
 
 DigitalOut myled(LED1);
 DigitalOut DigitalStatus(LED2);         //Led for when Digital read is running
 DigitalOut AnalogStatus(LED3);          //LED for when Analog read is running
+DigitalOut oScopeStatus(LED4);          //LED for Oscilloscope
 
 DigitalIn  d1(p21);                     //Always set these pins for digital in
 DigitalIn  d2(p22);
@@ -23,124 +40,216 @@
 DigitalIn  d4(p24);
 DigitalIn  d5(p25);
 
-AnalogIn   a1(p16);                     //Always set these pins for analog in 
+
+AnalogIn   a1(p16);                     //Always set these pins for analog in
 AnalogIn   a2(p17);
 AnalogIn   a3(p18);
 AnalogIn   a4(p19);
 AnalogIn   a5(p20);
 
 
-Serial PC(USBTX,USBRX);                                      
+Serial PC(USBTX,USBRX);
 Ticker tickerboi;                   //Initialize the ticker for Sampling
 
+Ticker oScopeTicker;
+Ticker oScopeCut;
+
 volatile unsigned char DigitalSample;
 volatile unsigned char AnalogSample[5];
 
-volatile bool DigitalRunning;
-volatile bool AnalogRunning;
-
 volatile unsigned char command;
 volatile unsigned char state;
 
 volatile bool newDigital=false;
 volatile bool newAnalog=false;
 
- 
- 
-void digital_sample_func(void){         //sampling function, samples each pin specified and Ors it
+volatile unsigned char oScopeTime;
+volatile bool oScope_poll;
+volatile bool newoScope=false;
+volatile unsigned char oScopeArray[20000];
+volatile int oScopeCount=0;
+
+
+void digital_sample_func(void)          //sampling function, samples each pin specified and Ors it
+{
     DigitalSample = digital;
-    
-    if( (command & pin1) == pin1){
+
+    if( (command & pin1) == pin1) {
         DigitalSample=DigitalSample + d1*pin1;
     }
-    if( (command & pin2) == pin2){
+    if( (command & pin2) == pin2) {
         DigitalSample=DigitalSample + d2*pin2;
     }
-    if( (command & pin3) == pin3){
+    if( (command & pin3) == pin3) {
         DigitalSample=DigitalSample + d3*pin3;
     }
-    if( (command & pin4) == pin4){
+    if( (command & pin4) == pin4) {
         DigitalSample=DigitalSample + d4*pin4;
     }
-    if( (command & pin5) == pin5){
+    if( (command & pin5) == pin5) {
         DigitalSample=DigitalSample + d5*pin5;
     }
     newDigital=true;
 }
 
 
-void analog_sample_func(void){
-    for(int i=0; i<5; i++){
-        AnalogSample[i]=0;   
+void analog_sample_func(void)
+{
+    for(int i=0; i<5; i++) {
+        AnalogSample[i]=0;
     }
-    if( (command & pin1) == pin1){
+    if( (command & pin1) == pin1) {
         AnalogSample[0]=a1*254;
     }
-    if( (command & pin2) == pin2){
+    if( (command & pin2) == pin2) {
         AnalogSample[1]=a2 * 254;
     }
-    if( (command & pin3) == pin3){
+    if( (command & pin3) == pin3) {
         AnalogSample[2]=a3*254;
     }
-    if( (command & pin4) == pin4){
+    if( (command & pin4) == pin4) {
         AnalogSample[3]=a4*254;
     }
-    if( (command & pin5) == pin5){
+    if( (command & pin5) == pin5) {
         AnalogSample[4]=a5*254;
     }
-    newAnalog=true;    
+    newAnalog=true;
+}
+
+
+void oScope_kill_func(void)
+{
+    oScopeTicker.detach();
+    oScopeCut.detach();
+    newoScope=true;
+    oScopeStatus=0;
+}
+
+void oScope_sample_func(void){
+    oScopeArray[oScopeCount]=a1*254;
+    oScopeCount++;
+}
+
+void oScope_poll_trig(){
+    float first, second;
+    bool run_poll =true;  
+    while(run_poll){
+        first = a1;  
+        wait (.001);
+        second=a1;
+        if( (second - first)>.1){run_poll = false;}
+    }
+    
+    switch(oScopeTime) {
+    
+    case ms1:
+        oScopeCut.attach(oScope_kill_func, .001);
+        break;
+    
+    case ms5:
+        oScopeCut.attach(oScope_kill_func, .005);
+        break;
+    
+    case ms10:
+        oScopeCut.attach(oScope_kill_func, .01);
+        break;
+    
+    case ms50:
+        oScopeCut.attach(oScope_kill_func, .05);
+        break;
+    
+    case ms100:
+        oScopeCut.attach(oScope_kill_func, .1);
+        break;
+    
+    case ms250:
+        oScopeCut.attach(oScope_kill_func, .25);
+        break;
+    
+    case ms500:
+        oScopeCut.attach(oScope_kill_func, .5);
+        break;
+    
+    case ms1000:
+        oScopeCut.attach(oScope_kill_func, 1);
+        break;
+    }   
+    
+    oScopeTicker.attach_us(oScope_sample_func, 50);
     
 }
 
 
-void SerialInterrupt(void){
-       command=PC.getc();
-       state= command & stateMask;
-       switch(state){
-           case reset:
-            tickerboi.detach();                 //detach Ticker
-            DigitalRunning=false;                //turn off status LED
-            AnalogRunning=false;
+void SerialInterrupt(void)
+{
+    command=PC.getc();
+    state= command & stateMask;
+    
+    switch(state) {
+        case reset:
+            tickerboi.detach();             //detach Ticker
+            DigitalStatus=0;                //turn off status LED
+            AnalogStatus=0;
+            if(oScopeStatus){
+                oScope_kill_func();
+            }
+            
             break;
-                
-           case digital:
-            tickerboi.attach(&digital_sample_func, .1);  //Ticker will call digital read every 100 ms  
-            DigitalRunning=true;               // turn on status LED
-            break;        
-            
-           case analog:
-            tickerboi.attach(&analog_sample_func, 1);        //Ticker will call analog read every 10ms
-            AnalogRunning=true;    
-        }  
+
+        case digital:
+            tickerboi.attach(&digital_sample_func, .5);
+            DigitalStatus=1;               // turn on status LED
+            break;
+
+        case analog:
+            tickerboi.attach(&analog_sample_func, .5);
+            AnalogStatus=1;
+
+        case oScope:
+            oScopeTime=command & timeMask;
+            oScope_poll=true;
+            oScopeStatus=1;
+            break;
+    }
 }
 
-int main() {
-     PC.attach(&SerialInterrupt, Serial::RxIrq);
+int main()
+{
+    PC.attach(&SerialInterrupt, Serial::RxIrq);
     
-    
+
     while(1) {
-        
-        DigitalStatus=DigitalRunning;               //Indicate DigitalRead is running
-        AnalogStatus=AnalogRunning;                 //Indicate analogRead is running
-        
-        if(newDigital){                            //if digital sampling was run
+
+        if(newDigital) {                           //if digital sampling was run
             PC.putc(DigitalSample);
             newDigital=false;
         }
-        
-        if(newAnalog){                         //if analog sampling was run             
-            PC.putc(FULL);                   //First bit is 0b01000000
-            for(int i=0; i<5; i++){            //Send all of the analog bits
-                PC.putc(AnalogSample[i]);   
+
+        if(newAnalog) {                        //if analog sampling was run
+            PC.putc(FULL);                     //First bit is 0b01000000
+            for(int i=0; i<5; i++) {           //Send all of the analog bits
+                PC.putc(AnalogSample[i]);
             }
             PC.putc(command);                     //Last bit is command from PC
             newAnalog=false;
         }
         
+        if(oScope_poll){ oScope_poll_trig(); }
+        
+        if(newoScope){
+            PC.putc(FULL);
+            for(int j=0; j<=oScopeCount; j++){
+                PC.putc(oScopeArray[oScopeCount]);
+            }
+            oScopeCount=0;
+            newoScope=false;    
+        }
+        
+
         myled = 1;                             //indicate main loop is running
         wait(0.2);
         myled = 0;
-        wait(0.2);  
+        wait(0.2);
     }
 }