yuhang zhu / Mbed 2 deprecated ADAM_menu

Dependencies:   mbed

Committer:
yuhangzhu
Date:
Sun Jul 14 22:38:44 2013 +0000
Revision:
12:5e4cba1182ab
Parent:
11:0e42dd431fb5
Child:
13:8d9c273b607d
this should be the final version for menu now.. 06

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yuhangzhu 12:5e4cba1182ab 1 //This main funtion mainly implements a mode transfer.
yuhangzhu 12:5e4cba1182ab 2 //When mcu resets, it's in MODE_IDLE. Then depends on the keyboard input, the
yuhangzhu 12:5e4cba1182ab 3 //mode switches to transition modes such as
yuhangzhu 12:5e4cba1182ab 4 //MODE_CHAxPHA, which is for phase input of channel x, or
yuhangzhu 12:5e4cba1182ab 5 //MODE_CHAxAMP, which is for attenuation input of channel x, or
yuhangzhu 12:5e4cba1182ab 6 //MODE_DISPLAY, which is for displaying the current parameters, or
yuhangzhu 12:5e4cba1182ab 7 //MODE_HELP, which is for displaying the help infomation, or
yuhangzhu 12:5e4cba1182ab 8 //MODE_SEND, which is for sending the bit stream through the SPI bus.
yuhangzhu 12:5e4cba1182ab 9 //After each transition mode completes, mcu returns to MODE_IDLE to wait for another user input.
yuhangzhu 12:5e4cba1182ab 10
yuhangzhu 12:5e4cba1182ab 11
yuhangzhu 0:249f6f78cd05 12 #include "mbed.h"
yuhangzhu 0:249f6f78cd05 13 #include "menu.h"
yuhangzhu 0:249f6f78cd05 14 #include "parameters.h"
yuhangzhu 3:32e67d121c7f 15 #include "handlers.h"
yuhangzhu 8:f0c3d5911b87 16 //#define DEBUG
yuhangzhu 0:249f6f78cd05 17
yuhangzhu 0:249f6f78cd05 18 Serial pc(USBTX, USBRX);
yuhangzhu 2:45db4f4ca70d 19
yuhangzhu 3:32e67d121c7f 20 char recv;
yuhangzhu 11:0e42dd431fb5 21 char temp;
yuhangzhu 11:0e42dd431fb5 22
yuhangzhu 2:45db4f4ca70d 23 int state;
yuhangzhu 6:e510aab8f2ce 24 char cha1_pha, cha2_pha;
yuhangzhu 6:e510aab8f2ce 25 char cha1_amp, cha2_amp;
yuhangzhu 6:e510aab8f2ce 26 int ret;
yuhangzhu 6:e510aab8f2ce 27
yuhangzhu 11:0e42dd431fb5 28 unsigned short spi_stream;
yuhangzhu 10:ff8c2470f019 29
yuhangzhu 12:5e4cba1182ab 30 char line_buf[4]; //line_buf[3] is used to indicate if it's empty 0 empty 1 not, other bytes for char data
yuhangzhu 4:e8142db2bbfd 31 int line_pt; //line buffer pointer points to next buffer location it's going to write
yuhangzhu 4:e8142db2bbfd 32 int line_length; //store the current line length
yuhangzhu 10:ff8c2470f019 33 int i;
yuhangzhu 2:45db4f4ca70d 34
yuhangzhu 0:249f6f78cd05 35 int main() {
yuhangzhu 0:249f6f78cd05 36
yuhangzhu 12:5e4cba1182ab 37 pc.baud(19200); //config buad rate. Note: 115200 seems too high for the current board
yuhangzhu 1:cb6811ef87de 38 state = MODE_IDLE;
yuhangzhu 3:32e67d121c7f 39 line_buf[3] = 0;
yuhangzhu 3:32e67d121c7f 40 line_buf[2] = 255;
yuhangzhu 3:32e67d121c7f 41 line_buf[1] = 255;
yuhangzhu 3:32e67d121c7f 42 line_buf[0] = 255;
yuhangzhu 10:ff8c2470f019 43 cha1_pha = 0;
yuhangzhu 10:ff8c2470f019 44 cha2_pha = 0;
yuhangzhu 10:ff8c2470f019 45 cha1_amp = 0;
yuhangzhu 10:ff8c2470f019 46 cha2_amp = 0;
yuhangzhu 0:249f6f78cd05 47
yuhangzhu 0:249f6f78cd05 48 while(1)
yuhangzhu 0:249f6f78cd05 49 {
yuhangzhu 1:cb6811ef87de 50 switch(state)
yuhangzhu 0:249f6f78cd05 51 {
yuhangzhu 1:cb6811ef87de 52 case MODE_IDLE:
yuhangzhu 1:cb6811ef87de 53 pc.printf("%s", main_menu);
yuhangzhu 3:32e67d121c7f 54 recv = pc.getc();
yuhangzhu 3:32e67d121c7f 55 mode_idle_handler(&state, recv);
yuhangzhu 3:32e67d121c7f 56 //pc.printf("%d", state);
yuhangzhu 3:32e67d121c7f 57 break;
yuhangzhu 11:0e42dd431fb5 58
yuhangzhu 3:32e67d121c7f 59 case MODE_CHA1PHA:
yuhangzhu 5:50ea1502a949 60 case MODE_CHA1AMP:
yuhangzhu 5:50ea1502a949 61 case MODE_CHA2PHA:
yuhangzhu 5:50ea1502a949 62 case MODE_CHA2AMP:
yuhangzhu 5:50ea1502a949 63 if(state == MODE_CHA1PHA)
yuhangzhu 5:50ea1502a949 64 pc.printf("%s", cmd1);
yuhangzhu 5:50ea1502a949 65 else if(state == MODE_CHA1AMP)
yuhangzhu 5:50ea1502a949 66 pc.printf("%s", cmd2);
yuhangzhu 5:50ea1502a949 67 else if(state == MODE_CHA2PHA)
yuhangzhu 5:50ea1502a949 68 pc.printf("%s", cmd3);
yuhangzhu 5:50ea1502a949 69 else
yuhangzhu 5:50ea1502a949 70 pc.printf("%s", cmd4);
yuhangzhu 5:50ea1502a949 71
yuhangzhu 3:32e67d121c7f 72 line_buf[3] = 0;
yuhangzhu 5:50ea1502a949 73 line_buf[2] = 255;
yuhangzhu 5:50ea1502a949 74 line_buf[1] = 255;
yuhangzhu 5:50ea1502a949 75 line_buf[0] = 255;
yuhangzhu 3:32e67d121c7f 76 line_pt = 0;
yuhangzhu 4:e8142db2bbfd 77 line_length = 0;
yuhangzhu 3:32e67d121c7f 78
yuhangzhu 12:5e4cba1182ab 79 while(1) //Character input into line buffer, terminated by enter key
yuhangzhu 3:32e67d121c7f 80 {
yuhangzhu 3:32e67d121c7f 81 recv = pc.getc();
yuhangzhu 6:e510aab8f2ce 82 if(recv == 13) //enter is pressed, break
yuhangzhu 3:32e67d121c7f 83 {
yuhangzhu 4:e8142db2bbfd 84 if(line_length == 0)
yuhangzhu 6:e510aab8f2ce 85 line_buf[3] = LINEBUF_EMPTY;
yuhangzhu 6:e510aab8f2ce 86 else if(line_length > 3)
yuhangzhu 6:e510aab8f2ce 87 line_buf[3] = LINEBUF_TOOLONG;
yuhangzhu 3:32e67d121c7f 88 else
yuhangzhu 6:e510aab8f2ce 89 line_buf[3] = LINEBUF_OK;
yuhangzhu 8:f0c3d5911b87 90 #ifdef DEBUG
yuhangzhu 8:f0c3d5911b87 91 pc.printf("decimal output : %d %d %d %d", line_buf[3], line_buf[2], line_buf[1], line_buf[0]);
yuhangzhu 8:f0c3d5911b87 92 pc.printf("char output: %c %c %c %c", line_buf[3], line_buf[2], line_buf[1], line_buf[0]);
yuhangzhu 8:f0c3d5911b87 93 #endif
yuhangzhu 8:f0c3d5911b87 94
yuhangzhu 4:e8142db2bbfd 95 break;
yuhangzhu 3:32e67d121c7f 96 }
yuhangzhu 6:e510aab8f2ce 97 else if(recv == 8) //backspace is pressed, delete one character both on screen and line buffer
yuhangzhu 3:32e67d121c7f 98 {
yuhangzhu 3:32e67d121c7f 99 pc.putc(8);
yuhangzhu 3:32e67d121c7f 100 pc.putc(32);
yuhangzhu 3:32e67d121c7f 101 pc.putc(8);
yuhangzhu 4:e8142db2bbfd 102
yuhangzhu 4:e8142db2bbfd 103 if(line_length <= 3 && line_length>=1)
yuhangzhu 3:32e67d121c7f 104 {
yuhangzhu 4:e8142db2bbfd 105 line_pt --;
yuhangzhu 3:32e67d121c7f 106 line_buf[line_pt] = 255;
yuhangzhu 3:32e67d121c7f 107 }
yuhangzhu 4:e8142db2bbfd 108 if(line_length > 0)
yuhangzhu 4:e8142db2bbfd 109 line_length --;
yuhangzhu 3:32e67d121c7f 110 }
yuhangzhu 6:e510aab8f2ce 111 else //other character is pressed, record that in line buffer
yuhangzhu 3:32e67d121c7f 112 {
yuhangzhu 3:32e67d121c7f 113 pc.putc(recv);
yuhangzhu 4:e8142db2bbfd 114 line_length ++;
yuhangzhu 4:e8142db2bbfd 115
yuhangzhu 4:e8142db2bbfd 116 if(line_length <= 3)
yuhangzhu 4:e8142db2bbfd 117 {
yuhangzhu 4:e8142db2bbfd 118 line_buf[line_pt] = recv;
yuhangzhu 3:32e67d121c7f 119 line_pt ++;
yuhangzhu 4:e8142db2bbfd 120 }
yuhangzhu 3:32e67d121c7f 121 }
yuhangzhu 3:32e67d121c7f 122 }
yuhangzhu 6:e510aab8f2ce 123 //input over, now checking
yuhangzhu 12:5e4cba1182ab 124 //check phase shift input
yuhangzhu 6:e510aab8f2ce 125 if(state == MODE_CHA1PHA || state == MODE_CHA2PHA)
yuhangzhu 6:e510aab8f2ce 126 {
yuhangzhu 6:e510aab8f2ce 127 if(state == MODE_CHA1PHA)
yuhangzhu 6:e510aab8f2ce 128 ret = parse_phase(line_buf, &cha1_pha);
yuhangzhu 6:e510aab8f2ce 129 else
yuhangzhu 6:e510aab8f2ce 130 ret = parse_phase(line_buf, &cha2_pha);
yuhangzhu 6:e510aab8f2ce 131
yuhangzhu 7:c268547fb6c8 132 if(ret == PARSE_LONG) //Input string too long
yuhangzhu 6:e510aab8f2ce 133 {
yuhangzhu 6:e510aab8f2ce 134 pc.printf("%s", msg_strlong);
yuhangzhu 6:e510aab8f2ce 135 pc.getc();
yuhangzhu 6:e510aab8f2ce 136 }
yuhangzhu 7:c268547fb6c8 137 else if(ret == PARSE_EMPTY)
yuhangzhu 7:c268547fb6c8 138 {
yuhangzhu 7:c268547fb6c8 139 pc.printf("%s", msg_empty);
yuhangzhu 7:c268547fb6c8 140 pc.printf("%s", msg_ret);
yuhangzhu 7:c268547fb6c8 141 pc.getc();
yuhangzhu 7:c268547fb6c8 142 }
yuhangzhu 7:c268547fb6c8 143 else if(ret == PARSE_ERR) //Input string has error
yuhangzhu 6:e510aab8f2ce 144 {
yuhangzhu 6:e510aab8f2ce 145 pc.printf("%s", msg_err);
yuhangzhu 6:e510aab8f2ce 146 pc.getc();
yuhangzhu 6:e510aab8f2ce 147 }
yuhangzhu 7:c268547fb6c8 148 else if(ret == PARSE_ROUNDED) //Input is rounded,show the rounded value
yuhangzhu 6:e510aab8f2ce 149 {
yuhangzhu 6:e510aab8f2ce 150 if(state == MODE_CHA1PHA)
yuhangzhu 9:3eaacc1ad758 151 pc.printf("%s %d\n", msg_rounded, cha1_pha*-7);
yuhangzhu 6:e510aab8f2ce 152 else if(state == MODE_CHA2PHA)
yuhangzhu 9:3eaacc1ad758 153 pc.printf("%s %d\n", msg_rounded, cha2_pha*-7);
yuhangzhu 6:e510aab8f2ce 154
yuhangzhu 6:e510aab8f2ce 155 pc.printf("%s", msg_ret);
yuhangzhu 6:e510aab8f2ce 156 pc.getc();
yuhangzhu 6:e510aab8f2ce 157 }
yuhangzhu 7:c268547fb6c8 158 else //Input is good
yuhangzhu 6:e510aab8f2ce 159 {
yuhangzhu 6:e510aab8f2ce 160 pc.printf("%s", msg_ok);
yuhangzhu 8:f0c3d5911b87 161 #ifdef DEBUG
yuhangzhu 6:e510aab8f2ce 162 pc.printf("%d %d\n", cha1_pha*7, cha2_pha*7);
yuhangzhu 8:f0c3d5911b87 163 #endif
yuhangzhu 6:e510aab8f2ce 164 pc.printf("%s", msg_ret);
yuhangzhu 6:e510aab8f2ce 165 pc.getc();
yuhangzhu 6:e510aab8f2ce 166 }
yuhangzhu 6:e510aab8f2ce 167 }
yuhangzhu 3:32e67d121c7f 168
yuhangzhu 7:c268547fb6c8 169 //check attenuation input
yuhangzhu 7:c268547fb6c8 170 if(state == MODE_CHA1AMP || state == MODE_CHA2AMP)
yuhangzhu 7:c268547fb6c8 171 {
yuhangzhu 7:c268547fb6c8 172 if(state == MODE_CHA1AMP)
yuhangzhu 7:c268547fb6c8 173 ret = parse_amp(line_buf, &cha1_amp);
yuhangzhu 7:c268547fb6c8 174 else
yuhangzhu 7:c268547fb6c8 175 ret = parse_amp(line_buf, &cha2_amp);
yuhangzhu 7:c268547fb6c8 176
yuhangzhu 7:c268547fb6c8 177 if(ret == PARSE_LONG) //Input string too long
yuhangzhu 7:c268547fb6c8 178 {
yuhangzhu 7:c268547fb6c8 179 pc.printf("%s", msg_strlong);
yuhangzhu 7:c268547fb6c8 180 pc.getc();
yuhangzhu 7:c268547fb6c8 181 }
yuhangzhu 7:c268547fb6c8 182 else if(ret == PARSE_EMPTY)
yuhangzhu 7:c268547fb6c8 183 {
yuhangzhu 7:c268547fb6c8 184 pc.printf("%s", msg_empty);
yuhangzhu 7:c268547fb6c8 185 pc.printf("%s", msg_ret);
yuhangzhu 7:c268547fb6c8 186 pc.getc();
yuhangzhu 7:c268547fb6c8 187 }
yuhangzhu 7:c268547fb6c8 188 else if(ret == PARSE_ERR) //Input string has error
yuhangzhu 7:c268547fb6c8 189 {
yuhangzhu 7:c268547fb6c8 190 pc.printf("%s", msg_err);
yuhangzhu 7:c268547fb6c8 191 pc.getc();
yuhangzhu 7:c268547fb6c8 192 }
yuhangzhu 7:c268547fb6c8 193 else if(ret == PARSE_ROUNDED) //Input is rounded, show the rounded value
yuhangzhu 7:c268547fb6c8 194 {
yuhangzhu 7:c268547fb6c8 195 if(state == MODE_CHA1AMP)
yuhangzhu 8:f0c3d5911b87 196 pc.printf("%s %.1f\n", msg_rounded, cha1_amp*5.0/10.0);
yuhangzhu 7:c268547fb6c8 197 else if(state == MODE_CHA2AMP)
yuhangzhu 8:f0c3d5911b87 198 pc.printf("%s %.1f\n", msg_rounded, cha2_amp*5.0/10.0);
yuhangzhu 7:c268547fb6c8 199
yuhangzhu 7:c268547fb6c8 200 pc.printf("%s", msg_ret);
yuhangzhu 7:c268547fb6c8 201 pc.getc();
yuhangzhu 7:c268547fb6c8 202 }
yuhangzhu 7:c268547fb6c8 203 else //Input is good
yuhangzhu 7:c268547fb6c8 204 {
yuhangzhu 7:c268547fb6c8 205 pc.printf("%s", msg_ok);
yuhangzhu 8:f0c3d5911b87 206 #ifdef DEBUG
yuhangzhu 7:c268547fb6c8 207 pc.printf("%d %d\n", cha1_amp*5, cha2_amp*5);
yuhangzhu 8:f0c3d5911b87 208 #endif
yuhangzhu 7:c268547fb6c8 209 pc.printf("%s", msg_ret);
yuhangzhu 7:c268547fb6c8 210 pc.getc();
yuhangzhu 7:c268547fb6c8 211 }
yuhangzhu 7:c268547fb6c8 212 }
yuhangzhu 7:c268547fb6c8 213 state = MODE_IDLE; //back to idle state after input
yuhangzhu 3:32e67d121c7f 214 break;
yuhangzhu 5:50ea1502a949 215
yuhangzhu 12:5e4cba1182ab 216 // In display mode, show current parameters
yuhangzhu 8:f0c3d5911b87 217 case MODE_DISPLAY:
yuhangzhu 11:0e42dd431fb5 218
yuhangzhu 10:ff8c2470f019 219 pc.printf("Phase shift value for channel 1 is %d degrees\n", cha1_pha*-7);
yuhangzhu 10:ff8c2470f019 220 pc.printf("Phase shift value for channel 2 is %d degrees\n", cha2_pha*-7);
yuhangzhu 10:ff8c2470f019 221 pc.printf("Attentuation for channel 1 is %.1f dB\n", cha1_amp*5.0/10.0);
yuhangzhu 10:ff8c2470f019 222 pc.printf("Attentuation for channel 2 is %.1f dB\n", cha2_amp*5.0/10.0);
yuhangzhu 8:f0c3d5911b87 223 pc.printf("%s", msg_ret);
yuhangzhu 8:f0c3d5911b87 224 pc.getc();
yuhangzhu 8:f0c3d5911b87 225 state = MODE_IDLE;
yuhangzhu 8:f0c3d5911b87 226 break;
yuhangzhu 12:5e4cba1182ab 227 //Help mode, displays help info
yuhangzhu 9:3eaacc1ad758 228 case MODE_HELP:
yuhangzhu 11:0e42dd431fb5 229
yuhangzhu 9:3eaacc1ad758 230 pc.printf("%s", msg_help);
yuhangzhu 9:3eaacc1ad758 231 pc.printf("%s", msg_ret);
yuhangzhu 9:3eaacc1ad758 232 pc.getc();
yuhangzhu 9:3eaacc1ad758 233 state = MODE_IDLE;
yuhangzhu 9:3eaacc1ad758 234 break;
yuhangzhu 9:3eaacc1ad758 235
yuhangzhu 12:5e4cba1182ab 236 case MODE_SEND: //In sending mode, display and send through SPI
yuhangzhu 11:0e42dd431fb5 237
yuhangzhu 10:ff8c2470f019 238 pc.printf("Phase shift value for channel 1 is %d degrees\n", cha1_pha*-7);
yuhangzhu 10:ff8c2470f019 239 pc.printf("Phase shift value for channel 2 is %d degrees\n", cha2_pha*-7);
yuhangzhu 10:ff8c2470f019 240 pc.printf("Attentuation for channel 1 is %.1f dB\n", cha1_amp*5.0/10.0);
yuhangzhu 10:ff8c2470f019 241 pc.printf("Attentuation for channel 2 is %.1f dB\n", cha2_amp*5.0/10.0);
yuhangzhu 11:0e42dd431fb5 242 pc.printf("\nSPI bit stream:\n");
yuhangzhu 10:ff8c2470f019 243 for(i=15; i>=0; i--)
yuhangzhu 10:ff8c2470f019 244 pc.printf("Bit%d ", i);
yuhangzhu 10:ff8c2470f019 245 pc.printf("\n");
yuhangzhu 10:ff8c2470f019 246 spi_stream = 0;
yuhangzhu 11:0e42dd431fb5 247
yuhangzhu 10:ff8c2470f019 248 spi_stream = (cha2_amp << 12) | (cha2_pha << 8) | (cha1_amp << 4) | (cha1_pha);
yuhangzhu 11:0e42dd431fb5 249
yuhangzhu 11:0e42dd431fb5 250
yuhangzhu 10:ff8c2470f019 251 for(i=0; i<=15; i++)
yuhangzhu 10:ff8c2470f019 252 {
yuhangzhu 11:0e42dd431fb5 253 if(spi_stream >= 0x8000)
yuhangzhu 11:0e42dd431fb5 254 {
yuhangzhu 11:0e42dd431fb5 255 if(i < 6)
yuhangzhu 11:0e42dd431fb5 256 pc.printf("%d ", 1);
yuhangzhu 11:0e42dd431fb5 257 else
yuhangzhu 11:0e42dd431fb5 258 pc.printf("%d ", 1);
yuhangzhu 11:0e42dd431fb5 259 }
yuhangzhu 10:ff8c2470f019 260 else
yuhangzhu 11:0e42dd431fb5 261 {
yuhangzhu 11:0e42dd431fb5 262 if(i < 6)
yuhangzhu 11:0e42dd431fb5 263 pc.printf("%d ", 0);
yuhangzhu 11:0e42dd431fb5 264 else
yuhangzhu 11:0e42dd431fb5 265 pc.printf("%d ", 0);
yuhangzhu 11:0e42dd431fb5 266 }
yuhangzhu 11:0e42dd431fb5 267 spi_stream = spi_stream << 1;
yuhangzhu 10:ff8c2470f019 268 }
yuhangzhu 11:0e42dd431fb5 269
yuhangzhu 10:ff8c2470f019 270 pc.printf("\n");
yuhangzhu 10:ff8c2470f019 271 pc.printf("%s", msg_ret);
yuhangzhu 10:ff8c2470f019 272 pc.getc();
yuhangzhu 10:ff8c2470f019 273 state = MODE_IDLE;
yuhangzhu 10:ff8c2470f019 274 break;
yuhangzhu 9:3eaacc1ad758 275 default:
yuhangzhu 9:3eaacc1ad758 276 state = MODE_IDLE;
yuhangzhu 1:cb6811ef87de 277 }
yuhangzhu 0:249f6f78cd05 278
yuhangzhu 0:249f6f78cd05 279
yuhangzhu 0:249f6f78cd05 280 }
yuhangzhu 0:249f6f78cd05 281
yuhangzhu 0:249f6f78cd05 282
yuhangzhu 0:249f6f78cd05 283 return 0;
yuhangzhu 0:249f6f78cd05 284 }