]> sigrok.org Git - libsigrok.git/blob - src/hardware/rdtech-dps/protocol.h
rdtech-dps: Handle different current/voltage digits for the various models.
[libsigrok.git] / src / hardware / rdtech-dps / protocol.h
1 /*
2  * This file is part of the libsigrok project.
3  *
4  * Copyright (C) 2018 James Churchill <pelrun@gmail.com>
5  * Copyright (C) 2019 Frank Stettner <frank-stettner@gmx.net>
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifndef LIBSIGROK_HARDWARE_RDTECH_DPS_PROTOCOL_H
22 #define LIBSIGROK_HARDWARE_RDTECH_DPS_PROTOCOL_H
23
24 #include <stdint.h>
25 #include <glib.h>
26 #include <libsigrok/libsigrok.h>
27 #include "libsigrok-internal.h"
28
29 #define LOG_PREFIX "rdtech-dps"
30
31 struct rdtech_dps_model {
32         unsigned int id;
33         const char *name;
34         unsigned int max_current;
35         unsigned int max_voltage;
36         unsigned int max_power;
37         unsigned int current_digits;
38         unsigned int voltage_digits;
39 };
40
41 struct dev_context {
42         const struct rdtech_dps_model *model;
43         struct sr_sw_limits limits;
44         GMutex rw_mutex;
45         double current_multiplier;
46         double voltage_multiplier;
47 };
48
49 enum rdtech_dps_register {
50         REG_USET       = 0x00, /* Mirror of 0x50 */
51         REG_ISET       = 0x01, /* Mirror of 0x51 */
52         REG_UOUT       = 0x02,
53         REG_IOUT       = 0x03,
54         REG_POWER      = 0x04,
55         REG_UIN        = 0x05,
56         REG_LOCK       = 0x06,
57         REG_PROTECT    = 0x07,
58         REG_CV_CC      = 0x08,
59         REG_ENABLE     = 0x09,
60         REG_BACKLIGHT  = 0x0A, /* Mirror of 0x55 */
61         REG_MODEL      = 0x0B,
62         REG_VERSION    = 0x0C,
63
64         REG_PRESET     = 0x23, /* Loads a preset into preset 0. */
65
66 /*
67  * Add (preset * 0x10) to each of the following, for preset 1-9.
68  * Preset 0 regs below are the active output settings.
69  */
70         PRE_USET       = 0x50,
71         PRE_ISET       = 0x51,
72         PRE_OVPSET     = 0x52,
73         PRE_OCPSET     = 0x53,
74         PRE_OPPSET     = 0x54,
75         PRE_BACKLIGHT  = 0x55,
76         PRE_DISABLE    = 0x56, /* Disable output if 0 is copied here from a preset (1 is no change). */
77         PRE_BOOT       = 0x57, /* Enable output at boot if 1. */
78 };
79
80 enum rdtech_dps_state {
81         STATE_NORMAL = 0,
82         STATE_OVP    = 1,
83         STATE_OCP    = 2,
84         STATE_OPP    = 3,
85 };
86
87 enum rdtech_dps_mode {
88         MODE_CV      = 0,
89         MODE_CC      = 1,
90 };
91
92 SR_PRIV int rdtech_dps_read_holding_registers(struct sr_modbus_dev_inst *modbus,
93                 int address, int nb_registers, uint16_t *registers);
94
95 SR_PRIV int rdtech_dps_get_reg(const struct sr_dev_inst *sdi, uint16_t address, uint16_t *value);
96 SR_PRIV int rdtech_dps_set_reg(const struct sr_dev_inst *sdi, uint16_t address, uint16_t value);
97
98 SR_PRIV int rdtech_dps_get_model_version(struct sr_modbus_dev_inst *modbus,
99                 uint16_t *model, uint16_t *version);
100
101 SR_PRIV int rdtech_dps_receive_data(int fd, int revents, void *cb_data);
102
103 #endif