mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-27 06:35:20 +00:00
hfp use state maschine instead of while
This commit is contained in:
parent
9410587b1d
commit
63ec1ba8aa
96
src/hfp_hf.c
96
src/hfp_hf.c
@ -227,63 +227,57 @@ static void hfp_run_for_context(hfp_connection_t * connection){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void hfp_parse_indicators(hfp_connection_t * context, uint8_t *packet, uint16_t size){
|
void hfp_parse_indicators(hfp_connection_t * context, uint8_t *packet, uint16_t size){
|
||||||
uint8_t parse_indicator = 0;
|
|
||||||
uint8_t parse_range = 0;
|
|
||||||
uint8_t parse_max_range = 0;
|
|
||||||
uint8_t byte;
|
|
||||||
char indicator[10];
|
char indicator[10];
|
||||||
char min_range[3];
|
char min_range[3];
|
||||||
char max_range[3];
|
char max_range[3];
|
||||||
|
int i, pos;
|
||||||
|
int index = 0;
|
||||||
|
int state = 0;
|
||||||
|
|
||||||
|
for (pos = 0; pos < size; pos++){
|
||||||
|
uint8_t byte = packet[pos];
|
||||||
|
|
||||||
int i;
|
switch (state){
|
||||||
int pos = 0;
|
case 0: // pre-indicator
|
||||||
|
if (byte != '"') break;
|
||||||
while ( pos < size ){
|
state++;
|
||||||
while (!parse_indicator && pos < size){
|
|
||||||
byte = packet[pos++];
|
|
||||||
if (byte == '"'){
|
|
||||||
parse_indicator = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = 0;
|
|
||||||
while (parse_indicator && pos < size){
|
|
||||||
byte = packet[pos++];
|
|
||||||
if (byte == '"'){
|
|
||||||
parse_indicator = 0;
|
|
||||||
indicator[i] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
indicator[i++] = byte;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!parse_range && pos < size){
|
|
||||||
byte = packet[pos++];
|
|
||||||
if (byte == '('){
|
|
||||||
parse_range = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i = 0;
|
|
||||||
while (parse_range && pos < size){
|
|
||||||
byte = packet[pos++];
|
|
||||||
if (byte == ')'){
|
|
||||||
parse_range = 0;
|
|
||||||
parse_max_range = 0;
|
|
||||||
max_range[i] = 0;
|
|
||||||
printf("Indicator %s, min %d, max %d\n", indicator, atoi(min_range), atoi(max_range));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (byte == ','){
|
|
||||||
parse_max_range = 1;
|
|
||||||
min_range[i] = 0;
|
|
||||||
i = 0;
|
i = 0;
|
||||||
continue;
|
break;
|
||||||
}
|
case 1: // indicator
|
||||||
if (parse_max_range){
|
if (byte == '"'){
|
||||||
max_range[i++] = byte;
|
state++;
|
||||||
} else {
|
indicator[i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
indicator[i++] = byte;
|
||||||
|
break;
|
||||||
|
case 2: // pre-range
|
||||||
|
if (byte != '(') break;
|
||||||
|
state++;
|
||||||
|
i = 0;
|
||||||
|
break;
|
||||||
|
case 3: // min-range
|
||||||
|
if (byte == ','){
|
||||||
|
state++;
|
||||||
|
min_range[i] = 0;
|
||||||
|
i = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
min_range[i++] = byte;
|
min_range[i++] = byte;
|
||||||
}
|
break;
|
||||||
|
case 4:
|
||||||
|
if (byte == ')'){
|
||||||
|
state = 0;
|
||||||
|
max_range[i] = 0;
|
||||||
|
printf("Indicator %d: %s, range [%d, %d] \n", index, indicator, atoi(min_range), atoi(max_range));
|
||||||
|
index++;
|
||||||
|
i = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
max_range[i++] = byte;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user