X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fhardware%2Frdtech-dps%2Fprotocol.h;h=456e20419bf6f785de425588111ccaa195ebe920;hp=3224e1b5220f1750c9cfe914e458e178efc4aa9b;hb=7a78fd56f70b4739d6002ae6bd8ca2a70a2e96e3;hpb=69b05583955761d24c86cf1f46c1d1dba8c6176c diff --git a/src/hardware/rdtech-dps/protocol.h b/src/hardware/rdtech-dps/protocol.h index 3224e1b5..456e2041 100644 --- a/src/hardware/rdtech-dps/protocol.h +++ b/src/hardware/rdtech-dps/protocol.h @@ -2,6 +2,8 @@ * This file is part of the libsigrok project. * * Copyright (C) 2018 James Churchill + * Copyright (C) 2019 Frank Stettner + * Copyright (C) 2021 Gerhard Sittig * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,77 +22,85 @@ #ifndef LIBSIGROK_HARDWARE_RDTECH_DPS_PROTOCOL_H #define LIBSIGROK_HARDWARE_RDTECH_DPS_PROTOCOL_H -#include +#include + #include #include +#include + #include "libsigrok-internal.h" #define LOG_PREFIX "rdtech-dps" +enum rdtech_dps_model_type { + MODEL_NONE, + MODEL_DPS, + MODEL_RD, +}; + struct rdtech_dps_model { + enum rdtech_dps_model_type model_type; unsigned int id; const char *name; unsigned int max_current; unsigned int max_voltage; unsigned int max_power; + unsigned int current_digits; + unsigned int voltage_digits; }; struct dev_context { const struct rdtech_dps_model *model; + double current_multiplier; + double voltage_multiplier; struct sr_sw_limits limits; - int expecting_registers; -}; - -enum rdtech_dps_register { - REG_USET = 0x00, /* Mirror of 0x50 */ - REG_ISET = 0x01, /* Mirror of 0x51 */ - REG_UOUT = 0x02, - REG_IOUT = 0x03, - REG_POWER = 0x04, - REG_UIN = 0x05, - REG_LOCK = 0x06, - REG_PROTECT = 0x07, - REG_CV_CC = 0x08, - REG_ENABLE = 0x09, - REG_BACKLIGHT = 0x0A, /* Mirror of 0x55 */ - REG_MODEL = 0x0B, - REG_VERSION = 0x0C, - - REG_PRESET = 0x23, /* Loads a preset into preset 0. */ - -/* - * Add (preset * 0x10) to each of the following, for preset 1-9. - * Preset 0 regs below are the active output settings. - */ - PRE_USET = 0x50, - PRE_ISET = 0x51, - PRE_OVPSET = 0x52, - PRE_OCPSET = 0x53, - PRE_OPPSET = 0x54, - PRE_BACKLIGHT = 0x55, - PRE_DISABLE = 0x56, /* Disable output if 0 is copied here from a preset (1 is no change). */ - PRE_BOOT = 0x57, /* Enable output at boot if 1. */ + GMutex rw_mutex; + gboolean curr_ovp_state; + gboolean curr_ocp_state; + gboolean curr_cc_state; + gboolean curr_out_state; }; -enum rdtech_dps_state { - STATE_NORMAL = 0, - STATE_OVP = 1, - STATE_OCP = 2, - STATE_OPP = 3, +/* Container to get and set parameter values. */ +struct rdtech_dps_state { + enum rdtech_dps_state_mask { + STATE_LOCK = 1 << 0, + STATE_OUTPUT_ENABLED = 1 << 1, + STATE_REGULATION_CC = 1 << 2, + STATE_PROTECT_OVP = 1 << 3, + STATE_PROTECT_OCP = 1 << 4, + STATE_PROTECT_ENABLED = 1 << 5, + STATE_VOLTAGE_TARGET = 1 << 6, + STATE_CURRENT_LIMIT = 1 << 7, + STATE_OVP_THRESHOLD = 1 << 8, + STATE_OCP_THRESHOLD = 1 << 9, + STATE_VOLTAGE = 1 << 10, + STATE_CURRENT = 1 << 11, + STATE_POWER = 1 << 12, + } mask; + gboolean lock; + gboolean output_enabled, regulation_cc; + gboolean protect_ovp, protect_ocp, protect_enabled; + float voltage_target, current_limit; + float ovp_threshold, ocp_threshold; + float voltage, current, power; }; -enum rdtech_dps_mode { - MODE_CV = 0, - MODE_CC = 1, +enum rdtech_dps_state_context { + ST_CTX_NONE, + ST_CTX_CONFIG, + ST_CTX_PRE_ACQ, + ST_CTX_IN_ACQ, }; - -SR_PRIV int rdtech_dps_get_reg(struct sr_modbus_dev_inst *modbus, uint16_t address, uint16_t *value); -SR_PRIV int rdtech_dps_set_reg(struct sr_modbus_dev_inst *modbus, uint16_t address, uint16_t value); +SR_PRIV int rdtech_dps_get_state(const struct sr_dev_inst *sdi, + struct rdtech_dps_state *state, enum rdtech_dps_state_context reason); +SR_PRIV int rdtech_dps_set_state(const struct sr_dev_inst *sdi, + struct rdtech_dps_state *state); SR_PRIV int rdtech_dps_get_model_version(struct sr_modbus_dev_inst *modbus, - uint16_t *model, uint16_t *version); - -SR_PRIV int rdtech_dps_capture_start(const struct sr_dev_inst *sdi); + enum rdtech_dps_model_type model_type, + uint16_t *model, uint16_t *version, uint32_t *serno); +SR_PRIV int rdtech_dps_seed_receive(const struct sr_dev_inst *sdi); SR_PRIV int rdtech_dps_receive_data(int fd, int revents, void *cb_data); #endif