#!/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";
    }

}
