Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@2:f2583b56777e, 2016-05-11 (annotated)
- Committer:
- skanderian
- Date:
- Wed May 11 16:13:49 2016 +0000
- Revision:
- 2:f2583b56777e
- Parent:
- 1:610dc7763656
- Child:
- 3:3b45e830ebe1
Sens desired pin # as hex. Example: #FE000100 gives readout for pin 1, #FE000F00 gives readout for pin 15
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
skanderian | 2:f2583b56777e | 1 | //Chesapeake Embedded code by Sami Kanderian. Date of last update (version) shown below. |
skanderian | 0:ce79b04fc2ca | 2 | #include "mbed.h" |
skanderian | 2:f2583b56777e | 3 | #include "string" |
skanderian | 2:f2583b56777e | 4 | #include "iostream" |
skanderian | 2:f2583b56777e | 5 | #include "math.h" |
skanderian | 2:f2583b56777e | 6 | //#include "stdio.h" |
skanderian | 1:610dc7763656 | 7 | //#include "rtos.h" |
skanderian | 1:610dc7763656 | 8 | |
skanderian | 0:ce79b04fc2ca | 9 | //Declare hardware inputs |
skanderian | 0:ce79b04fc2ca | 10 | Timer timer; |
skanderian | 2:f2583b56777e | 11 | Serial serial(USBTX, USBRX); |
skanderian | 2:f2583b56777e | 12 | //IMPORTANT NOTE: PTA1 and PTA2 ARE RESERVED FOR SERIAL COMMUNICATION!!! DO NOT USE FOR SENSOR/ACTUATOR I/O!!! |
skanderian | 2:f2583b56777e | 13 | |
skanderian | 2:f2583b56777e | 14 | //Analog inputs : 0-3.3V |
skanderian | 2:f2583b56777e | 15 | AnalogIn pin1(PTE20); |
skanderian | 2:f2583b56777e | 16 | AnalogIn pin2(PTB0); |
skanderian | 2:f2583b56777e | 17 | AnalogIn pin3(PTE21);//should be 16bit but doesnt work on mbed |
skanderian | 2:f2583b56777e | 18 | AnalogIn pin4(PTB1); |
skanderian | 2:f2583b56777e | 19 | AnalogIn pin5(PTE22); |
skanderian | 2:f2583b56777e | 20 | AnalogIn pin6(PTB2); |
skanderian | 2:f2583b56777e | 21 | AnalogIn pin7(PTE23); |
skanderian | 2:f2583b56777e | 22 | AnalogIn pin8(PTB3); |
skanderian | 2:f2583b56777e | 23 | AnalogIn pin9(PTE29); |
skanderian | 2:f2583b56777e | 24 | AnalogIn pin10(PTC2); |
skanderian | 2:f2583b56777e | 25 | AnalogIn pin11(PTE30); |
skanderian | 2:f2583b56777e | 26 | AnalogIn pin12(PTC1); |
skanderian | 2:f2583b56777e | 27 | AnalogIn pin13(PTC0); |
skanderian | 2:f2583b56777e | 28 | AnalogIn pin14(PTD1);// doesnt work. Seems to be stuck at 3.3 |
skanderian | 2:f2583b56777e | 29 | AnalogIn pin15(PTD5); |
skanderian | 2:f2583b56777e | 30 | AnalogIn pin16(PTD6); |
skanderian | 2:f2583b56777e | 31 | |
skanderian | 2:f2583b56777e | 32 | //Built in LEDs |
skanderian | 2:f2583b56777e | 33 | PwmOut rLed(LED_RED); |
skanderian | 2:f2583b56777e | 34 | PwmOut gLed(LED_GREEN); |
skanderian | 2:f2583b56777e | 35 | PwmOut bLed(LED_BLUE); |
skanderian | 2:f2583b56777e | 36 | |
skanderian | 2:f2583b56777e | 37 | //Date version as global |
skanderian | 2:f2583b56777e | 38 | string dateVersion = "#Microcontroller Detected! uC code ver.: 04.12.2016"; |
skanderian | 2:f2583b56777e | 39 | |
skanderian | 2:f2583b56777e | 40 | //New globals for RxInterrupt routine |
skanderian | 2:f2583b56777e | 41 | const int bufferSize = 256; |
skanderian | 2:f2583b56777e | 42 | char rxBuffer[bufferSize]; |
skanderian | 2:f2583b56777e | 43 | char txBuffer[bufferSize]; |
skanderian | 2:f2583b56777e | 44 | volatile int rxIn = 0; |
skanderian | 2:f2583b56777e | 45 | volatile int rxOut = 0; |
skanderian | 2:f2583b56777e | 46 | bool rxFlag = 0; |
skanderian | 0:ce79b04fc2ca | 47 | |
skanderian | 0:ce79b04fc2ca | 48 | //Declare globals |
skanderian | 1:610dc7763656 | 49 | char hexCCIn[2]; |
skanderian | 1:610dc7763656 | 50 | char hexDDDDIn[4]; |
skanderian | 1:610dc7763656 | 51 | int decCCIn; |
skanderian | 1:610dc7763656 | 52 | int decDDDDIn; |
skanderian | 1:610dc7763656 | 53 | |
skanderian | 2:f2583b56777e | 54 | |
skanderian | 2:f2583b56777e | 55 | void ledConfirmSent()//Light up blue LED 10% |
skanderian | 2:f2583b56777e | 56 | { |
skanderian | 2:f2583b56777e | 57 | rLed = 1; |
skanderian | 2:f2583b56777e | 58 | gLed = 1; |
skanderian | 2:f2583b56777e | 59 | bLed = 0.9; |
skanderian | 2:f2583b56777e | 60 | } |
skanderian | 2:f2583b56777e | 61 | |
skanderian | 2:f2583b56777e | 62 | void ledConfirmReceive()//Light up green LED 10% |
skanderian | 2:f2583b56777e | 63 | { |
skanderian | 2:f2583b56777e | 64 | rLed = 1; |
skanderian | 2:f2583b56777e | 65 | gLed = 0.9; |
skanderian | 2:f2583b56777e | 66 | bLed = 1; |
skanderian | 2:f2583b56777e | 67 | } |
skanderian | 0:ce79b04fc2ca | 68 | |
skanderian | 2:f2583b56777e | 69 | void sendAnalogIn(int pinNum) //send Analog input in V |
skanderian | 2:f2583b56777e | 70 | { |
skanderian | 2:f2583b56777e | 71 | |
skanderian | 2:f2583b56777e | 72 | //serial.printf("\r\n"); |
skanderian | 2:f2583b56777e | 73 | if (pinNum == 0 || pinNum == 1) { |
skanderian | 2:f2583b56777e | 74 | serial.printf("%s%03.1f%s\r\n", "#PTE20: ", 3.3f*pin1.read(), "V^"); |
skanderian | 2:f2583b56777e | 75 | } |
skanderian | 2:f2583b56777e | 76 | if (pinNum == 0 || pinNum == 2) { |
skanderian | 2:f2583b56777e | 77 | serial.printf("%s%03.1f%s\r\n", "#PTB0: ", 3.3f*pin2.read(), "V^"); |
skanderian | 2:f2583b56777e | 78 | } |
skanderian | 2:f2583b56777e | 79 | if (pinNum == 0 || pinNum == 3) { |
skanderian | 2:f2583b56777e | 80 | serial.printf("%s%03.1f%s\r\n", "#PTE21: ", 3.3f*pin3.read(), "V^"); |
skanderian | 2:f2583b56777e | 81 | } |
skanderian | 2:f2583b56777e | 82 | if (pinNum == 0 || pinNum == 4) { |
skanderian | 2:f2583b56777e | 83 | serial.printf("%s%03.1f%s\r\n", "#PTB1: ", 3.3f*pin4.read(), "V^"); |
skanderian | 2:f2583b56777e | 84 | } |
skanderian | 2:f2583b56777e | 85 | if (pinNum == 0 || pinNum == 5) { |
skanderian | 2:f2583b56777e | 86 | serial.printf("%s%03.1f%s\r\n", "#PTE22: ", 3.3f*pin5.read(), "V^"); |
skanderian | 2:f2583b56777e | 87 | } |
skanderian | 2:f2583b56777e | 88 | if (pinNum == 0 || pinNum == 6) { |
skanderian | 2:f2583b56777e | 89 | serial.printf("%s%03.1f%s\r\n", "#PTB2: ", 3.3f*pin6.read(), "V^"); |
skanderian | 2:f2583b56777e | 90 | } |
skanderian | 2:f2583b56777e | 91 | if (pinNum == 0 || pinNum == 7) { |
skanderian | 2:f2583b56777e | 92 | serial.printf("%s%03.1f%s\r\n", "#PTE23: ", 3.3f*pin7.read(), "V^"); |
skanderian | 2:f2583b56777e | 93 | } |
skanderian | 2:f2583b56777e | 94 | if (pinNum == 0 || pinNum == 8) { |
skanderian | 2:f2583b56777e | 95 | serial.printf("%s%03.1f%s\r\n", "#PTB3: ", 3.3f*pin8.read(), "V^"); |
skanderian | 2:f2583b56777e | 96 | } |
skanderian | 2:f2583b56777e | 97 | if (pinNum == 0 || pinNum == 9) { |
skanderian | 2:f2583b56777e | 98 | serial.printf("%s%03.1f%s\r\n", "#PTE29: ", 3.3f*pin9.read(), "V^"); |
skanderian | 2:f2583b56777e | 99 | } |
skanderian | 2:f2583b56777e | 100 | if (pinNum == 0 || pinNum == 10) { |
skanderian | 2:f2583b56777e | 101 | serial.printf("%s%03.1f%s\r\n", "#PTC2: ", 3.3f*pin10.read(), "V^"); |
skanderian | 2:f2583b56777e | 102 | } |
skanderian | 2:f2583b56777e | 103 | if (pinNum == 0 || pinNum == 11) { |
skanderian | 2:f2583b56777e | 104 | serial.printf("%s%03.1f%s\r\n", "#PTE30: ", 3.3f*pin11.read(), "V^"); |
skanderian | 2:f2583b56777e | 105 | } |
skanderian | 2:f2583b56777e | 106 | if (pinNum == 0 || pinNum == 12) { |
skanderian | 2:f2583b56777e | 107 | serial.printf("%s%03.1f%s\r\n", "#PTC1: ", 3.3f*pin12.read(), "V^"); |
skanderian | 2:f2583b56777e | 108 | } |
skanderian | 2:f2583b56777e | 109 | if (pinNum == 0 || pinNum == 13) { |
skanderian | 2:f2583b56777e | 110 | serial.printf("%s%03.1f%s\r\n", "#PTC0: ", 3.3f*pin13.read(), "V^"); |
skanderian | 2:f2583b56777e | 111 | } |
skanderian | 2:f2583b56777e | 112 | if (pinNum == 0 || pinNum == 14) { |
skanderian | 2:f2583b56777e | 113 | serial.printf("%s%03.1f%s\r\n", "#PTD1: ", 3.3f*pin14.read(), "V^"); |
skanderian | 2:f2583b56777e | 114 | } |
skanderian | 2:f2583b56777e | 115 | if (pinNum == 0 || pinNum == 15) { |
skanderian | 2:f2583b56777e | 116 | serial.printf("%s%03.1f%s\r\n", "#PTD5: ", 3.3f*pin15.read(), "V^"); |
skanderian | 2:f2583b56777e | 117 | } |
skanderian | 2:f2583b56777e | 118 | if (pinNum == 0 || pinNum == 16) { |
skanderian | 2:f2583b56777e | 119 | serial.printf("%s%03.1f%s\r\n", "#PTD6: ", 3.3f*pin16.read(), "V^"); |
skanderian | 2:f2583b56777e | 120 | } |
skanderian | 0:ce79b04fc2ca | 121 | |
skanderian | 2:f2583b56777e | 122 | ledConfirmSent(); |
skanderian | 0:ce79b04fc2ca | 123 | } |
skanderian | 0:ce79b04fc2ca | 124 | |
skanderian | 2:f2583b56777e | 125 | string decToHexDDDD(int i) { |
skanderian | 2:f2583b56777e | 126 | //Do twos complement to handle negative numbers |
skanderian | 2:f2583b56777e | 127 | if (i < 0) { |
skanderian | 2:f2583b56777e | 128 | i = 32767 - i; |
skanderian | 2:f2583b56777e | 129 | } |
skanderian | 2:f2583b56777e | 130 | char hex_string[10]; |
skanderian | 2:f2583b56777e | 131 | sprintf(hex_string, "0x%02X", i); |
skanderian | 2:f2583b56777e | 132 | return string(hex_string); |
skanderian | 2:f2583b56777e | 133 | } |
skanderian | 2:f2583b56777e | 134 | |
skanderian | 2:f2583b56777e | 135 | int hexDDDDToDec(char hex[]) { |
skanderian | 2:f2583b56777e | 136 | int decValue = strtol(hex, NULL, 16); |
skanderian | 2:f2583b56777e | 137 | if (decValue >= 32768) { //Do twos complement to handle negative numbers |
skanderian | 2:f2583b56777e | 138 | decValue = 32767 - decValue; |
skanderian | 2:f2583b56777e | 139 | } |
skanderian | 2:f2583b56777e | 140 | return decValue; |
skanderian | 2:f2583b56777e | 141 | } |
skanderian | 2:f2583b56777e | 142 | |
skanderian | 2:f2583b56777e | 143 | int hexToDec(char hex[]) { |
skanderian | 2:f2583b56777e | 144 | int decValue = strtol(hex, NULL, 16); |
skanderian | 2:f2583b56777e | 145 | return decValue; |
skanderian | 2:f2583b56777e | 146 | } |
skanderian | 2:f2583b56777e | 147 | |
skanderian | 2:f2583b56777e | 148 | int hexToDecSub(char hex[], int st, int ed) { |
skanderian | 2:f2583b56777e | 149 | int n = ed - st + 1; |
skanderian | 2:f2583b56777e | 150 | char hexSubset[n]; |
skanderian | 2:f2583b56777e | 151 | for (int i = st; i < ed + 1; i++) { |
skanderian | 2:f2583b56777e | 152 | hexSubset[i - st] = hex[i]; |
skanderian | 2:f2583b56777e | 153 | } |
skanderian | 2:f2583b56777e | 154 | int decValue = strtol(hexSubset, NULL, 16); |
skanderian | 2:f2583b56777e | 155 | return decValue; |
skanderian | 0:ce79b04fc2ca | 156 | } |
skanderian | 0:ce79b04fc2ca | 157 | |
skanderian | 2:f2583b56777e | 158 | void sendHexDDDDValTimes100(float val) { |
skanderian | 2:f2583b56777e | 159 | int valTimes100 = (int) ((100 * val)); |
skanderian | 2:f2583b56777e | 160 | string hexDDDD = decToHexDDDD(valTimes100); |
skanderian | 2:f2583b56777e | 161 | int nLeadingZeros = 4 - hexDDDD.length(); |
skanderian | 1:610dc7763656 | 162 | |
skanderian | 2:f2583b56777e | 163 | char hexDDDDout[hexDDDD.length()]; |
skanderian | 2:f2583b56777e | 164 | for (int i = 0; i < hexDDDD.length(); i++) { |
skanderian | 2:f2583b56777e | 165 | hexDDDDout[i] = hexDDDD[i]; |
skanderian | 2:f2583b56777e | 166 | } |
skanderian | 2:f2583b56777e | 167 | char leadingZeros[nLeadingZeros]; |
skanderian | 2:f2583b56777e | 168 | for (int i = 0; i < nLeadingZeros; i++) { |
skanderian | 2:f2583b56777e | 169 | leadingZeros[i] = '0'; |
skanderian | 2:f2583b56777e | 170 | } |
skanderian | 2:f2583b56777e | 171 | //serial.printf("#%s%saa^\r\n", leadingZeros, hexDDDDout); |
skanderian | 2:f2583b56777e | 172 | serial.printf("#%s%saa", leadingZeros, hexDDDDout); |
skanderian | 2:f2583b56777e | 173 | //ledConfirmSent(); |
skanderian | 0:ce79b04fc2ca | 174 | } |
skanderian | 0:ce79b04fc2ca | 175 | |
skanderian | 2:f2583b56777e | 176 | void runSingleCommand(int comInd) { |
skanderian | 2:f2583b56777e | 177 | int endBuffer = (comInd + 1)*8; |
skanderian | 2:f2583b56777e | 178 | int startBuffer = endBuffer - 7; |
skanderian | 2:f2583b56777e | 179 | |
skanderian | 2:f2583b56777e | 180 | //get hexCCIn |
skanderian | 2:f2583b56777e | 181 | for (int i = 0; i < 2; i++) { |
skanderian | 2:f2583b56777e | 182 | hexCCIn[i] = rxBuffer[i + startBuffer]; |
skanderian | 2:f2583b56777e | 183 | } |
skanderian | 2:f2583b56777e | 184 | //serial.printf("hexCCIn= is %s\r\n", hexCCIn); |
skanderian | 2:f2583b56777e | 185 | |
skanderian | 2:f2583b56777e | 186 | for (int i = 0; i < 4; i++) { |
skanderian | 2:f2583b56777e | 187 | hexDDDDIn[i] = rxBuffer[i + startBuffer + 2]; |
skanderian | 0:ce79b04fc2ca | 188 | } |
skanderian | 0:ce79b04fc2ca | 189 | |
skanderian | 2:f2583b56777e | 190 | decCCIn = hexToDec(hexCCIn); |
skanderian | 2:f2583b56777e | 191 | decDDDDIn = hexDDDDToDec(hexDDDDIn); |
skanderian | 2:f2583b56777e | 192 | |
skanderian | 2:f2583b56777e | 193 | //Make sure incoming checksum pans out: DO THIS LATER |
skanderian | 2:f2583b56777e | 194 | |
skanderian | 2:f2583b56777e | 195 | if (comInd == 0) { //include # if first command |
skanderian | 2:f2583b56777e | 196 | startBuffer = startBuffer - 1; |
skanderian | 2:f2583b56777e | 197 | } |
skanderian | 2:f2583b56777e | 198 | int i2 = 0; |
skanderian | 2:f2583b56777e | 199 | for (int i = startBuffer; i <= endBuffer; i++) { // duplicate bytes 0 to 9 for now; |
skanderian | 2:f2583b56777e | 200 | txBuffer[i2] = rxBuffer[i]; |
skanderian | 2:f2583b56777e | 201 | i2++; |
skanderian | 2:f2583b56777e | 202 | } |
skanderian | 2:f2583b56777e | 203 | |
skanderian | 2:f2583b56777e | 204 | //Do action based on CC: already in while loop |
skanderian | 2:f2583b56777e | 205 | |
skanderian | 0:ce79b04fc2ca | 206 | |
skanderian | 0:ce79b04fc2ca | 207 | } |
skanderian | 0:ce79b04fc2ca | 208 | |
skanderian | 2:f2583b56777e | 209 | void runWhenNewSerialIn() { |
skanderian | 2:f2583b56777e | 210 | int nCommands = (rxIn - 1) / 8; //find out how many commands are sent in one serial message |
skanderian | 2:f2583b56777e | 211 | //serial.printf("%s%d%s\r\n", "#nCommands: ", nCommands, "commands"); |
skanderian | 2:f2583b56777e | 212 | for (int comInd = 0; comInd < nCommands; comInd++) { // duplicate bytes 0 to 9 for now; |
skanderian | 2:f2583b56777e | 213 | runSingleCommand(comInd); |
skanderian | 2:f2583b56777e | 214 | } |
skanderian | 2:f2583b56777e | 215 | serial.printf("^\r\n"); //end line after responses to all commands returned |
skanderian | 2:f2583b56777e | 216 | } |
skanderian | 1:610dc7763656 | 217 | |
skanderian | 2:f2583b56777e | 218 | void Rx_interrupt() { |
skanderian | 2:f2583b56777e | 219 | // Loop just in case more than one character is in UART's receive FIFO buffer |
skanderian | 2:f2583b56777e | 220 | // Stop if buffer full |
skanderian | 2:f2583b56777e | 221 | //while ((serial.readable()) && (((rxIn + 1) % bufferSize) != 0)) { |
skanderian | 2:f2583b56777e | 222 | while (serial.readable()) { |
skanderian | 2:f2583b56777e | 223 | rxBuffer[rxIn] = serial.getc(); |
skanderian | 2:f2583b56777e | 224 | if (rxBuffer[rxIn] == '\r') { //looking for character not string (string is double quotes) \r is CR, \n is LF |
skanderian | 2:f2583b56777e | 225 | rxFlag = 1; |
skanderian | 2:f2583b56777e | 226 | //Turn built in LED blue (at half intensity) to confirm command recieved |
skanderian | 2:f2583b56777e | 227 | ledConfirmReceive(); |
skanderian | 2:f2583b56777e | 228 | //Execute runWhenNewSerialIn when new Rx recieved (ending with \r) |
skanderian | 2:f2583b56777e | 229 | runWhenNewSerialIn(); |
skanderian | 2:f2583b56777e | 230 | rxFlag = 0; //reset flag to listen for next message |
skanderian | 2:f2583b56777e | 231 | rxIn = 0; // reset position index to 0 |
skanderian | 1:610dc7763656 | 232 | |
skanderian | 2:f2583b56777e | 233 | } else { |
skanderian | 2:f2583b56777e | 234 | rxIn = (rxIn + 1) % bufferSize; |
skanderian | 1:610dc7763656 | 235 | } |
skanderian | 1:610dc7763656 | 236 | } |
skanderian | 1:610dc7763656 | 237 | } |
skanderian | 0:ce79b04fc2ca | 238 | |
skanderian | 2:f2583b56777e | 239 | int main() { |
skanderian | 2:f2583b56777e | 240 | |
skanderian | 2:f2583b56777e | 241 | serial.baud(9600); |
skanderian | 2:f2583b56777e | 242 | serial.attach(&Rx_interrupt, Serial::RxIrq); |
skanderian | 0:ce79b04fc2ca | 243 | |
skanderian | 2:f2583b56777e | 244 | //rLed.period(0.001f); |
skanderian | 2:f2583b56777e | 245 | //gLed.period(0.001f); |
skanderian | 2:f2583b56777e | 246 | //bLed.period(0.001f); |
skanderian | 2:f2583b56777e | 247 | |
skanderian | 0:ce79b04fc2ca | 248 | |
skanderian | 2:f2583b56777e | 249 | //flash LED blue then green on startup or system reset |
skanderian | 2:f2583b56777e | 250 | //serial.printf("Before Blue on Startup^\r\n"); |
skanderian | 2:f2583b56777e | 251 | ledConfirmSent(); |
skanderian | 2:f2583b56777e | 252 | ledConfirmReceive(); |
skanderian | 2:f2583b56777e | 253 | //serial.printf("After Green on Startup^\r\n"); |
skanderian | 2:f2583b56777e | 254 | timer.start(); |
skanderian | 0:ce79b04fc2ca | 255 | |
skanderian | 2:f2583b56777e | 256 | while (1) { |
skanderian | 2:f2583b56777e | 257 | //scanf("%10s", rxBuffer);// NO! Use Rx_interrupt instead! |
skanderian | 2:f2583b56777e | 258 | //Always keep running computePressureCommand when pump is enabled (runPump=true) |
skanderian | 2:f2583b56777e | 259 | sendAnalogIn(decDDDDIn); |
skanderian | 2:f2583b56777e | 260 | wait(1); |
skanderian | 0:ce79b04fc2ca | 261 | } |
skanderian | 0:ce79b04fc2ca | 262 | } |