Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

uni-t-ut8802e: Initial commit #220

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

KonradTagowski
Copy link

Implementation of the driver for Uni-t UT8802E bench multimeter. The protocol was reconstructed manually. I suppose that the multimeter supports only reading the measurement.

*/

static const int8_t range_volt[] = {-3, 0};
static const int8_t range_amp[] = {-6, -3, 0};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

range_amp[2] is never used. The initializer list can be shortened.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Range_amp[2], I used to choose a range for the current measurement in 168 to 194 lines.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, range_amp[2] is not used.


if (clc_checksum > 256 && want_checksum >= 128)
want_checksum = want_checksum - 128;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The checksum is calculated over the first 8 bytes including the FRAME_MAGIC byte (0xAC). If the checksum is in the range 0xAC - 0xFF, i.e. the sum of the remaining bytes is less than 0x54, the checksum should be found in pkt[8] with bit 7 set. But if the checksum is 0x100 or more, bit 7 of the checksum will be reset.
This is a strange definition.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you very much. I made a mistake here. I fixed it now. Bit 7 is always cleared.
0xac 0x04 0x10 0x20 0x01 0x33 0x04 0x18 -> Sum of bytes 0x118,
0xac 0x06 0x00 0x00 0x00 0x31 0x04 0x67 (103) -> Sum of bytes 0xE7 (231)
0xac 0x04 0x88 0x99 0x01 0x33 0x04 0x09 -> Sum of bytes 0x209
0xac 0x04 0x89 0x69 0x01 0x33 0x04 0x5a (90)-> Sum of bytes 0x1DA (474)

Copy link
Contributor

@biot biot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the late review, but here it is.

A bunch of mostly small comments, easily fixable. A couple of general notes:

  • Your code uses spaces for indentation, please use tabs instead.
  • Have you checked whether this protocol might already be supported by some other driver? This may well be driven by a generic DMM chip, and we already support lots of those (see https://sigrok.org/wiki/Multimeter_ICs). The easiest way to check is just to open up the device and check markings on the main IC.

case SR_CONF_DATA_SOURCE:
*data = g_variant_new_string(data_sources[0]);
break;
// TO DO ADD SR_CONF_MEASURED_QUANTITY and SR_CONF_RANGE
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please don't leave TODOs in the code that's going up to mainline. It's ok if your driver doesn't yet support all features the hardware has, but the driver should just be functional for the stuff it does support. You can make a note of features it still needs in the commit message or (much preferred) the wiki.



static const char *channel_names[] = {
"Main",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regular multimeters like this generally use P1 as the channel name (for probe 1).


static const char *data_sources[] = {
"Live",
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this multimeter only has live measurements, i.e. no storage mode, there is no need to implement SR_CONF_DATA_SOURCE in this driver. So this can go, and the entry in devopts[], and the config_get()/config_list() entries as well.

devices = g_slist_append(devices, sdi);

return std_scan_complete(di, devices);

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Extra blank line.

* Frame | func | value | comma | settings | checksum |
* ac | 1b | 45 01 00 | 33 | 04 | 44 |
* - The frame to send a command to the multimeter is unknown.
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This really belongs in the wiki, not in the code. Can you please create a page for this hardware? @abraxa will hook you up with an account. Document as much detail of the protocol as you can.

serial = sdi->conn;

if (devc->packet_len == sizeof(devc->packet)) {
(void)process_packet(sdi, &devc->packet[0], devc->packet_len);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use the return code? Might be an error.

return TRUE;

if (revents & G_IO_IN)
(void)ut8802e_receive_data(sdi);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you don't want to know if that function returned an error, just rewrite the function to not return one.


#define PACKET_SIZE 32

#define FRAME_MAGIC 0xac /* AC */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment seems unnecessary.


enum ut8802e_channel_idx {
ut8802e_CH_MAIN,
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is only one channel, this seems unnecessary.

want_checksum = want_checksum - 128;

got_checksum = R8(&pkt[checksum_dlen]);
sr_spew("Checksum: %d, Got: %d, ALL %d", want_checksum, got_checksum, clc_checksum);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once you know you've got the checksum right, no need to spew this debug output.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants