HW2 implemented using busy loop
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 00003 //DigitalOut led1(LED1); 00004 //DigitalOut led2(LED2); 00005 00006 Serial pc(USBTX, USBRX); 00007 00008 #define BTN0 p15 00009 #define BTN1 p20 00010 #define MAX_LENGTH 32 00011 00012 typedef unsigned int uint32_t; 00013 typedef unsigned char uint8_t; 00014 00015 void precharge(PinName p) 00016 { 00017 DigitalIn prec(p); 00018 prec.mode(PullUp); 00019 prec.mode(PullNone); 00020 } 00021 00022 uint8_t read_cap() 00023 { 00024 precharge(BTN0); 00025 precharge(BTN1); 00026 wait_ms(5); 00027 float s0 = AnalogIn(BTN0); 00028 float s1 = AnalogIn(BTN1); 00029 //pc.printf("%f \r", s0); 00030 return ((s0>0.5)?0:1) + ((s1>0.5)?0:2); 00031 } 00032 00033 int main() 00034 { 00035 enum { 00036 IDLE=0, 00037 HOST_INPUT, 00038 USER_INPUT 00039 } state; 00040 uint8_t c = 0; 00041 uint32_t data = 0; 00042 uint8_t datalength = 0; 00043 00044 state = IDLE; 00045 while (1) { 00046 switch(state) { 00047 case IDLE: 00048 pc.putc(c = pc.getc()); 00049 if (c == 'S') { 00050 datalength = 0; 00051 state = HOST_INPUT; 00052 } else { 00053 pc.printf("HOST ERROR. You are supposed to input S. Try again. \r\n"); 00054 } 00055 break; 00056 case HOST_INPUT: 00057 pc.putc(c = pc.getc()); 00058 if (c == '0' || c == '1') { 00059 datalength ++; 00060 if (datalength > MAX_LENGTH) { 00061 pc.printf("\r\nLength execeeds maximum. \r\n"); 00062 } else { 00063 data = (data << 1) | (c-'0'); 00064 } 00065 } else if (c == 'E') { 00066 pc.printf("\r\nInput End. Tap the caps now. \r\n"); 00067 if (!datalength) { 00068 pc.printf("Zero length. Try again. \r\n"); 00069 state = IDLE; 00070 break; 00071 } 00072 data <<= (32-datalength); 00073 state = USER_INPUT; 00074 } else { 00075 pc.printf("\r\nHOST ERROR. \r\n"); 00076 } 00077 break; 00078 case USER_INPUT: 00079 c = read_cap(); 00080 if (!c) break; 00081 wait_ms(10); 00082 if (c != read_cap()) break; 00083 while(read_cap()); 00084 if (c == 3) { 00085 pc.printf("\r\nTOUCH ERROR. Touch only one. \r\n"); 00086 break; 00087 } 00088 c -= 1; 00089 pc.putc(c + '0'); 00090 if (c == (data >> 31)) { 00091 datalength--; 00092 if (!datalength) { 00093 pc.printf("\r\nMATCH! \r\n"); 00094 state = IDLE; 00095 } 00096 data <<= 1; 00097 } else { 00098 pc.printf("\r\nTOUCH ERROR. \r\n"); 00099 } 00100 break; 00101 } 00102 } 00103 }
Generated on Sat Aug 6 2022 02:45:30 by
1.7.2