+ /* Interpret the second registers chunk's values. */
+ rdptr = (const void *)registers;
+ ovpset_raw = read_u16le_inc(&rdptr); /* PRE OVPSET */
+ ovp_threshold = ovpset_raw * devc->voltage_multiplier;
+ ocpset_raw = read_u16le_inc(&rdptr); /* PRE OCPSET */
+ ocp_threshold = ocpset_raw * devc->current_multiplier;
+
+ break;
+
+ case MODEL_RD:
+ /* Retrieve a set of adjacent registers. */
+ g_mutex_lock(&devc->rw_mutex);
+ ret = rdtech_dps_read_holding_registers(modbus,
+ REG_RD_VOLT_TGT, 11, registers);
+ g_mutex_unlock(&devc->rw_mutex);
+ if (ret != SR_OK)
+ return ret;
+
+ /* Interpret the registers' raw content. */
+ rdptr = (const void *)registers;
+ uset_raw = read_u16be_inc(&rdptr); /* USET */
+ volt_target = uset_raw / devc->voltage_multiplier;
+ iset_raw = read_u16be_inc(&rdptr); /* ISET */
+ curr_limit = iset_raw / devc->current_multiplier;
+ uout_raw = read_u16be_inc(&rdptr); /* UOUT */
+ curr_voltage = uout_raw / devc->voltage_multiplier;
+ iout_raw = read_u16be_inc(&rdptr); /* IOUT */
+ curr_current = iout_raw / devc->current_multiplier;
+ (void)read_u16be_inc(&rdptr); /* ENERGY */
+ power_raw = read_u16be_inc(&rdptr); /* POWER */
+ curr_power = power_raw / 100.0f;
+ (void)read_u16be_inc(&rdptr); /* VOLT_IN */
+ (void)read_u16be_inc(&rdptr);
+ reg_val = read_u16be_inc(&rdptr); /* PROTECT */
+ uses_ovp = reg_val == STATE_OVP;
+ uses_ocp = reg_val == STATE_OCP;
+ reg_state = read_u16be_inc(&rdptr); /* REGULATION */
+ is_reg_cc = reg_state == MODE_CC;
+ out_state = read_u16be_inc(&rdptr); /* ENABLE */
+ is_out_enabled = out_state != 0;
+
+ /* Retrieve a set of adjacent registers. */
+ g_mutex_lock(&devc->rw_mutex);
+ ret = rdtech_dps_read_holding_registers(modbus,
+ REG_RD_OVP_THR, 2, registers);
+ g_mutex_unlock(&devc->rw_mutex);
+ if (ret != SR_OK)
+ return ret;
+
+ /* Interpret the registers' raw content. */
+ rdptr = (const void *)registers;
+ ovpset_raw = read_u16be_inc(&rdptr); /* OVP THR */
+ ovp_threshold = ovpset_raw / devc->voltage_multiplier;
+ ocpset_raw = read_u16be_inc(&rdptr); /* OCP THR */
+ ocp_threshold = ocpset_raw / devc->current_multiplier;
+
+ /* Details which we cannot query from the device. */
+ is_lock = FALSE;
+
+ break;
+
+ default:
+ /* ShouldNotHappen(TM). Probe should have failed. */
+ return SR_ERR_ARG;
+ }
+
+ /*
+ * Store gathered details in the high level container.
+ *
+ * TODO Make use of the caller's context. The register access
+ * code path above need not have gathered every detail in every
+ * invocation.
+ */