Skip to content

Commit

Permalink
rdtech-dps: Retry sr_modbus_read_holding_registers() up to 3 times.
Browse files Browse the repository at this point in the history
The communication with the rdtech power supplies is not very reliable,
especially during the start. Because of that, the driver tries to read the
modbus registers up to three times.
Nevertheless there is the chance, that the communication fails.
  • Loading branch information
knarfS committed Nov 13, 2019
1 parent c9b187a commit aff2094
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
23 changes: 21 additions & 2 deletions src/hardware/rdtech-dps/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,21 @@
#include <config.h>
#include "protocol.h"

SR_PRIV int rdtech_dps_read_holding_registers(struct sr_modbus_dev_inst *modbus,
int address, int nb_registers, uint16_t *registers)
{
int i, ret;

i = 0;
do {
ret = sr_modbus_read_holding_registers(modbus,
address, nb_registers, registers);
++i;
} while (ret != SR_OK && i < 3);

return ret;
}

SR_PRIV int rdtech_dps_get_reg(const struct sr_dev_inst *sdi,
uint16_t address, uint16_t *value)
{
Expand All @@ -33,7 +48,7 @@ SR_PRIV int rdtech_dps_get_reg(const struct sr_dev_inst *sdi,
modbus = sdi->conn;

g_mutex_lock(&devc->rw_mutex);
ret = sr_modbus_read_holding_registers(modbus, address, 1, registers);
ret = rdtech_dps_read_holding_registers(modbus, address, 1, registers);
g_mutex_unlock(&devc->rw_mutex);
*value = RB16(registers + 0);
return ret;
Expand Down Expand Up @@ -67,7 +82,7 @@ SR_PRIV int rdtech_dps_get_model_version(struct sr_modbus_dev_inst *modbus,
* No mutex here, because there is no sr_dev_inst when this function
* is called.
*/
ret = sr_modbus_read_holding_registers(modbus, REG_MODEL, 2, registers);
ret = rdtech_dps_read_holding_registers(modbus, REG_MODEL, 2, registers);
if (ret == SR_OK) {
*model = RB16(registers + 0);
*version = RB16(registers + 1);
Expand Down Expand Up @@ -119,6 +134,10 @@ SR_PRIV int rdtech_dps_receive_data(int fd, int revents, void *cb_data)
devc = sdi->priv;

g_mutex_lock(&devc->rw_mutex);
/*
* Using the libsigrok function here, because it doesn't matter if the
* reading fails. It will be done again in the next acquision cycle anyways.
*/
ret = sr_modbus_read_holding_registers(modbus, REG_UOUT, 3, registers);
g_mutex_unlock(&devc->rw_mutex);

Expand Down
3 changes: 3 additions & 0 deletions src/hardware/rdtech-dps/protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ enum rdtech_dps_mode {
MODE_CC = 1,
};

SR_PRIV int rdtech_dps_read_holding_registers(struct sr_modbus_dev_inst *modbus,
int address, int nb_registers, uint16_t *registers);

SR_PRIV int rdtech_dps_get_reg(const struct sr_dev_inst *sdi, uint16_t address, uint16_t *value);
SR_PRIV int rdtech_dps_set_reg(const struct sr_dev_inst *sdi, uint16_t address, uint16_t value);

Expand Down

0 comments on commit aff2094

Please sign in to comment.