homework 12.2 for SSD applied algorithms and architecture

Dependencies:   SLCD TSI mbed

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?

UserRevisionLine numberNew 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