Maybe something like this:
Code:
typdef struct{
uint16_t data0;
uint16_t data1;
uint16_t data2;
uint16_t data3;
} data_st;
enum RequestType { REQUEST_NONE, REQUEST0, REQUEST1, REQUEST2, REQUEST3,
REQUEST4 };
void handle_request(RequestType request_type) {
static RequestType prev_request = REQUEST_NONE;
static int prev_mode = 0;
static data_st request[5] = {
{ 0x0102, 0x0304, 0x0506, 0x0708 }, // whatever the data is
// ...
};
data_st response;
switch (request_type) {
case REQUEST0:
request_response(&request[0], &response);
if (prev_request != REQUEST_NONE)
handle_response(prev_request, prev_mode, &response);
prev_request = REQUEST0;
prev_mode = 0;
break;
case REQUEST1:
request_response(&request[1], &response);
if (prev_request != REQUEST_NONE)
handle_response(prev_request, prev_mode, &response);
prev_request = REQUEST1;
prev_mode = 0;
break;
// ... case REQUEST2 and case REQUEST3 ...
case REQUEST4:
request_response(&request[4], &response);
if (prev_request != REQUEST_NONE)
handle_response(prev_request, prev_mode, &response);
if (prev_request == REQUEST4)
prev_mode = (prev_mode + 1) % 3;
else
prev_mode = 0;
prev_request = REQUEST4;
break;
}
}
void handle_response(RequestType type, int mode, data_st *response) {
switch (type) {
case REQUEST0:
// process response for request-0 type
break;
case REQUEST1:
// process response for request-1 type
break;
case REQUEST2:
// process response for request-2 type
break;
case REQUEST3:
// process response for request-3 type
break;
case REQUEST4:
switch (mode) {
case 0:
// process response for request-4, mode-0 type
break;
case 1:
// process response for request-4, mode-1 type
break;
case 2:
// process response for request-4, mode-2 type
break;
}
}
}