RM3100 SPI sample code

Dependencies:   mbed

Revision:
0:71d5c1c75f0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Mar 10 01:45:12 2019 +0000
@@ -0,0 +1,189 @@
+/**
+* @file         main.cpp
+*
+* @brief        Sample interface for RM3100.
+*
+* @authors      Betty Zhang
+* @date         05/21/2018
+* @copyright    (C) 2018 PNI Corp, Protonex LLC
+*
+* @copyright    Disclosure to third parties or reproduction in any form
+*               whatsoever, without prior written consent, is strictly forbidden
+*
+*/
+
+#include "mbed.h"
+#include "main.h"
+#include "RM3100.h"
+
+
+Serial comport(SERIAL_TX, SERIAL_RX);
+
+RM3100 rm3100;
+
+//Global variables
+int serial_inchar;
+float actual_rate;
+
+void OnSerial(void)
+{
+    serial_inchar = comport.getc();
+}
+
+//=============================================================================
+//  Serial input Character (Key) Commands, courtesy of JM.
+//=============================================================================
+// This function is called upon every incomming serial character 
+void processSerialInchar(char key)
+{
+    // The Simple Serial protocal mostly consists of single character commands
+    // send '?' to list available commands
+
+    serial_inchar = NULL;
+    int tmrc_val, rate;
+
+    switch (key) {
+        case '+':
+            rm3100.ChangeSampleRate(1);
+            break;
+
+        case '-':
+            rm3100.ChangeSampleRate(-1);
+            break;
+
+        case '>':
+            rm3100.ChangeCycleCount(1);
+            break;
+
+        case '<':
+            rm3100.ChangeCycleCount(-1);
+            break;
+
+        case 'a':
+            rm3100.DisplayREVIDReg();
+            break;
+        case 'b':
+            rate = rm3100.GetSampleRate(&tmrc_val);
+            comport.printf("Host process rate = %3.1f Hz, reqRate = %d, TMRC=0x%X\n\r",actual_rate, rate, tmrc_val);
+            break;
+        case 'c':
+            rm3100.DisplayCycleCount();
+            break;
+
+        case 'q':
+            rm3100.SelfTest();
+            break;
+        case 'r':
+            rm3100.RunCMM(1); //Run CMM
+            rm3100.ClearDrdyInt();
+            break;
+
+        case 's':
+            rm3100.RunCMM(0); //Stop
+            rate = rm3100.GetSampleRate(&tmrc_val);
+            comport.printf("Host process rate = %3.1f Hz, reqRate = %d, TMRC=0x%X\n\r",actual_rate, rate, tmrc_val);
+            break;
+
+        case '?': {
+            u8 bar[45];
+            memset(bar, 205, sizeof(bar));
+            bar[sizeof(bar)-1] = 0;
+            comport.printf("\n\r");
+            comport.printf("                  RM3100 Commands\n\r");
+            comport.printf("                  Revision: %s\n\r",REVISION);
+            comport.printf("  %c%s%c\n\r", 201, bar, 187);
+            comport.printf("  %c        Commands  (case sensitive)          %c\n\r", 186, 186);
+            // Status and configuration
+            comport.printf("  %c%s%c\n\r", 204, bar, 185);
+            comport.printf("  %c         Settings and Status                %c\n\r", 186, 186);
+            comport.printf("  %c%s%c\n\r", 204, bar, 185);
+            comport.printf("  %c a : Display REVID                          %c\n\r", 186, 186);
+            comport.printf("  %c b : Display host rate, request rate & TMRC %c\n\r", 186, 186);
+            comport.printf("  %c c : Display cycle count, gain & max rate   %c\n\r", 186, 186);
+            comport.printf("  %c + : Increase Sample Rate                   %c\n\r", 186, 186);
+            comport.printf("  %c - : Decrease Sample Rate                   %c\n\r", 186, 186);
+            comport.printf("  %c > : Increase Cycle Count                   %c\n\r", 186, 186);
+            comport.printf("  %c < : Decrease Cycle Count                   %c\n\r", 186, 186);
+
+            // Tests
+            comport.printf("  %c%s%c\n\r", 204, bar, 185);
+            comport.printf("  %c                  Tests                     %c\n\r", 186, 186);
+            comport.printf("  %c%s%c\n\r", 204, bar, 185);
+            comport.printf("  %c q : Run sensor Self tests                  %c\n\r", 186, 186);
+            comport.printf("  %c r : Run continous mode                     %c\n\r", 186, 186);
+            comport.printf("  %c s : Stop continous mode                    %c\n\r", 186, 186);
+
+            comport.printf("  %c%s%c\n\r", 200, bar, 188);
+
+        }
+        default:
+            break;
+    }
+}
+        
+int main() {
+    
+    int counter = 0;
+    Timer timer;
+    
+    
+    // Init user serial interface
+    comport.baud(921600);
+    comport.printf("\n\rRM3100 Host SPI Sample Code Ver %s on mBed\n\r",REVISION);
+        
+    //Set sample rate
+    rm3100.SetSampleRateReg(1); //in Hz
+                
+    //Start to CMM run
+    rm3100.RunCMM(1);
+   
+    // Setup interrupt callback functions
+    comport.attach(&OnSerial);  // user input from serial term 
+    
+    // Callback function to the rising edge
+    rm3100.DrdyCallBack();
+    
+    //Clear Interrupt first
+    rm3100.ClearDrdyInt();
+        
+    while (1) 
+    {
+
+        if (serial_inchar) 
+        {
+            processSerialInchar(serial_inchar); // process user key commands
+            serial_inchar = NULL;
+        }
+        
+        if (counter <= 1)
+            timer.start();
+        else if (counter >= 10)
+        {
+            timer.stop();
+            float time = timer.read();
+            actual_rate = 10.0/time;
+            if (actual_rate <= 150) {
+                __disable_irq();    // Disable Interrupts
+                comport.printf("Counter=%d, time=%3.3f s, Host Proc rate = %3.1f Hz\n\r",counter, time, actual_rate);
+                __enable_irq();    // Enable Interrupts
+            }
+            counter = 0;
+            timer.reset();
+        }
+        
+        //Process Drdy Interrupt
+        if (rm3100.GetDrdyIntFlag())
+        {
+            rm3100.SetDrdyIntFlag(0);
+            
+            //If sample rate is higher than 150Hz, serial port cannot process in time
+            //skip samples to make the host keep up, but to clear drdy interrupt
+            if ((actual_rate <= 150) || (counter == 1))
+                rm3100.ReadRM3100();
+            else
+                rm3100.ClearDrdyInt(); 
+            
+            counter++;
+        }
+    }
+}