/** * @brief * parses lists * channel numbers > 0. * no checks yet. * valid: (@1), (@3!1:1!3), ... * (@1!1:3!2) would be 1!1, 1!2, 2!1, 2!2, 3!1, 3!2. * (@3!1:1!3) would be 3!1, 3!2, 3!3, 2!1, 2!2, 2!3, ... 1!3. * * @param channel_list channel list, compare to SCPI99 Vol 1 Ch. 8.3.2 */ static scpi_result_t TEST_Chanlst(scpi_t *context) { scpi_parameter_t channel_list_param; #define MAXROW 2 /* maximum number of rows */ #define MAXCOL 6 /* maximum number of columns */ #define MAXDIM 2 /* maximum number of dimensions */ scpi_channel_value_t array[MAXROW * MAXCOL]; /* array which holds values in order (2D) */ size_t chanlst_idx; /* index for channel list */ size_t arr_idx = 0; /* index for array */ size_t n, m = 1; /* counters for row (n) and columns (m) */ /* get channel list */ if (SCPI_Parameter(context, &channel_list_param, TRUE)) { scpi_expr_result_t res; scpi_bool_t is_range; int32_t values_from[MAXDIM]; int32_t values_to[MAXDIM]; size_t dimensions; bool for_stop_row = FALSE; /* true if iteration for rows has to stop */ bool for_stop_col = FALSE; /* true if iteration for columns has to stop */ int32_t dir_row = 1; /* direction of counter for rows, +/-1 */ int32_t dir_col = 1; /* direction of counter for columns, +/-1 */ /* the next statement is valid usage and it gets only real number of dimensions for the first item (index 0) */ if (!SCPI_ExprChannelListEntry(context, &channel_list_param, 0, &is_range, NULL, NULL, 0, &dimensions)) { chanlst_idx = 0; /* call first index */ arr_idx = 0; /* set arr_idx to 0 */ do { /* if valid, iterate over channel_list_param index while res == valid (do-while cause we have to do it once) */ res = SCPI_ExprChannelListEntry(context, &channel_list_param, chanlst_idx, &is_range, values_from, values_to, 4, &dimensions); if (is_range == FALSE) { /* still can have multiple dimensions */ if (dimensions == 1) { /* here we have our values * row == values_from[0] * col == 0 (fixed number) * call a function or something */ array[arr_idx].row = values_from[0]; array[arr_idx].col = 0; } else if (dimensions == 2) { /* here we have our values * row == values_fom[0] * col == values_from[1] * call a function or something */ array[arr_idx].row = values_from[0]; array[arr_idx].col = values_from[1]; } else { return SCPI_RES_ERR; } arr_idx++; /* inkrement array where we want to save our values to, not neccessary otherwise */ if (arr_idx >= MAXROW * MAXCOL) { return SCPI_RES_ERR; } } else if (is_range == TRUE) { if (values_from[0] > values_to[0]) { dir_row = -1; /* we have to decrement from values_from */ } else { /* if (values_from[0] < values_to[0]) */ dir_row = +1; /* default, we increment from values_from */ } /* iterating over rows, do it once -> set for_stop_row = false * needed if there is channel list index isn't at end yet */ for_stop_row = FALSE; for (n = values_from[0]; for_stop_row == FALSE; n += dir_row) { /* usual case for ranges, 2 dimensions */ if (dimensions == 2) { if (values_from[1] > values_to[1]) { dir_col = -1; } else if (values_from[1] < values_to[1]) { dir_col = +1; } /* iterating over columns, do it at least once -> set for_stop_col = false * needed if there is channel list index isn't at end yet */ for_stop_col = FALSE; for (m = values_from[1]; for_stop_col == FALSE; m += dir_col) { /* here we have our values * row == n * col == m * call a function or something */ array[arr_idx].row = n; array[arr_idx].col = m; arr_idx++; if (arr_idx >= MAXROW * MAXCOL) { return SCPI_RES_ERR; } if (m == (size_t)values_to[1]) { /* endpoint reached, stop column for-loop */ for_stop_col = TRUE; } } /* special case for range, example: (@2!1) */ } else if (dimensions == 1) { /* here we have values * row == n * col == 0 (fixed number) * call function or sth. */ array[arr_idx].row = n; array[arr_idx].col = 0; arr_idx++; if (arr_idx >= MAXROW * MAXCOL) { return SCPI_RES_ERR; } } if (n == (size_t)values_to[0]) { /* endpoint reached, stop row for-loop */ for_stop_row = TRUE; } } } else { return SCPI_RES_ERR; } /* increase index */ chanlst_idx++; } while (SCPI_EXPR_OK == SCPI_ExprChannelListEntry(context, &channel_list_param, chanlst_idx, &is_range, values_from, values_to, 4, &dimensions)); /* while checks, whether incremented index is valid */ } /* do something at the end if needed */ /* array[arr_idx].row = 0; */ /* array[arr_idx].col = 0; */ } { size_t i; fprintf(stderr, "TEST_Chanlst: "); for (i = 0; i< arr_idx; i++) { fprintf(stderr, "%d!%d, ", array[i].row, array[i].col); } fprintf(stderr, "\r\n"); } return SCPI_RES_OK; }
/** * @brief * parses lists * channel numbers > 0. * no checks yet. * valid: (@1), (@3!1:1!3), ... * (@1!1:3!2) would be 1!1, 1!2, 2!1, 2!2, 3!1, 3!2. * (@3!1:1!3) would be 3!1, 3!2, 3!3, 2!1, 2!2, 2!3, ... 1!3. * * @param channel_list channel list, compare to SCPI99 Vol 1 Ch. 8.3.2 */ static scpi_result_t TEST_Chanlst(scpi_t *context) { scpi_parameter_t channel_list_param; #define maxrow 2 //maximum number of rows #define maxcol 6 //maximum number of columns #define maxdim 2 //maximum number of dimensions scpi_channel_value_t array[maxrow * maxcol]; //array which holds values in order (2D) size_t chanlst_idx; //index for channel list size_t arr_idx = 0; //index for array size_t n, m = 1; //counters for row (n) and columns (m) // get channel list if (SCPI_Parameter(context, &channel_list_param, TRUE)) { scpi_expr_result_t res; scpi_bool_t is_range; INT32 values_from[maxdim]; INT32 values_to[maxdim]; size_t dimensions; boolean for_stop_row = FALSE; //TRUE if iteration for rows has to stop boolean for_stop_col = FALSE; //TRUE if iteration for columns has to stop INT32 dir_row = 1; //direction of counter for rows, +/-1 INT32 dir_col = 1; //direction of counter for columns, +/-1 // the next statement is valid usage and it gets only real number of dimensions for the first item (index 0) if (!SCPI_ExprChannelListEntry(context, &channel_list_param, 0, &is_range, NULL, NULL, 0, &dimensions)) { chanlst_idx = 0; //call first index arr_idx = 0; //set arr_idx to 0 do { //if valid, iterate over channel_list_param index while res == valid (do-while cause we have to do it once) res = SCPI_ExprChannelListEntry(context, &channel_list_param, chanlst_idx, &is_range, values_from, values_to, 4, &dimensions); if (is_range == FALSE) { //still can have multiple dimensions if (dimensions == 1) { //here we have our values //row == values_from[0] //col == 0 (fixed number) //call a function or something array[arr_idx].row = values_from[0]; array[arr_idx].col = 0; } else if (dimensions == 2) { //here we have our values //row == values_fom[0] //col == values_from[1] //call a function or something array[arr_idx].row = values_from[0]; array[arr_idx].col = values_from[1]; } else { return SCPI_RES_ERR; break; } arr_idx++; //inkrement array where we want to save our values to, not neccessary otherwise } else if (is_range == TRUE) { if (values_from[0] > values_to[0]) { dir_row = -1; //we have to decrement from values_from } else { //if (values_from[0] < values_to[0]) dir_row = +1; //default, we increment from values_from } //iterating over rows, do it once -> set for_stop_row = FALSE //needed if there is channel list index isn't at end yet for_stop_row = FALSE; for (n = values_from[0]; for_stop_row == FALSE; n += dir_row) { //usual case for ranges, 2 dimensions if (dimensions == 2) { if (values_from[1] > values_to[1]) { dir_col = -1; } else if (values_from[1] < values_to[1]) { dir_col = +1; } //iterating over columns, do it at least once -> set for_stop_col = FALSE //needed if there is channel list index isn't at end yet for_stop_col = FALSE; for (m = values_from[1]; for_stop_col == FALSE; m += dir_col) { //here we have our values //row == n //col == m //call a function or something array[arr_idx].row = n; array[arr_idx].col = m; arr_idx++; if (m == (size_t)values_to[1]) { //endpoint reached, stop column for-loop for_stop_col = TRUE; } } //special case for range, example: (@2!1) } else if (dimensions == 1) { //here we have values //row == n //col == 0 (fixed number) //call function or sth. array[arr_idx].row = n; array[arr_idx].col = 0; arr_idx++; } if (n == (size_t)values_to[0]) { //endpoint reached, stop row for-loop for_stop_row = TRUE; } } } else { return SCPI_RES_ERR; break; } //increase index chanlst_idx++; } while (SCPI_EXPR_OK == SCPI_ExprChannelListEntry(context, &channel_list_param, chanlst_idx, &is_range, values_from, values_to, 4, &dimensions)); //while checks, whether incremented index is valid } //do something at the end if needed array[arr_idx].row = 0; array[arr_idx].col = 0; } { size_t i; fprintf(stderr, "TEST_Chanlst: "); for (i = 0; i< arr_idx; i++) { fprintf(stderr, "%d!%d, ", array[i].row, array[i].col); } fprintf(stderr, "\r\n"); } return SCPI_RES_OK; }