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.
handlers.cpp@26:5c264e20402f, 2013-07-23 (annotated)
- Committer:
- yuhangzhu
- Date:
- Tue Jul 23 17:55:40 2013 +0000
- Revision:
- 26:5c264e20402f
- Parent:
- 25:57de395d89aa
- Child:
- 27:231333972023
this is the version before suggestion generally good
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| yuhangzhu | 23:0b6901c9302c | 1 | /******************************************** |
| yuhangzhu | 23:0b6901c9302c | 2 | Function: void mode_idle_handler(int* state, char sel) |
| yuhangzhu | 23:0b6901c9302c | 3 | Function description: |
| yuhangzhu | 23:0b6901c9302c | 4 | This function converts character inputs to state information, which is used for later stages in main function |
| yuhangzhu | 12:5e4cba1182ab | 5 | |
| yuhangzhu | 23:0b6901c9302c | 6 | Function: int parse_phase(char* line_buf, char* adam_pha) |
| yuhangzhu | 23:0b6901c9302c | 7 | Function description: |
| yuhangzhu | 23:0b6901c9302c | 8 | This function checks data in the line buffer. If it's good then write the converted value into address adam_pha |
| yuhangzhu | 23:0b6901c9302c | 9 | otherwise it returns error code |
| yuhangzhu | 23:0b6901c9302c | 10 | |
| yuhangzhu | 23:0b6901c9302c | 11 | Function: int parse_amp(char* line_buf, char* adam_amp) |
| yuhangzhu | 23:0b6901c9302c | 12 | Function description: |
| yuhangzhu | 23:0b6901c9302c | 13 | This function checks data in the line buffer. If it's good then write the converted value into address adam_amp |
| yuhangzhu | 23:0b6901c9302c | 14 | otherwise it returns error code |
| yuhangzhu | 26:5c264e20402f | 15 | |
| yuhangzhu | 26:5c264e20402f | 16 | |
| yuhangzhu | 26:5c264e20402f | 17 | Function: static char char2hex_4bits(char c) |
| yuhangzhu | 26:5c264e20402f | 18 | Function description: |
| yuhangzhu | 26:5c264e20402f | 19 | This function converts a character input into 4 bit hex. For example, '1'->1, '9'->9, 'A'->10, 'a'->10 |
| yuhangzhu | 26:5c264e20402f | 20 | |
| yuhangzhu | 26:5c264e20402f | 21 | Function: static char char2hex_3bits(char c) |
| yuhangzhu | 26:5c264e20402f | 22 | Function description: |
| yuhangzhu | 26:5c264e20402f | 23 | This function converts a character input into 3 bit hex. For example, '8'->0, '7'->7,'f'->7 |
| yuhangzhu | 26:5c264e20402f | 24 | |
| yuhangzhu | 26:5c264e20402f | 25 | Function: int parse_spi_raw(char* buf, int length, char* cha1_pha, char* cha2_pha, char* cha1_amp, char* cha2_amp) |
| yuhangzhu | 26:5c264e20402f | 26 | Function description: |
| yuhangzhu | 26:5c264e20402f | 27 | This function converts characters in buf and put the data in cha1_pha, cha2_pha, cha1_amp, cha2_amp. |
| yuhangzhu | 26:5c264e20402f | 28 | If length is incorrect, return the error code. |
| yuhangzhu | 26:5c264e20402f | 29 | |
| yuhangzhu | 26:5c264e20402f | 30 | Function: char hex2char(char hex) |
| yuhangzhu | 26:5c264e20402f | 31 | Function description: |
| yuhangzhu | 26:5c264e20402f | 32 | This function converts a hex number to character. For example, 1->'1', 10->'A' |
| yuhangzhu | 23:0b6901c9302c | 33 | *********************************************/ |
| yuhangzhu | 12:5e4cba1182ab | 34 | |
| yuhangzhu | 2:45db4f4ca70d | 35 | #include "parameters.h" |
| yuhangzhu | 2:45db4f4ca70d | 36 | |
| yuhangzhu | 2:45db4f4ca70d | 37 | void mode_idle_handler(int* state, char sel) |
| yuhangzhu | 2:45db4f4ca70d | 38 | { |
| yuhangzhu | 24:f8fea5e5bf73 | 39 | if(sel>='1' && sel<='8') |
| yuhangzhu | 2:45db4f4ca70d | 40 | *state = sel - '0'; //select a mode |
| yuhangzhu | 2:45db4f4ca70d | 41 | else |
| yuhangzhu | 2:45db4f4ca70d | 42 | *state = MODE_IDLE; |
| yuhangzhu | 6:e510aab8f2ce | 43 | } |
| yuhangzhu | 6:e510aab8f2ce | 44 | |
| yuhangzhu | 6:e510aab8f2ce | 45 | |
| yuhangzhu | 6:e510aab8f2ce | 46 | int parse_phase(char* line_buf, char* adam_pha) |
| yuhangzhu | 6:e510aab8f2ce | 47 | { |
| yuhangzhu | 6:e510aab8f2ce | 48 | |
| yuhangzhu | 6:e510aab8f2ce | 49 | char temp = 0; |
| yuhangzhu | 6:e510aab8f2ce | 50 | |
| yuhangzhu | 6:e510aab8f2ce | 51 | if(line_buf[3] == LINEBUF_EMPTY) |
| yuhangzhu | 6:e510aab8f2ce | 52 | return PARSE_EMPTY; //empty line |
| yuhangzhu | 6:e510aab8f2ce | 53 | if(line_buf[3] == LINEBUF_TOOLONG) |
| yuhangzhu | 6:e510aab8f2ce | 54 | return PARSE_LONG; //buffer too long |
| yuhangzhu | 6:e510aab8f2ce | 55 | |
| yuhangzhu | 7:c268547fb6c8 | 56 | if(line_buf[0] == '0') //input is 0 |
| yuhangzhu | 6:e510aab8f2ce | 57 | { |
| yuhangzhu | 6:e510aab8f2ce | 58 | if(line_buf[1] == 255 && line_buf[2] == 255) |
| yuhangzhu | 6:e510aab8f2ce | 59 | { |
| yuhangzhu | 6:e510aab8f2ce | 60 | *adam_pha = 0; |
| yuhangzhu | 6:e510aab8f2ce | 61 | return PARSE_OK; |
| yuhangzhu | 6:e510aab8f2ce | 62 | } |
| yuhangzhu | 6:e510aab8f2ce | 63 | else |
| yuhangzhu | 7:c268547fb6c8 | 64 | return PARSE_ERR; |
| yuhangzhu | 6:e510aab8f2ce | 65 | } |
| yuhangzhu | 6:e510aab8f2ce | 66 | |
| yuhangzhu | 6:e510aab8f2ce | 67 | |
| yuhangzhu | 6:e510aab8f2ce | 68 | |
| yuhangzhu | 6:e510aab8f2ce | 69 | |
| yuhangzhu | 6:e510aab8f2ce | 70 | if(line_buf[1]>='0' && line_buf[1]<='4' && line_buf[2]>='0'&& line_buf[2]<='9' && line_buf[0] == '-') |
| yuhangzhu | 6:e510aab8f2ce | 71 | { |
| yuhangzhu | 6:e510aab8f2ce | 72 | temp = (line_buf[1] - '0')*10; |
| yuhangzhu | 6:e510aab8f2ce | 73 | temp += line_buf[2] - '0'; |
| yuhangzhu | 6:e510aab8f2ce | 74 | *adam_pha = temp/7; |
| yuhangzhu | 6:e510aab8f2ce | 75 | |
| yuhangzhu | 6:e510aab8f2ce | 76 | if(temp % 7 == 0) |
| yuhangzhu | 6:e510aab8f2ce | 77 | return PARSE_OK; |
| yuhangzhu | 6:e510aab8f2ce | 78 | else |
| yuhangzhu | 6:e510aab8f2ce | 79 | return PARSE_ROUNDED; |
| yuhangzhu | 6:e510aab8f2ce | 80 | } //double digit input |
| yuhangzhu | 6:e510aab8f2ce | 81 | else if(line_buf[2] == 255 && line_buf[1]>='0' && line_buf[1] <= '9' && line_buf[0] == '-') |
| yuhangzhu | 6:e510aab8f2ce | 82 | { |
| yuhangzhu | 6:e510aab8f2ce | 83 | temp = line_buf[1] - '0'; |
| yuhangzhu | 6:e510aab8f2ce | 84 | *adam_pha = temp/7; |
| yuhangzhu | 6:e510aab8f2ce | 85 | |
| yuhangzhu | 6:e510aab8f2ce | 86 | if(temp % 7 == 0) |
| yuhangzhu | 6:e510aab8f2ce | 87 | return PARSE_OK; |
| yuhangzhu | 6:e510aab8f2ce | 88 | else |
| yuhangzhu | 6:e510aab8f2ce | 89 | return PARSE_ROUNDED; |
| yuhangzhu | 6:e510aab8f2ce | 90 | } //single digit input |
| yuhangzhu | 6:e510aab8f2ce | 91 | else |
| yuhangzhu | 6:e510aab8f2ce | 92 | return PARSE_ERR; |
| yuhangzhu | 6:e510aab8f2ce | 93 | } |
| yuhangzhu | 6:e510aab8f2ce | 94 | |
| yuhangzhu | 6:e510aab8f2ce | 95 | int parse_amp(char* line_buf, char* adam_amp) |
| yuhangzhu | 6:e510aab8f2ce | 96 | { |
| yuhangzhu | 6:e510aab8f2ce | 97 | |
| yuhangzhu | 6:e510aab8f2ce | 98 | char temp = 0; |
| yuhangzhu | 6:e510aab8f2ce | 99 | |
| yuhangzhu | 6:e510aab8f2ce | 100 | if(line_buf[3] == LINEBUF_EMPTY) |
| yuhangzhu | 6:e510aab8f2ce | 101 | return PARSE_EMPTY; |
| yuhangzhu | 6:e510aab8f2ce | 102 | if(line_buf[3] == LINEBUF_TOOLONG) |
| yuhangzhu | 6:e510aab8f2ce | 103 | return PARSE_LONG; |
| yuhangzhu | 21:4d6b26eecdac | 104 | //Single digit input. single digit is 0,1,2,3,4,5,6,7 |
| yuhangzhu | 6:e510aab8f2ce | 105 | if(line_buf[0]>='0' && line_buf[0]<='7' && line_buf[1] == 255 && line_buf[2] == 255) |
| yuhangzhu | 6:e510aab8f2ce | 106 | { |
| yuhangzhu | 6:e510aab8f2ce | 107 | temp = (line_buf[0] - '0')*10; |
| yuhangzhu | 6:e510aab8f2ce | 108 | *adam_amp = temp/5; |
| yuhangzhu | 6:e510aab8f2ce | 109 | return PARSE_OK; |
| yuhangzhu | 7:c268547fb6c8 | 110 | } |
| yuhangzhu | 21:4d6b26eecdac | 111 | //x.x format input eg. 0.0 0.5 1.5 1.0 7.0 7.5 etc |
| yuhangzhu | 6:e510aab8f2ce | 112 | else if(line_buf[0]>='0' && line_buf[0]<='7' && line_buf[2]>='0'&& line_buf[2]<='9' && line_buf[1] == '.') |
| yuhangzhu | 6:e510aab8f2ce | 113 | { |
| yuhangzhu | 6:e510aab8f2ce | 114 | temp = (line_buf[0] - '0')*10; |
| yuhangzhu | 6:e510aab8f2ce | 115 | temp += line_buf[2] - '0'; |
| yuhangzhu | 6:e510aab8f2ce | 116 | *adam_amp = temp / 5; |
| yuhangzhu | 6:e510aab8f2ce | 117 | |
| yuhangzhu | 6:e510aab8f2ce | 118 | if(temp % 5 == 0) |
| yuhangzhu | 6:e510aab8f2ce | 119 | return PARSE_OK; |
| yuhangzhu | 6:e510aab8f2ce | 120 | else |
| yuhangzhu | 6:e510aab8f2ce | 121 | return PARSE_ROUNDED; |
| yuhangzhu | 6:e510aab8f2ce | 122 | } |
| yuhangzhu | 6:e510aab8f2ce | 123 | else |
| yuhangzhu | 6:e510aab8f2ce | 124 | return PARSE_ERR; |
| yuhangzhu | 24:f8fea5e5bf73 | 125 | } |
| yuhangzhu | 24:f8fea5e5bf73 | 126 | |
| yuhangzhu | 24:f8fea5e5bf73 | 127 | static char char2hex_4bits(char c) |
| yuhangzhu | 24:f8fea5e5bf73 | 128 | { |
| yuhangzhu | 24:f8fea5e5bf73 | 129 | if(c >= '0' && c <= '9') |
| yuhangzhu | 24:f8fea5e5bf73 | 130 | return c-'0'; |
| yuhangzhu | 24:f8fea5e5bf73 | 131 | else if(c >= 'a' && c <= 'f') |
| yuhangzhu | 24:f8fea5e5bf73 | 132 | return c-'a'+10; |
| yuhangzhu | 24:f8fea5e5bf73 | 133 | else if(c >= 'A' && c <= 'F') |
| yuhangzhu | 24:f8fea5e5bf73 | 134 | return c-'A'+10; |
| yuhangzhu | 24:f8fea5e5bf73 | 135 | else |
| yuhangzhu | 24:f8fea5e5bf73 | 136 | return 255; |
| yuhangzhu | 24:f8fea5e5bf73 | 137 | } |
| yuhangzhu | 24:f8fea5e5bf73 | 138 | |
| yuhangzhu | 24:f8fea5e5bf73 | 139 | static char char2hex_3bits(char c) |
| yuhangzhu | 24:f8fea5e5bf73 | 140 | { |
| yuhangzhu | 24:f8fea5e5bf73 | 141 | if(c>='0' && c<='7') |
| yuhangzhu | 24:f8fea5e5bf73 | 142 | return c-'0'; |
| yuhangzhu | 24:f8fea5e5bf73 | 143 | else if(c == '8') |
| yuhangzhu | 24:f8fea5e5bf73 | 144 | return 0; |
| yuhangzhu | 26:5c264e20402f | 145 | else if(c == '9') |
| yuhangzhu | 24:f8fea5e5bf73 | 146 | return 1; |
| yuhangzhu | 24:f8fea5e5bf73 | 147 | else if(c >= 'a' && c <= 'f') |
| yuhangzhu | 24:f8fea5e5bf73 | 148 | return c-'a'+2; |
| yuhangzhu | 24:f8fea5e5bf73 | 149 | else if(c >= 'A' && c <= 'F') |
| yuhangzhu | 24:f8fea5e5bf73 | 150 | return c-'A'+2; |
| yuhangzhu | 24:f8fea5e5bf73 | 151 | else return 255; |
| yuhangzhu | 24:f8fea5e5bf73 | 152 | } |
| yuhangzhu | 24:f8fea5e5bf73 | 153 | |
| yuhangzhu | 24:f8fea5e5bf73 | 154 | |
| yuhangzhu | 24:f8fea5e5bf73 | 155 | int parse_spi_raw(char* buf, int length, char* cha1_pha, char* cha2_pha, char* cha1_amp, char* cha2_amp) |
| yuhangzhu | 24:f8fea5e5bf73 | 156 | { |
| yuhangzhu | 24:f8fea5e5bf73 | 157 | if(length == 0) |
| yuhangzhu | 24:f8fea5e5bf73 | 158 | return PARSE_EMPTY; |
| yuhangzhu | 24:f8fea5e5bf73 | 159 | if(length < 4) |
| yuhangzhu | 24:f8fea5e5bf73 | 160 | return PARSE_SHORT; |
| yuhangzhu | 24:f8fea5e5bf73 | 161 | else if(length > 4) |
| yuhangzhu | 24:f8fea5e5bf73 | 162 | return PARSE_LONG; |
| yuhangzhu | 24:f8fea5e5bf73 | 163 | else |
| yuhangzhu | 24:f8fea5e5bf73 | 164 | { |
| yuhangzhu | 24:f8fea5e5bf73 | 165 | *cha2_amp = char2hex_4bits(buf[0]); |
| yuhangzhu | 24:f8fea5e5bf73 | 166 | *cha2_pha = char2hex_3bits(buf[1]); |
| yuhangzhu | 24:f8fea5e5bf73 | 167 | *cha1_amp = char2hex_4bits(buf[2]); |
| yuhangzhu | 25:57de395d89aa | 168 | *cha1_pha = char2hex_3bits(buf[3]); |
| yuhangzhu | 25:57de395d89aa | 169 | return PARSE_OK; |
| yuhangzhu | 24:f8fea5e5bf73 | 170 | } |
| yuhangzhu | 25:57de395d89aa | 171 | } |
| yuhangzhu | 25:57de395d89aa | 172 | |
| yuhangzhu | 25:57de395d89aa | 173 | |
| yuhangzhu | 25:57de395d89aa | 174 | char hex2char(char hex) |
| yuhangzhu | 25:57de395d89aa | 175 | { |
| yuhangzhu | 25:57de395d89aa | 176 | if(hex < 10) |
| yuhangzhu | 25:57de395d89aa | 177 | return hex + '0'; |
| yuhangzhu | 25:57de395d89aa | 178 | else |
| yuhangzhu | 25:57de395d89aa | 179 | return hex-10+'A'; |
| yuhangzhu | 2:45db4f4ca70d | 180 | } |