SSD541_HW12.2

Dependencies:   SLCD TSI mbed

Committer:
eseifert
Date:
Sun Nov 06 20:02:16 2016 +0000
Revision:
2:f9713d90a13c
Parent:
1:d82569d51964
for the (last?) time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eseifert 0:fb6ea61c315b 1 #include "mbed.h"
eseifert 0:fb6ea61c315b 2 #include "TSISensor.h"
eseifert 0:fb6ea61c315b 3 #include "SLCD.h"
eseifert 0:fb6ea61c315b 4 #define TSILIMIT 0.99
eseifert 0:fb6ea61c315b 5 #define LCDCHARLEN 10
eseifert 0:fb6ea61c315b 6 #define DATAINTERVAL 0.5
eseifert 0:fb6ea61c315b 7 #define PROGNAME "kl46z_recursive_count\n\r"
eseifert 0:fb6ea61c315b 8 #define BUTTONTIME 0.2
eseifert 0:fb6ea61c315b 9 #define LCDTITLE "rCNT"
eseifert 0:fb6ea61c315b 10 #define TITLEWAIT 2.0
eseifert 0:fb6ea61c315b 11 #define NUMBUTS 2
eseifert 0:fb6ea61c315b 12 #define LBUT PTC12 // port addresses for buttons
eseifert 0:fb6ea61c315b 13 #define RBUT PTC3
eseifert 1:d82569d51964 14 #define STOPPEDSTATE 0
eseifert 1:d82569d51964 15 #define COUNTINGSTATE 1
eseifert 0:fb6ea61c315b 16
eseifert 0:fb6ea61c315b 17 DigitalOut gpo(D0);
eseifert 0:fb6ea61c315b 18 DigitalOut led0(LED_RED);
eseifert 0:fb6ea61c315b 19 SLCD slcd;
eseifert 0:fb6ea61c315b 20 Serial pc(USBTX, USBRX);
eseifert 0:fb6ea61c315b 21 PwmOut gled(LED_GREEN);
eseifert 0:fb6ea61c315b 22 PwmOut rled(LED_RED);
eseifert 0:fb6ea61c315b 23 TSISensor tsi;
eseifert 0:fb6ea61c315b 24 Timer ButtonTimer;
eseifert 0:fb6ea61c315b 25 DigitalIn buttons[NUMBUTS] = {LBUT, RBUT};
eseifert 0:fb6ea61c315b 26
eseifert 0:fb6ea61c315b 27 char lcdData[LCDCHARLEN];
eseifert 1:d82569d51964 28 float tsidata = 0.0;
eseifert 1:d82569d51964 29 int count_num = 0;
eseifert 1:d82569d51964 30 int count_min = 0;
eseifert 1:d82569d51964 31 bool stateToggle = 0;
eseifert 0:fb6ea61c315b 32
eseifert 0:fb6ea61c315b 33 void LCDMess(char *lMess){
eseifert 0:fb6ea61c315b 34 slcd.Home();
eseifert 0:fb6ea61c315b 35 slcd.clear();
eseifert 0:fb6ea61c315b 36 slcd.printf(lMess);
eseifert 0:fb6ea61c315b 37 }
eseifert 0:fb6ea61c315b 38
eseifert 0:fb6ea61c315b 39 void initialize_global_vars()
eseifert 0:fb6ea61c315b 40 {
eseifert 0:fb6ea61c315b 41 pc.printf(PROGNAME);
eseifert 2:f9713d90a13c 42 pc.printf("Select count->\n\r");
eseifert 0:fb6ea61c315b 43 // set up DAQ timer
eseifert 0:fb6ea61c315b 44 ButtonTimer.start();
eseifert 0:fb6ea61c315b 45 ButtonTimer.reset();
eseifert 0:fb6ea61c315b 46 }
eseifert 0:fb6ea61c315b 47
eseifert 0:fb6ea61c315b 48 void showTitle()
eseifert 0:fb6ea61c315b 49 {
eseifert 0:fb6ea61c315b 50 LCDMess(LCDTITLE);
eseifert 0:fb6ea61c315b 51 wait(TITLEWAIT);
eseifert 0:fb6ea61c315b 52 return;
eseifert 0:fb6ea61c315b 53 }
eseifert 0:fb6ea61c315b 54
eseifert 2:f9713d90a13c 55 void showData(int c){
eseifert 2:f9713d90a13c 56 sprintf (lcdData,"tz%d",c);
eseifert 2:f9713d90a13c 57 LCDMess(lcdData);
eseifert 2:f9713d90a13c 58 }
eseifert 2:f9713d90a13c 59
eseifert 0:fb6ea61c315b 60 void count_backwards(int cnt, int min){
eseifert 2:f9713d90a13c 61 gled = !gled;
eseifert 2:f9713d90a13c 62 pc.printf("\tT-%d\n\r", cnt);
eseifert 2:f9713d90a13c 63 showData(cnt);
eseifert 2:f9713d90a13c 64 wait(DATAINTERVAL);
eseifert 1:d82569d51964 65 if(!buttons[1]){
eseifert 2:f9713d90a13c 66 pc.printf(" <--reset-->\n\r");
eseifert 2:f9713d90a13c 67 pc.printf("Choose new number.\n\r");
eseifert 1:d82569d51964 68 stateToggle = 0;
eseifert 1:d82569d51964 69 cnt = 0;
eseifert 1:d82569d51964 70 }
eseifert 0:fb6ea61c315b 71 // tail recursion to correct the direction of counting
eseifert 0:fb6ea61c315b 72 if(cnt > min){
eseifert 0:fb6ea61c315b 73 count_backwards(cnt-1,min);
eseifert 0:fb6ea61c315b 74 }
eseifert 0:fb6ea61c315b 75 }
eseifert 0:fb6ea61c315b 76
eseifert 0:fb6ea61c315b 77 int main()
eseifert 0:fb6ea61c315b 78 {
eseifert 2:f9713d90a13c 79 showTitle();
eseifert 0:fb6ea61c315b 80 initialize_global_vars();
eseifert 0:fb6ea61c315b 81 while (true) {
eseifert 0:fb6ea61c315b 82 tsidata = tsi.readPercentage();
eseifert 0:fb6ea61c315b 83 count_num = floor(tsidata*51);
eseifert 2:f9713d90a13c 84 showData(count_num);
eseifert 0:fb6ea61c315b 85 wait(DATAINTERVAL);
eseifert 0:fb6ea61c315b 86 if (ButtonTimer > BUTTONTIME) {
eseifert 0:fb6ea61c315b 87 if(!buttons[0]){
eseifert 1:d82569d51964 88 stateToggle = 1;
eseifert 0:fb6ea61c315b 89 }
eseifert 2:f9713d90a13c 90 if(!buttons[1]){
eseifert 2:f9713d90a13c 91 stateToggle = 0;
eseifert 2:f9713d90a13c 92 count_num = 0;
eseifert 2:f9713d90a13c 93 pc.printf("Select count->\n\r");
eseifert 2:f9713d90a13c 94 }
eseifert 0:fb6ea61c315b 95 }
eseifert 0:fb6ea61c315b 96 ButtonTimer.reset();
eseifert 1:d82569d51964 97
eseifert 1:d82569d51964 98 switch (stateToggle) {
eseifert 1:d82569d51964 99 case STOPPEDSTATE:
eseifert 2:f9713d90a13c 100 if(count_num > 2){
eseifert 2:f9713d90a13c 101 pc.printf("Count: %d?\n\r", count_num);
eseifert 2:f9713d90a13c 102 }
eseifert 1:d82569d51964 103 showData(count_num);
eseifert 1:d82569d51964 104 rled = 1.0;
eseifert 1:d82569d51964 105 gled = 0.0;
eseifert 1:d82569d51964 106 break;
eseifert 1:d82569d51964 107 case COUNTINGSTATE:
eseifert 1:d82569d51964 108 if(stateToggle) {
eseifert 2:f9713d90a13c 109 pc.printf("\n Counting down from: %d\n\r", count_num);
eseifert 1:d82569d51964 110 count_backwards(count_num, count_min);
eseifert 2:f9713d90a13c 111 pc.printf("Select count->\n\r");
eseifert 1:d82569d51964 112 }
eseifert 2:f9713d90a13c 113 stateToggle = 0;
eseifert 1:d82569d51964 114 rled = 0.0;
eseifert 1:d82569d51964 115 gled = !gled;
eseifert 1:d82569d51964 116 break;
eseifert 1:d82569d51964 117 }
eseifert 0:fb6ea61c315b 118 }
eseifert 0:fb6ea61c315b 119 }