]> sigrok.org Git - libsigrok.git/blobdiff - hardware/radioshack-dmm/radioshack.c
more deconstifying sr_dev_inst for dev_acquisition_stop()
[libsigrok.git] / hardware / radioshack-dmm / radioshack.c
index 9e05bef794f56b487767e9ed53446e7ff60f6eff..6746030824780bac06196988751159b26ffaf2dc 100644 (file)
 #include <glib.h>
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
-#include "config.h"
 #include "radioshack-dmm.h"
 #include <stdlib.h>
 #include <math.h>
 #include <string.h>
 #include <errno.h>
 
-
 static gboolean rs_22_812_is_checksum_valid(const rs_22_812_packet *data)
 {
        uint8_t *raw = (void *) data;
@@ -215,6 +213,12 @@ static gboolean rs_22_812_is_shortcirc(rs_22_812_packet *rs_packet)
        return((rs_packet->digit2 & ~RS_22_812_DP_MASK) == RS_22_812_LCD_h);
 }
 
+static gboolean rs_22_812_is_logic_high(rs_22_812_packet *rs_packet)
+{
+       sr_spew("digit 2: %x", rs_packet->digit2 & ~RS_22_812_DP_MASK);
+       return((rs_packet->digit2 & ~RS_22_812_DP_MASK) == RS_22_812_LCD_H);
+}
+
 static void rs_22_812_handle_packet(rs_22_812_packet *rs_packet,
                                    rs_dev_ctx *devc)
 {
@@ -225,8 +229,10 @@ static void rs_22_812_handle_packet(rs_22_812_packet *rs_packet,
        struct sr_datafeed_packet packet;
        struct sr_datafeed_analog *analog;
 
+       /* TODO: Check malloc return value. */
        analog = g_try_malloc0(sizeof(struct sr_datafeed_analog));
        analog->num_samples = 1;
+       /* TODO: Check malloc return value. */
        analog->data = g_try_malloc(sizeof(float));
        *analog->data = (float)rawval;
        analog->mq = -1;
@@ -281,12 +287,17 @@ static void rs_22_812_handle_packet(rs_22_812_packet *rs_packet,
                analog->unit = SR_UNIT_HERTZ;
                break;
        case RS_22_812_MODE_LOGIC:
-               analog->mq = 0; /* FIXME */
-               analog->unit = SR_UNIT_BOOLEAN;
-               sr_warn("radioshack-dmm: LOGIC mode not supported yet");
-               g_free(analog->data);
-               g_free(analog);
-               return;
+               /* No matter whether or not we have an actual voltage reading,
+                * we are measuring voltage, so we set our MQ as VOLTAGE */
+               analog->mq = SR_MQ_VOLTAGE;
+               if(!isnan(rawval)) {
+                       /* We have an actual voltage */
+                       analog->unit = SR_UNIT_VOLT;
+               } else {
+                       /* We have either HI or LOW */
+                       analog->unit = SR_UNIT_BOOLEAN;
+                       *analog->data = rs_22_812_is_logic_high(rs_packet);
+               }
                break;
        case RS_22_812_MODE_HFE:
                analog->mq = SR_MQ_GAIN;
@@ -316,7 +327,7 @@ static void rs_22_812_handle_packet(rs_22_812_packet *rs_packet,
                analog->mqflags |= SR_MQFLAG_AC;
                break;
        default:
-               sr_warn("radioshack-dmm: unkown mode: %d", rs_packet->mode);
+               sr_warn("Unknown mode: %d.", rs_packet->mode);
                break;
        }
 
@@ -335,7 +346,7 @@ static void rs_22_812_handle_packet(rs_22_812_packet *rs_packet,
 
        if (analog->mq != -1) {
                /* Got a measurement. */
-               sr_spew("radioshack-dmm: val %f", rawval);
+               sr_spew("Value: %f.", rawval);
                packet.type = SR_DF_ANALOG;
                packet.payload = analog;
                sr_session_send(devc->cb_data, &packet);
@@ -354,7 +365,7 @@ static void handle_new_data(rs_dev_ctx *devc, int fd)
        len = RS_DMM_BUFSIZE - devc->buflen;
        len = serial_read(fd, devc->buf + devc->buflen, len);
        if (len < 1) {
-               sr_err("radioshack-dmm: serial port read error!");
+               sr_err("Serial port read error!");
                return;
        }
        devc->buflen += len;
@@ -380,7 +391,7 @@ static void handle_new_data(rs_dev_ctx *devc, int fd)
 
 SR_PRIV int radioshack_receive_data(int fd, int revents, void *cb_data)
 {
-       const struct sr_dev_inst *sdi;
+       struct sr_dev_inst *sdi;
        struct dev_context *devc;
 
        if (!(sdi = cb_data))
@@ -402,4 +413,3 @@ SR_PRIV int radioshack_receive_data(int fd, int revents, void *cb_data)
 
        return TRUE;
 }
-