Commit f33e5b9ff8cf53db9b4eda3328abd5ec01cbbe65
1 parent
0a671c23
Avoid duplicated code to compute the header_length
Showing
1 changed file
with
31 additions
and
48 deletions
src/modbus.c
| @@ -483,51 +483,43 @@ static int send_msg(modbus_t *ctx, uint8_t *req, int req_length) | @@ -483,51 +483,43 @@ static int send_msg(modbus_t *ctx, uint8_t *req, int req_length) | ||
| 483 | return rc; | 483 | return rc; |
| 484 | } | 484 | } |
| 485 | 485 | ||
| 486 | -/* Computes the length of the header following the function code */ | ||
| 487 | -static uint8_t compute_indication_length_header(int function) | ||
| 488 | -{ | ||
| 489 | - int length; | ||
| 490 | - | ||
| 491 | - if (function <= FC_WRITE_SINGLE_COIL || | ||
| 492 | - function == FC_WRITE_SINGLE_REGISTER) | ||
| 493 | - /* Read and single write */ | ||
| 494 | - length = 4; | ||
| 495 | - else if (function == FC_WRITE_MULTIPLE_COILS || | ||
| 496 | - function == FC_WRITE_MULTIPLE_REGISTERS) | ||
| 497 | - /* Multiple write */ | ||
| 498 | - length = 5; | ||
| 499 | - else if (function == FC_REPORT_SLAVE_ID) | ||
| 500 | - length = 0; | ||
| 501 | - else | ||
| 502 | - length = 0; | 486 | +/* |
| 487 | + ---------- Request Indication ---------- | ||
| 488 | + | Client | ---------------------->| Server | | ||
| 489 | + ---------- Confirmation Response ---------- | ||
| 490 | +*/ | ||
| 503 | 491 | ||
| 504 | - return length; | ||
| 505 | -} | 492 | +typedef enum { |
| 493 | + /* Request message on the server side */ | ||
| 494 | + MSG_INDICATION, | ||
| 495 | + /* Request message on the client side */ | ||
| 496 | + MSG_CONFIRMATION | ||
| 497 | +} msg_type_t; | ||
| 506 | 498 | ||
| 507 | -/* Computes the length of the header following the function code */ | ||
| 508 | -static uint8_t compute_confirmation_length_header(int function) | 499 | +/* Computes the header length (to reach the the function code) */ |
| 500 | +static uint8_t compute_header_length(int function, msg_type_t msg_type) | ||
| 509 | { | 501 | { |
| 510 | int length; | 502 | int length; |
| 511 | 503 | ||
| 512 | if (function <= FC_WRITE_SINGLE_COIL || | 504 | if (function <= FC_WRITE_SINGLE_COIL || |
| 513 | - function == FC_WRITE_SINGLE_REGISTER) | ||
| 514 | - /* Read and single write */ | 505 | + function == FC_WRITE_SINGLE_REGISTER) { |
| 515 | length = 4; | 506 | length = 4; |
| 516 | - else if (function == FC_WRITE_MULTIPLE_COILS || | ||
| 517 | - function == FC_WRITE_MULTIPLE_REGISTERS) | ||
| 518 | - /* Multiple write */ | 507 | + } else if (function == FC_WRITE_MULTIPLE_COILS || |
| 508 | + function == FC_WRITE_MULTIPLE_REGISTERS) { | ||
| 519 | length = 5; | 509 | length = 5; |
| 520 | - else if (function == FC_REPORT_SLAVE_ID) | ||
| 521 | - /* Report slave_ID */ | ||
| 522 | - length = 1; | ||
| 523 | - else | 510 | + } else if (function == FC_REPORT_SLAVE_ID) { |
| 511 | + if (msg_type == MSG_INDICATION) | ||
| 512 | + length = 0; | ||
| 513 | + else | ||
| 514 | + length = 1; | ||
| 515 | + } else { | ||
| 524 | length = 0; | 516 | length = 0; |
| 525 | - | 517 | + } |
| 526 | return length; | 518 | return length; |
| 527 | } | 519 | } |
| 528 | 520 | ||
| 529 | /* Computes the length of the data to write in the request */ | 521 | /* Computes the length of the data to write in the request */ |
| 530 | -static int compute_msg_length_data(modbus_t *ctx, uint8_t *msg) | 522 | +static int compute_data_length(modbus_t *ctx, uint8_t *msg) |
| 531 | { | 523 | { |
| 532 | int function = msg[TAB_HEADER_LENGTH[ctx->type_com]]; | 524 | int function = msg[TAB_HEADER_LENGTH[ctx->type_com]]; |
| 533 | int length; | 525 | int length; |
| @@ -600,14 +592,9 @@ static int compute_msg_length_data(modbus_t *ctx, uint8_t *msg) | @@ -600,14 +592,9 @@ static int compute_msg_length_data(modbus_t *ctx, uint8_t *msg) | ||
| 600 | - ETIMEDOUT | 592 | - ETIMEDOUT |
| 601 | - read() or recv() error codes | 593 | - read() or recv() error codes |
| 602 | */ | 594 | */ |
| 603 | -enum { | ||
| 604 | - /* Request message on the server side */ | ||
| 605 | - MSG_INDICATION, | ||
| 606 | - /* Request message on the client side */ | ||
| 607 | - MSG_CONFIRMATION | ||
| 608 | -}; | ||
| 609 | 595 | ||
| 610 | -static int receive_msg(modbus_t *ctx, int msg_length_computed, uint8_t *msg, int type) | 596 | +static int receive_msg(modbus_t *ctx, int msg_length_computed, |
| 597 | + uint8_t *msg, msg_type_t msg_type) | ||
| 611 | { | 598 | { |
| 612 | int s_rc; | 599 | int s_rc; |
| 613 | int read_rc; | 600 | int read_rc; |
| @@ -620,7 +607,7 @@ static int receive_msg(modbus_t *ctx, int msg_length_computed, uint8_t *msg, int | @@ -620,7 +607,7 @@ static int receive_msg(modbus_t *ctx, int msg_length_computed, uint8_t *msg, int | ||
| 620 | int msg_length = 0; | 607 | int msg_length = 0; |
| 621 | 608 | ||
| 622 | if (ctx->debug) { | 609 | if (ctx->debug) { |
| 623 | - if (type == MSG_INDICATION) { | 610 | + if (msg_type == MSG_INDICATION) { |
| 624 | printf("Waiting for a indication"); | 611 | printf("Waiting for a indication"); |
| 625 | } else { | 612 | } else { |
| 626 | printf("Waiting for a confirmation"); | 613 | printf("Waiting for a confirmation"); |
| @@ -700,13 +687,9 @@ static int receive_msg(modbus_t *ctx, int msg_length_computed, uint8_t *msg, int | @@ -700,13 +687,9 @@ static int receive_msg(modbus_t *ctx, int msg_length_computed, uint8_t *msg, int | ||
| 700 | switch (state) { | 687 | switch (state) { |
| 701 | case FUNCTION: | 688 | case FUNCTION: |
| 702 | /* Function code position */ | 689 | /* Function code position */ |
| 703 | - if (type == MSG_INDICATION) { | ||
| 704 | - length_to_read = compute_indication_length_header( | ||
| 705 | - msg[TAB_HEADER_LENGTH[ctx->type_com]]); | ||
| 706 | - } else { | ||
| 707 | - length_to_read = compute_confirmation_length_header( | ||
| 708 | - msg[TAB_HEADER_LENGTH[ctx->type_com]]); | ||
| 709 | - } | 690 | + length_to_read = compute_header_length( |
| 691 | + msg[TAB_HEADER_LENGTH[ctx->type_com]], | ||
| 692 | + msg_type); | ||
| 710 | msg_length_computed += length_to_read; | 693 | msg_length_computed += length_to_read; |
| 711 | /* It's useless to check the value of | 694 | /* It's useless to check the value of |
| 712 | msg_length_computed in this case (only | 695 | msg_length_computed in this case (only |
| @@ -714,7 +697,7 @@ static int receive_msg(modbus_t *ctx, int msg_length_computed, uint8_t *msg, int | @@ -714,7 +697,7 @@ static int receive_msg(modbus_t *ctx, int msg_length_computed, uint8_t *msg, int | ||
| 714 | state = DATA; | 697 | state = DATA; |
| 715 | break; | 698 | break; |
| 716 | case DATA: | 699 | case DATA: |
| 717 | - length_to_read = compute_msg_length_data(ctx, msg); | 700 | + length_to_read = compute_data_length(ctx, msg); |
| 718 | msg_length_computed += length_to_read; | 701 | msg_length_computed += length_to_read; |
| 719 | if (msg_length_computed > TAB_MAX_ADU_LENGTH[ctx->type_com]) { | 702 | if (msg_length_computed > TAB_MAX_ADU_LENGTH[ctx->type_com]) { |
| 720 | errno = EMBBADDATA; | 703 | errno = EMBBADDATA; |