Skip to content

Commit cf8934c

Browse files
committed
Add support for Korad KA3005PS
1 parent f06f788 commit cf8934c

File tree

3 files changed

+33
-15
lines changed

3 files changed

+33
-15
lines changed

src/hardware/korad-kaxxxxp/api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ static const double amps_5[] = { 0, 5.1, 0.001, };
5757

5858
static const struct korad_kaxxxxp_model models[] = {
5959
/* Vendor, model name, ID reply, channels, voltage, current, quirks. */
60+
{"Korad", "KA3005PS", "", 1, volts_30, amps_5,
61+
KORAD_QUIRK_NEWLINE},
6062
{"Korad", "KA3005P", "", 1, volts_30, amps_5,
6163
KORAD_QUIRK_ID_TRAILING},
6264
{"Korad", "KD3005P", "", 1, volts_30, amps_5, 0},
@@ -278,11 +280,14 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
278280
len = sizeof(reply) - 1;
279281
sr_dbg("Want max %zu bytes.", len);
280282

281-
ret = korad_kaxxxxp_send_cmd(serial, "*IDN?");
283+
// TODO: check if adding the newline breaks some other devices - I cannot do so
284+
// This is required for the KA3005PS
285+
ret = korad_kaxxxxp_send_cmd(serial, "*IDN?", true);
282286
if (ret < 0)
283287
return NULL;
284288

285-
ret = korad_kaxxxxp_read_chars(serial, len, reply);
289+
// Newline stripping enabled by default - doesn't matter for devices that don't add one
290+
ret = korad_kaxxxxp_read_chars(serial, len, reply, true);
286291
if (ret < 0)
287292
return NULL;
288293
sr_dbg("Received: %d, %s", ret, reply);

src/hardware/korad-kaxxxxp/protocol.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#define EXTRA_PROCESSING_TIME_MS 450
2626

2727
SR_PRIV int korad_kaxxxxp_send_cmd(struct sr_serial_dev_inst *serial,
28-
const char *cmd)
28+
const char *cmd, bool add_newline)
2929
{
3030
int ret;
3131

@@ -34,6 +34,8 @@ SR_PRIV int korad_kaxxxxp_send_cmd(struct sr_serial_dev_inst *serial,
3434
sr_err("Error sending command: %d.", ret);
3535
return ret;
3636
}
37+
if (add_newline)
38+
serial_write_blocking(serial, "\n", 1, 0);
3739

3840
return ret;
3941
}
@@ -71,7 +73,7 @@ SR_PRIV int korad_kaxxxxp_send_cmd(struct sr_serial_dev_inst *serial,
7173
* larger initial timeout period before receive data is seen.
7274
*/
7375
SR_PRIV int korad_kaxxxxp_read_chars(struct sr_serial_dev_inst *serial,
74-
size_t count, char *buf)
76+
size_t count, char *buf, bool strip_newline)
7577
{
7678
int timeout_first, timeout_later, timeout;
7779
size_t retries_first, retries_later, retries;
@@ -146,6 +148,11 @@ SR_PRIV int korad_kaxxxxp_read_chars(struct sr_serial_dev_inst *serial,
146148
timeout = timeout_later;
147149
retries = retries_later;
148150
}
151+
152+
if (strip_newline && buf[received-1] == 0x0a) {
153+
buf[--received] = 0x00;
154+
}
155+
149156
/* TODO Escape non-printables? Seen those with status queries. */
150157
sr_dbg("got %zu bytes, received: '%s'.", received, buf);
151158

@@ -259,7 +266,7 @@ SR_PRIV int korad_kaxxxxp_set_value(struct sr_serial_dev_inst *serial,
259266
}
260267

261268
if (ret == SR_OK && msg[0]) {
262-
ret = korad_kaxxxxp_send_cmd(serial, msg);
269+
ret = korad_kaxxxxp_send_cmd(serial, msg, devc->model->quirks & KORAD_QUIRK_NEWLINE);
263270
devc->next_req_time = next_req_time(devc, TRUE, target);
264271
}
265272

@@ -282,36 +289,40 @@ SR_PRIV int korad_kaxxxxp_get_value(struct sr_serial_dev_inst *serial,
282289
give_device_time_to_process(devc);
283290

284291
value = NULL;
285-
count = 5;
292+
count = 6;
293+
294+
bool newline_quirk = devc->model->quirks & KORAD_QUIRK_NEWLINE;
286295

287296
switch (target) {
288297
case KAXXXXP_CURRENT:
289298
/* Read current from device. */
290-
ret = korad_kaxxxxp_send_cmd(serial, "IOUT1?");
299+
ret = korad_kaxxxxp_send_cmd(serial, "IOUT1?", newline_quirk);
291300
value = &(devc->current);
292301
break;
293302
case KAXXXXP_CURRENT_LIMIT:
294303
/* Read set current from device. */
295-
ret = korad_kaxxxxp_send_cmd(serial, "ISET1?");
304+
ret = korad_kaxxxxp_send_cmd(serial, "ISET1?", newline_quirk);
296305
value = &(devc->current_limit);
297306
break;
298307
case KAXXXXP_VOLTAGE:
299308
/* Read voltage from device. */
300-
ret = korad_kaxxxxp_send_cmd(serial, "VOUT1?");
309+
ret = korad_kaxxxxp_send_cmd(serial, "VOUT1?", newline_quirk);
301310
value = &(devc->voltage);
302311
break;
303312
case KAXXXXP_VOLTAGE_TARGET:
304313
/* Read set voltage from device. */
305-
ret = korad_kaxxxxp_send_cmd(serial, "VSET1?");
314+
ret = korad_kaxxxxp_send_cmd(serial, "VSET1?", newline_quirk);
306315
value = &(devc->voltage_target);
307316
break;
308317
case KAXXXXP_STATUS:
309318
case KAXXXXP_OUTPUT:
310319
case KAXXXXP_OCP:
311320
case KAXXXXP_OVP:
312321
/* Read status from device. */
313-
ret = korad_kaxxxxp_send_cmd(serial, "STATUS?");
322+
ret = korad_kaxxxxp_send_cmd(serial, "STATUS?", newline_quirk);
314323
count = 1;
324+
if (newline_quirk)
325+
count = 2;
315326
break;
316327
default:
317328
sr_err("Don't know how to query %d.", target);
@@ -324,7 +335,7 @@ SR_PRIV int korad_kaxxxxp_get_value(struct sr_serial_dev_inst *serial,
324335

325336
devc->next_req_time = next_req_time(devc, FALSE, target);
326337

327-
if ((ret = korad_kaxxxxp_read_chars(serial, count, reply)) < 0) {
338+
if ((ret = korad_kaxxxxp_read_chars(serial, count, reply, newline_quirk)) < 0) {
328339
g_mutex_unlock(&devc->rw_mutex);
329340
return ret;
330341
}

src/hardware/korad-kaxxxxp/protocol.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#ifndef LIBSIGROK_HARDWARE_KORAD_KAXXXXP_PROTOCOL_H
2222
#define LIBSIGROK_HARDWARE_KORAD_KAXXXXP_PROTOCOL_H
2323

24+
#include <stdbool.h>
2425
#include <stdint.h>
2526
#include <string.h>
2627
#include <glib.h>
@@ -38,7 +39,8 @@ enum korad_quirks_flag {
3839
KORAD_QUIRK_ID_TRAILING = 1UL << 2,
3940
KORAD_QUIRK_ID_OPT_VERSION = 1UL << 3,
4041
KORAD_QUIRK_SLOW_PROCESSING = 1UL << 4,
41-
KORAD_QUIRK_ALL = (1UL << 5) - 1,
42+
KORAD_QUIRK_NEWLINE = 1UL << 5,
43+
KORAD_QUIRK_ALL = (1UL << 6) - 1,
4244
};
4345

4446
/* Information on single model */
@@ -103,9 +105,9 @@ struct dev_context {
103105
};
104106

105107
SR_PRIV int korad_kaxxxxp_send_cmd(struct sr_serial_dev_inst *serial,
106-
const char *cmd);
108+
const char *cmd, bool add_newline);
107109
SR_PRIV int korad_kaxxxxp_read_chars(struct sr_serial_dev_inst *serial,
108-
size_t count, char *buf);
110+
size_t count, char *buf, bool strip_newline);
109111
SR_PRIV int korad_kaxxxxp_set_value(struct sr_serial_dev_inst *serial,
110112
int target, struct dev_context *devc);
111113
SR_PRIV int korad_kaxxxxp_get_value(struct sr_serial_dev_inst *serial,

0 commit comments

Comments
 (0)