Over voltage and current protection support

Developed against Velleman LABPS3005D and seems to work.
This commit is contained in:
Hannu Vuolasaho 2015-10-22 01:05:37 +03:00 committed by Uwe Hermann
parent b16d975a5c
commit c40ed60f27
3 changed files with 49 additions and 5 deletions

View File

@ -44,6 +44,8 @@ static const uint32_t devopts[] = {
SR_CONF_CURRENT_LIMIT | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
SR_CONF_ENABLED | SR_CONF_GET | SR_CONF_SET,
SR_CONF_REGULATION | SR_CONF_GET,
SR_CONF_OVER_CURRENT_PROTECTION_ENABLED | SR_CONF_GET | SR_CONF_SET,
SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED | SR_CONF_GET | SR_CONF_SET,
};
static const struct korad_kdxxxxp_model models[] = {
@ -225,6 +227,12 @@ static int config_get(uint32_t key, GVariant **data,
else
*data = g_variant_new_string("CV");
break;
case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED:
*data = g_variant_new_boolean(devc->OCP_enabled);
break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED:
*data = g_variant_new_boolean(devc->OVP_enabled);
break;
default:
return SR_ERR_NA;
}
@ -283,6 +291,20 @@ static int config_set(uint32_t key, GVariant *data,
if (korad_kdxxxxp_set_value(sdi->conn, devc) < 0)
return SR_ERR;
break;
case SR_CONF_OVER_CURRENT_PROTECTION_ENABLED:
bval = g_variant_get_boolean(data);
devc->OCP_enabled = bval;
devc->target = KDXXXXP_OCP;
if (korad_kdxxxxp_set_value(sdi->conn, devc) < 0)
return SR_ERR;
break;
case SR_CONF_OVER_VOLTAGE_PROTECTION_ENABLED:
bval = g_variant_get_boolean(data);
devc->OVP_enabled = bval;
devc->target = KDXXXXP_OVP;
if (korad_kdxxxxp_set_value(sdi->conn, devc) < 0)
return SR_ERR;
break;
default:
return SR_ERR_NA;
}

View File

@ -109,6 +109,14 @@ SR_PRIV int korad_kdxxxxp_set_value(struct sr_serial_dev_inst *serial,
cmd = "BEEP%01.0f";
value = (devc->beep_enabled) ? 1 : 0;
break;
case KDXXXXP_OCP:
cmd = "OCP%01.0f";
value = (devc->OCP_enabled) ? 1 : 0;
break;
case KDXXXXP_OVP:
cmd = "OVP%01.0f";
value = (devc->OVP_enabled) ? 1 : 0;
break;
case KDXXXXP_SAVE:
cmd = "SAV%01.0f";
if (devc->program < 1 || devc->program > 5) {
@ -266,18 +274,24 @@ SR_PRIV int korad_kdxxxxp_get_reply(struct sr_serial_dev_inst *serial,
* 00 independent 01 series 11 parallel
*/
devc->beep_enabled = (1 << 4);
/* status_byte & (1 << 5) Unlocked */
devc->OCP_enabled = (status_byte & (1 << 5));
devc->output_enabled = (status_byte & (1 << 6));
/* Velleman LABPS3005 quirk */
if (devc->output_enabled)
devc->OVP_enabled = (status_byte & (1 << 7));
sr_dbg("Status: 0x%02x", status_byte);
sr_spew("Status: CH1: constant %s CH2: constant %s. Device is "
"%s and %s. Buttons are %s. Output is %s ",
sr_spew("Status: CH1: constant %s CH2: constant %s. "
"Tracking would be %s. Device is "
"%s and %s. Buttons are %s. Output is %s "
"and extra byte is %s.",
(status_byte & (1 << 0)) ? "voltage" : "current",
(status_byte & (1 << 1)) ? "voltage" : "current",
(status_byte & (1 << 2)) ? "parallel" : "series",
(status_byte & (1 << 3)) ? "tracking" : "independent",
(status_byte & (1 << 4)) ? "beeping" : "silent",
(status_byte & (1 << 5)) ? "locked" : "unlocked",
(status_byte & (1 << 6)) ? "enabled" : "disabled");
(status_byte & (1 << 6)) ? "enabled" : "disabled",
(status_byte & (1 << 7)) ? "true" : "false");
}
devc->reply_pending = FALSE;
@ -300,6 +314,10 @@ static void next_measurement(struct dev_context *devc)
case KDXXXXP_VOLTAGE_MAX:
devc->target = KDXXXXP_CURRENT;
break;
/* Read back what was set */
case KDXXXXP_BEEP:
case KDXXXXP_OCP:
case KDXXXXP_OVP:
case KDXXXXP_OUTPUT:
devc->target = KDXXXXP_STATUS;
break;

View File

@ -61,6 +61,8 @@ enum {
KDXXXXP_STATUS,
KDXXXXP_OUTPUT,
KDXXXXP_BEEP,
KDXXXXP_OCP,
KDXXXXP_OVP,
KDXXXXP_SAVE,
KDXXXXP_RECALL,
};
@ -89,6 +91,8 @@ struct dev_context {
gboolean output_enabled; /**< Is the output enabled? */
gboolean beep_enabled; /**< Enable beeper. */
gboolean OCP_enabled; /**< Output current protection enabled */
gboolean OVP_enabled; /**< Output voltage protection enabled */
/* Temporary state across callbacks */
int target; /**< What reply to expect */