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

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

Committer:
JoeMiller
Date:
Mon Oct 10 21:10:44 2016 +0000
Revision:
3:69239f60d620
Parent:
1:b0a205c9b958
Child:
5:7f3a6a07b973
1) Fixed interrupt issue; 2) Added Sensor ID number to sensor information request, command 'n'.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JoeMiller 0:02c0c2cbc3df 1 #include "main.h"
JoeMiller 0:02c0c2cbc3df 2
JoeMiller 1:b0a205c9b958 3 #define REVISION "1.0.1"
JoeMiller 0:02c0c2cbc3df 4 #define CR 13
JoeMiller 0:02c0c2cbc3df 5 #define LF 10
JoeMiller 0:02c0c2cbc3df 6
JoeMiller 0:02c0c2cbc3df 7 // Note: all warmstart related functions are commented-out. The parameter list and
JoeMiller 0:02c0c2cbc3df 8 // flags are presently going through a major revision.
JoeMiller 0:02c0c2cbc3df 9
JoeMiller 0:02c0c2cbc3df 10
JoeMiller 0:02c0c2cbc3df 11
JoeMiller 0:02c0c2cbc3df 12 //******************************
JoeMiller 0:02c0c2cbc3df 13 // Function prototypes
JoeMiller 0:02c0c2cbc3df 14 //******************************
JoeMiller 0:02c0c2cbc3df 15 void read_BuildVersion(void);
JoeMiller 0:02c0c2cbc3df 16 void executeSerialFunction(char key);
JoeMiller 0:02c0c2cbc3df 17
JoeMiller 0:02c0c2cbc3df 18 //*******************************
JoeMiller 0:02c0c2cbc3df 19 // Global Variables
JoeMiller 0:02c0c2cbc3df 20 //*******************************
JoeMiller 0:02c0c2cbc3df 21 u8 serialCommandMode;
JoeMiller 0:02c0c2cbc3df 22 u8 serialSensorID;
JoeMiller 0:02c0c2cbc3df 23 u16 serialSensorRate;
JoeMiller 0:02c0c2cbc3df 24 u16 serialCommandValue;
JoeMiller 0:02c0c2cbc3df 25
JoeMiller 0:02c0c2cbc3df 26 u8 fifoBuffer[24 * 1024];
JoeMiller 0:02c0c2cbc3df 27 u32 bytesRead;
JoeMiller 0:02c0c2cbc3df 28
JoeMiller 0:02c0c2cbc3df 29 u8 apSuspendMode = 0;
JoeMiller 0:02c0c2cbc3df 30 u8 displayText = 1; // Also see simular "printData" in em7186.cpp
JoeMiller 0:02c0c2cbc3df 31 u8 reportMetaData = 0;
JoeMiller 0:02c0c2cbc3df 32
JoeMiller 0:02c0c2cbc3df 33 u8 fw[] = { "/sd/sentral.fw" };
JoeMiller 0:02c0c2cbc3df 34 u8 logfilename[] = { "/sd/log.csv" };
JoeMiller 0:02c0c2cbc3df 35 //u8 warmStartFile[] = { "/sd/warmstart.dat" };
JoeMiller 3:69239f60d620 36 u8 sentral_service_flag=0;
JoeMiller 0:02c0c2cbc3df 37
JoeMiller 0:02c0c2cbc3df 38 FILE *flog;
JoeMiller 0:02c0c2cbc3df 39
JoeMiller 0:02c0c2cbc3df 40 char serial_inchar;
JoeMiller 0:02c0c2cbc3df 41
JoeMiller 0:02c0c2cbc3df 42 //******************************
JoeMiller 0:02c0c2cbc3df 43 // Interrupt callback functions
JoeMiller 0:02c0c2cbc3df 44 //******************************
JoeMiller 0:02c0c2cbc3df 45
JoeMiller 0:02c0c2cbc3df 46 void SENtral_Interrupt(void)
JoeMiller 0:02c0c2cbc3df 47 {
JoeMiller 0:02c0c2cbc3df 48
JoeMiller 3:69239f60d620 49 sentral_service_flag=1;
JoeMiller 3:69239f60d620 50 SENtral_InterruptPin.disable_irq();
JoeMiller 3:69239f60d620 51
JoeMiller 0:02c0c2cbc3df 52 }
JoeMiller 0:02c0c2cbc3df 53
JoeMiller 0:02c0c2cbc3df 54 void OnSerial(void)
JoeMiller 0:02c0c2cbc3df 55 {
JoeMiller 0:02c0c2cbc3df 56 serial_inchar = pc.getc();
JoeMiller 0:02c0c2cbc3df 57 }
JoeMiller 0:02c0c2cbc3df 58
JoeMiller 0:02c0c2cbc3df 59 //=============================================================================
JoeMiller 0:02c0c2cbc3df 60 // Serial input Character (Key) Commands
JoeMiller 0:02c0c2cbc3df 61 //=============================================================================
JoeMiller 0:02c0c2cbc3df 62
JoeMiller 0:02c0c2cbc3df 63 // processSerialInchar function is called upon every incomming serial character
JoeMiller 0:02c0c2cbc3df 64 // as defined in mbed_objects.cpp
JoeMiller 0:02c0c2cbc3df 65 void processSerialInchar(char key)
JoeMiller 0:02c0c2cbc3df 66 {
JoeMiller 0:02c0c2cbc3df 67 // The Simple Serial protocal mostly consists of single character commands
JoeMiller 0:02c0c2cbc3df 68 // the exceptions are commands that require additional information like 's' and 'X'.
JoeMiller 0:02c0c2cbc3df 69 // In these cases serialCommandMode states are used and operands are then preprocessed
JoeMiller 0:02c0c2cbc3df 70 // inside this function.
JoeMiller 0:02c0c2cbc3df 71
JoeMiller 0:02c0c2cbc3df 72 // If the protocal gets larger and more commands require additional data a more complex
JoeMiller 0:02c0c2cbc3df 73 // command processor with incoming serial buffer will have to be implimented
JoeMiller 0:02c0c2cbc3df 74 // presently this simple processor does the job
JoeMiller 0:02c0c2cbc3df 75
JoeMiller 0:02c0c2cbc3df 76 // serialCommandMode ** STATES **
JoeMiller 0:02c0c2cbc3df 77 // 0: Not in Sensor command building mode
JoeMiller 0:02c0c2cbc3df 78 // 1: 's' Sensor Rate chane. State 1 = Constructing Sensor ID number
JoeMiller 0:02c0c2cbc3df 79 // 2: State 2 = Constructing Sensor Rate Value
JoeMiller 0:02c0c2cbc3df 80 // 3: 'X' Firmware Image Tranfer Mode (waiting for source/destination character)
JoeMiller 0:02c0c2cbc3df 81 // CR: [carrage return] sends constructed sensor rate request
JoeMiller 0:02c0c2cbc3df 82
JoeMiller 0:02c0c2cbc3df 83 // send '?' to mbed for menu of commands
JoeMiller 0:02c0c2cbc3df 84
JoeMiller 0:02c0c2cbc3df 85
JoeMiller 0:02c0c2cbc3df 86 serial_inchar = NULL;
JoeMiller 0:02c0c2cbc3df 87
JoeMiller 0:02c0c2cbc3df 88 if ((serialCommandMode > 0) && (serialCommandMode < 3)) { //'s' virutual sensor rate change request
JoeMiller 0:02c0c2cbc3df 89 if ((key >= '0') && (key <= '9')) {
JoeMiller 0:02c0c2cbc3df 90 serialCommandValue = (serialCommandValue * 10) + (key - '0');
JoeMiller 0:02c0c2cbc3df 91 }
JoeMiller 0:02c0c2cbc3df 92 else if (key == ',') {
JoeMiller 0:02c0c2cbc3df 93 serialSensorID = (unsigned char)serialCommandValue;
JoeMiller 0:02c0c2cbc3df 94 serialCommandValue = 0;
JoeMiller 0:02c0c2cbc3df 95 serialCommandMode = 2;
JoeMiller 0:02c0c2cbc3df 96 } else if (key == CR || key == LF) {
JoeMiller 0:02c0c2cbc3df 97 if (serialCommandMode == 1) {
JoeMiller 0:02c0c2cbc3df 98 serialSensorID = serialCommandValue;
JoeMiller 0:02c0c2cbc3df 99 } else {
JoeMiller 0:02c0c2cbc3df 100 serialSensorRate = serialCommandValue;
JoeMiller 0:02c0c2cbc3df 101 }
JoeMiller 0:02c0c2cbc3df 102 if (serialSensorID > 0) {
JoeMiller 0:02c0c2cbc3df 103 if (displayText) printf("\n\rChanging rate of sensor %u to %d\n\r", serialSensorID, serialSensorRate);
JoeMiller 0:02c0c2cbc3df 104 em7186_set_sensor_rate(serialSensorID,serialSensorRate);
JoeMiller 0:02c0c2cbc3df 105 if (serialSensorRate > 0) {
JoeMiller 0:02c0c2cbc3df 106 sensorEnabled[serialSensorID-1] = TRUE;
JoeMiller 0:02c0c2cbc3df 107 } else {
JoeMiller 0:02c0c2cbc3df 108 sensorEnabled[serialSensorID-1] = FALSE;
JoeMiller 0:02c0c2cbc3df 109 }
JoeMiller 0:02c0c2cbc3df 110 }
JoeMiller 0:02c0c2cbc3df 111 serialCommandMode = 0;
JoeMiller 0:02c0c2cbc3df 112 serialSensorID = 0;
JoeMiller 0:02c0c2cbc3df 113 serialSensorRate = 0;
JoeMiller 0:02c0c2cbc3df 114 }
JoeMiller 0:02c0c2cbc3df 115 } else if (serialCommandMode == 3) { // 'X' Transfer firmware command
JoeMiller 0:02c0c2cbc3df 116 firmwareTransfer(key);
JoeMiller 0:02c0c2cbc3df 117 serialCommandMode = 0;
JoeMiller 0:02c0c2cbc3df 118 } else
JoeMiller 0:02c0c2cbc3df 119 executeSerialFunction(key);
JoeMiller 0:02c0c2cbc3df 120 }
JoeMiller 0:02c0c2cbc3df 121
JoeMiller 0:02c0c2cbc3df 122 void executeSerialFunction(char key)
JoeMiller 0:02c0c2cbc3df 123 {
JoeMiller 0:02c0c2cbc3df 124 u8 paramValues[2];
JoeMiller 0:02c0c2cbc3df 125 ParamInfo param = { 1,1 }; // parameter# 1, size=1
JoeMiller 0:02c0c2cbc3df 126 switch (key)
JoeMiller 0:02c0c2cbc3df 127 {
JoeMiller 0:02c0c2cbc3df 128 case 'B':
JoeMiller 0:02c0c2cbc3df 129 if (displayText) printf("\n\r\n\r ********** PREPARING FOR SENSOR SELF TEST REQUEST; STANDBY REQUEST MADE ********** \n\r\n\r");
JoeMiller 0:02c0c2cbc3df 130 paramValues[0] = 0x01; // Request Sensor Self Test bit and NOT standby bit
JoeMiller 0:02c0c2cbc3df 131 em7186_i2c_write(0x55, paramValues, 1); // 0x55 = Host Interface Control Reg
JoeMiller 0:02c0c2cbc3df 132 if (displayText) printf("\n\r\n\r ********** SENSOR SELF TEST REQUEST + RUN MADE ********** \n\r\n\r");
JoeMiller 0:02c0c2cbc3df 133 paramValues[0] = 0x40; // Request Sensor Self Test bit and NOT standby bit
JoeMiller 0:02c0c2cbc3df 134 em7186_i2c_write(0x55, paramValues, 1); // 0x55 = Host Interface Control Reg
JoeMiller 0:02c0c2cbc3df 135 break;
JoeMiller 0:02c0c2cbc3df 136 case 'c':
JoeMiller 0:02c0c2cbc3df 137 displayStatusRegisters();
JoeMiller 0:02c0c2cbc3df 138 break;
JoeMiller 0:02c0c2cbc3df 139 // case 'd':
JoeMiller 0:02c0c2cbc3df 140 // displayParams(2, warmStartList, sizeof(warmStartList) / sizeof(warmStartList[0]));
JoeMiller 0:02c0c2cbc3df 141 // break;
JoeMiller 0:02c0c2cbc3df 142 case 'D': // this togggles display of SENtral(FIFO) Data
JoeMiller 0:02c0c2cbc3df 143 // Only useful when intending to log data through SD Card and want to suspend terminal display of data
JoeMiller 0:02c0c2cbc3df 144 printData = !printData;
JoeMiller 0:02c0c2cbc3df 145 if (displayText) printf("Display SENtral Data - %s\n\r", (printData ? "Enabled" : "Disabled"));
JoeMiller 0:02c0c2cbc3df 146 break;
JoeMiller 0:02c0c2cbc3df 147 case 'e':
JoeMiller 0:02c0c2cbc3df 148 displayPhysicalSensorStatus();
JoeMiller 0:02c0c2cbc3df 149 break;
JoeMiller 0:02c0c2cbc3df 150 case 'f':
JoeMiller 0:02c0c2cbc3df 151 displaySensorStatus();
JoeMiller 0:02c0c2cbc3df 152 break;
JoeMiller 0:02c0c2cbc3df 153
JoeMiller 0:02c0c2cbc3df 154 case 'g':
JoeMiller 0:02c0c2cbc3df 155 logData = !logData;
JoeMiller 0:02c0c2cbc3df 156 if(logData) {
JoeMiller 0:02c0c2cbc3df 157 flog = fopen(logfilename, "a");
JoeMiller 0:02c0c2cbc3df 158 if (!flog) {
JoeMiller 0:02c0c2cbc3df 159 printf("Error Opening log file\n\r");
JoeMiller 0:02c0c2cbc3df 160 logData = 0;
JoeMiller 0:02c0c2cbc3df 161 }
JoeMiller 0:02c0c2cbc3df 162 else
JoeMiller 0:02c0c2cbc3df 163 printf("%s Log file open\n\r",logfilename);
JoeMiller 0:02c0c2cbc3df 164 }
JoeMiller 0:02c0c2cbc3df 165 else {
JoeMiller 0:02c0c2cbc3df 166 if(flog) {
JoeMiller 0:02c0c2cbc3df 167 fclose(flog);
JoeMiller 0:02c0c2cbc3df 168 printf("Log file closed\n\r");
JoeMiller 0:02c0c2cbc3df 169 }
JoeMiller 0:02c0c2cbc3df 170 }
JoeMiller 0:02c0c2cbc3df 171 break;
JoeMiller 0:02c0c2cbc3df 172
JoeMiller 0:02c0c2cbc3df 173 case 'h':
JoeMiller 0:02c0c2cbc3df 174 apSuspendMode = !apSuspendMode;
JoeMiller 0:02c0c2cbc3df 175 if (apSuspendMode) em7186_ap_suspend(1);
JoeMiller 0:02c0c2cbc3df 176 else em7186_ap_suspend(0);
JoeMiller 0:02c0c2cbc3df 177 if (displayText) printf("AP Suspend Mode %s\n\r", (apSuspendMode ? "Enabled" : "Disabled"));
JoeMiller 0:02c0c2cbc3df 178 break;
JoeMiller 0:02c0c2cbc3df 179 case 'H':
JoeMiller 0:02c0c2cbc3df 180 em7186_i2c_write_value(CHIP_CONTROL_REG, CHIP_CONTROL_CPU_STOP);
JoeMiller 0:02c0c2cbc3df 181 //SENtral_InterruptPin.enable_irq();
JoeMiller 0:02c0c2cbc3df 182 if (displayText) printf("Exit Run Mode Request sent\n\r");
JoeMiller 0:02c0c2cbc3df 183 break;
JoeMiller 0:02c0c2cbc3df 184 case 'i':
JoeMiller 0:02c0c2cbc3df 185 {
JoeMiller 0:02c0c2cbc3df 186 displayPhysicalSensorInformation();
JoeMiller 0:02c0c2cbc3df 187 break;
JoeMiller 0:02c0c2cbc3df 188 }
JoeMiller 0:02c0c2cbc3df 189 case 'j':
JoeMiller 0:02c0c2cbc3df 190 em7186_set_fifo_watermarks(1000, 1000);
JoeMiller 0:02c0c2cbc3df 191 break;
JoeMiller 0:02c0c2cbc3df 192 // case 'l':
JoeMiller 0:02c0c2cbc3df 193 // em7186_warm_start_load(warmStartFile);
JoeMiller 0:02c0c2cbc3df 194 // break;
JoeMiller 0:02c0c2cbc3df 195 case 'm':
JoeMiller 0:02c0c2cbc3df 196 reportMetaData = !reportMetaData;
JoeMiller 0:02c0c2cbc3df 197 if (reportMetaData) printf("Meta Data reporting - %s\n\r", (printData ? "Enabled" : "Disabled"));
JoeMiller 0:02c0c2cbc3df 198 break;
JoeMiller 0:02c0c2cbc3df 199 case 'n':
JoeMiller 0:02c0c2cbc3df 200 displaySensorInformation();
JoeMiller 0:02c0c2cbc3df 201 break;
JoeMiller 0:02c0c2cbc3df 202 case 'r':
JoeMiller 0:02c0c2cbc3df 203 em7186_i2c_write_value(CHIP_CONTROL_REG, CHIP_CONTROL_CPU_RUN);
JoeMiller 0:02c0c2cbc3df 204 em7186_set_scale_factors();
JoeMiller 0:02c0c2cbc3df 205 SENtral_InterruptPin.enable_irq();
JoeMiller 0:02c0c2cbc3df 206 if (displayText) printf("Run Mode Request sent\n\r");
JoeMiller 0:02c0c2cbc3df 207 break;
JoeMiller 0:02c0c2cbc3df 208 case 'R':
JoeMiller 0:02c0c2cbc3df 209 em7186_i2c_write_value(RESET_REQ_REG, 1);
JoeMiller 0:02c0c2cbc3df 210 if (displayText) printf("Reset Request Sent\n\r");
JoeMiller 0:02c0c2cbc3df 211 break;
JoeMiller 0:02c0c2cbc3df 212 case 's':
JoeMiller 0:02c0c2cbc3df 213 serialCommandMode = 1; // user beginning to Enable/Disable or change SensorRate
JoeMiller 0:02c0c2cbc3df 214 serialSensorID = 0; serialSensorRate = 0; serialCommandValue = 0;
JoeMiller 0:02c0c2cbc3df 215 if (displayText) printf("Enter Sensor ID,Rate--> ");
JoeMiller 0:02c0c2cbc3df 216 // reminder: SENtral must be "run"-ing before the virtual sensor actually starts
JoeMiller 0:02c0c2cbc3df 217 // run mode ('r' command) can be executed before or after this command
JoeMiller 0:02c0c2cbc3df 218 break;
JoeMiller 0:02c0c2cbc3df 219 // case 'S':
JoeMiller 0:02c0c2cbc3df 220 // em7186_warm_start_save(warmStartFile);
JoeMiller 0:02c0c2cbc3df 221 // break;
JoeMiller 0:02c0c2cbc3df 222 case 't':
JoeMiller 0:02c0c2cbc3df 223 displayText = !displayText;
JoeMiller 0:02c0c2cbc3df 224 if (displayText) printf("Text Display %s\n\r", (displayText ? "Enabled" : "Disabled"));
JoeMiller 0:02c0c2cbc3df 225 break;
JoeMiller 0:02c0c2cbc3df 226 case 'X':
JoeMiller 0:02c0c2cbc3df 227 if (displayText) printf("Firmware Transfer. Enter source/destination code: %s\n\r",fw);
JoeMiller 0:02c0c2cbc3df 228 serialCommandMode = 3;
JoeMiller 0:02c0c2cbc3df 229 break;
JoeMiller 0:02c0c2cbc3df 230 case 'v':
JoeMiller 0:02c0c2cbc3df 231 case 'V':
JoeMiller 0:02c0c2cbc3df 232 read_BuildVersion();
JoeMiller 0:02c0c2cbc3df 233 break;
JoeMiller 0:02c0c2cbc3df 234 // case 'w':
JoeMiller 0:02c0c2cbc3df 235 // warmStart(); // this is to test the warmstart save/load process
JoeMiller 0:02c0c2cbc3df 236 // break;
JoeMiller 0:02c0c2cbc3df 237 case 'y':
JoeMiller 0:02c0c2cbc3df 238 break;
JoeMiller 0:02c0c2cbc3df 239 case 'z':
JoeMiller 0:02c0c2cbc3df 240 displaySensorConfiguration();
JoeMiller 0:02c0c2cbc3df 241 break;
JoeMiller 0:02c0c2cbc3df 242 case '?':
JoeMiller 0:02c0c2cbc3df 243 {
JoeMiller 0:02c0c2cbc3df 244 u8 bar[45];
JoeMiller 0:02c0c2cbc3df 245 memset(bar, 205, sizeof(bar));
JoeMiller 0:02c0c2cbc3df 246 bar[sizeof(bar)-1] = 0;
JoeMiller 0:02c0c2cbc3df 247 printf("\n\r");
JoeMiller 0:02c0c2cbc3df 248 printf(" RM3100RTI-SEntral Simple Serial Interface\n\r");
JoeMiller 0:02c0c2cbc3df 249 printf(" Revision: %s\n\r",REVISION);
JoeMiller 0:02c0c2cbc3df 250 printf(" %c%s%c\n\r", 201, bar, 187);
JoeMiller 0:02c0c2cbc3df 251 printf(" %c Commands (case sensitive) %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 252 // Status and configuration
JoeMiller 0:02c0c2cbc3df 253 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 254 printf(" %c Configuration and Status %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 255 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 256 printf(" %c c : Display status registers %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 257 printf(" %c e : Display physical sensor status %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 258 printf(" %c f : Display sensor status %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 259 printf(" %c i : Display Physical Sensor Information %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 260 printf(" %c n : Display sensor information %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 261 printf(" %c z : Display sensor configuration %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 262 printf(" %c v : Display Firmware Version information %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 263
JoeMiller 0:02c0c2cbc3df 264 // Sensor control
JoeMiller 0:02c0c2cbc3df 265 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 266 printf(" %c Firmware Transfers %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 267 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 268 printf(" %c XR : From SD Card to SENtral RAM %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 269 printf(" %c XE : From SD Card to EEPROM %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 270
JoeMiller 0:02c0c2cbc3df 271 // Sensor control
JoeMiller 0:02c0c2cbc3df 272 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 273 printf(" %c Sensor Rates %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 274 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 275 printf(" %c s @@@,###[CR] %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 276 printf(" %c where: %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 277 printf(" %c @@@ = Sensor ID %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 278 printf(" %c ### = Data rate %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 279 printf(" %c [CR]= carriage return (0x0D) %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 280
JoeMiller 0:02c0c2cbc3df 281 // Display controls
JoeMiller 0:02c0c2cbc3df 282 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 283 printf(" %c Display Controls %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 284 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 285 printf(" %c t : Toggle command feedback text %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 286 printf(" %c m : Meta event reporting (on/off) %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 287
JoeMiller 0:02c0c2cbc3df 288 // Data logging
JoeMiller 0:02c0c2cbc3df 289 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 290 printf(" %c Data Logging %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 291 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 292 printf(" %c g : Toggle sensor Data log (on/off) %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 293 printf(" %c D : Toggle sensor Data display (on/off) %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 294
JoeMiller 0:02c0c2cbc3df 295 // Additional controls
JoeMiller 0:02c0c2cbc3df 296 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 297 printf(" %c Additional Controls %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 298 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 299 printf(" %c j : Set fifo watermarks to 1000 %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 300 printf(" %c h : Toggle AP suspend mode (on/off) %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 301 printf(" %c R : Send Reset Request to SENtral %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 302 printf(" %c r : Request SENtral Run Mode ON %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 303 printf(" %c H : Request SENtral Run Mode OFF (Halt) %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 304
JoeMiller 0:02c0c2cbc3df 305 // Warm-start
JoeMiller 0:02c0c2cbc3df 306 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 307 printf(" %c Warm-Start %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 308 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 309 printf(" %c S : Save warm-start parameters %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 310 printf(" %c l : Load warm-start parameters %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 311 printf(" %c d : Display warm-start parameters %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 312 printf(" %c w : Perform warm-start test %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 313
JoeMiller 0:02c0c2cbc3df 314 // Tests
JoeMiller 0:02c0c2cbc3df 315 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 316 printf(" %c Tests %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 317 printf(" %c%s%c\n\r", 204, bar, 185);
JoeMiller 0:02c0c2cbc3df 318 printf(" %c B : Run sensor Self tests %c\n\r", 186, 186);
JoeMiller 0:02c0c2cbc3df 319
JoeMiller 0:02c0c2cbc3df 320 printf(" %c%s%c\n\r", 200, bar, 188);
JoeMiller 0:02c0c2cbc3df 321
JoeMiller 0:02c0c2cbc3df 322 }
JoeMiller 0:02c0c2cbc3df 323 }
JoeMiller 0:02c0c2cbc3df 324 }
JoeMiller 0:02c0c2cbc3df 325
JoeMiller 0:02c0c2cbc3df 326
JoeMiller 0:02c0c2cbc3df 327 void runScript(void)
JoeMiller 0:02c0c2cbc3df 328 {
JoeMiller 0:02c0c2cbc3df 329
JoeMiller 0:02c0c2cbc3df 330 // This script(function) runs when the Pushbutton on the RM3100 Arduino
JoeMiller 0:02c0c2cbc3df 331 // shield is pressed, which is connected to pin D5.
JoeMiller 0:02c0c2cbc3df 332
JoeMiller 0:02c0c2cbc3df 333 green_LED = 1; // flash to denote start
JoeMiller 0:02c0c2cbc3df 334 wait(0.1);
JoeMiller 0:02c0c2cbc3df 335 green_LED = 0;
JoeMiller 0:02c0c2cbc3df 336
JoeMiller 0:02c0c2cbc3df 337 if (displayText) printf("Running Special script\n\r");
JoeMiller 0:02c0c2cbc3df 338
JoeMiller 0:02c0c2cbc3df 339 /*
JoeMiller 0:02c0c2cbc3df 340 Your custom code goes here
JoeMiller 0:02c0c2cbc3df 341 */
JoeMiller 0:02c0c2cbc3df 342
JoeMiller 0:02c0c2cbc3df 343
JoeMiller 0:02c0c2cbc3df 344 }
JoeMiller 0:02c0c2cbc3df 345
JoeMiller 0:02c0c2cbc3df 346
JoeMiller 0:02c0c2cbc3df 347 //******************************
JoeMiller 0:02c0c2cbc3df 348 // MAIN
JoeMiller 0:02c0c2cbc3df 349 //******************************
JoeMiller 0:02c0c2cbc3df 350
JoeMiller 0:02c0c2cbc3df 351 int main()
JoeMiller 0:02c0c2cbc3df 352 {
JoeMiller 0:02c0c2cbc3df 353
JoeMiller 0:02c0c2cbc3df 354 // Init user serial interface
JoeMiller 0:02c0c2cbc3df 355 pc.baud(115200);
JoeMiller 0:02c0c2cbc3df 356 printf("SENtral Simple Serial Host Interface %s\n\r",REVISION);
JoeMiller 0:02c0c2cbc3df 357
JoeMiller 0:02c0c2cbc3df 358 // Initialize Stuff
JoeMiller 0:02c0c2cbc3df 359 if (!em7186_i2c_init()) {
JoeMiller 0:02c0c2cbc3df 360 printf("Failed to see SENtral device.\n\r Check connections\n\r");
JoeMiller 0:02c0c2cbc3df 361 }
JoeMiller 0:02c0c2cbc3df 362
JoeMiller 0:02c0c2cbc3df 363
JoeMiller 0:02c0c2cbc3df 364 // Setup interrupt callback functions
JoeMiller 0:02c0c2cbc3df 365 SENtral_InterruptPin.rise(&SENtral_Interrupt); // SENtral host interrupt
JoeMiller 0:02c0c2cbc3df 366 pc.attach(&OnSerial); // user input from serial term
JoeMiller 0:02c0c2cbc3df 367
JoeMiller 0:02c0c2cbc3df 368
JoeMiller 0:02c0c2cbc3df 369 // flash ready signal on expansion board Assumes LED is jumpered to D4
JoeMiller 0:02c0c2cbc3df 370 for (char i=4;i;i--)
JoeMiller 0:02c0c2cbc3df 371 {
JoeMiller 0:02c0c2cbc3df 372 green_LED = 1; // This LED is optional RM3100RTI shield board specific
JoeMiller 0:02c0c2cbc3df 373 wait(0.1);
JoeMiller 0:02c0c2cbc3df 374 green_LED = 0;
JoeMiller 0:02c0c2cbc3df 375 wait(.1);
JoeMiller 0:02c0c2cbc3df 376 }
JoeMiller 0:02c0c2cbc3df 377 green_LED = 1;
JoeMiller 0:02c0c2cbc3df 378 wait(.25);
JoeMiller 0:02c0c2cbc3df 379
JoeMiller 0:02c0c2cbc3df 380 while (1)
JoeMiller 0:02c0c2cbc3df 381 {
JoeMiller 0:02c0c2cbc3df 382
JoeMiller 0:02c0c2cbc3df 383 if (serial_inchar)
JoeMiller 0:02c0c2cbc3df 384 {
JoeMiller 0:02c0c2cbc3df 385 processSerialInchar(serial_inchar); // process user key commands
JoeMiller 0:02c0c2cbc3df 386 serial_inchar = NULL;
JoeMiller 0:02c0c2cbc3df 387 }
JoeMiller 3:69239f60d620 388
JoeMiller 3:69239f60d620 389 if (sentral_service_flag)
JoeMiller 3:69239f60d620 390 {
JoeMiller 3:69239f60d620 391 sentral_service_flag=0;
JoeMiller 3:69239f60d620 392 bytesRead = em7186_read_fifo(fifoBuffer);
JoeMiller 3:69239f60d620 393 em7186_parse_fifo(fifoBuffer, bytesRead);
JoeMiller 3:69239f60d620 394 SENtral_InterruptPin.enable_irq();
JoeMiller 3:69239f60d620 395
JoeMiller 3:69239f60d620 396 }
JoeMiller 0:02c0c2cbc3df 397
JoeMiller 0:02c0c2cbc3df 398 if (pushButton == 1) // PBSwitch is wired as active high
JoeMiller 0:02c0c2cbc3df 399 runScript(); // execute special script(function)
JoeMiller 0:02c0c2cbc3df 400
JoeMiller 0:02c0c2cbc3df 401 }
JoeMiller 0:02c0c2cbc3df 402
JoeMiller 0:02c0c2cbc3df 403 }
JoeMiller 0:02c0c2cbc3df 404