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
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
Generated on Wed Jul 20 2022 12:20:49 by 1.7.2