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@0:544b5f6ad832, 2010-12-01 (annotated)
- Committer:
- StevenHe
- Date:
- Wed Dec 01 04:39:00 2010 +0000
- Revision:
- 0:544b5f6ad832
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| StevenHe | 0:544b5f6ad832 | 1 | #include "mbed.h" |
| StevenHe | 0:544b5f6ad832 | 2 | #include "pt.h" |
| StevenHe | 0:544b5f6ad832 | 3 | |
| StevenHe | 0:544b5f6ad832 | 4 | #define numsamples 1 |
| StevenHe | 0:544b5f6ad832 | 5 | #define sizeofpattern 30 // max size of string length |
| StevenHe | 0:544b5f6ad832 | 6 | |
| StevenHe | 0:544b5f6ad832 | 7 | |
| StevenHe | 0:544b5f6ad832 | 8 | // function declartion |
| StevenHe | 0:544b5f6ad832 | 9 | int touchSense(int Num_Charger); |
| StevenHe | 0:544b5f6ad832 | 10 | void displayString(int* String); |
| StevenHe | 0:544b5f6ad832 | 11 | void displayMessage(int NumMes); |
| StevenHe | 0:544b5f6ad832 | 12 | |
| StevenHe | 0:544b5f6ad832 | 13 | // I/O declarations |
| StevenHe | 0:544b5f6ad832 | 14 | DigitalOut myled(LED1); |
| StevenHe | 0:544b5f6ad832 | 15 | AnalogIn input1(p20), input0(p17); |
| StevenHe | 0:544b5f6ad832 | 16 | DigitalIn charger1(p19), charger0(p16); |
| StevenHe | 0:544b5f6ad832 | 17 | DigitalOut ground(p18); |
| StevenHe | 0:544b5f6ad832 | 18 | Serial pc(USBTX, USBRX); // tx, rx |
| StevenHe | 0:544b5f6ad832 | 19 | |
| StevenHe | 0:544b5f6ad832 | 20 | |
| StevenHe | 0:544b5f6ad832 | 21 | // variable definitions |
| StevenHe | 0:544b5f6ad832 | 22 | int hostString[sizeofpattern]; |
| StevenHe | 0:544b5f6ad832 | 23 | //int currentState = S_idle; |
| StevenHe | 0:544b5f6ad832 | 24 | //int nextState = S_idle; |
| StevenHe | 0:544b5f6ad832 | 25 | |
| StevenHe | 0:544b5f6ad832 | 26 | int i, j, token; |
| StevenHe | 0:544b5f6ad832 | 27 | int NewTokenFlag, StateFlag; // NewTokenFlag is 1 when a token is received, otherwise 0 |
| StevenHe | 0:544b5f6ad832 | 28 | // StateFlag is 1 when a state transition decision is made, it is sets to 2 when the system should be reset |
| StevenHe | 0:544b5f6ad832 | 29 | |
| StevenHe | 0:544b5f6ad832 | 30 | // threads declarations |
| StevenHe | 0:544b5f6ad832 | 31 | static struct pt pt_1, pt_2; |
| StevenHe | 0:544b5f6ad832 | 32 | |
| StevenHe | 0:544b5f6ad832 | 33 | |
| StevenHe | 0:544b5f6ad832 | 34 | // FSM_transition executes FSM transition |
| StevenHe | 0:544b5f6ad832 | 35 | static int FSM_transition(struct pt *pt) { |
| StevenHe | 0:544b5f6ad832 | 36 | |
| StevenHe | 0:544b5f6ad832 | 37 | PT_BEGIN(pt); |
| StevenHe | 0:544b5f6ad832 | 38 | |
| StevenHe | 0:544b5f6ad832 | 39 | StateFlag = 1; // let IO_handler run first |
| StevenHe | 0:544b5f6ad832 | 40 | |
| StevenHe | 0:544b5f6ad832 | 41 | while (1) { |
| StevenHe | 0:544b5f6ad832 | 42 | PT_WAIT_UNTIL(pt, (NewTokenFlag==1)); |
| StevenHe | 0:544b5f6ad832 | 43 | if (token == 'S') { |
| StevenHe | 0:544b5f6ad832 | 44 | NewTokenFlag = 0; |
| StevenHe | 0:544b5f6ad832 | 45 | break; |
| StevenHe | 0:544b5f6ad832 | 46 | } else { // handle the case when the input is not S |
| StevenHe | 0:544b5f6ad832 | 47 | displayMessage(1); |
| StevenHe | 0:544b5f6ad832 | 48 | NewTokenFlag = 0; |
| StevenHe | 0:544b5f6ad832 | 49 | StateFlag = 1; |
| StevenHe | 0:544b5f6ad832 | 50 | } |
| StevenHe | 0:544b5f6ad832 | 51 | } |
| StevenHe | 0:544b5f6ad832 | 52 | |
| StevenHe | 0:544b5f6ad832 | 53 | // |
| StevenHe | 0:544b5f6ad832 | 54 | //printf("S_HostInput \n"); |
| StevenHe | 0:544b5f6ad832 | 55 | // |
| StevenHe | 0:544b5f6ad832 | 56 | |
| StevenHe | 0:544b5f6ad832 | 57 | // currentState = S_HostInput |
| StevenHe | 0:544b5f6ad832 | 58 | i = 0; |
| StevenHe | 0:544b5f6ad832 | 59 | while (1) { |
| StevenHe | 0:544b5f6ad832 | 60 | StateFlag = 1; |
| StevenHe | 0:544b5f6ad832 | 61 | PT_WAIT_UNTIL(pt, NewTokenFlag); |
| StevenHe | 0:544b5f6ad832 | 62 | NewTokenFlag = 0; |
| StevenHe | 0:544b5f6ad832 | 63 | if (token=='E') break; |
| StevenHe | 0:544b5f6ad832 | 64 | else if ((token=='0'||token=='1')&& i<sizeofpattern) { |
| StevenHe | 0:544b5f6ad832 | 65 | hostString[i] = token; |
| StevenHe | 0:544b5f6ad832 | 66 | i++; |
| StevenHe | 0:544b5f6ad832 | 67 | } |
| StevenHe | 0:544b5f6ad832 | 68 | |
| StevenHe | 0:544b5f6ad832 | 69 | else { |
| StevenHe | 0:544b5f6ad832 | 70 | displayMessage(1); // currentState = S_HostError |
| StevenHe | 0:544b5f6ad832 | 71 | i = 0; |
| StevenHe | 0:544b5f6ad832 | 72 | StateFlag =2; // indicate the system should be reset |
| StevenHe | 0:544b5f6ad832 | 73 | break; |
| StevenHe | 0:544b5f6ad832 | 74 | } |
| StevenHe | 0:544b5f6ad832 | 75 | } |
| StevenHe | 0:544b5f6ad832 | 76 | |
| StevenHe | 0:544b5f6ad832 | 77 | if (StateFlag!=2) { // skip S_UserInput if the sysetem should be reset |
| StevenHe | 0:544b5f6ad832 | 78 | // currentState = S_UserInput |
| StevenHe | 0:544b5f6ad832 | 79 | // |
| StevenHe | 0:544b5f6ad832 | 80 | //printf("S_UserInput ------- \n"); |
| StevenHe | 0:544b5f6ad832 | 81 | // |
| StevenHe | 0:544b5f6ad832 | 82 | j =0; |
| StevenHe | 0:544b5f6ad832 | 83 | while (1) { |
| StevenHe | 0:544b5f6ad832 | 84 | StateFlag = 1; |
| StevenHe | 0:544b5f6ad832 | 85 | PT_WAIT_UNTIL(pt, NewTokenFlag); |
| StevenHe | 0:544b5f6ad832 | 86 | NewTokenFlag = 0; |
| StevenHe | 0:544b5f6ad832 | 87 | |
| StevenHe | 0:544b5f6ad832 | 88 | if (hostString[j]==token) { |
| StevenHe | 0:544b5f6ad832 | 89 | j++; |
| StevenHe | 0:544b5f6ad832 | 90 | if (j==i) { |
| StevenHe | 0:544b5f6ad832 | 91 | displayMessage(2); // currentState = S_Match |
| StevenHe | 0:544b5f6ad832 | 92 | break; |
| StevenHe | 0:544b5f6ad832 | 93 | } |
| StevenHe | 0:544b5f6ad832 | 94 | } else { |
| StevenHe | 0:544b5f6ad832 | 95 | displayMessage(0); // currentState = S_UserError |
| StevenHe | 0:544b5f6ad832 | 96 | j = 0; |
| StevenHe | 0:544b5f6ad832 | 97 | continue; // returns S_UserInput |
| StevenHe | 0:544b5f6ad832 | 98 | } |
| StevenHe | 0:544b5f6ad832 | 99 | |
| StevenHe | 0:544b5f6ad832 | 100 | StateFlag = 2; // indicates the system should be reset |
| StevenHe | 0:544b5f6ad832 | 101 | } // end of while |
| StevenHe | 0:544b5f6ad832 | 102 | } // end of skip |
| StevenHe | 0:544b5f6ad832 | 103 | |
| StevenHe | 0:544b5f6ad832 | 104 | PT_END(pt); |
| StevenHe | 0:544b5f6ad832 | 105 | } |
| StevenHe | 0:544b5f6ad832 | 106 | |
| StevenHe | 0:544b5f6ad832 | 107 | |
| StevenHe | 0:544b5f6ad832 | 108 | // IO_handler polls the I/O ports |
| StevenHe | 0:544b5f6ad832 | 109 | static int IO_Handler(struct pt *pt) { |
| StevenHe | 0:544b5f6ad832 | 110 | PT_BEGIN(pt); |
| StevenHe | 0:544b5f6ad832 | 111 | while (1) { |
| StevenHe | 0:544b5f6ad832 | 112 | if (StateFlag == 2) break; // reacts when the system is rest |
| StevenHe | 0:544b5f6ad832 | 113 | |
| StevenHe | 0:544b5f6ad832 | 114 | PT_WAIT_UNTIL(pt, StateFlag==1); |
| StevenHe | 0:544b5f6ad832 | 115 | // |
| StevenHe | 0:544b5f6ad832 | 116 | //printf("CP 2 ------- \n"); |
| StevenHe | 0:544b5f6ad832 | 117 | // |
| StevenHe | 0:544b5f6ad832 | 118 | if (pc.readable()) { |
| StevenHe | 0:544b5f6ad832 | 119 | token = pc.getc(); |
| StevenHe | 0:544b5f6ad832 | 120 | pc.putc(token); |
| StevenHe | 0:544b5f6ad832 | 121 | NewTokenFlag = 1; |
| StevenHe | 0:544b5f6ad832 | 122 | StateFlag = 0; |
| StevenHe | 0:544b5f6ad832 | 123 | } else if (touchSense(0)) { |
| StevenHe | 0:544b5f6ad832 | 124 | myled=1; |
| StevenHe | 0:544b5f6ad832 | 125 | token = '0'; |
| StevenHe | 0:544b5f6ad832 | 126 | pc.putc('0'); |
| StevenHe | 0:544b5f6ad832 | 127 | NewTokenFlag = 1; |
| StevenHe | 0:544b5f6ad832 | 128 | StateFlag = 0; |
| StevenHe | 0:544b5f6ad832 | 129 | } else if (touchSense(1)) { |
| StevenHe | 0:544b5f6ad832 | 130 | myled=1; |
| StevenHe | 0:544b5f6ad832 | 131 | token = '1'; |
| StevenHe | 0:544b5f6ad832 | 132 | pc.putc('1'); |
| StevenHe | 0:544b5f6ad832 | 133 | NewTokenFlag = 1; |
| StevenHe | 0:544b5f6ad832 | 134 | StateFlag = 0; |
| StevenHe | 0:544b5f6ad832 | 135 | } else myled =0; |
| StevenHe | 0:544b5f6ad832 | 136 | wait(0.1); |
| StevenHe | 0:544b5f6ad832 | 137 | // |
| StevenHe | 0:544b5f6ad832 | 138 | //printf("CP 3 ------- \n"); |
| StevenHe | 0:544b5f6ad832 | 139 | // |
| StevenHe | 0:544b5f6ad832 | 140 | } |
| StevenHe | 0:544b5f6ad832 | 141 | |
| StevenHe | 0:544b5f6ad832 | 142 | PT_END(pt); |
| StevenHe | 0:544b5f6ad832 | 143 | } |
| StevenHe | 0:544b5f6ad832 | 144 | |
| StevenHe | 0:544b5f6ad832 | 145 | |
| StevenHe | 0:544b5f6ad832 | 146 | |
| StevenHe | 0:544b5f6ad832 | 147 | int main() { |
| StevenHe | 0:544b5f6ad832 | 148 | PT_INIT(&pt_1); |
| StevenHe | 0:544b5f6ad832 | 149 | PT_INIT(&pt_2); |
| StevenHe | 0:544b5f6ad832 | 150 | StateFlag =0; |
| StevenHe | 0:544b5f6ad832 | 151 | NewTokenFlag =0; |
| StevenHe | 0:544b5f6ad832 | 152 | |
| StevenHe | 0:544b5f6ad832 | 153 | while (1) { |
| StevenHe | 0:544b5f6ad832 | 154 | |
| StevenHe | 0:544b5f6ad832 | 155 | FSM_transition(&pt_1); |
| StevenHe | 0:544b5f6ad832 | 156 | IO_Handler(&pt_2); |
| StevenHe | 0:544b5f6ad832 | 157 | } |
| StevenHe | 0:544b5f6ad832 | 158 | return 0; |
| StevenHe | 0:544b5f6ad832 | 159 | } // end of main |
| StevenHe | 0:544b5f6ad832 | 160 | |
| StevenHe | 0:544b5f6ad832 | 161 | |
| StevenHe | 0:544b5f6ad832 | 162 | int touchSense(int Num_Charger) { |
| StevenHe | 0:544b5f6ad832 | 163 | float sample1, sample2; |
| StevenHe | 0:544b5f6ad832 | 164 | ground = 0; |
| StevenHe | 0:544b5f6ad832 | 165 | if (Num_Charger ==1) { |
| StevenHe | 0:544b5f6ad832 | 166 | charger1.mode(PullUp); |
| StevenHe | 0:544b5f6ad832 | 167 | charger1.mode(PullNone); |
| StevenHe | 0:544b5f6ad832 | 168 | sample1=input1.read(); // take two samples to avoid the random jump on voltage on touch sensor |
| StevenHe | 0:544b5f6ad832 | 169 | wait(0.1); |
| StevenHe | 0:544b5f6ad832 | 170 | sample2=input1.read(); |
| StevenHe | 0:544b5f6ad832 | 171 | } else { |
| StevenHe | 0:544b5f6ad832 | 172 | charger0.mode(PullUp); |
| StevenHe | 0:544b5f6ad832 | 173 | charger0.mode(PullNone); |
| StevenHe | 0:544b5f6ad832 | 174 | sample1=input0.read(); // take two samples to ignore temp jump |
| StevenHe | 0:544b5f6ad832 | 175 | wait(0.1); |
| StevenHe | 0:544b5f6ad832 | 176 | sample2=input0.read(); |
| StevenHe | 0:544b5f6ad832 | 177 | } |
| StevenHe | 0:544b5f6ad832 | 178 | |
| StevenHe | 0:544b5f6ad832 | 179 | if (sample1 < 0.3 && sample2 < 0.3) { |
| StevenHe | 0:544b5f6ad832 | 180 | return 1; |
| StevenHe | 0:544b5f6ad832 | 181 | } else { |
| StevenHe | 0:544b5f6ad832 | 182 | return 0; |
| StevenHe | 0:544b5f6ad832 | 183 | } |
| StevenHe | 0:544b5f6ad832 | 184 | } |
| StevenHe | 0:544b5f6ad832 | 185 | |
| StevenHe | 0:544b5f6ad832 | 186 | |
| StevenHe | 0:544b5f6ad832 | 187 | |
| StevenHe | 0:544b5f6ad832 | 188 | void displayString(int* String) { |
| StevenHe | 0:544b5f6ad832 | 189 | for (int j=0; j<sizeofpattern; j++) |
| StevenHe | 0:544b5f6ad832 | 190 | pc.putc(String[j]); |
| StevenHe | 0:544b5f6ad832 | 191 | |
| StevenHe | 0:544b5f6ad832 | 192 | pc.putc('\n'); |
| StevenHe | 0:544b5f6ad832 | 193 | |
| StevenHe | 0:544b5f6ad832 | 194 | } |
| StevenHe | 0:544b5f6ad832 | 195 | |
| StevenHe | 0:544b5f6ad832 | 196 | void displayMessage(int NumMes) { |
| StevenHe | 0:544b5f6ad832 | 197 | if (NumMes == 1) |
| StevenHe | 0:544b5f6ad832 | 198 | printf("HOST ERROR : Host must send string in the form of Sxxxx...E X=0 or 1 \n"); |
| StevenHe | 0:544b5f6ad832 | 199 | else if (NumMes == 0) printf("TOUCH ERROR: Please enter the string that matched host string exactly through touchsensor\n"); |
| StevenHe | 0:544b5f6ad832 | 200 | else printf("MATCH: Host will send another string\n"); |
| StevenHe | 0:544b5f6ad832 | 201 | |
| StevenHe | 0:544b5f6ad832 | 202 | } |
| StevenHe | 0:544b5f6ad832 | 203 |