SENtral Simple Serial Host interface for PNI Sensor Corp SENtral-A2 motion coprocessor. For use with the RM3100RTI Arduino shield module on top of an STM4 serial mbed board. Will work with an PNI RM3100RTI module or M&M motion modules. Interaction with unit using built in USB serial serial port set for 115200 baud. Send '?' char for menu. Presently requires SENtral firmware to either be loaded in the RM3100RTI Arduino shield SD Card or preloaded in the RM3100RTI or M&M module's EEPROM. Firmware is typically preloaded on the module's EEPROM by PNI. PNI Sensor, 2019 www.pnicorp.com

Dependencies:   mbed SDFileSystemVSG

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "main.h"
00002 
00003 #define REVISION "1.0.3"
00004 #define CR 13
00005 #define LF 10
00006 
00007 // Note: all warmstart related functions are commented-out. The parameter list and 
00008 //   flags are presently going through a major revision.
00009 
00010 
00011 
00012 //******************************
00013 //  Function prototypes
00014 //******************************
00015 void read_BuildVersion(void);
00016 void executeSerialFunction(char key);
00017 
00018 //*******************************
00019 // Global Variables
00020 //*******************************
00021 u8      serialCommandMode;
00022 u8      serialSensorID;
00023 u16     serialSensorRate; 
00024 u16     serialCommandValue;
00025 
00026 u8      fifoBuffer[24 * 1024];
00027 u32     bytesRead;
00028 
00029 u8      apSuspendMode = 0;
00030 u8      displayText = 1;       // Also see simular "printData" in em7186.cpp
00031 u8      reportMetaData = 0;
00032 
00033 u8      fw[] = { "/sd/sentral.fw" };
00034 u8      logfilename[] = { "/sd/log.csv" };
00035 //u8      warmStartFile[] = { "/sd/warmstart.dat" }; 
00036 u8 sentral_service_flag=0;
00037 
00038 FILE *flog;
00039 
00040 char    serial_inchar;
00041 
00042 //******************************
00043 //  Interrupt callback functions
00044 //******************************
00045  
00046 void SENtral_Interrupt(void)
00047 {
00048 
00049     sentral_service_flag=1;
00050     SENtral_InterruptPin.disable_irq();
00051         
00052 }
00053 
00054 void OnSerial(void)
00055 {
00056     serial_inchar = pc.getc();
00057 }
00058 
00059 //=============================================================================
00060 //  Serial input Character (Key) Commands
00061 //=============================================================================
00062 
00063 // processSerialInchar function is called upon every incomming serial character 
00064 //   as defined in mbed_objects.cpp
00065 void processSerialInchar(char key)
00066 {
00067     // The Simple Serial protocal mostly consists of single character commands
00068     //   the exceptions are commands that require additional information like 's' and 'X'.
00069     //   In these cases serialCommandMode states are used and operands are then preprocessed 
00070     //   inside this function.
00071 
00072     // If the protocal gets larger and more commands require additional data a more complex
00073     //    command processor with incoming serial buffer will have to be implimented
00074     //    presently this simple processor does the job
00075 
00076     // serialCommandMode  ** STATES **
00077     // 0: Not in Sensor command building mode
00078     // 1: 's' Sensor Rate chane. State 1 = Constructing Sensor ID number
00079     // 2:                        State 2 = Constructing Sensor Rate Value
00080     // 3: 'X' Firmware Image Tranfer Mode (waiting for source/destination character)
00081     // CR: [carrage return] sends constructed sensor rate request
00082     
00083     // send '?' to mbed for menu of commands
00084 
00085 
00086     serial_inchar = NULL;
00087 
00088     if ((serialCommandMode > 0) && (serialCommandMode < 3)) { //'s' virutual sensor rate change request
00089         if ((key >= '0') && (key <= '9')) {
00090             serialCommandValue = (serialCommandValue * 10) + (key - '0');
00091         }
00092         else if (key == ',') {
00093             serialSensorID = (unsigned char)serialCommandValue;
00094             serialCommandValue = 0;
00095             serialCommandMode = 2;
00096         } else if (key == CR || key == LF) {
00097             if (serialCommandMode == 1) {
00098                 serialSensorID = serialCommandValue;
00099             } else {
00100                 serialSensorRate = serialCommandValue;
00101             }
00102             if (serialSensorID > 0) {
00103                 if (displayText) printf("\n\rChanging rate of sensor %u to %d\n\r", serialSensorID, serialSensorRate);
00104                 em7186_set_sensor_rate(serialSensorID,serialSensorRate);
00105                 if (serialSensorRate > 0) {
00106                     sensorEnabled[serialSensorID-1] = TRUE;
00107                 } else {
00108                     sensorEnabled[serialSensorID-1] = FALSE;
00109                 }
00110             }
00111             serialCommandMode = 0;
00112             serialSensorID = 0;
00113             serialSensorRate = 0;
00114         }
00115     } else if (serialCommandMode == 3) { // 'X' Transfer firmware command
00116         firmwareTransfer(key);
00117         serialCommandMode = 0;
00118     } else
00119         executeSerialFunction(key);
00120 }
00121 
00122 void executeSerialFunction(char key)
00123 {
00124     u8 paramValues[2];
00125     ParamInfo param = { 1,1 }; // parameter# 1, size=1
00126     switch (key)
00127     {
00128     case 'B':
00129         if (displayText) printf("\n\r\n\r ********** PREPARING FOR SENSOR SELF TEST REQUEST; STANDBY REQUEST MADE ********** \n\r\n\r");
00130         paramValues[0] = 0x01; // Request Sensor Self Test bit and NOT standby bit
00131         em7186_i2c_write(0x55, paramValues, 1); // 0x55 = Host Interface Control Reg
00132         if (displayText) printf("\n\r\n\r ********** SENSOR SELF TEST REQUEST + RUN MADE ********** \n\r\n\r");
00133         paramValues[0] = 0x40; // Request Sensor Self Test bit and NOT standby bit
00134         em7186_i2c_write(0x55, paramValues, 1); // 0x55 = Host Interface Control Reg
00135         break;
00136     case 'c':
00137         displayStatusRegisters();
00138         break;
00139 //    case 'd':
00140 //        displayParams(2, warmStartList, sizeof(warmStartList) / sizeof(warmStartList[0]));
00141 //        break;
00142     case 'D':  // this togggles display of SENtral(FIFO) Data 
00143                // Only useful when intending to log data through SD Card and want to suspend terminal display of data
00144         printData = !printData;
00145         if (displayText) printf("Display SENtral Data  - %s\n\r", (printData ? "Enabled" : "Disabled"));
00146         break;
00147     case 'e':
00148         displayPhysicalSensorStatus();
00149         break;
00150     case 'f':
00151         displaySensorStatus();
00152         break;
00153 
00154     case 'g':
00155         logData = !logData;
00156         if(logData) {
00157             flog = fopen(logfilename, "a");
00158             if (!flog) {
00159                 printf("Error Opening log file\n\r");
00160                 logData = 0;
00161             }
00162             else
00163                 printf("%s Log file open\n\r",logfilename);            
00164         }
00165         else {
00166             if(flog) {
00167                 fclose(flog);
00168                 printf("Log file closed\n\r");
00169             }
00170         }
00171         break;    
00172               
00173     case 'h':
00174         apSuspendMode = !apSuspendMode;
00175         if (apSuspendMode) em7186_ap_suspend(1);
00176         else em7186_ap_suspend(0);
00177         if (displayText) printf("AP Suspend Mode %s\n\r", (apSuspendMode ? "Enabled" : "Disabled"));
00178         break;
00179     case 'H':
00180         em7186_i2c_write_value(CHIP_CONTROL_REG, CHIP_CONTROL_CPU_STOP);        
00181         //SENtral_InterruptPin.enable_irq();
00182         if (displayText) printf("Exit Run Mode Request sent\n\r");
00183         break;
00184     case 'i':
00185     {
00186         displayPhysicalSensorInformation();
00187         break;
00188     }
00189     case 'j':
00190         em7186_set_fifo_watermarks(1000, 1000);
00191         break;
00192 //    case 'l':
00193 //        em7186_warm_start_load(warmStartFile);
00194 //        break;
00195     case 'm':
00196         reportMetaData = !reportMetaData;
00197         if (reportMetaData) printf("Meta Data reporting  - %s\n\r", (printData ? "Enabled" : "Disabled"));
00198         break;
00199     case 'n':
00200         displaySensorInformation();
00201         break;
00202     case 'r':
00203         em7186_i2c_write_value(CHIP_CONTROL_REG, CHIP_CONTROL_CPU_RUN);        
00204         em7186_set_scale_factors();
00205         SENtral_InterruptPin.enable_irq();
00206         if (displayText) printf("Run Mode Request sent\n\r");
00207         break;
00208     case 'R':
00209         em7186_i2c_write_value(RESET_REQ_REG, 1);        
00210         if (displayText) printf("Reset Request Sent\n\r"); 
00211         break;
00212     case 's':
00213         serialCommandMode = 1; // user beginning to Enable/Disable or change SensorRate
00214         serialSensorID = 0; serialSensorRate = 0; serialCommandValue = 0;
00215         if (displayText) printf("Enter Sensor ID,Rate--> ");
00216         // reminder: SENtral must be "run"-ing before the virtual sensor actually starts
00217         // run mode ('r' command) can be executed before or after this command
00218         break;
00219 //    case 'S':
00220 //        em7186_warm_start_save(warmStartFile);
00221 //        break;
00222    case 't':
00223         displayText = !displayText;
00224         if (displayText) printf("Text Display %s\n\r", (displayText ? "Enabled" : "Disabled"));
00225         break;
00226     case 'X':
00227             if (displayText) printf("Firmware Transfer. Enter source/destination code: %s\n\r",fw);
00228             serialCommandMode = 3;
00229             break;
00230     case 'v':
00231     case 'V':
00232         read_BuildVersion();
00233         break;
00234 //    case 'w':
00235 //        warmStart(); // this is to test the warmstart save/load process
00236 //        break;
00237     case 'y':
00238         break;
00239     case 'z':
00240         displaySensorConfiguration();
00241         break;
00242      case '?':
00243         {
00244         u8 bar[45];
00245         memset(bar, 205, sizeof(bar));
00246         bar[sizeof(bar)-1] = 0;
00247         printf("\n\r");
00248         printf("  RM3100RTI-SEntral Simple Serial Interface\n\r");
00249         printf("                  Revision: %s\n\r",REVISION);
00250         printf("  %c%s%c\n\r", 201, bar, 187);
00251         printf("  %c        Commands  (case sensitive)          %c\n\r", 186, 186);
00252         // Status and configuration
00253         printf("  %c%s%c\n\r", 204, bar, 185);
00254         printf("  %c         Configuration and Status           %c\n\r", 186, 186);
00255         printf("  %c%s%c\n\r", 204, bar, 185);
00256         printf("  %c c : Display status registers               %c\n\r", 186, 186);
00257         printf("  %c e : Display physical sensor status         %c\n\r", 186, 186);
00258         printf("  %c f : Display sensor status                  %c\n\r", 186, 186);
00259         printf("  %c i : Display Physical Sensor Information    %c\n\r", 186, 186);
00260         printf("  %c n : Display sensor information             %c\n\r", 186, 186);
00261         printf("  %c z : Display sensor configuration           %c\n\r", 186, 186);
00262         printf("  %c v : Display Firmware Version information   %c\n\r", 186, 186);
00263 
00264         // Sensor control
00265         printf("  %c%s%c\n\r", 204, bar, 185);
00266         printf("  %c               Firmware Transfers           %c\n\r", 186, 186);
00267         printf("  %c%s%c\n\r", 204, bar, 185);
00268         printf("  %c XR : From SD Card to SENtral RAM           %c\n\r", 186, 186);
00269         printf("  %c XE : From SD Card to EEPROM                %c\n\r", 186, 186);
00270  
00271         // Sensor control
00272         printf("  %c%s%c\n\r", 204, bar, 185);
00273         printf("  %c               Sensor Rates                 %c\n\r", 186, 186);
00274         printf("  %c%s%c\n\r", 204, bar, 185);
00275         printf("  %c s @@@,###[CR]                              %c\n\r", 186, 186);
00276         printf("  %c   where:                                   %c\n\r", 186, 186);
00277         printf("  %c    @@@ = Sensor ID                         %c\n\r", 186, 186);
00278         printf("  %c    ### = Data rate                         %c\n\r", 186, 186); 
00279         printf("  %c    [CR]= carriage return (0x0D)            %c\n\r", 186, 186); 
00280  
00281         // Display controls
00282         printf("  %c%s%c\n\r", 204, bar, 185);
00283         printf("  %c             Display Controls               %c\n\r", 186, 186);
00284         printf("  %c%s%c\n\r", 204, bar, 185);
00285         printf("  %c t : Toggle command feedback text           %c\n\r", 186, 186);
00286         printf("  %c m : Meta event reporting (on/off)          %c\n\r", 186, 186);
00287 
00288         // Data logging
00289         printf("  %c%s%c\n\r", 204, bar, 185);
00290         printf("  %c               Data Logging                 %c\n\r", 186, 186);
00291         printf("  %c%s%c\n\r", 204, bar, 185);
00292         printf("  %c g : Toggle sensor Data log (on/off)        %c\n\r", 186, 186);
00293         printf("  %c D : Toggle sensor Data display (on/off)    %c\n\r", 186, 186);
00294 
00295         // Additional controls
00296         printf("  %c%s%c\n\r", 204, bar, 185);
00297         printf("  %c           Additional Controls              %c\n\r", 186, 186);
00298         printf("  %c%s%c\n\r", 204, bar, 185);
00299         printf("  %c j : Set fifo watermarks to 1000            %c\n\r", 186, 186);
00300         printf("  %c h : Toggle AP suspend mode (on/off)        %c\n\r", 186, 186);
00301         printf("  %c R : Send Reset Request to SENtral          %c\n\r", 186, 186);
00302         printf("  %c r : Request SENtral Run Mode ON            %c\n\r", 186, 186);
00303         printf("  %c H : Request SENtral Run Mode OFF (Halt)    %c\n\r", 186, 186);
00304  
00305         // Warm-start
00306         printf("  %c%s%c\n\r", 204, bar, 185);
00307         printf("  %c                Warm-Start                  %c\n\r", 186, 186);
00308         printf("  %c%s%c\n\r", 204, bar, 185);
00309         printf("  %c S : Save warm-start parameters             %c\n\r", 186, 186);
00310         printf("  %c l : Load warm-start parameters             %c\n\r", 186, 186);
00311         printf("  %c d : Display warm-start parameters          %c\n\r", 186, 186);
00312         printf("  %c w : Perform warm-start test                %c\n\r", 186, 186);
00313         
00314         // Tests
00315         printf("  %c%s%c\n\r", 204, bar, 185);
00316         printf("  %c                  Tests                     %c\n\r", 186, 186);
00317         printf("  %c%s%c\n\r", 204, bar, 185);
00318         printf("  %c B : Run sensor Self tests                  %c\n\r", 186, 186);
00319 
00320         printf("  %c%s%c\n\r", 200, bar, 188);
00321 
00322         }
00323     }
00324 }
00325 
00326 
00327 void runScript(void)
00328 {
00329     
00330     // This script(function) runs when the Pushbutton on the RM3100 Arduino
00331     // shield is pressed, which is connected to pin D5.
00332     
00333     green_LED = 1; // flash to denote start
00334     wait(0.1);
00335     green_LED = 0;
00336     
00337     if (displayText) printf("Running Special script\n\r");  
00338     
00339 /*
00340     Your custom code goes here
00341 */
00342 
00343 
00344 }
00345 
00346 
00347 //******************************
00348 //  MAIN
00349 //******************************
00350 
00351 int main()
00352 {
00353 
00354     // Init user serial interface
00355     pc.baud(115200);
00356     printf("SENtral Simple Serial Host Interface %s\n\r",REVISION);
00357 
00358     // Initialize Stuff
00359     if (!em7186_i2c_init()) {
00360         printf("Failed to see SENtral device.\n\r Check connections\n\r");
00361     }
00362 
00363 
00364     // Setup interrupt callback functions
00365     SENtral_InterruptPin.rise(&SENtral_Interrupt); // SENtral host interrupt
00366     pc.attach(&OnSerial);                          // user input from serial term 
00367     
00368     
00369     // flash ready signal on expansion board Assumes LED is jumpered to D4
00370     for (char i=4;i;i--)
00371     {
00372         green_LED       = 1;     // This LED is optional RM3100RTI shield board specific
00373         wait(0.1);
00374         green_LED       = 0;
00375         wait(.1);
00376     }
00377     green_LED       = 1;
00378     wait(.25);
00379    
00380     while (1) 
00381     {
00382 
00383         if (serial_inchar) 
00384         {
00385             processSerialInchar(serial_inchar); // process user key commands
00386             serial_inchar = NULL;
00387         }
00388         
00389         if (sentral_service_flag)
00390         {
00391             sentral_service_flag=0;
00392             bytesRead = em7186_read_fifo(fifoBuffer);
00393             em7186_parse_fifo(fifoBuffer, bytesRead);
00394             SENtral_InterruptPin.enable_irq();
00395     
00396         }
00397 
00398         if (pushButton == 1) // PBSwitch is wired as active high
00399             runScript();    // execute special script(function)
00400  
00401     }
00402 
00403 }
00404