2525#define EXTRA_PROCESSING_TIME_MS 450
2626
2727SR_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 */
7387SR_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 }
0 commit comments