|
@@ -0,0 +1,83 @@
|
|
|
+#!/usr/bin/env perl
|
|
|
+#
|
|
|
+# Eric Jiang
|
|
|
+# http://notes.ericjiang.com/posts/54
|
|
|
+# This software is public domain.
|
|
|
+#
|
|
|
+# NOTE: This code is not maintained!
|
|
|
+# There is a newer version written in C:
|
|
|
+# https://github.com/erjiang/usbscale
|
|
|
+#
|
|
|
+use bytes;
|
|
|
+
|
|
|
+my $data;
|
|
|
+
|
|
|
+#prevents us from repeating messages
|
|
|
+my $waitingflag = 0;
|
|
|
+
|
|
|
+while (1) {
|
|
|
+
|
|
|
+ $data = `cat /dev/hidraw7 | head -c 7`;
|
|
|
+
|
|
|
+ my $report = ord(substr($data, 0, 1));
|
|
|
+ my $status = ord(substr($data, 1, 1));
|
|
|
+ my $unit = ord(substr($data, 2, 1));
|
|
|
+ my $exp = ord(substr($data, 3, 1));
|
|
|
+ my $lsb = ord(substr($data, 4, 1));
|
|
|
+ my $msb = ord(substr($data, 5, 1));
|
|
|
+ my $weight = ($msb * 256 + $lsb) / 10;
|
|
|
+ if($exp != 255 && $exp != 0) {
|
|
|
+ $weight ^= $exp;
|
|
|
+ }
|
|
|
+ #print "$report $status $unit $exp $weight\n";
|
|
|
+
|
|
|
+ if($report != 0x03) {
|
|
|
+ die "Error reading scale data!\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ if($status == 0x01) {
|
|
|
+ die "Scale reports FAULT!\n";
|
|
|
+ } elsif ($status == 0x02 || $weight == 0) {
|
|
|
+ if($waitingflag != 0x02) {
|
|
|
+ print "Zero'd...\n";
|
|
|
+ $waitingflag = 0x02;
|
|
|
+ }
|
|
|
+ } elsif ($status == 0x03) {
|
|
|
+ if($waitingflag != 0x03) {
|
|
|
+ print "Weighing...\n";
|
|
|
+ $waitingflag = 0x03;
|
|
|
+ }
|
|
|
+ } elsif ($status == 0x04) {
|
|
|
+ my $unitName = "units";
|
|
|
+ if($unit == 11) {
|
|
|
+ $unitName = "ounces";
|
|
|
+ } elsif ($unit == 12) {
|
|
|
+ $unitName = "pounds";
|
|
|
+ }
|
|
|
+ print "$weight $unitName\n";
|
|
|
+ last;
|
|
|
+ } elsif ($status == 0x05) {
|
|
|
+ if($waitingflag != 0x05) {
|
|
|
+ print "Scale reports Under Zero...\n";
|
|
|
+ $waitingflag = 0x05;
|
|
|
+ }
|
|
|
+ } elsif ($status == 0x06) {
|
|
|
+ if($waitingflag != 0x06) {
|
|
|
+ print "Scale reports Over Weight!\n";
|
|
|
+ $waitingflag = 0x06;
|
|
|
+ }
|
|
|
+ } elsif ($status == 0x07) {
|
|
|
+ if($waitingflag != 0x07) {
|
|
|
+ print "Scale reports Calibration Needed!\n";
|
|
|
+ $waitingflag = 0x07;
|
|
|
+ }
|
|
|
+ } elsif ($status == 0x08) {
|
|
|
+ if($waitingflag != 0x08) {
|
|
|
+ print "Scale reports Re-zeroing Needed!\n";
|
|
|
+ $waitingflag = 0x08;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ die "Unknown status code: $status\n";
|
|
|
+ }
|
|
|
+
|
|
|
+}
|