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@24:f8fea5e5bf73, 2013-07-23 (annotated)
- Committer:
- yuhangzhu
- Date:
- Tue Jul 23 04:33:02 2013 +0000
- Revision:
- 24:f8fea5e5bf73
- Parent:
- 23:0b6901c9302c
- Child:
- 25:57de395d89aa
this is the newest version with raw spi stream support
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 | 23:0b6901c9302c | 15 | *********************************************/ | 
| yuhangzhu | 12:5e4cba1182ab | 16 | |
| yuhangzhu | 2:45db4f4ca70d | 17 | #include "parameters.h" | 
| yuhangzhu | 2:45db4f4ca70d | 18 | |
| yuhangzhu | 2:45db4f4ca70d | 19 | void mode_idle_handler(int* state, char sel) | 
| yuhangzhu | 2:45db4f4ca70d | 20 | { | 
| yuhangzhu | 24:f8fea5e5bf73 | 21 | if(sel>='1' && sel<='8') | 
| yuhangzhu | 2:45db4f4ca70d | 22 | *state = sel - '0'; //select a mode | 
| yuhangzhu | 2:45db4f4ca70d | 23 | else | 
| yuhangzhu | 2:45db4f4ca70d | 24 | *state = MODE_IDLE; | 
| yuhangzhu | 6:e510aab8f2ce | 25 | } | 
| yuhangzhu | 6:e510aab8f2ce | 26 | |
| yuhangzhu | 6:e510aab8f2ce | 27 | |
| yuhangzhu | 6:e510aab8f2ce | 28 | int parse_phase(char* line_buf, char* adam_pha) | 
| yuhangzhu | 6:e510aab8f2ce | 29 | { | 
| yuhangzhu | 6:e510aab8f2ce | 30 | |
| yuhangzhu | 6:e510aab8f2ce | 31 | char temp = 0; | 
| yuhangzhu | 6:e510aab8f2ce | 32 | |
| yuhangzhu | 6:e510aab8f2ce | 33 | if(line_buf[3] == LINEBUF_EMPTY) | 
| yuhangzhu | 6:e510aab8f2ce | 34 | return PARSE_EMPTY; //empty line | 
| yuhangzhu | 6:e510aab8f2ce | 35 | if(line_buf[3] == LINEBUF_TOOLONG) | 
| yuhangzhu | 6:e510aab8f2ce | 36 | return PARSE_LONG; //buffer too long | 
| yuhangzhu | 6:e510aab8f2ce | 37 | |
| yuhangzhu | 7:c268547fb6c8 | 38 | if(line_buf[0] == '0') //input is 0 | 
| yuhangzhu | 6:e510aab8f2ce | 39 | { | 
| yuhangzhu | 6:e510aab8f2ce | 40 | if(line_buf[1] == 255 && line_buf[2] == 255) | 
| yuhangzhu | 6:e510aab8f2ce | 41 | { | 
| yuhangzhu | 6:e510aab8f2ce | 42 | *adam_pha = 0; | 
| yuhangzhu | 6:e510aab8f2ce | 43 | return PARSE_OK; | 
| yuhangzhu | 6:e510aab8f2ce | 44 | } | 
| yuhangzhu | 6:e510aab8f2ce | 45 | else | 
| yuhangzhu | 7:c268547fb6c8 | 46 | return PARSE_ERR; | 
| yuhangzhu | 6:e510aab8f2ce | 47 | } | 
| yuhangzhu | 6:e510aab8f2ce | 48 | |
| yuhangzhu | 6:e510aab8f2ce | 49 | |
| yuhangzhu | 6:e510aab8f2ce | 50 | |
| yuhangzhu | 6:e510aab8f2ce | 51 | |
| yuhangzhu | 6:e510aab8f2ce | 52 | if(line_buf[1]>='0' && line_buf[1]<='4' && line_buf[2]>='0'&& line_buf[2]<='9' && line_buf[0] == '-') | 
| yuhangzhu | 6:e510aab8f2ce | 53 | { | 
| yuhangzhu | 6:e510aab8f2ce | 54 | temp = (line_buf[1] - '0')*10; | 
| yuhangzhu | 6:e510aab8f2ce | 55 | temp += line_buf[2] - '0'; | 
| yuhangzhu | 6:e510aab8f2ce | 56 | *adam_pha = temp/7; | 
| yuhangzhu | 6:e510aab8f2ce | 57 | |
| yuhangzhu | 6:e510aab8f2ce | 58 | if(temp % 7 == 0) | 
| yuhangzhu | 6:e510aab8f2ce | 59 | return PARSE_OK; | 
| yuhangzhu | 6:e510aab8f2ce | 60 | else | 
| yuhangzhu | 6:e510aab8f2ce | 61 | return PARSE_ROUNDED; | 
| yuhangzhu | 6:e510aab8f2ce | 62 | } //double digit input | 
| yuhangzhu | 6:e510aab8f2ce | 63 | else if(line_buf[2] == 255 && line_buf[1]>='0' && line_buf[1] <= '9' && line_buf[0] == '-') | 
| yuhangzhu | 6:e510aab8f2ce | 64 | { | 
| yuhangzhu | 6:e510aab8f2ce | 65 | temp = line_buf[1] - '0'; | 
| yuhangzhu | 6:e510aab8f2ce | 66 | *adam_pha = temp/7; | 
| yuhangzhu | 6:e510aab8f2ce | 67 | |
| yuhangzhu | 6:e510aab8f2ce | 68 | if(temp % 7 == 0) | 
| yuhangzhu | 6:e510aab8f2ce | 69 | return PARSE_OK; | 
| yuhangzhu | 6:e510aab8f2ce | 70 | else | 
| yuhangzhu | 6:e510aab8f2ce | 71 | return PARSE_ROUNDED; | 
| yuhangzhu | 6:e510aab8f2ce | 72 | } //single digit input | 
| yuhangzhu | 6:e510aab8f2ce | 73 | else | 
| yuhangzhu | 6:e510aab8f2ce | 74 | return PARSE_ERR; | 
| yuhangzhu | 6:e510aab8f2ce | 75 | } | 
| yuhangzhu | 6:e510aab8f2ce | 76 | |
| yuhangzhu | 6:e510aab8f2ce | 77 | int parse_amp(char* line_buf, char* adam_amp) | 
| yuhangzhu | 6:e510aab8f2ce | 78 | { | 
| yuhangzhu | 6:e510aab8f2ce | 79 | |
| yuhangzhu | 6:e510aab8f2ce | 80 | char temp = 0; | 
| yuhangzhu | 6:e510aab8f2ce | 81 | |
| yuhangzhu | 6:e510aab8f2ce | 82 | if(line_buf[3] == LINEBUF_EMPTY) | 
| yuhangzhu | 6:e510aab8f2ce | 83 | return PARSE_EMPTY; | 
| yuhangzhu | 6:e510aab8f2ce | 84 | if(line_buf[3] == LINEBUF_TOOLONG) | 
| yuhangzhu | 6:e510aab8f2ce | 85 | return PARSE_LONG; | 
| yuhangzhu | 6:e510aab8f2ce | 86 | |
| yuhangzhu | 20:2a5e9d9aadbf | 87 | /*if(line_buf[0] == '0') //Input value is 0, or 0.0, or 0.5 | 
| yuhangzhu | 6:e510aab8f2ce | 88 | { | 
| yuhangzhu | 20:2a5e9d9aadbf | 89 | if((line_buf[1] == 255 && line_buf[2] == 255) ||(line_buf[1] == '.' && line_buf[2] == '0')) //Input is 0 or 0.0 | 
| yuhangzhu | 6:e510aab8f2ce | 90 | { | 
| yuhangzhu | 6:e510aab8f2ce | 91 | *adam_amp = 0; | 
| yuhangzhu | 6:e510aab8f2ce | 92 | return PARSE_OK; | 
| yuhangzhu | 6:e510aab8f2ce | 93 | } | 
| yuhangzhu | 20:2a5e9d9aadbf | 94 | else if(line_buf[1] == '.' && line_buf[2] == '5') //Input is 0.5 | 
| yuhangzhu | 20:2a5e9d9aadbf | 95 | { | 
| yuhangzhu | 20:2a5e9d9aadbf | 96 | *adam_amp = 1; | 
| yuhangzhu | 20:2a5e9d9aadbf | 97 | return PARSE_OK; | 
| yuhangzhu | 20:2a5e9d9aadbf | 98 | } | 
| yuhangzhu | 6:e510aab8f2ce | 99 | else | 
| yuhangzhu | 6:e510aab8f2ce | 100 | return PARSE_ERR; | 
| yuhangzhu | 20:2a5e9d9aadbf | 101 | } | 
| yuhangzhu | 20:2a5e9d9aadbf | 102 | */ | 
| yuhangzhu | 21:4d6b26eecdac | 103 | //Single digit input. single digit is 0,1,2,3,4,5,6,7 | 
| yuhangzhu | 6:e510aab8f2ce | 104 | if(line_buf[0]>='0' && line_buf[0]<='7' && line_buf[1] == 255 && line_buf[2] == 255) | 
| yuhangzhu | 6:e510aab8f2ce | 105 | { | 
| yuhangzhu | 6:e510aab8f2ce | 106 | temp = (line_buf[0] - '0')*10; | 
| yuhangzhu | 6:e510aab8f2ce | 107 | *adam_amp = temp/5; | 
| yuhangzhu | 6:e510aab8f2ce | 108 | return PARSE_OK; | 
| yuhangzhu | 7:c268547fb6c8 | 109 | } | 
| yuhangzhu | 21:4d6b26eecdac | 110 | //x.x format input eg. 0.0 0.5 1.5 1.0 7.0 7.5 etc | 
| yuhangzhu | 6:e510aab8f2ce | 111 | else if(line_buf[0]>='0' && line_buf[0]<='7' && line_buf[2]>='0'&& line_buf[2]<='9' && line_buf[1] == '.') | 
| yuhangzhu | 6:e510aab8f2ce | 112 | { | 
| yuhangzhu | 6:e510aab8f2ce | 113 | temp = (line_buf[0] - '0')*10; | 
| yuhangzhu | 6:e510aab8f2ce | 114 | temp += line_buf[2] - '0'; | 
| yuhangzhu | 6:e510aab8f2ce | 115 | *adam_amp = temp / 5; | 
| yuhangzhu | 6:e510aab8f2ce | 116 | |
| yuhangzhu | 6:e510aab8f2ce | 117 | if(temp % 5 == 0) | 
| yuhangzhu | 6:e510aab8f2ce | 118 | return PARSE_OK; | 
| yuhangzhu | 6:e510aab8f2ce | 119 | else | 
| yuhangzhu | 6:e510aab8f2ce | 120 | return PARSE_ROUNDED; | 
| yuhangzhu | 6:e510aab8f2ce | 121 | } | 
| yuhangzhu | 6:e510aab8f2ce | 122 | else | 
| yuhangzhu | 6:e510aab8f2ce | 123 | return PARSE_ERR; | 
| yuhangzhu | 24:f8fea5e5bf73 | 124 | } | 
| yuhangzhu | 24:f8fea5e5bf73 | 125 | |
| yuhangzhu | 24:f8fea5e5bf73 | 126 | static char char2hex_4bits(char c) | 
| yuhangzhu | 24:f8fea5e5bf73 | 127 | { | 
| yuhangzhu | 24:f8fea5e5bf73 | 128 | if(c >= '0' && c <= '9') | 
| yuhangzhu | 24:f8fea5e5bf73 | 129 | return c-'0'; | 
| yuhangzhu | 24:f8fea5e5bf73 | 130 | else if(c >= 'a' && c <= 'f') | 
| yuhangzhu | 24:f8fea5e5bf73 | 131 | return c-'a'+10; | 
| yuhangzhu | 24:f8fea5e5bf73 | 132 | else if(c >= 'A' && c <= 'F') | 
| yuhangzhu | 24:f8fea5e5bf73 | 133 | return c-'A'+10; | 
| yuhangzhu | 24:f8fea5e5bf73 | 134 | else | 
| yuhangzhu | 24:f8fea5e5bf73 | 135 | return 255; | 
| yuhangzhu | 24:f8fea5e5bf73 | 136 | } | 
| yuhangzhu | 24:f8fea5e5bf73 | 137 | |
| yuhangzhu | 24:f8fea5e5bf73 | 138 | static char char2hex_3bits(char c) | 
| yuhangzhu | 24:f8fea5e5bf73 | 139 | { | 
| yuhangzhu | 24:f8fea5e5bf73 | 140 | if(c>='0' && c<='7') | 
| yuhangzhu | 24:f8fea5e5bf73 | 141 | return c-'0'; | 
| yuhangzhu | 24:f8fea5e5bf73 | 142 | else if(c == '8') | 
| yuhangzhu | 24:f8fea5e5bf73 | 143 | return 0; | 
| yuhangzhu | 24:f8fea5e5bf73 | 144 | else if(c == 9) | 
| yuhangzhu | 24:f8fea5e5bf73 | 145 | return 1; | 
| yuhangzhu | 24:f8fea5e5bf73 | 146 | else if(c >= 'a' && c <= 'f') | 
| yuhangzhu | 24:f8fea5e5bf73 | 147 | return c-'a'+2; | 
| yuhangzhu | 24:f8fea5e5bf73 | 148 | else if(c >= 'A' && c <= 'F') | 
| yuhangzhu | 24:f8fea5e5bf73 | 149 | return c-'A'+2; | 
| yuhangzhu | 24:f8fea5e5bf73 | 150 | else return 255; | 
| yuhangzhu | 24:f8fea5e5bf73 | 151 | } | 
| yuhangzhu | 24:f8fea5e5bf73 | 152 | |
| yuhangzhu | 24:f8fea5e5bf73 | 153 | |
| yuhangzhu | 24:f8fea5e5bf73 | 154 | int parse_spi_raw(char* buf, int length, char* cha1_pha, char* cha2_pha, char* cha1_amp, char* cha2_amp) | 
| yuhangzhu | 24:f8fea5e5bf73 | 155 | { | 
| yuhangzhu | 24:f8fea5e5bf73 | 156 | if(length == 0) | 
| yuhangzhu | 24:f8fea5e5bf73 | 157 | return PARSE_EMPTY; | 
| yuhangzhu | 24:f8fea5e5bf73 | 158 | if(length < 4) | 
| yuhangzhu | 24:f8fea5e5bf73 | 159 | return PARSE_SHORT; | 
| yuhangzhu | 24:f8fea5e5bf73 | 160 | else if(length > 4) | 
| yuhangzhu | 24:f8fea5e5bf73 | 161 | return PARSE_LONG; | 
| yuhangzhu | 24:f8fea5e5bf73 | 162 | else | 
| yuhangzhu | 24:f8fea5e5bf73 | 163 | { | 
| yuhangzhu | 24:f8fea5e5bf73 | 164 | *cha2_amp = char2hex_4bits(buf[0]); | 
| yuhangzhu | 24:f8fea5e5bf73 | 165 | *cha2_pha = char2hex_3bits(buf[1]); | 
| yuhangzhu | 24:f8fea5e5bf73 | 166 | *cha1_amp = char2hex_4bits(buf[2]); | 
| yuhangzhu | 24:f8fea5e5bf73 | 167 | *cha1_pha = char2hex_3bits(buf[3]); | 
| yuhangzhu | 24:f8fea5e5bf73 | 168 | } | 
| yuhangzhu | 2:45db4f4ca70d | 169 | } |