HW2 implemented using busy loop

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }