BEI ZHANG
/
RM3100_SPI_SampleCode
RM3100 SPI sample code
main.cpp
- Committer:
- BeiZhang
- Date:
- 2019-03-10
- Revision:
- 0:71d5c1c75f0b
File content as of revision 0:71d5c1c75f0b:
/** * @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++; } } }