Skip to content

Commit c79a973

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

File tree

3 files changed

+46
-17
lines changed

3 files changed

+46
-17
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: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,26 @@
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

32+
char* addition = "";
33+
if (add_newline)
34+
addition = "\n";
35+
36+
// 21 was chosen here because 20 is chosen in korad_kaxxxxp_set_value
37+
char newcmd[21];
38+
ret = sr_snprintf_ascii(newcmd, 21, "%s%s", cmd, addition);
39+
if (ret < 0 || ret >= 21) {
40+
sr_err("Error creating command: %d.", ret);
41+
if (ret > 0)
42+
ret = -ret; // make errors always return negative numbers
43+
return ret;
44+
}
45+
3246
sr_dbg("Sending '%s'.", cmd);
33-
if ((ret = serial_write_blocking(serial, cmd, strlen(cmd), 0)) < 0) {
47+
if ((ret = serial_write_blocking(serial, newcmd, strlen(newcmd), 0)) < 0) {
3448
sr_err("Error sending command: %d.", ret);
3549
return ret;
3650
}
@@ -71,7 +85,7 @@ SR_PRIV int korad_kaxxxxp_send_cmd(struct sr_serial_dev_inst *serial,
7185
* larger initial timeout period before receive data is seen.
7286
*/
7387
SR_PRIV int korad_kaxxxxp_read_chars(struct sr_serial_dev_inst *serial,
74-
size_t count, char *buf)
88+
size_t count, char *buf, bool strip_newline)
7589
{
7690
int timeout_first, timeout_later, timeout;
7791
size_t retries_first, retries_later, retries;
@@ -146,6 +160,10 @@ SR_PRIV int korad_kaxxxxp_read_chars(struct sr_serial_dev_inst *serial,
146160
timeout = timeout_later;
147161
retries = retries_later;
148162
}
163+
164+
if (strip_newline && buf[received-1] == 0x0a)
165+
buf[--received] = 0x00;
166+
149167
/* TODO Escape non-printables? Seen those with status queries. */
150168
sr_dbg("got %zu bytes, received: '%s'.", received, buf);
151169

@@ -259,7 +277,7 @@ SR_PRIV int korad_kaxxxxp_set_value(struct sr_serial_dev_inst *serial,
259277
}
260278

261279
if (ret == SR_OK && msg[0]) {
262-
ret = korad_kaxxxxp_send_cmd(serial, msg);
280+
ret = korad_kaxxxxp_send_cmd(serial, msg, devc->model->quirks & KORAD_QUIRK_NEWLINE);
263281
devc->next_req_time = next_req_time(devc, TRUE, target);
264282
}
265283

@@ -272,7 +290,7 @@ SR_PRIV int korad_kaxxxxp_get_value(struct sr_serial_dev_inst *serial,
272290
int target, struct dev_context *devc)
273291
{
274292
int ret, count;
275-
char reply[6];
293+
char reply[7];
276294
float *value;
277295
char status_byte;
278296
gboolean needs_ovp_quirk;
@@ -282,36 +300,40 @@ SR_PRIV int korad_kaxxxxp_get_value(struct sr_serial_dev_inst *serial,
282300
give_device_time_to_process(devc);
283301

284302
value = NULL;
285-
count = 5;
303+
count = 6;
304+
305+
bool newline_quirk = devc->model->quirks & KORAD_QUIRK_NEWLINE;
286306

287307
switch (target) {
288308
case KAXXXXP_CURRENT:
289309
/* Read current from device. */
290-
ret = korad_kaxxxxp_send_cmd(serial, "IOUT1?");
310+
ret = korad_kaxxxxp_send_cmd(serial, "IOUT1?", newline_quirk);
291311
value = &(devc->current);
292312
break;
293313
case KAXXXXP_CURRENT_LIMIT:
294314
/* Read set current from device. */
295-
ret = korad_kaxxxxp_send_cmd(serial, "ISET1?");
315+
ret = korad_kaxxxxp_send_cmd(serial, "ISET1?", newline_quirk);
296316
value = &(devc->current_limit);
297317
break;
298318
case KAXXXXP_VOLTAGE:
299319
/* Read voltage from device. */
300-
ret = korad_kaxxxxp_send_cmd(serial, "VOUT1?");
320+
ret = korad_kaxxxxp_send_cmd(serial, "VOUT1?", newline_quirk);
301321
value = &(devc->voltage);
302322
break;
303323
case KAXXXXP_VOLTAGE_TARGET:
304324
/* Read set voltage from device. */
305-
ret = korad_kaxxxxp_send_cmd(serial, "VSET1?");
325+
ret = korad_kaxxxxp_send_cmd(serial, "VSET1?", newline_quirk);
306326
value = &(devc->voltage_target);
307327
break;
308328
case KAXXXXP_STATUS:
309329
case KAXXXXP_OUTPUT:
310330
case KAXXXXP_OCP:
311331
case KAXXXXP_OVP:
312332
/* Read status from device. */
313-
ret = korad_kaxxxxp_send_cmd(serial, "STATUS?");
333+
ret = korad_kaxxxxp_send_cmd(serial, "STATUS?", newline_quirk);
314334
count = 1;
335+
if (newline_quirk)
336+
count = 2;
315337
break;
316338
default:
317339
sr_err("Don't know how to query %d.", target);
@@ -324,7 +346,7 @@ SR_PRIV int korad_kaxxxxp_get_value(struct sr_serial_dev_inst *serial,
324346

325347
devc->next_req_time = next_req_time(devc, FALSE, target);
326348

327-
if ((ret = korad_kaxxxxp_read_chars(serial, count, reply)) < 0) {
349+
if ((ret = korad_kaxxxxp_read_chars(serial, count, reply, newline_quirk)) < 0) {
328350
g_mutex_unlock(&devc->rw_mutex);
329351
return ret;
330352
}

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)