Colin Monroe
/
CKM_HW_12_2
homework 12.2 for SSD applied algorithms and architecture
main.cpp@0:a4095918961b, 2016-11-06 (annotated)
- Committer:
- CKMonroe
- Date:
- Sun Nov 06 07:06:44 2016 +0000
- Revision:
- 0:a4095918961b
V1 of homework 12.2 - recursion on the KL board
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
CKMonroe | 0:a4095918961b | 1 | #include "mbed.h" |
CKMonroe | 0:a4095918961b | 2 | #include <math.h> |
CKMonroe | 0:a4095918961b | 3 | #include "TSISensor.h" |
CKMonroe | 0:a4095918961b | 4 | #include "SLCD.h" |
CKMonroe | 0:a4095918961b | 5 | |
CKMonroe | 0:a4095918961b | 6 | #define NUMBUTS 2 |
CKMonroe | 0:a4095918961b | 7 | #define LBUT PTC12 // port addresses for buttons |
CKMonroe | 0:a4095918961b | 8 | #define RBUT PTC3 |
CKMonroe | 0:a4095918961b | 9 | |
CKMonroe | 0:a4095918961b | 10 | #define ARGUMENTSTATE 0 //states to operate in |
CKMonroe | 0:a4095918961b | 11 | #define COUNTSTATE 1 |
CKMonroe | 0:a4095918961b | 12 | |
CKMonroe | 0:a4095918961b | 13 | #define TSILIMIT 0.01 |
CKMonroe | 0:a4095918961b | 14 | #define LCDCHARLEN 10 |
CKMonroe | 0:a4095918961b | 15 | #define DATAINTERVAL 0.1 |
CKMonroe | 0:a4095918961b | 16 | #define BUTTONTIME 0.1 |
CKMonroe | 0:a4095918961b | 17 | #define PROGNAME "kl46z_recursion_v1\n\r" |
CKMonroe | 0:a4095918961b | 18 | |
CKMonroe | 0:a4095918961b | 19 | SLCD slcd; //define LCD display |
CKMonroe | 0:a4095918961b | 20 | Serial pc(USBTX, USBRX); |
CKMonroe | 0:a4095918961b | 21 | |
CKMonroe | 0:a4095918961b | 22 | Timer dataTimer; |
CKMonroe | 0:a4095918961b | 23 | Timer ButtonTimer; // for reading button states |
CKMonroe | 0:a4095918961b | 24 | DigitalIn buttons[NUMBUTS] = {RBUT, LBUT}; |
CKMonroe | 0:a4095918961b | 25 | float tsidata; |
CKMonroe | 0:a4095918961b | 26 | int displayState = 0; //start program in argument state |
CKMonroe | 0:a4095918961b | 27 | bool recursion = false; |
CKMonroe | 0:a4095918961b | 28 | |
CKMonroe | 0:a4095918961b | 29 | void initialize_global_vars(){ |
CKMonroe | 0:a4095918961b | 30 | pc.printf(PROGNAME); |
CKMonroe | 0:a4095918961b | 31 | // set up DAQ timers |
CKMonroe | 0:a4095918961b | 32 | ButtonTimer.start(); |
CKMonroe | 0:a4095918961b | 33 | ButtonTimer.reset(); |
CKMonroe | 0:a4095918961b | 34 | dataTimer.start(); |
CKMonroe | 0:a4095918961b | 35 | dataTimer.reset(); |
CKMonroe | 0:a4095918961b | 36 | } |
CKMonroe | 0:a4095918961b | 37 | |
CKMonroe | 0:a4095918961b | 38 | void LCDMess(char *lMess){ |
CKMonroe | 0:a4095918961b | 39 | slcd.Home(); |
CKMonroe | 0:a4095918961b | 40 | slcd.clear(); |
CKMonroe | 0:a4095918961b | 41 | slcd.printf(lMess); |
CKMonroe | 0:a4095918961b | 42 | } |
CKMonroe | 0:a4095918961b | 43 | |
CKMonroe | 0:a4095918961b | 44 | void backward_count(float n,int delta,int min_num){ |
CKMonroe | 0:a4095918961b | 45 | pc.printf("\n Number: %2.0f\n\r", n); |
CKMonroe | 0:a4095918961b | 46 | if (n <= min_num){ |
CKMonroe | 0:a4095918961b | 47 | recursion = false; //set flag to false to prevent repeats |
CKMonroe | 0:a4095918961b | 48 | return; |
CKMonroe | 0:a4095918961b | 49 | } |
CKMonroe | 0:a4095918961b | 50 | else { |
CKMonroe | 0:a4095918961b | 51 | backward_count(n-delta, delta, min_num); |
CKMonroe | 0:a4095918961b | 52 | } |
CKMonroe | 0:a4095918961b | 53 | } |
CKMonroe | 0:a4095918961b | 54 | |
CKMonroe | 0:a4095918961b | 55 | int main(void) { |
CKMonroe | 0:a4095918961b | 56 | int i; |
CKMonroe | 0:a4095918961b | 57 | char lcdData[LCDCHARLEN]; |
CKMonroe | 0:a4095918961b | 58 | TSISensor tsi; |
CKMonroe | 0:a4095918961b | 59 | float tempTSI; |
CKMonroe | 0:a4095918961b | 60 | PwmOut gled(LED_GREEN); |
CKMonroe | 0:a4095918961b | 61 | PwmOut rled(LED_RED); |
CKMonroe | 0:a4095918961b | 62 | |
CKMonroe | 0:a4095918961b | 63 | initialize_global_vars(); |
CKMonroe | 0:a4095918961b | 64 | |
CKMonroe | 0:a4095918961b | 65 | while (true) { |
CKMonroe | 0:a4095918961b | 66 | if (ButtonTimer > BUTTONTIME){ |
CKMonroe | 0:a4095918961b | 67 | for (i=0; i<NUMBUTS; i++){ // index will be 0 or 1 |
CKMonroe | 0:a4095918961b | 68 | if(!buttons[i]) { |
CKMonroe | 0:a4095918961b | 69 | displayState = i; //set display state |
CKMonroe | 0:a4095918961b | 70 | } // if ! buttons |
CKMonroe | 0:a4095918961b | 71 | }// for loop to look at buttons |
CKMonroe | 0:a4095918961b | 72 | |
CKMonroe | 0:a4095918961b | 73 | ButtonTimer.reset(); |
CKMonroe | 0:a4095918961b | 74 | }//end if buttonTimer |
CKMonroe | 0:a4095918961b | 75 | |
CKMonroe | 0:a4095918961b | 76 | //right button - ARGUMENT STATE(red led) |
CKMonroe | 0:a4095918961b | 77 | //this state uses the slider to read a value, which |
CKMonroe | 0:a4095918961b | 78 | //will be passed into a simple recursive function later |
CKMonroe | 0:a4095918961b | 79 | if (displayState == ARGUMENTSTATE){ |
CKMonroe | 0:a4095918961b | 80 | |
CKMonroe | 0:a4095918961b | 81 | //turn on red led |
CKMonroe | 0:a4095918961b | 82 | rled = 0.0; |
CKMonroe | 0:a4095918961b | 83 | gled = 1.0; |
CKMonroe | 0:a4095918961b | 84 | |
CKMonroe | 0:a4095918961b | 85 | //if statement to read tsi |
CKMonroe | 0:a4095918961b | 86 | if(dataTimer.read() > DATAINTERVAL){ |
CKMonroe | 0:a4095918961b | 87 | dataTimer.reset(); |
CKMonroe | 0:a4095918961b | 88 | tempTSI = tsi.readPercentage(); |
CKMonroe | 0:a4095918961b | 89 | if (tempTSI > TSILIMIT){ |
CKMonroe | 0:a4095918961b | 90 | tsidata = (tempTSI*100)/2; |
CKMonroe | 0:a4095918961b | 91 | } |
CKMonroe | 0:a4095918961b | 92 | }// end if statement to read tsi |
CKMonroe | 0:a4095918961b | 93 | |
CKMonroe | 0:a4095918961b | 94 | //send data to LCD |
CKMonroe | 0:a4095918961b | 95 | //range 2-50 |
CKMonroe | 0:a4095918961b | 96 | sprintf (lcdData,"%2.0f", tsidata ); |
CKMonroe | 0:a4095918961b | 97 | |
CKMonroe | 0:a4095918961b | 98 | recursion = true; //set bool to true so that the function can run |
CKMonroe | 0:a4095918961b | 99 | //in count mode |
CKMonroe | 0:a4095918961b | 100 | } //end argument state |
CKMonroe | 0:a4095918961b | 101 | |
CKMonroe | 0:a4095918961b | 102 | //left button - COUNT STATE (green led) |
CKMonroe | 0:a4095918961b | 103 | else if (displayState == COUNTSTATE){ |
CKMonroe | 0:a4095918961b | 104 | //turn on green led |
CKMonroe | 0:a4095918961b | 105 | rled = 1.0; |
CKMonroe | 0:a4095918961b | 106 | gled = 0.0; |
CKMonroe | 0:a4095918961b | 107 | |
CKMonroe | 0:a4095918961b | 108 | //code for recursion goes here |
CKMonroe | 0:a4095918961b | 109 | //2nd and 3rd passed variables are hardcoded here |
CKMonroe | 0:a4095918961b | 110 | //2nd variable: delta |
CKMonroe | 0:a4095918961b | 111 | if (recursion == true){ |
CKMonroe | 0:a4095918961b | 112 | recursion = false; //set recursion bool to false to prevent |
CKMonroe | 0:a4095918961b | 113 | //repeat function calls from here |
CKMonroe | 0:a4095918961b | 114 | backward_count(tsidata, 2, -5); |
CKMonroe | 0:a4095918961b | 115 | } |
CKMonroe | 0:a4095918961b | 116 | } //end count state |
CKMonroe | 0:a4095918961b | 117 | |
CKMonroe | 0:a4095918961b | 118 | LCDMess(lcdData); |
CKMonroe | 0:a4095918961b | 119 | } //end while true |
CKMonroe | 0:a4095918961b | 120 | }//end main |